Cancellation of an order with reason for cancellation (Java)
In this use case, the user cancels the order. Sometimes, the pharmacy asks for a reason for cancellation before cancelling the order that the user has to provide. The pharmacy’s cancellation policy is also communicated to the user on or before the cancellation of the order. The cancellation policy includes terms like cancellation charges, last time of cancellation, refund policy etc
Code snippets
BPP receives protocol cancel
/*
Example Request JSON:
{
"context": {
"domain": "nic2004:52311",
"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:52311",
"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": "vit_c",
"price" : {
"currency": "INR",
"value": "500"
},
"quantity": {
"selected": {
"count": 1
}
}
},
{
"id": "a_500",
"price" : {
"currency": "INR",
"value": "500"
},
"quantity": {
"selected": {
"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": {
"type": "HOME-DELIVERY",
"start": {
"location": {
"id": "abc_medicines_koramangala",
"descriptor": {
"name": "ABC Medicines"
},
"gps": "12.9349377,77.6055586"
},
"contact": {
"phone": "+919999999999",
"email": "[email protected]"
}
},
"end": {
"location": {
"gps": "12.914028, 77.638698",
"address": {
"door": "21A",
"name": "ABC Apartments",
"locality": "HSR Layout",
"city": "Bengaluru",
"state": "Karnataka",
"country": "India",
"area_code": "560102"
}
},
"time": {
"range": {
"start": "2021-06-15T07:11:36.212Z",
"end": "2021-06-15T07:12:36.212Z"
}
},
"instructions": {
"name": "drop off instructions",
"short_desc": "Leave at door step"
},
"contact": {
"phone": "+919876543210",
"email": "[email protected]"
}
},
"customer": {
"person":{
"name": "John Doe",
"image": "https://mock_bap.com/prescription1.jpg",
"dob": "1991-08-12"
}
}
},
"quote": {
"price": {
"currency": "INR",
"value": "1100"
},
"breakup": [
{
"title": "Vitamin C",
"price": {
"currency": "INR",
"value": "500"
}
},
{
"title": "Antibiotics",
"price": {
"currency": "INR",
"value": "500"
}
},
{
"title": "Delivery 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);
}
}