use of org.motechproject.mots.domain.Module in project mots by motech-implementations.
the class ModuleMapper method updateModuleFromDto.
/**
* Update Module using data from DTO.
* @param moduleDto DTO with new data
* @param module Module to be updated
*/
private void updateModuleFromDto(ModuleDto moduleDto, Module module) {
List<UnitDto> unitDtos = moduleDto.getChildren();
List<Unit> units = module.getUnits();
List<Unit> updatedUnits = new ArrayList<>();
if (units == null) {
units = new ArrayList<>();
}
if (unitDtos != null && !unitDtos.isEmpty()) {
for (int i = 0; i < unitDtos.size(); i++) {
UnitDto unitDto = unitDtos.get(i);
Unit unit;
if (StringUtils.isBlank(unitDto.getId())) {
unit = new Unit();
} else {
unit = units.stream().filter(u -> u.getId().toString().equals(unitDto.getId())).findAny().orElseThrow(() -> new EntityNotFoundException("Cannot update module, because error occurred during unit list update"));
}
updateUnitFromDto(unitDto, unit);
unit.setAllowReplay(BooleanUtils.isTrue(unit.getAllowReplay()));
unit.setListOrder(i);
updatedUnits.add(unit);
}
}
updateFromDto(moduleDto, module);
module.setUnits(updatedUnits);
}
use of org.motechproject.mots.domain.Module in project mots by motech-implementations.
the class ModuleAssignmentServiceTest method shouldAssignModulesToDistrict.
@Test
public void shouldAssignModulesToDistrict() throws Exception {
when(userService.getUserByUserName(eq(user.getUsername()))).thenReturn(user);
when(communityHealthWorkerRepository.findByCommunityFacilityChiefdomDistrictIdAndSelected(any(), any())).thenReturn(Collections.singletonList(CHW));
moduleAssignmentService.assignModulesToDistrict(districtAssignmentDto);
ArgumentCaptor<DistrictAssignmentLog> districtAssignmentLogCaptor = ArgumentCaptor.forClass(DistrictAssignmentLog.class);
verify(districtAssignmentLogRepository, times(2)).save(districtAssignmentLogCaptor.capture());
List<DistrictAssignmentLog> districtAssignmentLogs = districtAssignmentLogCaptor.getAllValues();
final Set<Module> passedModules = new HashSet<>(Arrays.asList(MODULE_2, MODULE_3));
assertTrue(districtAssignmentLogs.stream().allMatch(l -> passedModules.contains(l.getModule())));
for (DistrictAssignmentLog log : districtAssignmentLogs) {
assertEquals(DISTRICT, log.getDistrict());
assertEquals(districtAssignmentDto.getStartDate(), log.getStartDate().toString());
assertEquals(districtAssignmentDto.getEndDate(), log.getEndDate().toString());
assertEquals(user, log.getOwner());
}
ArgumentCaptor<AssignedModules> assignedModulesCaptor = ArgumentCaptor.forClass(AssignedModules.class);
verify(assignedModulesRepository).save(assignedModulesCaptor.capture());
final Set<Module> allModules = new HashSet<>(Arrays.asList(MODULE_1, MODULE_2, MODULE_3));
assertEquals(allModules, assignedModulesCaptor.getValue().getModules());
verify(ivrService).addSubscriberToGroups(eq(CHW.getIvrId()), eq(Collections.singletonList(IVR_GROUP)));
verify(moduleProgressService).createModuleProgresses(any(), eq(Collections.singleton(MODULE_3)));
}
use of org.motechproject.mots.domain.Module in project mots by motech-implementations.
the class ModuleAssignmentService method assignModules.
/**
* Assign modules to CHW.
* @param assignedModules modules assigned for CHW
*/
@SuppressWarnings("checkstyle:variabledeclarationusagedistance")
@Transactional
@PreAuthorize(RoleNames.HAS_ASSIGN_MODULES_ROLE)
public void assignModules(AssignedModules assignedModules) {
AssignedModules existingAssignedModules = getAssignedModules(assignedModules.getHealthWorker().getId());
CommunityHealthWorker assignedModulesChw = existingAssignedModules.getHealthWorker();
Set<Module> oldModules = new HashSet<>(existingAssignedModules.getModules());
existingAssignedModules.setModules(assignedModules.getModules());
repository.save(existingAssignedModules);
entityManager.flush();
entityManager.refresh(existingAssignedModules);
Set<Module> newModules = new HashSet<>(existingAssignedModules.getModules());
Set<Module> modulesToAdd = getModulesToAdd(oldModules, newModules);
Set<Module> modulesToRemove = getModulesToRemove(oldModules, newModules);
validateModulesToUnassign(assignedModulesChw, modulesToRemove);
String ivrId = assignedModulesChw.getIvrId();
if (ivrId == null) {
throw new ModuleAssignmentException("Could not assign module to CHW, because CHW has empty IVR id");
}
try {
ivrService.addSubscriberToGroups(ivrId, getIvrGroupsFromModules(modulesToAdd));
ivrService.removeSubscriberFromGroups(ivrId, getIvrGroupsFromModules(modulesToRemove));
} catch (IvrException ex) {
String message = "Could not assign or delete module for CHW, " + "because of IVR module assignment error.\n\n" + ex.getClearVotoInfo();
throw new ModuleAssignmentException(message, ex);
}
moduleProgressService.removeModuleProgresses(assignedModulesChw, modulesToRemove);
moduleProgressService.createModuleProgresses(assignedModulesChw, modulesToAdd);
}
use of org.motechproject.mots.domain.Module in project mots by motech-implementations.
the class ModuleAssignmentService method assignModulesToDistrict.
/**
* Creates DistrictAssignmentLog for district assignment,
* and assigns modules to each CHW from a district.
* @param assignmentDto dto with district id, list of modules assigned to it
* and start and end dates
*/
@Transactional
@PreAuthorize(RoleNames.HAS_ASSIGN_MODULES_ROLE)
public void assignModulesToDistrict(DistrictAssignmentDto assignmentDto) {
List<CommunityHealthWorker> communityHealthWorkers = communityHealthWorkerRepository.findByCommunityFacilityChiefdomDistrictIdAndSelected(UUID.fromString(assignmentDto.getDistrictId()), true);
Set<Module> newChwModules = new HashSet<>();
String userName = (String) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
User currentUser = userService.getUserByUserName(userName);
for (String moduleId : assignmentDto.getModules()) {
Module moduleToAssign = moduleRepository.findById(UUID.fromString(moduleId)).orElseThrow(() -> new EntityNotFoundException("No module found for Id: {0}", moduleId));
newChwModules.add(moduleToAssign);
assignmentLogRepository.save(new DistrictAssignmentLog(districtRepository.findOne(UUID.fromString(assignmentDto.getDistrictId())), LocalDate.parse(assignmentDto.getStartDate()), LocalDate.parse(assignmentDto.getEndDate()), moduleToAssign, currentUser));
}
for (CommunityHealthWorker chw : communityHealthWorkers) {
AssignedModules existingAssignedModules = getAssignedModules(chw.getId());
Set<Module> oldModules = existingAssignedModules.getModules();
Set<Module> modulesToAdd = getModulesToAdd(oldModules, newChwModules);
existingAssignedModules.getModules().addAll(modulesToAdd);
repository.save(existingAssignedModules);
entityManager.flush();
entityManager.refresh(existingAssignedModules);
String ivrId = existingAssignedModules.getHealthWorker().getIvrId();
if (ivrId == null) {
throw new ModuleAssignmentException("Could not assign module to CHW, because CHW has empty IVR id");
}
try {
ivrService.addSubscriberToGroups(ivrId, getIvrGroupsFromModules(modulesToAdd));
} catch (IvrException ex) {
String message = "Could not assign or delete module for CHW, " + "because of IVR module assignment error.\n\n" + ex.getClearVotoInfo();
throw new ModuleAssignmentException(message, ex);
}
moduleProgressService.createModuleProgresses(chw, modulesToAdd);
}
}
use of org.motechproject.mots.domain.Module in project mots by motech-implementations.
the class ModuleService method updateModule.
/**
* Update existing Module.
* @param id id of Module to be updated
* @param moduleDto Module DTO
* @return updated Module
*/
@PreAuthorize(RoleNames.HAS_MANAGE_MODULES_ROLE)
public ModuleDto updateModule(UUID id, ModuleDto moduleDto) {
Course course = getDraftCourse();
CourseModule courseModule = course.findCourseModuleByModuleId(id);
Module module = courseModule.getModule();
if (!Status.DRAFT.equals(module.getStatus())) {
throw new MotsException("Only Module draft can be updated");
}
moduleMapper.updateCourseModuleFromDto(moduleDto, courseModule);
courseModule = courseModuleRepository.save(courseModule);
return moduleMapper.toDto(courseModule);
}
Aggregations