예제 #1
0
  /**
   * 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);
    }
  }