Updating billing details of an active consultation service order (Java)

In this use case, the user updates the details of an active consultation like the patient’s billing details, or add a test report, or change the appointment slot (if the consultation has not started) etc. Sometimes the healthcare service provider also updates an active consultation order.

Update

Code snippets

BPP receives protocol update

/*
Example Request JSON:
{
    "context": {
        "domain": "nic2004:85121",
        "country": "IND",
        "city": "std:080",
        "action": "update",
        "core_version": "0.9.2",
        "bap_id": "https://mock_bap.com/",
        "bap_uri": "https://mock_bap.com/beckn/",
        "transaction_id": "1239890342",
        "message_id": "123793824",
        "timestamp": "2021-03-23T10:00:40.065Z"
    },
    "message": {
        "update_target": "billing",
        "order": {
            "id": "order_1",
            "state": "Active",
            "items": [
                {
                    "id": "dr_veena_slot_1",
                    "quantity": {
                        "count": 1
                    }
                }
            ],
            "billing": {
                "name": "Jane Doe",
                "address": {
                    "door": "21A",
                    "name": "ABC Apartments",
                    "locality": "HSR Layout",
                    "city": "Bengaluru",
                    "state": "Karnataka",
                    "country": "India",
                    "area_code": "560102"
                },
                "email": "[email protected]",
                "phone": "+919876523210"
            },
            "fulfillment": {
                "type": "IN-PERSON",
                "end": {
                    "location": {
                        "id": "good-health-koramangala",
                        "gps": "12.9349377,77.6055586"
                    },
                    "time": {
                        "range": {
                            "start": "2021-08-11T04:30:00.000Z",
                            "end": "2021-08-11T05:30:00.000Z"
                        }
                    },
                    "contact": {
                        "phone": "+919876543210",
                        "email": "[email protected]"
                    }
                },
                "agent": {
                    "name": "Dr. Veena H",
                    "dob": "1989-08-12",
                    "gender": "Female",
                    "tags": {
                        "doctor_registration_no": "12345"
                    },
                    "phone": "+919876543210",
                    "email": "[email protected]"
                },
                "customer": {
                    "person": {
                        "name": "Remya C",
                        "dob": "1989-08-12",
                        "gender": "Female"
                    },
                    "contact": {
                        "phone": "+919898987676",
                        "email": "[email protected]"
                    }
                }
            },
            "quote": {
                "price": {
                    "currency": "INR",
                    "value": "1100"
                },
                "breakup": [
                    {
                        "title": "Consultation Charges",
                        "price": {
                            "currency": "INR",
                            "value": "1000"
                        }
                    },
                    {
                        "title": "Service Charge",
                        "price": {
                            "currency": "INR",
                            "value": "100"
                        }
                    }
                ],
                "ttl": "P1H"
            },
            "payment": {
                "uri": "https://api.bpp.com/pay?amt=$amount&txn_id=ksh87yriuro34iyr3p4&mode=upi&vpa=bpp@upi",
                "tl_method": "http/get",
                "params": {
                    "transaction_id": "ksh87yriuro34iyr3p4",
                    "amount": "1100",
                    "mode": "upi",
                    "vpa": "bpp@upi"
                },
                "type": "ON-FULFILLMENT",
                "status": "NOT-PAID"
            }
        }
    }
}
*/
    // BPP Update Endpoint
    @PostMapping("/bpp/update")
    public ResponseEntity update(
            @RequestHeader HttpHeaders headers,
            @RequestBody UpdateRequest request) {
        var response = bppApplicationService.update(request, headers);
        return ResponseEntity.ok(response);
    }

BPP processes the update

    public Response update(UpdateRequest request, HttpHeaders headers) {
        var onUpdateRequest = new OnUpdateRequest();
        // Validate the headers
        var isHeadersValid = validateHeaders(headers);
        // Construct and return error
        if (!isHeadersValid) return null;

        // Update the given order
        var updateOrder = request.getMessage().getOrder();

        // Execute business logic here

        // Generate the response
        onUpdateRequest = generateUpdatedOrderResponse(updateOrder);

        //invoke on_update api
        return invokeOnUpdate(onUpdateRequest, headers);
    }
}

