Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
147 changes: 46 additions & 101 deletions adaptors/library/jobs/CommCare-FHIR.js
Original file line number Diff line number Diff line change
@@ -1,108 +1,53 @@
// CommCare form submission mapped to the FHIR patient encounter standard,
// submitted by Simon Kelly @ Dimagi.
encounter(
fields(
field('resourceType', 'Encounter'),
field('status', 'finished'),
field('type', function (state) {
return [
encounter({
resourceType: 'Encounter',
status: 'finished',
type: [{ coding: [{ system: 'momconnect:type', code: '8' }] }],
contained: [
{
resourceType: 'Patient',
id: 'patient',
identifier: [
{ use: 'official', system: 'momconnect:sanid', value: $.data.properties.id_number },
],
name: [
{
coding: [
{
system: 'momconnect:type',
code: '8',
},
],
use: 'official',
family: [$.data.properties.family_name],
given: [$.data.properties.given_name],
text: `${$.data.properties.given_name} ${$.data.properties.family_name}`,
},
];
}),
field('contained', function (state) {
return [
],
gender: 'female',
birthDate: $.data.properties.dob,
telecom: [{ system: 'phone', value: $.data.properties.msisdn }],
communication: [
{
resourceType: 'Patient',
id: 'patient',
identifier: [
{
use: 'official',
system: 'momconnect:sanid',
value: dataValue('properties.id_number')(state),
},
],
name: [
{
use: 'official',
family: [dataValue('properties.family_name')(state)],
given: [dataValue('properties.given_name')(state)],
text: dataValue('properties.given_name')(state).concat(
' ',
dataValue('properties.family_name')(state)
),
},
],
gender: 'female',
birthDate: dataValue('properties.dob')(state),
telecom: [
{
system: 'phone',
value: dataValue('properties.msisdn')(state),
},
],
communication: [
{
language: {
coding: [
{
system: 'urn:ietf:bcp:47',
code: dataValue('properties.language_code')(state),
},
],
},
preferred: true,
},
],
},
{
resourceType: 'Observation',
id: 'edd',
code: {
coding: [
{
system: 'http://loinc.org',
code: '11778-8',
display: 'Delivery date Estimated',
},
],
language: {
coding: [{ system: 'urn:ietf:bcp:47', code: $.data.properties.language_code }],
},
valueDateTime: dataValue('properties.edd')(state),
status: 'preliminary',
},
];
}),
field('patient', function (state) {
return {
reference: '#patient',
};
}),
field('period', function (state) {
return {
start: dataValue('properties.visit_date')(state),
};
}),
field('extension', function (state) {
return [
{
url: 'momconnect:mha',
valueInteger: 2,
},
{
url: 'momconnect:swt',
valueInteger: 3,
},
{
url: 'momconnect:dmsisdn',
valueString: '+27831111111',
preferred: true,
},
];
})
)
);
],
},
{
resourceType: 'Observation',
id: 'edd',
code: {
coding: [
{ system: 'http://loinc.org', code: '11778-8', display: 'Delivery date Estimated' },
],
},
valueDateTime: $.data.properties.edd,
status: 'preliminary',
},
],
patient: { reference: '#patient' },
period: { start: $.data.properties.visit_date },
extension: [
{ url: 'momconnect:mha', valueInteger: 2 },
{ url: 'momconnect:swt', valueInteger: 3 },
{ url: 'momconnect:dmsisdn', valueString: '+27831111111' },
],
});
18 changes: 6 additions & 12 deletions adaptors/library/jobs/Create-SMS-Linked-to-Contact-in-SF.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,6 @@
create(
'SMS__c',
fields(
field('text__c', dataValue('message_text')),
relationship(
'Contact__r',
'Contact_Phone_Number__c',
dataValue('from_number')
),
field('date__c', dataValue('date'))
)
);
// Create an SMS record in Salesforce linked to a Contact by phone number
create('SMS__c', {
text__c: $.data.message_text,
Contact__r: { Contact_Phone_Number__c: $.data.from_number },
date__c: $.data.date,
});
Original file line number Diff line number Diff line change
Expand Up @@ -3,53 +3,50 @@
blocks, submitted by Taylor Downs @ OpenFn.
*/

beta.each(
'$.data.data[*]',
create(
'ODK__c',
fields(
field('Event_Type__c', dataValue('event_type')),
field('Training_Type__c', dataValue('training_type')),
field('Event_Leader_ID__c', dataValue('leader')),
field('Event_Date__c', dataValue('date')),
field('metainstanceid__c', dataValue('*meta-instance-id*'))
)
)
// Step 1: Create a parent ODK record for each submission
each(
$.data.data,
create('ODK__c', {
Event_Type__c: $.data.event_type,
Training_Type__c: $.data.training_type,
Event_Leader_ID__c: $.data.leader,
Event_Date__c: $.data.date,
metainstanceid__c: $.data['*meta-instance-id*'],
})
);

beta.each(
merge(
dataPath('data[*].attendee_new[*]'),
fields(field('parentId', lastReferenceValue('id')))
),
create(
'ODK_Child_2__c',
fields(
field('ODK__c', dataValue('parentId')),
field('Barcode__c', dataValue('new_attendee_id')),
field('First_Name__c', dataValue('new_attendee_first_name')),
field('Last_Name__c', dataValue('new_attendee_last_name')),
field('Phone_Number__c', dataValue('new_attendee_phone'))
)
)
// Step 2: Flatten child records across all submissions, attaching the parent ID
fn(state => {
const parentId = state.references[state.references.length - 1].id;
return {
...state,
newAttendees: state.data.data.flatMap(sub =>
(sub.attendee_new || []).map(a => ({ ...a, parentId }))
),
attendees: state.data.data.flatMap(sub =>
(sub.attendee || []).map(a => ({ ...a, parentId }))
),
};
});

// Step 3: Create child records for new attendees
each(
$.newAttendees,
create('ODK_Child_2__c', {
ODK__c: $.data.parentId,
Barcode__c: $.data.new_attendee_id,
First_Name__c: $.data.new_attendee_first_name,
Last_Name__c: $.data.new_attendee_last_name,
Phone_Number__c: $.data.new_attendee_phone,
})
);

beta.each(
merge(
dataPath('data[*].attendee[*]'),
fields(
field('parentId', function (state) {
return state.references[state.references.length - 1].id;
})
// ^^ This will get the sfID of the 1st item created.
)
),
create(
'ODK_Child_1__c',
fields(
field('ODK__c', dataValue('parentId')),
field('Barcode__c', dataValue('attendee_id')),
field('Late__c', dataValue('late'))
)
)
// Step 4: Create child records for existing attendees
each(
$.attendees,
create('ODK_Child_1__c', {
ODK__c: $.data.parentId,
Barcode__c: $.data.attendee_id,
Late__c: $.data.late,
})
);
47 changes: 21 additions & 26 deletions adaptors/library/jobs/alter-state-before-operations.js
Original file line number Diff line number Diff line change
@@ -1,31 +1,26 @@
// Here, we make sure CommCare gives us an array to use in each(merge(...), ...)
// Pre-process: normalize data to an array and merge in parent-level fields.
// Use fn() + array.map() instead of merge() + dataPath() to enrich child items.
fn(state => {
const idCards = state.data.form.ID_cards_given_to_vendor;
if (!Array.isArray(idCards)) {
state.data.form.ID_cards_given_to_vendor = [idCards];
}
return state;
const { ID_cards_given_to_vendor, ID_vendor } = state.data.form;
const cards = Array.isArray(ID_cards_given_to_vendor)
? ID_cards_given_to_vendor
: [ID_cards_given_to_vendor];

return {
...state,
processedCards: cards.map(card => ({
sp_id: card,
vendor_badge_code: ID_vendor,
distribution_date: state.data.form.meta.timeEnd,
})),
};
});

// Now state has been changed, and we carry on...
each(
merge(
dataPath('form.ID_cards_given_to_vendor[*]'),
fields(
field('Vendor_Id', dataValue('form.ID_vendor')),
field('form_finished_time', dataValue('form.meta.timeEnd'))
)
),
upsert(
'Small_Packet__c',
'sp_id__c',
fields(
field('sp_id__c', dataValue('ID_cards_given_to_vendor')),
relationship('Vendor__r', 'Badge_Code__c', dataValue('Vendor_Id')),
field(
'Small_Packet_Distribution_Date__c',
dataValue('form_finished_time')
)
)
)
$.processedCards,
upsert('Small_Packet__c', 'sp_id__c', {
sp_id__c: $.data.sp_id,
Vendor__r: { Badge_Code__c: $.data.vendor_badge_code },
Small_Packet_Distribution_Date__c: $.data.distribution_date,
})
);
Loading