Cancellation of a diagnostic service appointment with reason for cancellation (Java)
In this use case, the user or the diagnostic center cancels the appointment with or without reason
Code snippets
BPP receives protocol cancel
/*
Example Request JSON:
{
"context": {
"domain": "nic2004:85195",
"country": "IND",
"city": "std:080",
"action": "cancel",
"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",
"cancellation_reason_id": "reason_3"
}
}
*/
// BPP Cancel Endpoint
@PostMapping("/bpp/cancel")
public ResponseEntity cancel(
@RequestHeader HttpHeaders headers,
@RequestBody CancelRequest request) {
var response = bppApplicationService.cancel(request, headers);
return ResponseEntity.ok(response);
}
BPP processes the cancel
public Response cancel(CancelRequest request, HttpHeaders headers) {
var onCancelRequest = new OnCancelRequest();
// Validate the headers
var isHeadersValid = validateHeaders(headers);
// Construct and return error
if (!isHeadersValid) return null;
// Cancel the given order
var cancelOrder = request.getMessage().getOrderId();
// Execute business logic here
// Generate the response
onCancelRequest = generateCancelledOrderResponse(cancelOrder);
//invoke on_cancel api
return invokeOnCancel(onCancelRequest, headers);
}
}
BPP generates response
/*
Example Response JSON:
{
"context": {
"domain": "nic2004:85195",
"country": "IND",
"city": "std:080",
"action": "on_status",
"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": "Cancelled",
"items": [
{
"id": "health_checkup",
"quantity": {
"count": 1
}
}
],
"billing": {
"name": "John Doe",
"address": {
"door": "21A",
"name": "ABC Apartments",
"locality": "HSR Layout",
"city": "Bengaluru",
"state": "Karnataka",
"country": "India",
"area_code": "560102"
},
"email": "[email protected]",
"phone": "+919876543210"
},
"fulfillment": {
"end": {
"location": {
"id": "srs-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]"
}
}
},
"quote": {
"price": {
"currency": "INR",
"value": "1100"
},
"breakup": [
{
"title": "Lab 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"
}
}
}
}
*/
public OnCancelRequest generateCancelledOrderResponse(CancelledOrderDetails cancelOrderDetails) {
var cancelResult = CancelResponseBuilder.builder.result(cancelOrderDetails).build();
// Convert response into protocol object similar to example above
return cancelResult;
}
BPP calls protocol on_cancel
public Response invokeOnCancel(OnCancelRequest cancelResponse, HttpHeaders headers) {
if(cancelResponse.getError() == null) {
// Call BAP on_cancel 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);
// Call BAP on_cancel api with the cancelled order object
var response = apiClient.post(url[0] + Context.ActionEnum.on_cancel,
constructResponseHeaders(),
cancelResponse,
OnCancelRequest.class);
return Response.of("ACK", null);
} else {
return Response.of("NACK", null);
}
}