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 oi_csv = "https://github.com/openhie/openinfoman/adapter/csv"; declare namespace csd = "urn:ihe:iti:csd:2013"; declare variable $careServicesRequest as item() external; oi_csv:get_serialized(/,$careServicesRequest)
Get JSON representation of CSD for import to RapidPro via API
import module namespace csr_proc = "https://github.com/openhie/openinfoman/csr_proc"; import module namespace csd_webconf = "https://github.com/openhie/openinfoman/csd_webconf"; declare namespace csd = "urn:ihe:iti:csd:2013"; declare variable $careServicesRequest as item() external; let $careServicesSubRequest := <csd:careServicesRequest> <csd:function urn="urn:ihe:iti:csd:2014:stored-function:provider-search" > <csd:requestParams/> </csd:function> </csd:careServicesRequest> let $providers := csr_proc:process_CSR_stored_results( /. , $careServicesSubRequest) let $contacts := <json type='object'> <contacts type="array"> { for $provider in $providers/csd:providerDirectory/csd:provider let $uuid := lower-case(string($provider/@entityID)) let $name := ($provider/csd:demographic/csd:name/csd:commonName)[1]/text() let $tels := $provider/csd:demographic/csd:contactPoint/csd:codedType[@code="BP" and @codingScheme="urn:ihe:iti:csd:2013:contactPoint"] let $tel_1 := $tels[1]/text() let $tel_2 := $tels[2]/text() let $tel_3 := $tels[3]/text() return if (true()) (: ($uuid and $name) :) then <_ type="object"> <name>{$name}</name> <urns type="array"> { if ($tel_1) then <_ type='string'>tel:{$tel_1}</_> else ()} { if ($tel_2) then <_ type='string'>tel:{$tel_2}</_> else ()} { if ($tel_3) then <_ type='string'>tel:{$tel_3}</_> else ()} </urns> <fields type="object"> <globalid>{$uuid}</globalid> </fields> </_> else () } </contacts> </json> return json:serialize($contacts,map{"format":"direct"})
Statistics on phone numbers
import module namespace functx = "http://www.functx.com"; declare namespace csd = "urn:ihe:iti:csd:2013"; declare variable $careServicesRequest as item() external; let $country_code := '+231' let $cellcom_code := '77' let $get_clean_phones := function($provider) { let $all_phones := $provider/csd:demographic/csd:contactPoint/csd:codedType[@code = "BP" and @codingScheme="urn:ihe:iti:csd:2013:contactPoint"] let $clean_phones := for $phone in $all_phones let $raw_phones := tokenize($phone/text(),'[/\s]+') let $normalized_phones := for $raw_phone in $raw_phones let $clean_phone := replace($raw_phone,'[^\d\+]/', '') return if (string-length($clean_phone) = 0) then () else if (starts-with($clean_phone,'0')) then concat($country_code, substring($clean_phone,2)) else $clean_phone return $normalized_phones return $clean_phones } let $clean_providers := for $provider in /csd:CSD/csd:providerDirectory/csd:provider let $clean_phones := $get_clean_phones($provider) where count($clean_phones) > 0 return $provider let $cellcom_providers := for $provider in $clean_providers let $clean_phones := $get_clean_phones($provider) let $cellcom_phones := for $clean_phone in $clean_phones return if (starts-with($clean_phone,concat($country_code,$cellcom_code))) then $clean_phone else () where (count($cellcom_phones) > 0) return $provider let $multi_providers := for $provider in $clean_providers let $clean_phones := $get_clean_phones($provider) where (count($clean_phones) > 1) return $provider return <div> <ul> <li>Total number of health workers: {count(/csd:CSD/csd:providerDirectory/csd:provider)}</li> <li>Total number of health workers with phone: {count($clean_providers)}</li> <li>Total number of health workers with cellcom phone: {count($cellcom_providers)}</li> <li>Total number of health workers with multiple phones: {count($multi_providers)}</li> </ul> </div>
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'})