Skip to content

Commit

Permalink
Add contact-outcome date (#125)
Browse files Browse the repository at this point in the history
* chore: quality improvements

* chore : code quality
feat : expose contactOutcome full entity

* fix: contactOucome object

* chore: fix some cyclic dependencies

* fix: revert field mapping code

* fix: restore previous stateCountDto

* fix : another dto revert

* test: fix test

* test: update test to comply with service not throwing exception
  • Loading branch information
SimonDmz authored Jan 16, 2024
1 parent 6459a11 commit ddc34f4
Show file tree
Hide file tree
Showing 27 changed files with 567 additions and 1,335 deletions.
6 changes: 3 additions & 3 deletions src/main/java/fr/insee/pearljam/api/ApiApplication.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
import java.util.Arrays;
import java.util.stream.StreamSupport;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
Expand All @@ -20,15 +19,16 @@

import fr.insee.pearljam.api.repository.SurveyUnitRepository;
import fr.insee.pearljam.api.service.impl.DataSetInjectorServiceImpl;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

@SpringBootApplication(scanBasePackages = "fr.insee.pearljam.api")
@EnableJpaRepositories(basePackageClasses = SurveyUnitRepository.class)
@RequiredArgsConstructor
@Slf4j
public class ApiApplication extends SpringBootServletInitializer {

@Autowired
private DataSetInjectorServiceImpl injector;
private final DataSetInjectorServiceImpl injector;

@Value("${spring.profiles.active}")
private String profile;
Expand Down
159 changes: 102 additions & 57 deletions src/main/java/fr/insee/pearljam/api/bussinessrules/BussinessRules.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;

Expand All @@ -13,82 +14,122 @@ public class BussinessRules {
private BussinessRules() {
throw new IllegalStateException("BusinessRules static class");
}

// Checks if a survey unit is allowed to pass from a state to another
public static Boolean stateCanBeModified(StateType currentState, StateType targetState) {
switch(targetState) {
case NVA: return currentState != StateType.NVA;
case ANV: return currentState == StateType.NNS;
case VIN: return currentState == StateType.NNS || currentState == StateType.ANV;
case VIC: return currentState == StateType.VIN;
case FIN: return currentState == StateType.TBR || currentState == StateType.WFS;
case WFT: return currentState == StateType.FIN || currentState == StateType.TBR
|| currentState == StateType.INS;
case PRC: return currentState == StateType.VIC;
case AOC: return currentState == StateType.APS || currentState == StateType.PRC;
case APS: return currentState == StateType.AOC || currentState == StateType.PRC;
case INS: return currentState == StateType.APS || currentState == StateType.PRC
|| currentState == StateType.FIN || currentState == StateType.TBR;
case WFS: return currentState == StateType.WFT;
case TBR: return currentState == StateType.WFS;
case NVM: return currentState == StateType.ANV;
default: return false;
switch (targetState) {
case NVA:
return currentState != StateType.NVA;
case ANV:
return currentState == StateType.NNS;
case VIN:
return currentState == StateType.NNS || currentState == StateType.ANV;
case VIC:
return currentState == StateType.VIN;
case FIN:
return currentState == StateType.TBR || currentState == StateType.WFS;
case WFT:
return currentState == StateType.FIN || currentState == StateType.TBR
|| currentState == StateType.INS;
case PRC:
return currentState == StateType.VIC;
case AOC:
return currentState == StateType.APS || currentState == StateType.PRC;
case APS:
return currentState == StateType.AOC || currentState == StateType.PRC;
case INS:
return currentState == StateType.APS || currentState == StateType.PRC
|| currentState == StateType.FIN || currentState == StateType.TBR;
case WFS:
return currentState == StateType.WFT;
case TBR:
return currentState == StateType.WFS;
case NVM:
return currentState == StateType.ANV;
default:
return false;
}
}

/* Checks if a survey unit is allowed to pass from a state to another

/*
* Checks if a survey unit is allowed to pass from a state to another
* via a manager action
*/
public static Boolean stateCanBeModifiedByManager(StateType currentState, StateType targetState) {
switch(targetState) {
case NVA: return currentState != StateType.NVA;
case ANV: return currentState == StateType.NNS;
case VIN: return currentState == StateType.NNS || currentState == StateType.ANV;
case FIN: return currentState == StateType.TBR;
case WFT: return currentState == StateType.FIN || currentState == StateType.TBR;
case CLO: return true;
default: return false;
switch (targetState) {
case NVA:
return currentState != StateType.NVA;
case ANV:
return currentState == StateType.NNS;
case VIN:
return currentState == StateType.NNS || currentState == StateType.ANV;
case FIN:
return currentState == StateType.TBR;
case WFT:
return currentState == StateType.FIN || currentState == StateType.TBR;
case CLO:
return true;
default:
return false;
}
}

/* Checks if a survey unit is allowed to pass from a state to another

/*
* Checks if a survey unit is allowed to pass from a state to another
* via an interviewer action
*/
public static Boolean stateCanBeModifiedByInterviewer(StateType currentState, StateType targetState) {
switch(targetState) {
case PRC: return currentState == StateType.VIC;
case AOC: return currentState == StateType.APS || currentState == StateType.PRC;
case APS: return currentState == StateType.AOC || currentState == StateType.PRC;
case INS: return currentState == StateType.APS || currentState == StateType.PRC
|| currentState == StateType.FIN || currentState == StateType.TBR;
case WFT: return currentState == StateType.INS;
case WFS: return currentState == StateType.WFT;
case TBR: return currentState == StateType.WFS;
case FIN: return currentState == StateType.WFS;
default: return false;
switch (targetState) {
case PRC:
return currentState == StateType.VIC;
case AOC:
return currentState == StateType.APS || currentState == StateType.PRC;
case APS:
return currentState == StateType.AOC || currentState == StateType.PRC;
case INS:
return currentState == StateType.APS || currentState == StateType.PRC
|| currentState == StateType.FIN || currentState == StateType.TBR;
case WFT:
return currentState == StateType.INS;
case WFS:
return currentState == StateType.WFT;
case TBR:
return currentState == StateType.WFS;
case FIN:
return currentState == StateType.WFS;
default:
return false;
}
}

/* Checks if a survey unit is allowed to pass from a state to another

/*
* Checks if a survey unit is allowed to pass from a state to another
* via an automatic bussiness rule
*/
public static Boolean stateCanBeModifiedBussinessRules(StateType currentState, StateType targetState) {
switch(targetState) {
case VIC: return currentState == StateType.VIN;
case WFT: return currentState == StateType.INS;
case FIN: return currentState == StateType.WFS;
case TBR: return currentState == StateType.WFS;
case ANV: return currentState == StateType.FIN;
case NVM: return currentState == StateType.ANV;
default: return false;
switch (targetState) {
case VIC:
return currentState == StateType.VIN;
case WFT:
return currentState == StateType.INS;
case FIN:
return currentState == StateType.WFS;
case TBR:
return currentState == StateType.WFS;
case ANV:
return currentState == StateType.FIN;
case NVM:
return currentState == StateType.ANV;
default:
return false;
}
}

/* Checks if a survey unit can be seen by the interviewer

/*
* Checks if a survey unit can be seen by the interviewer
* via an automatic bussiness rule
*/
public static Boolean stateCanBeSeenByInterviewerBussinessRules(StateType currentState) {
//return new StateType[] {NNS,ANV, NVM}.includes(currentState)
StateType[] possibleTypes = {
StateType.VIN,
StateType.VIC,
Expand All @@ -101,7 +142,7 @@ public static Boolean stateCanBeSeenByInterviewerBussinessRules(StateType curren
StateType.TBR,
StateType.FIN,
StateType.CLO,
};
};
return Arrays.stream(possibleTypes).anyMatch(currentState::equals);
}

Expand All @@ -111,9 +152,13 @@ public static Boolean shouldFallBackToTbrOrFin(List<StateDto> states) {
if (presentTypes.contains(StateType.NVA))
return false;
// Survey-unit should not already be in TBR or FIN state
StateType currentState = states.stream().max(Comparator.comparingLong(StateDto::getDate)).get().getType();
Optional<StateDto> optCurrentState = states.stream().max(Comparator.comparingLong(StateDto::getDate));
if (optCurrentState.isEmpty()) {
return false;
}
StateType currentState = optCurrentState.get().getType();
StateType[] fallBackTypes = { StateType.FIN, StateType.TBR };
return ! Arrays.stream(fallBackTypes).anyMatch(currentState::equals);
return Arrays.stream(fallBackTypes).noneMatch(currentState::equals);
}

}
71 changes: 56 additions & 15 deletions src/main/java/fr/insee/pearljam/api/constants/Constants.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package fr.insee.pearljam.api.constants;

import java.util.List;

public class Constants {
private Constants() {
throw new IllegalStateException("Constants class");
Expand Down Expand Up @@ -86,27 +88,66 @@ private Constants() {

public static final String API_HEALTH_CHECK = "/api/healthcheck";

public static final String API_MAIL = "/api/mail";

public static final String API_ENUM_STATE = "/api/enum/state";
public static final String API_ENUM_CONTACT_OUTCOME = "/api/enum/contact-outcome";
public static final String API_ENUM_CONTACT_ATTEMPT = "/api/enum/contact-attempt";
// Error messages
public static final String ERR_USER_NOT_EXIST = "User {} does not exist";
public static final String ERR_CAMPAIGN_NOT_EXIST = "Campaign {} does not exist";
public static final String ERR_NO_OU_FOR_CAMPAIGN = "There is no Organisation Unit for Campaign {} affiliated to user {}";

public static final String[] STATE_COUNT_FIELDS = { "nvmCount", "nnsCount", "anvCount", "vinCount", "vicCount",
"prcCount", "aocCount", "apsCount", "insCount", "wftCount", "wfsCount", "tbrCount", "finCount", "cloCount",
"nvaCount", "total" };

public static final String[] STATECOUNT_CLOSED_CLOSING_CAUSE_FIELDS = { "npaCount", "npiCount", "npxCount", "rowCount" };

public static final String[] CLOSING_CAUSE_FIELDS = { "npaCount", "npiCount", "npxCount", "rowCount", "total" };

public static final String[] CONTACT_OUTCOME_FIELDS = { "inaCount", "refCount", "impCount", "ucdCount", "utrCount",
"alaCount", "dcdCount", "nuhCount", "dukCount", "duuCount", "noaCount" };
// Front expected variables names

public static final String NVM_COUNT = "nvmCount";
public static final String NNS_COUNT = "nnsCount";
public static final String ANV_COUNT = "anvCount";
public static final String VIN_COUNT = "vinCount";
public static final String VIC_COUNT = "vicCount";
public static final String PRC_COUNT = "prcCount";
public static final String AOC_COUNT = "aocCount";
public static final String APS_COUNT = "apsCount";
public static final String INS_COUNT = "insCount";
public static final String WFT_COUNT = "wftCount";
public static final String WFS_COUNT = "wfsCount";
public static final String TBR_COUNT = "tbrCount";
public static final String FIN_COUNT = "finCount";
public static final String CLO_COUNT = "cloCount";
public static final String NVA_COUNT = "nvaCount";
public static final String TOTAL_COUNT = "total";

public static final String NPA_COUNT = "npaCount";
public static final String NPI_COUNT = "npiCount";
public static final String NPX_COUNT = "npxCount";
public static final String ROW_COUNT = "rowCount";

public static final String INA_COUNT = "inaCount";
public static final String REF_COUNT = "refCount";
public static final String IMP_COUNT = "impCount";
public static final String UCD_COUNT = "ucdCount";
public static final String UTR_COUNT = "utrCount";
public static final String ALA_COUNT = "alaCount";
public static final String DCD_COUNT = "dcdCount";
public static final String NUH_COUNT = "nuhCount";
public static final String DUK_COUNT = "dukCount";
public static final String DUU_COUNT = "duuCount";
public static final String NOA_COUNT = "noaCount";

public static final List<String> STATE_COUNT_FIELDS = List.of(NVM_COUNT, NNS_COUNT, ANV_COUNT, VIN_COUNT, VIC_COUNT,
PRC_COUNT, AOC_COUNT, APS_COUNT, INS_COUNT, WFT_COUNT, WFS_COUNT, TBR_COUNT, FIN_COUNT, CLO_COUNT,
NVA_COUNT, TOTAL_COUNT);

public static final List<String> STATECOUNT_CLOSED_CLOSING_CAUSE_FIELDS = List.of(NPA_COUNT, NPI_COUNT, NPX_COUNT,
ROW_COUNT);

public static final List<String> CLOSING_CAUSE_FIELDS = List.of(NPA_COUNT, NPI_COUNT, NPX_COUNT, ROW_COUNT,
TOTAL_COUNT);

public static final List<String> CONTACT_OUTCOME_FIELDS = List.of(INA_COUNT, REF_COUNT, IMP_COUNT, UCD_COUNT,
UTR_COUNT,
ALA_COUNT, DCD_COUNT, NUH_COUNT, DUK_COUNT, DUU_COUNT, NOA_COUNT);

public static final String UNAVAILABLE = "UNAVAILABLE";

public static final String API_MAIL = "/api/mail";

public static final String API_ENUM_STATE = "/api/enum/state";
public static final String API_ENUM_CONTACT_OUTCOME = "/api/enum/contact-outcome";
public static final String API_ENUM_CONTACT_ATTEMPT = "/api/enum/contact-attempt";
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,23 +20,23 @@ public class EnumController {
public ResponseEntity<StateType[]> getStateEnum() {

StateType[] enumValues = StateType.values();
return new ResponseEntity<StateType[]>(enumValues, HttpStatus.OK);
return new ResponseEntity<>(enumValues, HttpStatus.OK);
}

@ApiOperation(value = "Get enum")
@GetMapping(path = "/enum/contact-attempt")
public ResponseEntity<Status[]> getContactAttemptEnum() {

Status[] enumValues = Status.values();
return new ResponseEntity<Status[]>(enumValues, HttpStatus.OK);
return new ResponseEntity<>(enumValues, HttpStatus.OK);
}

@ApiOperation(value = "Get enum")
@GetMapping(path = "/enum/contact-outcome")
public ResponseEntity<ContactOutcomeType[]> getContactOutcomeEnum() {

ContactOutcomeType[] enumValues = ContactOutcomeType.values();
return new ResponseEntity<ContactOutcomeType[]>(enumValues, HttpStatus.OK);
return new ResponseEntity<>(enumValues, HttpStatus.OK);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
import javax.servlet.http.HttpServletRequest;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.messaging.simp.SimpMessagingTemplate;
Expand All @@ -26,24 +25,19 @@
import fr.insee.pearljam.api.service.MessageService;
import fr.insee.pearljam.api.service.UtilsService;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

@Controller
@RequestMapping(path = "/api")
@Slf4j
@RequiredArgsConstructor
public class MessageController {

@Autowired
MessageService messageService;

@Autowired
BiFunction<String, String, HttpStatus> sendMail;

@Autowired
UtilsService utilsService;

@Autowired
private SimpMessagingTemplate brokerMessagingTemplate;
private final MessageService messageService;
private final BiFunction<String, String, HttpStatus> sendMail;
private final UtilsService utilsService;
private final SimpMessagingTemplate brokerMessagingTemplate;

StompSessionHandler sessionHandler = new CustomStompSessionHandler();

Expand Down
Loading

0 comments on commit ddc34f4

Please sign in to comment.