Creates selection menu of all the CSD organizations with a specified parent. Designed as part of heierarchical organization selection menus in RapidPro webhooks.
import module namespace functx = "http://www.functx.com"; declare namespace csd = "urn:ihe:iti:csd:2013"; declare variable $careServicesRequest as item() external; let $t_top_orgid := $careServicesRequest/query[@name = 'orgid']/text() let $top_org := (/csd:CSD/csd:organizationDirectory/csd:organization[@entityID = $t_top_orgid])[1] let $selected_text := $careServicesRequest/query[@name = 'input']/text() let $selected_index := if ($selected_text castable as xs:integer) then xs:integer($selected_text) else -1 let $selected := if ($selected_index = 0) then /csd:CSD/csd:organizationDirectory/csd:organization[ @entityID = /csd:CSD/csd:organizationDirectory/csd:organization[@entityID = $top_org/@entityID]/csd:parent/@entityID ] else if ($selected_index > 0) then let $select_orgs := if (exists($top_org)) then /csd:CSD/csd:organizationDirectory/csd:organization[./csd:parent/@entityID = $top_org/@entityID] else /csd:CSD/csd:organizationDirectory/csd:organization[count(./csd:parent[@entityID]) = 0] return ($select_orgs)[$selected_index] else () let $orgs := if (exists($selected) and local-name($selected ) = 'organization') then /csd:CSD/csd:organizationDirectory/csd:organization[./csd:parent/@entityID = $selected/@entityID] else /csd:CSD/csd:organizationDirectory/csd:organization[count(./csd:parent[@entityID]) = 0] let $output := if ( $selected[./csd:codedType/@code=7]) then <json type='object'> <menutext>Facility Selected</menutext> <facility>{string($selected/@entityID)}</facility> <facilityname>{$selected/csd:primaryName/text()}</facilityname> <orgcode>{string($selected/csd:otherID/@code)}</orgcode> </json> else if ( local-name($selected ) = 'organization' or not(exists($selected))) then <json type='object'> <menutext > { if (exists($selected)) then concat("In ", $selected/csd:primaryName/text(), ". ") else () } { let $parent := (/csd:CSD/csd:organizationDirectory/csd:organization[@entityID = $selected/csd:parent/@entityID])[1]/csd:primaryName/text() return if ($parent) then concat("O) Up to ", $parent, " ") else () } { for $ent at $pos in ($orgs) return concat( $pos, ") ", $ent/csd:primaryName/text()) } </menutext> <orgid>{if (exists($selected)) then string($selected/@entityID) else ()}</orgid> <orgcode>{string($selected/csd:otherID/@code)}</orgcode> <facility/> <facilityname/> </json> else <json type='object'/> (:return $output :) return json:serialize($output,map{'format':'direct'})
Creates selection menu of all the CSD organizations and faciltiies with a specified parent. Designed as part of heierarchical facility selection menus in RapidPro webhooks.
import module namespace functx = "http://www.functx.com"; declare namespace csd = "urn:ihe:iti:csd:2013"; declare variable $careServicesRequest as item() external; let $t_top_orgid := $careServicesRequest/query[@name = 'orgid']/text() let $top_org := (/csd:CSD/csd:organizationDirectory/csd:organization[@entityID = $t_top_orgid])[1] let $selected_text := $careServicesRequest/query[@name = 'input']/text() (: let $selections := $careServicesRequest/values/item[./pair[@name = 'label' and ./text() = 'facilityselection']] let $selected_text := if (count($selections) > 0) then let $max_time := max(for $time in $selections/pair[@name='time'] return xs:dateTime($time)) return $selections[./pair[@name = 'time'] = $max_time]/pair[@name='text']/text() else () :) let $selected_index := if ($selected_text castable as xs:integer) then xs:integer($selected_text) else -1 let $selected := if ($selected_index = 0) then /csd:CSD/csd:organizationDirectory/csd:organization[ @entityID = /csd:CSD/csd:organizationDirectory/csd:organization[@entityID = $top_org/@entityID]/csd:parent/@entityID ] else if ($selected_index > 0) then let $select_orgs := if (exists($top_org)) then /csd:CSD/csd:organizationDirectory/csd:organization[./csd:parent/@entityID = $top_org/@entityID] else /csd:CSD/csd:organizationDirectory/csd:organization[count(./csd:parent[@entityID]) = 0] let $select_facs := if (exists($top_org)) then /csd:CSD/csd:facilityDirectory/csd:facility[./csd:organizations/csd:organization[@entityID = $top_org/@entityID]] else () return ($select_orgs,$select_facs)[ $selected_index] else () let $orgs := if (exists($selected) and local-name($selected ) = 'organization') then /csd:CSD/csd:organizationDirectory/csd:organization[./csd:parent/@entityID = $selected/@entityID] else /csd:CSD/csd:organizationDirectory/csd:organization[count(./csd:parent[@entityID]) = 0] let $facs := if (exists($selected) and local-name($selected ) = 'organization') then /csd:CSD/csd:facilityDirectory/csd:facility[./csd:organizations/csd:organization[@entityID = $selected/@entityID]] else () let $output := if ( local-name($selected ) = 'facility') then <json type='object'> <menutext>You already selected a facility. You shouldn't see this message</menutext> <facility>{string($selected/@entityID)}</facility> <facilityname>{$selected/csd:primaryName/text()}</facilityname> </json> else if ( local-name($selected ) = 'organization' or not(exists($selected))) then <json type='object'> <menutext > { if (exists($selected)) then concat("In ", $selected/csd:primaryName/text(), ". ") else () } { let $parent := (/csd:CSD/csd:organizationDirectory/csd:organization[@entityID = $selected/csd:parent/@entityID])[1]/csd:primaryName/text() return if ($parent) then concat("O) Up to ", $parent, " ") else () } { for $ent at $pos in ($orgs,$facs) return concat( $pos, ") ", $ent/csd:primaryName/text()) } </menutext> <orgid>{if (exists($selected)) then string($selected/@entityID) else ()}</orgid> <facility/> <facilityname/> </json> else <json type='object'/> (:return $output :) return json:serialize($output,map{'format':'direct'})
Updates the CSD document by an import from Health Facility Registry export of the Organizational hierarchy
import module namespace dxf2csd = "http://dhis2.org/csd/dxf/2.0"; import module namespace csd_webconf = "https://github.com/openhie/openinfoman/csd_webconf"; import module namespace csd_dm = "https://github.com/openhie/openinfoman/csd_dm"; import module namespace functx = "http://www.functx.com"; declare namespace csd = "urn:ihe:iti:csd:2013"; declare variable $careServicesRequest as item() external; let $doc_name := string($careServicesRequest/@resource) let $doc := csd_dm:open_document($csd_webconf:db,$doc_name) let $org_dir := $doc/csd:CSD/csd:organizationDirectory let $oid := $careServicesRequest/oid let $csv_src := $careServicesRequest/csv let $csv := csv:parse($csv_src, map{ 'header': true()})/csv/record let $namespace_uuid := "7ee93e32-78da-4913-82f8-49eb0a618cfc" let $generate_UUID_v3 := function($name) { concat('urn:uuid:' , dxf2csd:generate_UUID_v3($name,$namespace_uuid)) } let $zone_csd := for $zone_record in distinct-values($csv/Zone) let $now := current-dateTime() let $zone_urn := $generate_UUID_v3(concat('zone:',$zone_record)) return <csd:organization entityID="{$zone_urn}"> <csd:codedType code="1" codingScheme="{$oid}"/> <csd:primaryName>{$zone_record}</csd:primaryName> <csd:record created="{$now}" updated="{$now}" sourceDirectory="http://hfrportal.ehealth.go.tz"/> </csd:organization> let $region_csd := for $region_record in distinct-values($csv/Region) let $now := current-dateTime() let $region_urn := $generate_UUID_v3(concat('region:',$region_record)) let $parent_urns := for $record in $csv let $zone := $record/Zone let $region := $record/Region return if($region_record=$region) then $generate_UUID_v3(concat('zone:',$zone)) else () return <csd:organization entityID="{$region_urn}"> <csd:codedType code="2" codingScheme="{$oid}"/> <csd:primaryName>{$region_record}</csd:primaryName> <csd:record created="{$now}" updated="{$now}" sourceDirectory="http://hfrportal.ehealth.go.tz"/> <csd:parent entityID="{$parent_urns[last()]}"/> </csd:organization> let $district_csd := for $district_record in distinct-values($csv/District) let $now := current-dateTime() let $district_urn := $generate_UUID_v3(concat('district:',$district_record)) let $parent_urns := for $record in $csv let $region := $record/Region let $district := $record/District return if($district_record=$district) then $generate_UUID_v3(concat('region:',$region)) else () return <csd:organization entityID="{$district_urn}"> <csd:codedType code="3" codingScheme="{$oid}"/> <csd:primaryName>{$district_record}</csd:primaryName> <csd:record created="{$now}" updated="{$now}" sourceDirectory="http://hfrportal.ehealth.go.tz"/> <csd:parent entityID="{$parent_urns[last()]}"/> </csd:organization> let $council_csd := for $council_record in distinct-values($csv/Council) let $now := current-dateTime() let $council_urn := $generate_UUID_v3(concat('council:',$council_record)) let $parent_urns := for $record in $csv let $district := $record/District let $council := $record/Council return if($council_record=$council) then $generate_UUID_v3(concat('district:',$district)) else () return <csd:organization entityID="{$council_urn}"> <csd:codedType code="4" codingScheme="{$oid}"/> <csd:primaryName>{$council_record}</csd:primaryName> <csd:record created="{$now}" updated="{$now}" sourceDirectory="http://hfrportal.ehealth.go.tz"/> <csd:parent entityID="{$parent_urns[last()]}"/> </csd:organization> let $ward_csd := for $ward_record in distinct-values($csv/Ward) let $now := current-dateTime() let $ward_urn := $generate_UUID_v3(concat('ward:',$ward_record)) let $parent_urns := for $record in $csv let $council := $record/Council let $ward := $record/Ward return if($ward_record=$ward) then $generate_UUID_v3(concat('council:',$council)) else () return if (not (contains($ward_record,"Not set"))) then <csd:organization entityID="{$ward_urn}"> <csd:codedType code="5" codingScheme="{$oid}"/> <csd:primaryName>{$ward_record}</csd:primaryName> <csd:record created="{$now}" updated="{$now}" sourceDirectory="http://hfrportal.ehealth.go.tz"/> <csd:parent entityID="{$parent_urns[last()]}"/> </csd:organization> else () let $village_csd := for $village_record in distinct-values($csv/VillageStreet) let $now := current-dateTime() let $village_urn := $generate_UUID_v3(concat('village:',$village_record)) let $parent_urns := for $record in $csv let $ward := if ((contains($record/Ward,"Not set"))) then $record/Council else($record/Ward) let $village := $record/VillageStreet return if($village_record=$village) then $generate_UUID_v3(concat('ward:',$ward)) else () return if (not (contains($village_record,"Not set"))) then <csd:organization entityID="{$village_urn}"> <csd:codedType code="6" codingScheme="{$oid}"/> <csd:primaryName>{$village_record}</csd:primaryName> <csd:record created="{$now}" updated="{$now}" sourceDirectory="http://hfrportal.ehealth.go.tz"/> <csd:parent entityID="{$parent_urns[last()]}"/> </csd:organization> else () let $facility_csd := for $record in $csv let $facNum := $record/FacilityNumber let $facName := $record/FacilityName let $now := current-dateTime() let $facility_urn := $generate_UUID_v3(concat('facility:',$facNum)) let $parent := if ((contains($record/VillageStreet,"Not set"))) then (if ((contains($record/Ward,"Not set"))) then $record/Council else $record/Ward) else($record/VillageStreet) let $parent_string := if ((contains($record/VillageStreet,"Not set"))) then (if ((contains($record/Ward,"Not set"))) then "council:" else "ward:") else("village:") let $parent_urn := $generate_UUID_v3(concat($parent_string,$parent)) return if (not (contains($facName,"Not set"))) then <csd:organization entityID="{$facility_urn}"> <csd:otherID assigningAuthorityName='health_facility_registry' code="{$facNum}"/> <csd:codedType code="7" codingScheme="{$oid}"/> <csd:primaryName>{$facName/text()}</csd:primaryName> <csd:record created="{$now}" updated="{$now}" sourceDirectory="http://hfrportal.ehealth.go.tz"/> <csd:parent entityID="{$parent_urn}"/> </csd:organization> else () let $csd := <csd:CSD> <csd:organizationDirectory> {($zone_csd,$region_csd,$district_csd,$council_csd,$ward_csd,$village_csd,$facility_csd)} </csd:organizationDirectory> <csd:serviceDirectory/> <csd:facilityDirectory/> <csd:providerDirectory/> </csd:CSD> return csd_dm:add($csd_webconf:db,$csd,$doc_name)
Updates the CSD document by an import from Resource Map's export of the Organizational hierarchy
import module namespace dxf2csd = "http://dhis2.org/csd/dxf/2.0"; import module namespace csd_dm = "https://github.com/openhie/openinfoman/csd_dm"; import module namespace functx = "http://www.functx.com"; declare namespace csd = "urn:ihe:iti:csd:2013"; declare variable $careServicesRequest as item() external; let $doc_name := string($careServicesRequest/@resource) let $doc := csd_dm:open_document($doc_name) let $oid := $careServicesRequest/oid let $csv_src := $careServicesRequest/csv let $csv := csv:parse($csv_src, map{ 'header': true()})/csv/record let $namespace_uuid := "7ee93e32-78da-4913-82f8-49eb0a618cfc" let $generate_UUID_v3 := function($name) { concat('urn:uuid:' , dxf2csd:generate_UUID_v3($name,$namespace_uuid)) } let $csd_orgs := for $record in $csv let $village := $record/VillMtaa let $ward := $record/Ward let $council := $record/Council let $district := $record/District let $region := $record/Region let $zone := $record/Zone let $country := $record/Country let $name := $record/Name let $id := $record/NodeID let $urn := $generate_UUID_v3(concat('organization:',$id)) let $level := if (not(functx:all-whitespace($village))) then '6' else if (not(functx:all-whitespace($ward))) then '5' else if (not(functx:all-whitespace($council))) then '4' else if (not(functx:all-whitespace($district))) then '3' else if (not(functx:all-whitespace($region))) then '2' else if (not(functx:all-whitespace($zone))) then '1' else if (not(functx:all-whitespace($country))) then '0' else () let $pid := if ( not(functx:all-whitespace($village)) ) then $csv[./Country = $country and ./Zone = $zone and ./Region = $region and ./District = $district and ./Council = $council and ./Ward = $ward and functx:all-whitespace(./VillMtaa)]/NodeID/text() else if (not(functx:all-whitespace($ward))) then $csv[./Country = $country and ./Zone = $zone and ./Region = $region and ./District = $district and ./Council = $council and functx:all-whitespace(./VillMtaa) and functx:all-whitespace(./Ward)]/NodeID/text() else if (not(functx:all-whitespace($council))) then $csv[./Country = $country and ./Zone = $zone and ./Region = $region and ./District = $district and functx:all-whitespace(./Council) and functx:all-whitespace(./VillMtaa) and functx:all-whitespace(./Ward) ]/NodeID/text() else if (not(functx:all-whitespace($district))) then $csv[./Country = $country and ./Zone = $zone and ./Region = $region and functx:all-whitespace(./District) and functx:all-whitespace(./Council) and functx:all-whitespace(./VillMtaa) and functx:all-whitespace(./Ward) ]/NodeID/text() else if (not(functx:all-whitespace($region))) then $csv[./Country = $country and ./Zone = $zone and functx:all-whitespace(./Region) and functx:all-whitespace(./District) and functx:all-whitespace(./Council) and functx:all-whitespace(./VillMtaa) and functx:all-whitespace(./Ward)]/NodeID/text() else if (not(functx:all-whitespace($zone))) then $csv[./Country = $country and functx:all-whitespace(./Zone) and functx:all-whitespace(./Region) and functx:all-whitespace(./District) and functx:all-whitespace(./Council) and functx:all-whitespace(./VillMtaa) and functx:all-whitespace(./Ward)]/NodeID/text() else () let $parent := if ($pid) then let $parent_urn := $generate_UUID_v3(concat('organization:',$pid)) return <csd:parent entityID="{$parent_urn}"/> else () return if (($name) and ($level) and ($urn) ) then <csd:organization entityID="{$urn}"> <csd:otherID assigningAuthorityName='resource_map_tanzania' code="{$id}"/> <csd:codedType code="{$level}" codingScheme="{$oid}"/> <csd:primaryName>{$name/text()}</csd:primaryName> {$parent} </csd:organization> else ($record) (:no name or id or type :) let $csd := <csd:CSD> <csd:organizationDirectory> {$csd_orgs} </csd:organizationDirectory> <csd:serviceDirectory/> <csd:facilityDirectory/> <csd:providerDirectory/> </csd:CSD> return csd_dm:add($csd,$doc_name)