diff --git a/imi/src/main/java/org/motechproject/nms/imi/domain/CallSummaryRecord.java b/imi/src/main/java/org/motechproject/nms/imi/domain/CallSummaryRecord.java index 4c64f11eb..99e5a15bf 100644 --- a/imi/src/main/java/org/motechproject/nms/imi/domain/CallSummaryRecord.java +++ b/imi/src/main/java/org/motechproject/nms/imi/domain/CallSummaryRecord.java @@ -203,7 +203,8 @@ public CallSummaryRecordDto toDto() { circle, timestamp, opt_in_call_eligibility, - opt_in_input + opt_in_input, + serviceId ); } } diff --git a/kilkari/src/main/java/org/motechproject/nms/kilkari/dto/CallSummaryRecordDto.java b/kilkari/src/main/java/org/motechproject/nms/kilkari/dto/CallSummaryRecordDto.java index e612ecdb8..2bc9dd59d 100644 --- a/kilkari/src/main/java/org/motechproject/nms/kilkari/dto/CallSummaryRecordDto.java +++ b/kilkari/src/main/java/org/motechproject/nms/kilkari/dto/CallSummaryRecordDto.java @@ -37,6 +37,8 @@ public class CallSummaryRecordDto implements Serializable { private String opt_in_input; + private String serviceId; + public CallSummaryRecordDto() { } //CHECKSTYLE:OFF @@ -53,7 +55,7 @@ public CallSummaryRecordDto(String subscriptionId, int statusCode, int finalStat } public CallSummaryRecordDto(String subscriptionId, int statusCode, int finalStatus, String contentFileName, - String weekId, String languageCode, String circleName, String targetFileTimeStamp, Boolean opt_in_call_eligibility, String opt_in_input) { + String weekId, String languageCode, String circleName, String targetFileTimeStamp, Boolean opt_in_call_eligibility, String opt_in_input,String serviceId) { this.subscriptionId = subscriptionId; this.statusCode = statusCode; this.finalStatus = finalStatus; @@ -64,6 +66,7 @@ public CallSummaryRecordDto(String subscriptionId, int statusCode, int finalStat this.targetFileTimeStamp = targetFileTimeStamp; this.opt_in_call_eligibility = opt_in_call_eligibility; this.opt_in_input = opt_in_input; + this.serviceId = serviceId; } // Helper constructor for ITs @@ -155,6 +158,14 @@ public void setTargetFileTimeStamp(String targetFileTimeStamp) { this.targetFileTimeStamp = targetFileTimeStamp; } + public String getServiceId() { + return serviceId; + } + + public void setServiceId(String serviceId) { + this.serviceId = serviceId; + } + @Ignore public static CallSummaryRecordDto fromParams(Map params) { CallSummaryRecordDto csr; @@ -168,7 +179,8 @@ public static CallSummaryRecordDto fromParams(Map params) { (String) params.get("circleName"), (String) params.get("targetFileTimeStamp"), (Boolean) params.get("opt_in_call_eligibility"), - (String) params.get("opt_in_input") + (String) params.get("opt_in_input"), + (String) params.get("serviceId") ); return csr; } @@ -186,6 +198,7 @@ public static Map toParams(CallSummaryRecordDto csr) { params.put("targetFileTimeStamp", csr.targetFileTimeStamp); params.put("opt_in_call_eligibility", csr.opt_in_call_eligibility); params.put("opt_in_input", csr.opt_in_input); + params.put("serviceId", csr.serviceId); return params; } } diff --git a/kilkari/src/main/java/org/motechproject/nms/kilkari/service/SubscriptionService.java b/kilkari/src/main/java/org/motechproject/nms/kilkari/service/SubscriptionService.java index f3a285432..544045bfe 100644 --- a/kilkari/src/main/java/org/motechproject/nms/kilkari/service/SubscriptionService.java +++ b/kilkari/src/main/java/org/motechproject/nms/kilkari/service/SubscriptionService.java @@ -106,6 +106,8 @@ Subscription createSubscription(Subscriber subscriber, long callingNumber, Langu void deleteCallRetry(String subscriptionId); + void updateCallRetry(String subscriptionId,Long msisdn); + void deleteBlockedMsisdn(Long motherId, Long oldCallingNumber, Long newCallingNumber); /** diff --git a/kilkari/src/main/java/org/motechproject/nms/kilkari/service/impl/CsrServiceImpl.java b/kilkari/src/main/java/org/motechproject/nms/kilkari/service/impl/CsrServiceImpl.java index 283c0efdf..b5554aebb 100644 --- a/kilkari/src/main/java/org/motechproject/nms/kilkari/service/impl/CsrServiceImpl.java +++ b/kilkari/src/main/java/org/motechproject/nms/kilkari/service/impl/CsrServiceImpl.java @@ -24,9 +24,11 @@ import org.motechproject.nms.kilkari.service.CsrVerifierService; import org.motechproject.nms.kilkari.service.SubscriptionService; import org.motechproject.nms.kilkari.utils.KilkariConstants; +import org.motechproject.nms.props.domain.DayOfTheWeek; import org.motechproject.nms.props.domain.FinalCallStatus; import org.motechproject.nms.props.domain.StatusCode; import org.motechproject.nms.props.domain.WhatsAppOptInStatusCode; +import org.motechproject.server.config.SettingsFacade; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -34,6 +36,7 @@ import org.springframework.transaction.annotation.Transactional; import java.util.List; +import java.util.Objects; import static java.lang.Math.min; @@ -145,7 +148,6 @@ private void handleDndForSubscription(Subscription subscription) { private void doReschedule(Subscription subscription, CallRetry existingCallRetry, CallSummaryRecordDto csrDto) { boolean invalidNr = StatusCode.fromInt(csrDto.getStatusCode()).equals(StatusCode.OBD_FAILED_INVALIDNUMBER); - if (existingCallRetry == null && SubscriptionStatus.ACTIVE.equals(subscription.getStatus())) { // We've never retried this call, let's do it callRetryDataService.create(new CallRetry( @@ -167,7 +169,6 @@ private void doReschedule(Subscription subscription, CallRetry existingCallRetry if ((subscription.getSubscriptionPack().retryCount() == 1) || (existingCallRetry !=null && existingCallRetry.getCallStage() == CallStage.RETRY_LAST)) { - // This call should not be retried // Deactivate subscription for persistent invalid numbers @@ -199,13 +200,13 @@ private void doReschedule(Subscription subscription, CallRetry existingCallRetry ) );*/ existingCallRetry.setContentFileName("opt_in.wav"); + if(!Objects.equals(existingCallRetry.getMsisdn(), subscription.getSubscriber().getCallingNumber())){ + existingCallRetry.setMsisdn(subscription.getSubscriber().getCallingNumber()); + } callRetryDataService.update(existingCallRetry); } else { completeSubscriptionIfNeeded(subscription, csrDto.getContentFileName()); callRetryDataService.delete(existingCallRetry); - LOGGER.info("subscription is : {}", subscription); - LOGGER.info("csrDto is : {}", csrDto); - LOGGER.info("whatsAppOptSMSDataService is : {}", whatsAppOptSMSDataService); // write message table logic here whatsAppOptSMSDataService.create(new WhatsAppOptSMS(csrDto.getCircleName(), "SMS_CONTENT", @@ -237,6 +238,9 @@ private void doReschedule(Subscription subscription, CallRetry existingCallRetry existingCallRetry.setCallStage(existingCallRetry.getCallStage().nextStage()); existingCallRetry.setInvalidNumberCount(existingCallRetry.getInvalidNumberCount() == null ? 0 : (existingCallRetry.getInvalidNumberCount() + (invalidNr ? 1 : 0))); + if(!Objects.equals(existingCallRetry.getMsisdn(), subscription.getSubscriber().getCallingNumber())){ + existingCallRetry.setMsisdn(subscription.getSubscriber().getCallingNumber()); + } callRetryDataService.update(existingCallRetry); } @@ -289,7 +293,6 @@ private void doRescheduleOptIn(Subscription subscription,CallSummaryRecordDto ca @MotechListener(subjects = {KilkariConstants.NMS_IMI_KK_PROCESS_CSR_SUBJECT}) //NO CHECKSTYLE Cyclomatic Complexity @Transactional public void processCallSummaryRecord(MotechEvent event) { //NOPMD NcssMethodCount - Timer timer = new Timer(); String whatHappened = "##"; @@ -329,9 +332,13 @@ public void processCallSummaryRecord(MotechEvent event) { //NOPMD NcssMethodCoun if(callRetry!=null){ callRetryDataService.delete(callRetry); } - } else { + }else if(callRetry == null && !csrDto.getWeekId().equals("w1_1") && !subscription.getFirstMessageDayOfWeek().equals(DayOfTheWeek.getDayOfTheWeekFromTimestamp(csrDto.getTargetFileTimeStamp())) && "1".equals(extractRouteNumber(csrDto.getServiceId()))) { + LOGGER.info("Fresh call condition after rch update"); + }else if(callRetry == null && !csrDto.getWeekId().equals("w1_1") && "2".equals(extractRouteNumber(csrDto.getServiceId()))){ + LOGGER.info("Retry call condition after rch update"); + }else { if (callRetry == null || - !csrDto.getTargetFileTimeStamp().equals(callRetry.getTargetFiletimestamp())) { + !csrDto.getTargetFileTimeStamp().equals(callRetry.getTargetFiletimestamp())){ doReschedule(subscription, callRetry, csrDto); } } @@ -372,6 +379,16 @@ public void processCallSummaryRecord(MotechEvent event) { //NOPMD NcssMethodCoun LOGGER.debug(String.format("processCallSummaryRecord %s %s %s", subscriptionId, whatHappened, timer.time())); } + private String extractRouteNumber(String serviceId) { + if (serviceId != null && serviceId.contains("Retryonroute")) { + int startIndex = serviceId.indexOf("Retryonroute") + "Retryonroute".length(); + if (startIndex < serviceId.length()) { + return String.valueOf(serviceId.charAt(startIndex)); + } + } + return ""; + } + @MotechListener(subjects = {KilkariConstants.NMS_IMI_KK_WHATSAPP_SMS_PROCESS_CSR_SUBJECT}) //NO CHECKSTYLE Cyclomatic Complexity @Transactional public void processWhatsAppSMSCsr(MotechEvent event) { //NOPMD NcssMethodCount @@ -381,16 +398,13 @@ public void processWhatsAppSMSCsr(MotechEvent event) { //NOPMD NcssMethodCount String subscriptionId = "###INVALID###"; try { - LOGGER.debug("test 20 - WhatsAppOptSMSCsrDto.fromParams"); WhatsAppOptSMSCsrDto csrDto = WhatsAppOptSMSCsrDto.fromParams(event.getParameters()); subscriptionId = csrDto.getRequestId(); // csrVerifierService.verify(csrDto); - LOGGER.debug("test 21 - subscriptionDataService.findBySubscriptionIdAndStatus"); Subscription subscription = subscriptionDataService.findBySubscriptionIdAndStatus(subscriptionId, SubscriptionStatus.ACTIVE); if (subscription == null) { throw new NoSuchSubscriptionException(subscriptionId); } - LOGGER.debug("test 22 - updateSubscriptionServiceStatusForWhatsAppSMS"); updateSubscriptionServiceStatusForWhatsAppSMS(subscription, csrDto.getResponse(), (List) event.getParameters().get("subscriptions")); } catch (NoSuchSubscriptionException e) { @@ -419,18 +433,15 @@ public void processWhatsAppCsr(MotechEvent event) { //NOPMD NcssMethodCount String subscriptionId = "###INVALID###"; try { - LOGGER.debug("test 20 - WhatsAppOptCsrDto.fromParams"); WhatsAppOptCsrDto csrDto = WhatsAppOptCsrDto.fromParams(event.getParameters()); LOGGER.debug("csrDto: {}", csrDto); subscriptionId = csrDto.getExternalId(); // csrVerifierService.verify(csrDto); - LOGGER.debug("test 21 - subscriptionDataService.findBySubscriptionIdAndStatus"); Subscription subscription = subscriptionDataService.findBySubscriptionIdAndStatus(subscriptionId, SubscriptionStatus.ACTIVE); LOGGER.debug("subscription: {}", subscription); if (subscription == null) { throw new NoSuchSubscriptionException(subscriptionId); } - LOGGER.debug("test 22 - updateSubscriptionServiceStatusForWhatsApp"); updateSubscriptionServiceStatusForWhatsApp(subscription, csrDto.getMessageStatus(), (List) event.getParameters().get("subscriptions")); LOGGER.debug("subscription: {}", subscription); } catch (NoSuchSubscriptionException e) { diff --git a/kilkari/src/main/java/org/motechproject/nms/kilkari/service/impl/SubscriberServiceImpl.java b/kilkari/src/main/java/org/motechproject/nms/kilkari/service/impl/SubscriberServiceImpl.java index c630d6a68..e0b7f58dd 100644 --- a/kilkari/src/main/java/org/motechproject/nms/kilkari/service/impl/SubscriberServiceImpl.java +++ b/kilkari/src/main/java/org/motechproject/nms/kilkari/service/impl/SubscriberServiceImpl.java @@ -407,6 +407,16 @@ public Subscription updateRchMotherSubscriber(Long msisdn, MctsMother motherUpda subscriberByRchId.setCaseNo(caseNo); motherUpdate.setMaxCaseNo(caseNo); } + + + if(subscription != null){ + if ( !((subscriberByRchId.getLastMenstrualPeriod().getDayOfYear() == lmp.getDayOfYear()) && (subscriberByRchId.getLastMenstrualPeriod().getYear() == lmp.getYear()))) { + subscriptionService.deleteCallRetry(subscription.getSubscriptionId()); + + }else { + subscriptionService.updateCallRetry(subscription.getSubscriptionId(), msisdn); + } + } subscriberByRchId.setLastMenstrualPeriod(lmp); subscriberByRchId.setModificationDate(DateTime.now()); motherUpdate.setName(name); @@ -414,7 +424,6 @@ public Subscription updateRchMotherSubscriber(Long msisdn, MctsMother motherUpda motherUpdate.setLastMenstrualPeriod(lmp); motherUpdate.setUpdatedDateNic(lastUpdatedDateNic); motherUpdate.setRegistrationDate(motherRegistrationDate); - if(subscription != null){subscriptionService.deleteCallRetry(subscription.getSubscriptionId());} return updateOrCreateSubscription(subscriberByRchId, subscription, lmp, pack, language, circle, SubscriptionOrigin.RCH_IMPORT, greaterCase); } else { // we have a subscriber by phone# and also one with the RCH id if (subscriptionService.activeSubscriptionByMsisdnRch(subscribersByMsisdn,msisdn, SubscriptionPackType.PREGNANCY, motherUpdate.getRchId(), null)) { @@ -729,10 +738,25 @@ public ChildImportRejection updateRchChildSubscriber(Long msisdn, MctsChild chil subscription = latestDeactivatedSubscription; } } + + // Delete that record from retry table as beneficiary gets their mobile number update + if(subscription != null){ + if ((subscriberByRchId.getDateOfBirth().getDayOfYear() != dob.getDayOfYear())){ + subscriptionService.deleteCallRetry(subscription.getSubscriptionId()); + }else { + subscriptionService.updateCallRetry(subscription.getSubscriptionId(), msisdn); + } + } subscriberByRchId.setDateOfBirth(dob); subscriberByRchId.setModificationDate(DateTime.now()); // Delete that record from retry table as beneficiary gets their mobile number update - if(subscription != null){subscriptionService.deleteCallRetry(subscription.getSubscriptionId());} + if(subscription != null){ + if ((subscriberByRchId.getDateOfBirth().getDayOfYear() != dob.getDayOfYear())){ + subscriptionService.deleteCallRetry(subscription.getSubscriptionId()); + }else { + subscriptionService.updateCallRetry(subscription.getSubscriptionId(), msisdn); + } + } finalSubscription = updateOrCreateSubscription(subscriberByRchId, subscription, dob, pack, language, circle, SubscriptionOrigin.RCH_IMPORT, false); } else { //subscriber found with provided msisdn @@ -1023,6 +1047,13 @@ public Subscription updateOrCreateSubscription(Subscriber subscriber, Subscripti return deactivatedSubscripion; } } else if (subscription != null && !subscription.getDeactivationReason().equals(DeactivationReason.INVALID_NUMBER)){ + Set activeSubscriptions = subscriber.getActiveAndPendingSubscriptions(); + if (activeSubscriptions != null && !activeSubscriptions.isEmpty()) { + for(Subscription sub : activeSubscriptions ){ + sub.setModificationDate(DateTime.now()); + } + } + subscription.setModificationDate(DateTime.now()); return subscription; } else { return subscriptionService.createSubscription(subscriber, subscriber.getCallingNumber(), language, circle, pack, origin); diff --git a/kilkari/src/main/java/org/motechproject/nms/kilkari/service/impl/SubscriptionServiceImpl.java b/kilkari/src/main/java/org/motechproject/nms/kilkari/service/impl/SubscriptionServiceImpl.java index 67045b5bb..909175509 100644 --- a/kilkari/src/main/java/org/motechproject/nms/kilkari/service/impl/SubscriptionServiceImpl.java +++ b/kilkari/src/main/java/org/motechproject/nms/kilkari/service/impl/SubscriptionServiceImpl.java @@ -944,6 +944,15 @@ public void deleteCallRetry(String subscriptionId) { } } + @Override + public void updateCallRetry(String subscriptionId,Long msisdn) { + CallRetry callRetry = callRetryDataService.findBySubscriptionId(subscriptionId); + if (callRetry != null) { + callRetry.setMsisdn(msisdn); + callRetryDataService.update(callRetry); + } + } + @Override public void deactivateSubscription(Subscription subscription, DeactivationReason reason) { if (subscription != null && (subscription.getStatus() == SubscriptionStatus.ACTIVE || diff --git a/props/src/main/java/org/motechproject/nms/props/domain/DayOfTheWeek.java b/props/src/main/java/org/motechproject/nms/props/domain/DayOfTheWeek.java index 7286386c7..08a9051b6 100644 --- a/props/src/main/java/org/motechproject/nms/props/domain/DayOfTheWeek.java +++ b/props/src/main/java/org/motechproject/nms/props/domain/DayOfTheWeek.java @@ -1,6 +1,8 @@ package org.motechproject.nms.props.domain; import org.joda.time.DateTime; +import org.joda.time.format.DateTimeFormat; +import org.joda.time.format.DateTimeFormatter; public enum DayOfTheWeek { MONDAY(1), @@ -38,6 +40,16 @@ public static DayOfTheWeek fromDateTime(DateTime dt) { return fromInt(dt.getDayOfWeek()); } + public static DayOfTheWeek getDayOfTheWeekFromTimestamp(String timestamp) { + DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyyMMddHHmmss"); + + DateTime dateTime = formatter.parseDateTime(timestamp); + + int dayOfWeek = dateTime.getDayOfWeek(); // 1 = Monday, 7 = Sunday + + return DayOfTheWeek.fromInt(dayOfWeek); + } + public DayOfTheWeek nextDay() { if (value == SUNDAY.getValue()) { return MONDAY;