From 4e38851690859f61c91baafa9199246e1a2ec83f Mon Sep 17 00:00:00 2001 From: ericboucher Date: Thu, 3 Sep 2026 12:01:51 +0200 Subject: [PATCH 1/5] Augment query param limit --- apps/backend/src/main.ts | 2 ++ .../kobo/tests/kobo.controller.spec.ts | 36 +++++++++++++++++++ apps/backend/src/utils/queryParser.ts | 14 ++++++++ .../frontend/services/api/kobo/useGetForms.ts | 7 ++-- 4 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 apps/backend/src/utils/queryParser.ts diff --git a/apps/backend/src/main.ts b/apps/backend/src/main.ts index 96e59b5e..615ecaf4 100644 --- a/apps/backend/src/main.ts +++ b/apps/backend/src/main.ts @@ -6,6 +6,7 @@ import { AppModule } from './app.module'; import { Environment } from './env.validation'; import { CustomLogger } from './modules/logger/custom-logger.service'; import { getAllowedOriginMatchers } from './utils/allowedOrigins'; +import { configureQueryParser } from './utils/queryParser'; const bootstrap = async () => { const logger = new CustomLogger(); @@ -15,6 +16,7 @@ const bootstrap = async () => { app.enableCors({ credentials: true, origin: getAllowedOriginMatchers() }); } + configureQueryParser(app); app.use(cookieParser()); // Setting up Swagger document diff --git a/apps/backend/src/modules/kobo/tests/kobo.controller.spec.ts b/apps/backend/src/modules/kobo/tests/kobo.controller.spec.ts index 99b50906..8baae335 100644 --- a/apps/backend/src/modules/kobo/tests/kobo.controller.spec.ts +++ b/apps/backend/src/modules/kobo/tests/kobo.controller.spec.ts @@ -6,6 +6,7 @@ import { INestApplication } from '@nestjs/common'; import { Test, TestingModule } from '@nestjs/testing'; import { getRepositoryToken } from '@nestjs/typeorm'; import { AppModule } from '@root/app.module'; +import { configureQueryParser } from '@root/utils/queryParser'; import { DisasterDtoType, DROUGHT, @@ -45,6 +46,7 @@ describe('KoboController', () => { authService = testingModule.get(AuthService); koboService = testingModule.get(KoboService); app = testingModule.createNestApplication(); + configureQueryParser(app); await app.init(); }); @@ -182,6 +184,40 @@ describe('KoboController', () => { }); }); }); + + it('should accept more than 20 province values in axios bracket query format', async () => { + const role = 'ncdm'; + const disTyps = ['1']; + const startDate = '2026-08-01'; + const endDate = '2026-09-01'; + const province = Array.from({ length: 25 }, (_, index) => + String(index + 1).padStart(2, '0'), + ); + + const getFormsSpy = jest.spyOn(koboService, 'getForms').mockImplementation(getFormsMock); + + const user = await userFactory.createOne({ roles: [role] }); + const accessToken = authService.createAccessToken(user, 10000); + const queryString = province.reduce( + (params, code) => `${params}&province[]=${code}`, + `disTyps[]=1&startDate=${startDate}&endDate=${endDate}`, + ); + + await request(app.getHttpServer()) + .get(`/kobo/forms?${queryString}`) + .set('Authorization', `Bearer ${accessToken}`) + .expect(200) + .expect(() => { + expect(getFormsSpy).toHaveBeenNthCalledWith(1, { + disTyps, + startDate, + endDate, + province, + district: undefined, + commune: undefined, + }); + }); + }); }); describe('GET form', () => { diff --git a/apps/backend/src/utils/queryParser.ts b/apps/backend/src/utils/queryParser.ts new file mode 100644 index 00000000..60e30308 --- /dev/null +++ b/apps/backend/src/utils/queryParser.ts @@ -0,0 +1,14 @@ +import { INestApplication } from '@nestjs/common'; +import { NestExpressApplication } from '@nestjs/platform-express'; +import qs from 'qs'; + +// qs defaults arrayLimit to 20; admin-area filters can exceed that. +const QUERY_ARRAY_LIMIT = 2000; + +export const configureQueryParser = (app: INestApplication): void => { + const expressApp = app as NestExpressApplication; + + expressApp.set('query parser', (queryString: string) => + qs.parse(queryString, { arrayLimit: QUERY_ARRAY_LIMIT }), + ); +}; diff --git a/apps/frontend/services/api/kobo/useGetForms.ts b/apps/frontend/services/api/kobo/useGetForms.ts index d24d86e2..84826c9c 100644 --- a/apps/frontend/services/api/kobo/useGetForms.ts +++ b/apps/frontend/services/api/kobo/useGetForms.ts @@ -1,4 +1,4 @@ -import { DroughtDto, FloodDto, IncidentDto } from '@wfp-dmp/interfaces'; +import { DroughtDto, FloodDto, IncidentDto, provinces } from '@wfp-dmp/interfaces'; import useSWR from 'swr'; import { SearchFormData } from 'components/Filters/SearchFilters'; @@ -13,7 +13,10 @@ export const useGetForms = ({ const inputStartDate = inputDateRange.startDate?.format('YYYY-MM-DD'); const inputEndDate = inputDateRange.endDate?.format('YYYY-MM-DD'); const inputProvince = - inputRegion.province.length === 0 ? undefined : inputRegion.province; + inputRegion.province.length === 0 || + inputRegion.province.length === provinces.length + ? undefined + : inputRegion.province; const inputDistrict = inputRegion.district.length === 0 ? undefined : inputRegion.district; const inputCommune = From bc63c583a68b97f61bad8a553964b00daf962a6f Mon Sep 17 00:00:00 2001 From: ericboucher Date: Thu, 3 Sep 2026 13:35:42 +0200 Subject: [PATCH 2/5] Update crop mapping --- .../FloodFormValidation/tablesConfig/Agriculture.tsx | 8 ++++++-- apps/frontend/translations/en.json | 6 +++--- apps/frontend/translations/km.json | 6 +++--- apps/frontend/utils/test/formatFormToRaw.spec.ts | 3 +++ packages/interfaces/src/kobo/FloodDto.ts | 10 +++++----- packages/interfaces/src/kobo/mapping/flood.ts | 10 +++++----- 6 files changed, 25 insertions(+), 18 deletions(-) diff --git a/apps/frontend/components/FormValidation/FloodFormValidation/tablesConfig/Agriculture.tsx b/apps/frontend/components/FormValidation/FloodFormValidation/tablesConfig/Agriculture.tsx index e4896e5e..72a39f09 100644 --- a/apps/frontend/components/FormValidation/FloodFormValidation/tablesConfig/Agriculture.tsx +++ b/apps/frontend/components/FormValidation/FloodFormValidation/tablesConfig/Agriculture.tsx @@ -19,6 +19,11 @@ const AgricultureColumns: GridColDef[] = [ getColumnSetup({ field: FloodSpecific.NumFarmCroAff, disaster: FLOOD, + width: colWidth + 8 * 4, + }), + getColumnSetup({ + field: FloodSpecific.NumFarmPaddyAff, + disaster: FLOOD, width: colWidth + 8 * 2, }), getColumnSetup({ @@ -33,7 +38,6 @@ const AgricultureColumns: GridColDef[] = [ }), getColumnSetup({ field: FloodSpecific.SamNabAff, disaster: FLOOD }), getColumnSetup({ field: FloodSpecific.SamNabDam, disaster: FLOOD }), - getColumnSetup({ field: FloodSpecific.NumFarmPaddyAff, disaster: FLOOD }), getColumnSetup({ field: FloodSpecific.PaddyAff, disaster: FLOOD }), getColumnSetup({ field: FloodSpecific.PaddyDam, disaster: FLOOD }), getColumnSetup({ field: FloodSpecific.CowEva, disaster: FLOOD }), @@ -53,6 +57,7 @@ const AgricultureColumnGroup: GridColumnGroupingModel = [ children: [ { field: FloodSpecific.ToNamAgriAff }, { field: FloodSpecific.NumFarmCroAff }, + { field: FloodSpecific.NumFarmPaddyAff }, ], }, { @@ -65,7 +70,6 @@ const AgricultureColumnGroup: GridColumnGroupingModel = [ { ...getGroupSetup('seedling', FLOOD), children: [ - { field: FloodSpecific.NumFarmPaddyAff }, { field: FloodSpecific.SamNabAff }, { field: FloodSpecific.SamNabDam }, ], diff --git a/apps/frontend/translations/en.json b/apps/frontend/translations/en.json index c15ea537..a8e20e68 100644 --- a/apps/frontend/translations/en.json +++ b/apps/frontend/translations/en.json @@ -229,11 +229,11 @@ "NumWareHDam": "Damaged", "NumCraftAff": "Affected", "NumCraftDam": "Damaged", - "ToNamAgriAff": "Affected", - "NumFarmCroAff": "Affected", + "ToNamAgriAff": "Farmland", + "NumFarmCroAff": "Mixed crops", "FarmAff": "Affected", "FarmDam": "Damaged", - "NumFarmPaddyAff": "Affected", + "NumFarmPaddyAff": "Seedlings", "SamNabAff": "Affected", "SamNabDam": "Damaged", "PaddyAff": "Affected", diff --git a/apps/frontend/translations/km.json b/apps/frontend/translations/km.json index 065abee8..00cf4db3 100644 --- a/apps/frontend/translations/km.json +++ b/apps/frontend/translations/km.json @@ -233,11 +233,11 @@ "NumWareHDam": "ខូចខាត", "NumCraftAff": "ប៉ះពាល់", "NumCraftDam": "ខូចខាត", - "ToNamAgriAff": "ប៉ះពាល់", - "NumFarmCroAff": "ប៉ះពាល់", + "ToNamAgriAff": "ដីស្រែ/ចម្ការ", + "NumFarmCroAff": "ដំណាំរួមផ្សំ", "FarmAff": "ប៉ះពាល់", "FarmDam": "ខូចខាត", - "NumFarmPaddyAff": "ប៉ះពាល់", + "NumFarmPaddyAff": "សំណាប/សន្ទូង", "SamNabAff": "ប៉ះពាល់", "SamNabDam": "ខូចខាត", "PaddyAff": "ប៉ះពាល់", diff --git a/apps/frontend/utils/test/formatFormToRaw.spec.ts b/apps/frontend/utils/test/formatFormToRaw.spec.ts index e1c0203e..773e7b16 100644 --- a/apps/frontend/utils/test/formatFormToRaw.spec.ts +++ b/apps/frontend/utils/test/formatFormToRaw.spec.ts @@ -20,6 +20,7 @@ describe('formatFormToRaw', () => { specific: { NumFamAff: 50, floodN: '3', + FarmAff: 31, }, } as unknown as FloodFormType; @@ -28,6 +29,8 @@ describe('formatFormToRaw', () => { expect(raw['g3/g3_1/g3_2/NumFamAff']).toBe('50'); expect(raw['g2/flood_n']).toBe('3'); + expect(raw['g11/Crop/FarmAff']).toBe('31'); + expect(raw).not.toHaveProperty('g11/g11_1/FarmAff'); expect(raw).not.toHaveProperty('undefined'); }); }); diff --git a/packages/interfaces/src/kobo/FloodDto.ts b/packages/interfaces/src/kobo/FloodDto.ts index 9fd54bc2..4dbe66c9 100644 --- a/packages/interfaces/src/kobo/FloodDto.ts +++ b/packages/interfaces/src/kobo/FloodDto.ts @@ -84,11 +84,11 @@ export class FloodDto { @IsOptional() @IsNumberString() readonly 'g10/g10_7/NumWareHDam'?: string; @IsOptional() @IsNumberString() readonly 'g10/g10_8/NumCraftAff'?: string; @IsOptional() @IsNumberString() readonly 'g10/g10_8/NumCraftDam'?: string; - @IsOptional() @IsNumberString() readonly 'g11/g11_1/FarmAff'?: string; - @IsOptional() @IsNumberString() readonly 'g11/g11_1/FarmDam'?: string; - @IsOptional() @IsNumberString() readonly 'g11/g11_1/ToNamAgriAff'?: string; - @IsOptional() @IsNumberString() readonly 'g11/g11_1/NumFarmCroAff'?: string; - @IsOptional() @IsNumberString() readonly 'g11/g11_2/NumFarmPaddyAff'?: string; + @IsOptional() @IsNumberString() readonly 'g11/ToNamAgriAff'?: string; + @IsOptional() @IsNumberString() readonly 'g11/NumFarmCroAff'?: string; + @IsOptional() @IsNumberString() readonly 'g11/Crop/FarmAff'?: string; + @IsOptional() @IsNumberString() readonly 'g11/Crop/FarmDam'?: string; + @IsOptional() @IsNumberString() readonly 'g11/NumFarmPaddyAff'?: string; @IsOptional() @IsNumberString() readonly 'g11/g11_2/SamNabAff'?: string; @IsOptional() @IsNumberString() readonly 'g11/g11_2/SamNabDam'?: string; @IsOptional() @IsNumberString() readonly 'g11/g11_3/PaddyAff'?: string; diff --git a/packages/interfaces/src/kobo/mapping/flood.ts b/packages/interfaces/src/kobo/mapping/flood.ts index 1508624d..b1789fe1 100644 --- a/packages/interfaces/src/kobo/mapping/flood.ts +++ b/packages/interfaces/src/kobo/mapping/flood.ts @@ -190,13 +190,13 @@ export const floodSpecificKeys = { [FloodSpecific.NumWareHDam]: 'g10/g10_7/NumWareHDam', [FloodSpecific.NumCraftAff]: 'g10/g10_8/NumCraftAff', [FloodSpecific.NumCraftDam]: 'g10/g10_8/NumCraftDam', - [FloodSpecific.FarmAff]: 'g11/g11_1/FarmAff', - [FloodSpecific.FarmDam]: 'g11/g11_1/FarmDam', - [FloodSpecific.NumFarmCroAff]: 'g11/g11_1/NumFarmCroAff', - [FloodSpecific.ToNamAgriAff]: 'g11/g11_1/ToNamAgriAff', + [FloodSpecific.FarmAff]: 'g11/Crop/FarmAff', + [FloodSpecific.FarmDam]: 'g11/Crop/FarmDam', + [FloodSpecific.NumFarmCroAff]: 'g11/NumFarmCroAff', + [FloodSpecific.ToNamAgriAff]: 'g11/ToNamAgriAff', [FloodSpecific.SamNabAff]: 'g11/g11_2/SamNabAff', [FloodSpecific.SamNabDam]: 'g11/g11_2/SamNabDam', - [FloodSpecific.NumFarmPaddyAff]: 'g11/g11_2/NumFarmPaddyAff', + [FloodSpecific.NumFarmPaddyAff]: 'g11/NumFarmPaddyAff', [FloodSpecific.PaddyAff]: 'g11/g11_3/PaddyAff', [FloodSpecific.PaddyDam]: 'g11/g11_3/PaddyDam', [FloodSpecific.CowEva]: 'g11/g11_4/CowEva', From 0367b18123e2c59eb933e3fa472e8c3bbbae2b9b Mon Sep 17 00:00:00 2001 From: ericboucher Date: Thu, 3 Sep 2026 13:43:13 +0200 Subject: [PATCH 3/5] lint --- .../backend/src/modules/kobo/tests/kobo.controller.spec.ts | 4 +--- apps/frontend/services/api/kobo/useGetForms.ts | 7 ++++++- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/apps/backend/src/modules/kobo/tests/kobo.controller.spec.ts b/apps/backend/src/modules/kobo/tests/kobo.controller.spec.ts index 8baae335..70cef2d9 100644 --- a/apps/backend/src/modules/kobo/tests/kobo.controller.spec.ts +++ b/apps/backend/src/modules/kobo/tests/kobo.controller.spec.ts @@ -190,9 +190,7 @@ describe('KoboController', () => { const disTyps = ['1']; const startDate = '2026-08-01'; const endDate = '2026-09-01'; - const province = Array.from({ length: 25 }, (_, index) => - String(index + 1).padStart(2, '0'), - ); + const province = Array.from({ length: 25 }, (_, index) => String(index + 1).padStart(2, '0')); const getFormsSpy = jest.spyOn(koboService, 'getForms').mockImplementation(getFormsMock); diff --git a/apps/frontend/services/api/kobo/useGetForms.ts b/apps/frontend/services/api/kobo/useGetForms.ts index 84826c9c..c821b745 100644 --- a/apps/frontend/services/api/kobo/useGetForms.ts +++ b/apps/frontend/services/api/kobo/useGetForms.ts @@ -1,4 +1,9 @@ -import { DroughtDto, FloodDto, IncidentDto, provinces } from '@wfp-dmp/interfaces'; +import { + DroughtDto, + FloodDto, + IncidentDto, + provinces, +} from '@wfp-dmp/interfaces'; import useSWR from 'swr'; import { SearchFormData } from 'components/Filters/SearchFilters'; From 18d50b53b5447062b8913ef495cdbc6ba8d71e81 Mon Sep 17 00:00:00 2001 From: ericboucher Date: Thu, 3 Sep 2026 13:58:43 +0200 Subject: [PATCH 4/5] Update incident forms --- .../utils/test/formatFormToRaw.spec.ts | 77 ++++++++++++---- .../utils/test/formatRawToForm.spec.ts | 91 +++++++++++++++++++ packages/interfaces/src/kobo/IncidentDto.ts | 4 +- .../interfaces/src/kobo/mapping/incident.ts | 4 +- 4 files changed, 152 insertions(+), 24 deletions(-) create mode 100644 apps/frontend/utils/test/formatRawToForm.spec.ts diff --git a/apps/frontend/utils/test/formatFormToRaw.spec.ts b/apps/frontend/utils/test/formatFormToRaw.spec.ts index 773e7b16..1f2dfccf 100644 --- a/apps/frontend/utils/test/formatFormToRaw.spec.ts +++ b/apps/frontend/utils/test/formatFormToRaw.spec.ts @@ -1,30 +1,37 @@ -import { FLOOD, floodSpecificKeys, koboKeys } from '@wfp-dmp/interfaces'; +import { + FLOOD, + floodSpecificKeys, + INCIDENT, + incidentSpecificKeys, + koboKeys, +} from '@wfp-dmp/interfaces'; import dayjs from 'dayjs'; import { FloodFormType } from 'components/FormValidation/FloodFormValidation/FloodFormType'; +import { IncidentFormType } from 'components/FormValidation/IncidentFormValidation/IncidentFormType'; import { formatFormToRaw } from 'utils/formatFormToRaw'; describe('formatFormToRaw', () => { - const formValues = { - region: { - province: ['01'], - district: ['0102'], - commune: ['010203'], - village: 'village', - }, - interviewer: 'tester', - disTyp: '1', - phone: '012', - reportDate: dayjs('2024-01-02'), - incidentDate: dayjs('2024-01-01'), - specific: { - NumFamAff: 50, - floodN: '3', - FarmAff: 31, - }, - } as unknown as FloodFormType; - it('stringifies numeric DataGrid values and omits unmapped keys', () => { + const formValues = { + region: { + province: ['01'], + district: ['0102'], + commune: ['010203'], + village: 'village', + }, + interviewer: 'tester', + disTyp: '1', + phone: '012', + reportDate: dayjs('2024-01-02'), + incidentDate: dayjs('2024-01-01'), + specific: { + NumFamAff: 50, + floodN: '3', + FarmAff: 31, + }, + } as unknown as FloodFormType; + const raw = formatFormToRaw(formValues, koboKeys[FLOOD], floodSpecificKeys); expect(raw['g3/g3_1/g3_2/NumFamAff']).toBe('50'); @@ -33,4 +40,34 @@ describe('formatFormToRaw', () => { expect(raw).not.toHaveProperty('g11/g11_1/FarmAff'); expect(raw).not.toHaveProperty('undefined'); }); + + it('writes incident factory fields to current Kobo xpaths', () => { + const incidentValues = { + region: { + province: ['05'], + district: ['0503'], + commune: ['050303'], + village: 'village', + }, + interviewer: 'tester', + disTyp: '11', + phone: '012', + reportDate: dayjs('2024-01-02'), + incidentDate: dayjs('2024-01-01'), + specific: { + FactoryAff: 7, + FactoryDam: 4, + }, + } as unknown as IncidentFormType; + + const raw = formatFormToRaw( + incidentValues, + koboKeys[INCIDENT], + incidentSpecificKeys, + ); + + expect(raw['group_pk03i04/group_az7bv13/FactoryAff']).toBe('7'); + expect(raw['group_pk03i04/group_az7bv13/FactoryDam']).toBe('4'); + expect(raw).not.toHaveProperty('group_gh6ag70/group_az7bv13/FactoryAff'); + }); }); diff --git a/apps/frontend/utils/test/formatRawToForm.spec.ts b/apps/frontend/utils/test/formatRawToForm.spec.ts new file mode 100644 index 00000000..e65c0898 --- /dev/null +++ b/apps/frontend/utils/test/formatRawToForm.spec.ts @@ -0,0 +1,91 @@ +import { FloodDto, IncidentDto } from '@wfp-dmp/interfaces'; + +import { formatFloodFields, formatIncidentFields } from 'utils/formatRawToForm'; + +const baseFlood = { + _id: 816716609, + 'formhub/uuid': 'uid', + start: '2026-09-03T00:00:00.000Z', + end: '2026-09-03T00:00:00.000Z', + 'g1/q_Enum': 'admin', + 'g1/Date_report': '2026-09-03', + 'g2/Province': '24', + 'g2/District': '2401', + 'g2/Commune': '240103', + 'g2/Date_Dis': '2026-09-03', + 'g2/DisTyp': '1', + __version__: 'version', + 'meta/instanceID': 'uuid', + _xform_id_string: 'ids', + _uuid: 'uid', + _attachments: [], + _status: 'submitted_via_web', + _geolocation: [null, null], + _submission_time: '2026-09-03T08:00:00', + _tags: [], + _notes: [], + _validation_status: {}, + _submitted_by: null, +} as FloodDto; + +describe('formatFloodFields agriculture mapping', () => { + it('maps current Kobo agriculture xpaths into review fields', () => { + const formatted = formatFloodFields({ + ...baseFlood, + 'g11/ToNamAgriAff': '33', + 'g11/NumFarmCroAff': '32', + 'g11/Crop/FarmAff': '31', + 'g11/Crop/FarmDam': '30', + 'g11/NumFarmPaddyAff': '29', + 'g11/g11_2/SamNabAff': '28', + } as FloodDto); + + expect(formatted.ToNamAgriAff).toBe('33'); + expect(formatted.NumFarmCroAff).toBe('32'); + expect(formatted.FarmAff).toBe('31'); + expect(formatted.FarmDam).toBe('30'); + expect(formatted.NumFarmPaddyAff).toBe('29'); + expect(formatted.SamNabAff).toBe('28'); + }); +}); + +const baseIncident = { + _id: 3, + 'formhub/uuid': 'uid', + start: '2026-09-03T00:00:00.000Z', + end: '2026-09-03T00:00:00.000Z', + 'G1/q_Enum': 'admin', + 'G1/Date_report': '2026-09-03', + 'G2/Province': '05', + 'G2/District': '0503', + 'G2/Commune': '050303', + 'G2/Date_Dis': '2026-09-03', + 'G2/DisTyp': '11', + __version__: 'version', + 'meta/instanceID': 'uuid', + _xform_id_string: 'ids', + _uuid: 'uid', + _attachments: [], + _status: 'submitted_via_web', + _geolocation: [null, null], + _submission_time: '2026-09-03T08:00:00', + _tags: [], + _notes: [], + _validation_status: {}, + _submitted_by: null, +} as IncidentDto; + +describe('formatIncidentFields factory mapping', () => { + it('maps current Kobo factory xpaths into review fields', () => { + const formatted = formatIncidentFields({ + ...baseIncident, + 'group_pk03i04/group_az7bv13/FactoryAff': '7', + 'group_pk03i04/group_az7bv13/FactoryDam': '4', + 'group_gh6ag70/group_na4yi04/CropAff': '2', + } as IncidentDto); + + expect(formatted.FactoryAff).toBe('7'); + expect(formatted.FactoryDam).toBe('4'); + expect(formatted.CropAff).toBe('2'); + }); +}); diff --git a/packages/interfaces/src/kobo/IncidentDto.ts b/packages/interfaces/src/kobo/IncidentDto.ts index b79aa1c2..6800030e 100644 --- a/packages/interfaces/src/kobo/IncidentDto.ts +++ b/packages/interfaces/src/kobo/IncidentDto.ts @@ -85,10 +85,10 @@ export class IncidentDto { @IsOptional() @IsNumberString() readonly 'group_pk03i04/group_lf9ou90/StorageDam'?: string; @IsOptional() @IsNumberString() readonly 'group_pk03i04/group_ub2hp14/CraftAff'?: string; @IsOptional() @IsNumberString() readonly 'group_pk03i04/group_ub2hp14/CraftDam'?: string; + @IsOptional() @IsNumberString() readonly 'group_pk03i04/group_az7bv13/FactoryAff'?: string; + @IsOptional() @IsNumberString() readonly 'group_pk03i04/group_az7bv13/FactoryDam'?: string; @IsOptional() @IsNumberString() readonly 'group_gh6ag70/group_na4yi04/CropAff'?: string; @IsOptional() @IsNumberString() readonly 'group_gh6ag70/group_na4yi04/CropDam'?: string; - @IsOptional() @IsNumberString() readonly 'group_gh6ag70/group_az7bv13/FactoryAff'?: string; - @IsOptional() @IsNumberString() readonly 'group_gh6ag70/group_az7bv13/FactoryDam'?: string; @IsOptional() @IsNumberString() readonly 'group_gh6ag70/group_yh83p68/SamnabAff'?: string; @IsOptional() @IsNumberString() readonly 'group_gh6ag70/group_yh83p68/SamnabDam'?: string; @IsOptional() @IsNumberString() readonly 'group_gh6ag70/group_en38q31/PaddyAff'?: string; diff --git a/packages/interfaces/src/kobo/mapping/incident.ts b/packages/interfaces/src/kobo/mapping/incident.ts index 67c1274f..28b0c488 100644 --- a/packages/interfaces/src/kobo/mapping/incident.ts +++ b/packages/interfaces/src/kobo/mapping/incident.ts @@ -134,8 +134,8 @@ export const incidentSpecificKeys = { [IncidentSpecific.CraftDam]: 'group_pk03i04/group_ub2hp14/CraftDam', [IncidentSpecific.CropAff]: 'group_gh6ag70/group_na4yi04/CropAff', [IncidentSpecific.CropDam]: 'group_gh6ag70/group_na4yi04/CropDam', - [IncidentSpecific.FactoryAff]: 'group_gh6ag70/group_az7bv13/FactoryAff', - [IncidentSpecific.FactoryDam]: 'group_gh6ag70/group_az7bv13/FactoryDam', + [IncidentSpecific.FactoryAff]: 'group_pk03i04/group_az7bv13/FactoryAff', + [IncidentSpecific.FactoryDam]: 'group_pk03i04/group_az7bv13/FactoryDam', [IncidentSpecific.SamnabAff]: 'group_gh6ag70/group_yh83p68/SamnabAff', [IncidentSpecific.SamnabDam]: 'group_gh6ag70/group_yh83p68/SamnabDam', [IncidentSpecific.PaddyAff]: 'group_gh6ag70/group_en38q31/PaddyAff', From fbd364687eaf98297fbb3058dc988a4cdd999fb8 Mon Sep 17 00:00:00 2001 From: ericboucher Date: Thu, 3 Sep 2026 14:24:09 +0200 Subject: [PATCH 5/5] Update formatRawToForm.spec.ts --- apps/frontend/utils/test/formatRawToForm.spec.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apps/frontend/utils/test/formatRawToForm.spec.ts b/apps/frontend/utils/test/formatRawToForm.spec.ts index e65c0898..e8b62006 100644 --- a/apps/frontend/utils/test/formatRawToForm.spec.ts +++ b/apps/frontend/utils/test/formatRawToForm.spec.ts @@ -8,6 +8,8 @@ const baseFlood = { start: '2026-09-03T00:00:00.000Z', end: '2026-09-03T00:00:00.000Z', 'g1/q_Enum': 'admin', + 'g1/q_Funtion': 'flood_admin', + 'g1/q_Phone': '12345678', 'g1/Date_report': '2026-09-03', 'g2/Province': '24', 'g2/District': '2401', @@ -55,6 +57,8 @@ const baseIncident = { start: '2026-09-03T00:00:00.000Z', end: '2026-09-03T00:00:00.000Z', 'G1/q_Enum': 'admin', + 'G1/q_Funtion': 'admin_incident', + 'G1/q_Phone': '12345678', 'G1/Date_report': '2026-09-03', 'G2/Province': '05', 'G2/District': '0503',