Skip to content

Commit e7618cd

Browse files
authored
fix: update complaint submission (#37)
1 parent b2987e5 commit e7618cd

4 files changed

Lines changed: 50 additions & 17 deletions

File tree

gov_api/postman.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"info":{"_postman_id":"3a3e0068-8ed8-4464-b3e1-90fb3b3d2103","name":"PniotMot","schema":"https://schema.getpostman.com/json/collection/v2.1.0/collection.json","description":""},"item":[{"name":"GetLinesByStation","request":{"method":"POST","url":{"raw":"https://esb.gov.il/govServiceList/trafficLicensing/GetLines","path":["govServiceList","trafficLicensing","GetLines"],"protocol":"https","host":["esb","gov","il"]},"body":{"mode":"raw","options":{"raw":{"language":"json"}},"raw":"{\n \"EventDate\": \"13/05/2025\",\n \"OperatorId\": 3,\n \"StationId\": 57865\n}"}}},{"name":"GetStationByLine","request":{"method":"POST","url":{"raw":"https://esb.gov.il/govServiceList/trafficLicensing/GetStationToLine","path":["govServiceList","trafficLicensing","GetStationToLine"],"protocol":"https","host":["esb","gov","il"]},"body":{"mode":"raw","options":{"raw":{"language":"json"}},"raw":"{\n \"eventDate\": \"13/05/2025\",\n \"OperatorId\": 3,\n \"OfficelineId\": 12083,\n \"Directions\": [\n 1\n ]\n}"}}},{"name":"GetSubjects","request":{"method":"POST","url":{"raw":"https://esb.gov.il/govServiceList/ListProvider/GetList","path":["govServiceList","ListProvider","GetList"],"protocol":"https","host":["esb","gov","il"]},"header":[{"key":"Accept","value":"*/*","disabled":true},{"key":"User-Agent","value":"Thunder Client (https://www.thunderclient.com)","disabled":true}],"body":{"mode":"raw","options":{"raw":{"language":"json"}},"raw":"{\n \"listName\": \"subject_type_vehicles\"\n}"}}},{"name":"GetTrainStations","request":{"method":"POST","url":{"raw":"https://esb.gov.il/govServiceList/trafficLicensing/GetTrainStations","path":["govServiceList","trafficLicensing","GetTrainStations"],"protocol":"https","host":["esb","gov","il"]},"body":{"mode":"raw","options":{"raw":{"language":"json"}},"raw":"{\n \"StationTypeId\": 7\n}"}}},{"name":"GetPniya(Vehicles Type)","request":{"method":"POST","url":{"raw":"https://esb.gov.il/govServiceList/ListProvider/GetList","path":["govServiceList","ListProvider","GetList"],"protocol":"https","host":["esb","gov","il"]},"header":[{"key":"Accept","value":"*/*","disabled":true},{"key":"User-Agent","value":"Thunder Client (https://www.thunderclient.com)","disabled":true}],"body":{"mode":"raw","options":{"raw":{"language":"json"}},"raw":"{\n \"listName\": \"pniya\"\n}"}}},{"name":"GetNotRealNumbers","request":{"method":"POST","url":{"raw":"https://esb.gov.il/govServiceList/ListProvider/GetList","path":["govServiceList","ListProvider","GetList"],"protocol":"https","host":["esb","gov","il"]},"header":[{"key":"Accept","value":"*/*","disabled":true},{"key":"User-Agent","value":"Thunder Client (https://www.thunderclient.com)","disabled":true}],"body":{"mode":"raw","options":{"raw":{"language":"json"}},"raw":"{\n \"listName\": \"notrealnumbers\"\n}"}}},{"name":"GetLinesByLine","request":{"method":"POST","url":{"raw":"https://esb.gov.il/govServiceList/trafficLicensing/GetLines","path":["govServiceList","trafficLicensing","GetLines"],"protocol":"https","host":["esb","gov","il"]},"body":{"mode":"raw","options":{"raw":{"language":"json"}},"raw":"{\n \"eventDate\": \"13/05/2025\",\n \"OperatorId\": 3,\n \"OperatorLineId\": 83\n}"}}},{"name":"GetCities","request":{"method":"POST","url":{"raw":"https://esb.gov.il/govServiceList/trafficLicensing/GetCities","path":["govServiceList","trafficLicensing","GetCities"],"protocol":"https","host":["esb","gov","il"]}}},{"name":"GetTime","request":{"method":"GET","url":{"raw":"https://esb.gov.il/govServiceList/TSA/GetTime?_=1747161247807","query":[{"key":"_","value":"1747161247807"}],"variable":[],"path":["govServiceList","TSA","GetTime"],"protocol":"https","host":["esb","gov","il"]}}},{"name":"Submit","request":{"method":"POST","url":{"raw":"https://forms.gov.il/globaldata/getsequence/setform.aspx?displang=he&formtype=PniotMot%40mot.gov.il","query":[{"key":"displang","value":"he"},{"key":"formtype","value":"PniotMot%40mot.gov.il"}],"variable":[],"path":["globaldata","getsequence","setform.aspx"],"protocol":"https","host":["forms","gov","il"]},"header":[{"key":"Content-Type","value":"multipart/form-data"}],"body":{"mode":"file","file":{"src":"c:\\Users\\aviva\\Downloads\\PniotMot@mot.gov.il_20250513_1908.xml"}}}}]}
1+
{"info":{"_postman_id":"0f6e4879-d1a7-4beb-9ecd-2f61fd69ecc2","name":"PniotMot","schema":"https://schema.getpostman.com/json/collection/v2.1.0/collection.json","_exporter_id":"14533538","_collection_link":"https://go.postman.co/collection/14533538-0f6e4879-d1a7-4beb-9ecd-2f61fd69ecc2?source=collection_link"},"item":[{"name":"GetReferenceNumber","request":{"method":"GET","header":[],"url":{"raw":"https://govforms.gov.il/mw/forms/PublicTransportRequest@mot.gov.il","protocol":"https","host":["govforms","gov","il"],"path":["mw","forms","PublicTransportRequest@mot.gov.il"]}},"response":[]},{"name":"GetCities","request":{"method":"GET","header":[{"key":"applicationid","value":"{{requestID}}","type":"text"}],"url":{"raw":"https://govforms.gov.il/govLists/City?columns[0]=city_code&columns[1]=city_name_he","protocol":"https","host":["govforms","gov","il"],"path":["govLists","City"],"query":[{"key":"columns[0]","value":"city_code"},{"key":"columns[1]","value":"city_name_he"}]}},"response":[]},{"name":"GetTransport","request":{"method":"GET","header":[{"key":"applicationid","value":"{{requestID}}","type":"text"}],"url":{"raw":"https://govforms.gov.il/govLists/TransportMeans?columns[0]=TransportMeansCode&columns[1]=TransportMeans","protocol":"https","host":["govforms","gov","il"],"path":["govLists","TransportMeans"],"query":[{"key":"columns[0]","value":"TransportMeansCode"},{"key":"columns[1]","value":"TransportMeans"}]}},"response":[]},{"name":"GetSubject","request":{"method":"GET","header":[{"key":"applicationid","value":"{{requestID}}","type":"text"}],"url":{"raw":"https://govforms.gov.il/govLists/RequestSubjectTran?columns[0]=RequestSubjectTranCode&columns[1]=RequestSubjectTran&filters[TransportMeansCode]=1","protocol":"https","host":["govforms","gov","il"],"path":["govLists","RequestSubjectTran"],"query":[{"key":"columns[0]","value":"RequestSubjectTranCode"},{"key":"columns[1]","value":"RequestSubjectTran"},{"key":"filters[TransportMeansCode]","value":"1","description":"1 bus\n2 taxi\n3 train\n4 rahbal\n5 carmelit"}]}},"response":[]},{"name":"GetComplaintAppeal","request":{"method":"GET","header":[{"key":"applicationid","value":"{{requestID}}","type":"text"}],"url":{"raw":"https://govforms.gov.il/govLists/RequestComplaintAppealTran?columns[0]=RequestComplaintAppealTranCode&columns[1]=RequestComplaintAppealTran&columns[2]=RequestComplaintAppealTranText&filters[RequestSubjectTranCode]=1&options.asdesignedcolumns[0]=RequestComplaintAppealTranText","protocol":"https","host":["govforms","gov","il"],"path":["govLists","RequestComplaintAppealTran"],"query":[{"key":"columns[0]","value":"RequestComplaintAppealTranCode"},{"key":"columns[1]","value":"RequestComplaintAppealTran"},{"key":"columns[2]","value":"RequestComplaintAppealTranText"},{"key":"filters[RequestSubjectTranCode]","value":"1","description":"1 - bus - זמנים ואי עצירה\n2 - bus - תלונה על שירות אמצעי תחבורה\n3 - bus - בקשה לשינויים בשירות\n4 - bus - תעריפים ותשלומים\n\n5 - taxi - תלונה על שירות אמצעי תחבורה\n6 - taxi - תעריפים ותשלומים\n\n7 - train - זמנים ואי עצירה\n8 - train - תלונה על שירות אמצעי תחבורה\n9 - train - בקשה לשינויים בשירות\n10 - train - תעריפים ותשלומים\n\n11 - cable car - תלונה על שירות אמצעי תחבורה\n12 - cable car - תעריפים ותשלומים\n\n13 - carmelit - תלונה על שירות אמצעי תחבורה\n14 - carmelit - תעריפים ותשלומים"},{"key":"options.asdesignedcolumns[0]","value":"RequestComplaintAppealTranText"}]}},"response":[]},{"name":"GetTrainStation","request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n \"MappingId\": \"739b1f3a-0bcb-4a1d-f6d8-08dda272749e\",\r\n \"RequestId\": \"{{requestID}}\",\r\n \"Options\": {},\r\n \"InputParams\": {\r\n \"operatorTypeId\": 1\r\n // 2 light train\r\n // 3 israel railway\r\n // 4 service taxi\r\n // 8 rahbal\r\n },\r\n \"processID\": null\r\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"https://govforms.gov.il/MW/serviceCall/invoke","protocol":"https","host":["govforms","gov","il"],"path":["MW","serviceCall","invoke"]}},"response":[]},{"name":"GetBusStation","request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n \"MappingId\": \"7c7a1bf8-8725-4879-f6df-08dda272749e\",\r\n \"RequestId\": \"{{requestID}}\",\r\n \"Options\": {},\r\n \"InputParams\": {\r\n \"routeId\": 36503,// lineDetailRecordId\r\n \"eventDate\": \"2026-05-18T00:00:00.000Z\",\r\n \"eventHour2\": \"10:00\",\r\n \"operatorTypeId\": 1\r\n // 1 bus\r\n },\r\n\r\n \"processID\": null\r\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"https://govforms.gov.il/MW/serviceCall/invoke","protocol":"https","host":["govforms","gov","il"],"path":["MW","serviceCall","invoke"]}},"response":[]},{"name":"GetLines","request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n \"MappingId\": \"65b6e90d-bcc6-452d-f6d5-08dda272749e\",\r\n \"RequestId\": \"{{requestID}}\",\r\n \"Options\": {},\r\n \"InputParams\": {\r\n \"operatorTypeId\": 8\r\n // 1 bus\r\n // 2 light train\r\n // 3 israel railway\r\n // 4 service taxi\r\n // 5 carmelit\r\n // 8 rahbal\r\n // \"operatorLineId\": 129\r\n },\r\n \"processID\": null\r\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"https://govforms.gov.il/MW/serviceCall/invoke","protocol":"https","host":["govforms","gov","il"],"path":["MW","serviceCall","invoke"]}},"response":[]}]}

src/controllers/complaints.controller.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,11 @@ export async function sendComplaint(request, reply) {
1919

2020
request.log.info('Complaint submission started');
2121

22-
const clientData = isDebug ? { ref: '1234567', guid: 'test' } : await getReferenceNumber();
22+
const clientData = isDebug ? { referenceNumber: '1234567', requestID: 'test' } : await getReferenceNumber();
2323

2424
if (clientData === null) return reply.status(500).send({ success: false, error: 'Failed to get reference number' });
2525

26-
const xml = templateBuilder(request.body, clientData.ref);
26+
const xml = templateBuilder(request.body, clientData.referenceNumber);
2727

2828
const boundary = `----WebKitFormBoundary${crypto.randomBytes(16).toString('hex')}`;
2929

@@ -39,14 +39,14 @@ export async function sendComplaint(request, reply) {
3939
`--${boundary}`,
4040
'Content-Disposition: form-data; name="_form_guid"',
4141
'',
42-
clientData.guid,
42+
clientData.requestID,
4343
`--${boundary}--`,
4444
'',
4545
].join('\r\n');
4646

4747
if (isDebug) {
4848
request.log.info('Complaint submitted in debug mode');
49-
return reply.status(200).send({ success: true, debug: true, xml, ref: clientData.ref });
49+
return reply.status(200).send({ success: true, debug: true, xml, ref: clientData.referenceNumber });
5050
// for test xml resepnse
5151
// return reply.status(200).headers({ 'content-type': 'application/xml' }).send(xml);
5252
}
@@ -76,9 +76,9 @@ export async function sendComplaint(request, reply) {
7676
return reply.status(400).send({ error: 'Validation failed', message: 'Government API error' });
7777
}
7878

79-
request.log.info('Complaint submitted successfully', { referenceNumber: clientData.ref, status: response.status });
79+
request.log.info('Complaint submitted successfully', { referenceNumber: clientData.referenceNumber, status: response.status });
8080

81-
return reply.status(200).send({ success: true, debug: false, data: text, referenceNumber: clientData.ref });
81+
return reply.status(200).send({ success: true, debug: false, data: text, referenceNumber: clientData.referenceNumber });
8282
} catch (error) {
8383
request.log.error('Complaint submission failed', { error: error.message, stack: error.stack, body: request.body });
8484
// Handle validation errors

src/utils/getReferenceNumber.js

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,37 @@
11
import { load } from 'cheerio';
22
import ky from 'ky';
33

4-
const URL = 'https://forms.gov.il/globaldata/getsequence/getHtmlForm.aspx?formType=PniotMot%40mot.gov.il';
4+
const URL = 'https://govforms.gov.il/mw/forms/PublicTransportRequest@mot.gov.il';
5+
6+
function getFormParams(dom) {
7+
const script = dom('#govFormsScript').html();
8+
const match = script?.match(/var\s+formParams\s*=\s*(?<formParams>\{[\s\S]*\})\s*;?\s*$/u);
9+
10+
if (!match) return null;
11+
12+
try {
13+
return JSON.parse(match.groups.formParams);
14+
} catch {
15+
return null;
16+
}
17+
}
518

619
export async function getReferenceNumber() {
720
const response = await ky.get(URL);
821
const html = await response.text();
922
const dom = load(html);
10-
const ref = dom('#ReferenceNumber').text().trim();
11-
const guid = dom('#_form_guid').val();
23+
const process = getFormParams(dom)?.process;
24+
const requestID = process?.requestID;
25+
const referenceNumber = process?.referenceNumber;
26+
const formUniqueID = process?.formUniqueID;
1227

13-
if (!ref || !guid) return null;
28+
if (requestID && referenceNumber !== undefined && referenceNumber !== null) {
29+
return {
30+
formUniqueID,
31+
referenceNumber: String(referenceNumber),
32+
requestID,
33+
};
34+
}
1435

15-
return { ref, guid };
36+
return null;
1637
}

tests/getReferenceNumber.test.js

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,26 @@ describe('getReferenceNumber', () => {
1616
cleanup();
1717
});
1818

19-
it('should return the reference number', async () => {
20-
get.resolves({ text: () => Promise.resolve('<span id="ReferenceNumber">1234567</span><input id="_form_guid" value="test-guid">') });
19+
it('should return the reference number and request id from formParams', async () => {
20+
get.resolves({
21+
text: () =>
22+
Promise.resolve(`<script type="text/javascript" id="govFormsScript"> var formParams = {
23+
"process": {
24+
"formUniqueID": "UJdQLbqX3BF1jDydDZJ0fQ",
25+
"requestID": "ff9869f2-aeec-4f37-a673-aa9ba23406b1",
26+
"referenceNumber": 143098
27+
}
28+
}</script>`),
29+
});
2130
const result = await getReferenceNumber();
22-
expect(result.ref).to.equal('1234567');
23-
expect(result.guid).to.equal('test-guid');
31+
expect(result).to.deep.equal({
32+
formUniqueID: 'UJdQLbqX3BF1jDydDZJ0fQ',
33+
referenceNumber: '143098',
34+
requestID: 'ff9869f2-aeec-4f37-a673-aa9ba23406b1',
35+
});
2436
});
2537

26-
it('should return null if #ReferenceNumber not found', async () => {
38+
it('should return null if formParams process identifiers are not found', async () => {
2739
get.resolves({ text: () => Promise.resolve('<div>No ref</div>') });
2840
const result = await getReferenceNumber();
2941
expect(result).to.be.null;

0 commit comments

Comments
 (0)