BPP generates response

/*
Example Response JSON:
{
    "context": {
        "domain": "nic2004:85121",
        "country": "IND",
        "city": "std:080",
        "action": "on_update",
        "core_version": "0.9.2",
        "bap_id": "https://mock_bap.com/",
        "bap_uri": "https://mock_bap.com/beckn/",
        "transaction_id": "1239890342",
        "message_id": "123793824",
        "timestamp": "2021-03-23T10:00:40.065Z"
    },
    "message": {
        "order": {
            "id": "order_1",
            "state": "Active",
            "items": [
                {
                    "id": "dr_veena_slot_1",
                    "quantity": {
                        "count": 1
                    }
                }
            ],
            "billing": {
                "name": "Jane Doe",
                "address": {
                    "door": "21A",
                    "name": "ABC Apartments",
                    "locality": "HSR Layout",
                    "city": "Bengaluru",
                    "state": "Karnataka",
                    "country": "India",
                    "area_code": "560102"
                },
                "email": "[email protected]",
                "phone": "+919876523210"
            },
            "fulfillment": {
                "type": "IN-PERSON",
                "end": {
                    "location": {
                        "id": "good-health-koramangala",
                        "gps": "12.9349377,77.6055586"
                    },
                    "time": {
                        "range": {
                            "start": "2021-08-11T04:30:00.000Z",
                            "end": "2021-08-11T05:30:00.000Z"
                        }
                    },
                    "contact": {
                        "phone": "+919876543210",
                        "email": "[email protected]"
                    }
                },
                "agent": {
                    "name": "Dr. Veena H",
                    "dob": "1989-08-12",
                    "gender": "Female",
                    "tags": {
                        "doctor_registration_no": "12345"
                    },
                    "phone": "+919876543210",
                    "email": "[email protected]"
                },
                "customer": {
                    "person": {
                        "name": "Remya C",
                        "dob": "1989-08-12",
                        "gender": "Female"
                    },
                    "contact": {
                        "phone": "+919898987676",
                        "email": "[email protected]"
                    }
                }
            },
            "quote": {
                "price": {
                    "currency": "INR",
                    "value": "1200"
                },
                "breakup": [
                    {
                        "title": "Consultation Charges",
                        "price": {
                            "currency": "INR",
                            "value": "1000"
                        }
                    },
                    {
                        "title": "Service Charge",
                        "price": {
                            "currency": "INR",
                            "value": "100"
                        }
                    },
                    {
                        "title": "Reschedule charge",
                        "price": {
                            "currency": "INR",
                            "value": "100"
                        }
                    }
                ],
                "ttl": "P1H"
            },
            "payment": {
                "uri": "https://api.bpp.com/pay?amt=$amount&txn_id=ksh87yriuro34iyr3p4&mode=upi&vpa=bpp@upi",
                "tl_method": "http/get",
                "params": {
                    "transaction_id": "ksh87yriuro34iyr3p4",
                    "amount": "1200",
                    "mode": "upi",
                    "vpa": "bpp@upi"
                },
                "type": "ON-FULFILLMENT",
                "status": "NOT-PAID"
            }
        }
    }
}
*/
    public OnUpdateRequest generateUpdatedOrderResponse(UpdatedOrderDetails updatedDetails) {
        var updatedResult = UpdateResponseBuilder.builder.result(updateingDetails).build();
        // Convert response into protocol object similar to example above
        return updatedResult;
    }

BPP calls protocol on_update

    public Response invokeOnUpdate(OnUpdateRequest updateResponse, HttpHeaders headers) {
        if(updateResponse.getError() == null) {
            // Call BAP on_update api with the order response

            // Call to look up function which returns the the public key and BAP Endpoint to be called 
            var url = lookUp(headers);

            var response = apiClient.post(url[0] + Context.ActionEnum.on_update,
                constructResponseHeaders(),
                updateResponse,
                OnUpdateRequest.class);
            return Response.of("ACK", null);
        } else {
            return Response.of("NACK", null);
        }
    }