/** * 2.2.6 Save CallDetails API IVR shall invoke this API to send MA call details to MoTech. * /api/mobileacademy/callDetails * * <p>3.2.2 Save Call Details API This API enables IVR to send call details to NMS_MoTech_MK. This * data is further saved in NMS database and used for reporting purpose. * /api/mobilekunji/callDetails */ @RequestMapping( value = "/{serviceName}/callDetails", method = RequestMethod.POST, headers = {"Content-type=application/json"}) @ResponseStatus(HttpStatus.OK) @Transactional public void saveCallDetails( @PathVariable String serviceName, @RequestBody CallDetailRecordRequest callDetailRecordRequest) { Service service = null; StringBuilder failureReasons; if (!(MOBILE_ACADEMY.equals(serviceName) || MOBILE_KUNJI.equals(serviceName))) { throw new IllegalArgumentException(String.format(INVALID, "serviceName")); } failureReasons = validate( callDetailRecordRequest.getCallingNumber(), callDetailRecordRequest.getCallId(), callDetailRecordRequest.getOperator(), callDetailRecordRequest.getCircle()); // Verify common elements // (callStartTime, callEndTime, callDurationInPulses, endOfUsagePromptCount, callStatus, // callDisconnectReason) failureReasons.append(validateCallDetailsCommonElements(callDetailRecordRequest)); if (MOBILE_ACADEMY.equals(serviceName)) { service = Service.MOBILE_ACADEMY; } if (MOBILE_KUNJI.equals(serviceName)) { service = Service.MOBILE_KUNJI; // Verify MK elements (welcomeMessagePromptFlag) failureReasons.append(validateCallDetailsMobileKunjiElements(callDetailRecordRequest)); } for (CallContentRequest callContentRequest : callDetailRecordRequest.getContent()) { failureReasons.append(validateCallContentRequest(service, callContentRequest)); } if (failureReasons.length() > 0) { throw new IllegalArgumentException(failureReasons.toString()); } FrontLineWorker flw = frontLineWorkerService.getByContactNumber(callDetailRecordRequest.getCallingNumber()); if (null == flw) { throw new NotFoundException(String.format(NOT_FOUND, "callingNumber")); } createCallDetailRecord(flw, callDetailRecordRequest, service); // if this is the FLW's first time calling the service, set her status to ACTIVE if (flw.getStatus() == FrontLineWorkerStatus.INACTIVE) { flw.setStatus(FrontLineWorkerStatus.ACTIVE); frontLineWorkerService.update(flw); } }