From da2fb6a8e095d6b55908cd5561f7340c415185a3 Mon Sep 17 00:00:00 2001 From: Venkatesh Babu Date: Sat, 30 Mar 2024 14:37:27 +0530 Subject: [PATCH] Add additional demo scenario --- docs/demo_healthcare.md | 142 +++++++++++++++++++++++ docs/images/message_validation_in_ba.png | Bin 0 -> 22293 bytes 2 files changed, 142 insertions(+) create mode 100644 docs/demo_healthcare.md create mode 100644 docs/images/message_validation_in_ba.png diff --git a/docs/demo_healthcare.md b/docs/demo_healthcare.md new file mode 100644 index 0000000..a9d5ff5 --- /dev/null +++ b/docs/demo_healthcare.md @@ -0,0 +1,142 @@ +# Creating a Beckn network for healthcare using Beckn ONIX and transacting on it. + +## Introduction + +[Beckn](https://becknprotocol.io/) as a protocol allows creation of decentralised commerce network across many domains. Healthcare is one of them. Beckn ONIX is a project aimed at easing setup and maintanence of Beckn network for different domains. It provides utilities to quickly setup the core Beckn network as well as provides tools to enable domain specific transactions. The latter is achieved through the use of layer 2 configuration files. + +The [Beckn ONIX User Guide](./user_guide.md) provides an overall understanding of setup of the core Beckn network as well as download and ingestion of Layer 2 configuration files. The [step by step demo](./demo_walkthrough.md) walks through one such installation in great detail. The layer 2 configurations illustrated in that demo belong to the retail and energy domain. + +## Healthcare usecases on Beckn network + +A sample of the usecases that can be imagined on Beckn networks include + +- Discovery and request for ambulance service including scenarios such as + - Requesting an immediate ambulance service + - Scheduled pickup by ambulance + - Querying special ambulances for certain category of patients + - Requesting with both start and destination locations +- Blood bank related use cases including + - Finding and transacting for emergency blood + - Identifying and enrolling for donation +- Doctor consultation including + - search by location + - search by speciality +- Diagnostics related transactions including +- Pharmacy related transactions including + - Location aware search + +## Setting up Beckn network for healthcare usecases + +Setting up of a network for healthcare related use cases follows the same steps as illustrated in the [step by step demo](./demo_walkthrough.md) document. The primary differences is the layer 2 configuration file downloaded will be specific to healthcare and suited to conduct healthcare transactions. A sample layer 2 config for healthcare is available in the beckn_onix/layer2/samples folder and its path can be provided when running download_layer_2_config_bap.sh and download_layer_2_config_bpp.sh. If you are joining a network administered by a network facilitator, they might have a different layer 2 config and that should be used instead of the sample. + +The following is a conceptual view of core and layer 2 config from a perspective of validation +![Validation in Beckn Adaptor](./images/message_validation_in_ba.png) + +## Writing Layer 2 configuration file for healthcare domain + +Layer 2 configuration file addresses two primary concerns + +- The rules and policies agreed by participants from the healtcare domain and agreed upon usually through working groups or other mechanisms +- The rules and policies required by the network facilitator. + +At an implementation level, the layer 2 configuration has additional data over core in two primary areas + +- Description, examples and other non-machine enforceable information. These are useful for implementors to get the big picture, perform semantic validation and use example requests as base for their own modifications. +- Rules and policies against which incoming messages can be validated. These are over and above those in the core and cover domain specific scenarios. + +## Sample validations that can be encoded into layer 2 configuration + +1. Limiting values to a fixed set of enumerations. Examples include + +- Limiting fulfillment type to ["walk-in","doorstep service"] for diagnostics +- Limiting fulfillment type to ["IN-STORE_PICKUP","HOME-DELIVERY"] for items in pharmacy +- Limiting fulfillment type to ["EMERGENCY","NORMAL"] for blood bank related queries + +``` +type: object +properties: + type: + type: string + enum: + - EMERGENCY + - NORMAL +required: + - type +``` + +2. Limiting values using minimum and maximum + +- Setting minimum and maximum of count field of unitized object to indicate a single unit item in medicine packages + +``` +unitized: + description: This represents the quantity available in a single unit of the item + type: object + properties: + count: + type: integer + minimum: 1 + maximum: 1 + measure: + $ref: '#/components/schemas/Scalar' +``` + +3. Marking an optional field in the core as required in the layer 2 config + +- Mandating feedback form be filled after consultation during rating +- Mandating cancellation reason for appointment cancellation +- Mandating credentials of doctor be present in search + +``` +type: object +properties: + cancellation_reason: + type: string +required: + - cancellation_reason +``` + +4. Mandating custom tags to be present in the tag list + +- Requiring the symptoms field be filled before the doctor's appointment is confirmed +- Requiring the qualifications of doctor to be returned ih search results in either skills or verifiable creds + +``` +type: object +properties: + creds: + type: object + skills: + type: object +oneOf: +- required: + - skills +- required: + - creds +``` + +5. Conditional requirement based on value of a different field + +- If item is medical equipment, additinoal description should be present + +``` +type: object +properties: + code: + type: string + additional_desc: + type: string +anyOf: +- not: + properties: + code: + const: "medical-equipment" + required: + - code +- required: + - additional_desc +``` + +## Conclusion + +Multitide DHP related use cases can be implemented on the Beckn networks. The process Beckn ONIX follows to create core Beckn network and allowing participants to download layer 2 configuration is identical across domains. Layer 2 configuration captures both domain policies and rules as well as those enforced by the network facilitators. Layer 2 configuration are both prescriptive as well as mandatory. The mandatory rules and policies can be written on top of the core spec within the layer 2 config and can be enforced by incorporating a validator in the workflow. diff --git a/docs/images/message_validation_in_ba.png b/docs/images/message_validation_in_ba.png new file mode 100644 index 0000000000000000000000000000000000000000..610722256e659dfdd96381d9bb812df5fcc63726 GIT binary patch literal 22293 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 literal 0 HcmV?d00001