@Override
@Transactional
public List<SuppliesDTO> saveMultiple(List<SuppliesDTO> suppliesDTOS) {
log.debug("Request to save multiple supplies : {}", suppliesDTOS);
for (SuppliesDTO suppliesDTO : suppliesDTOS) suppliesDTO.validateInput();
Set<Long> idSuppliesGroups = suppliesDTOS.stream().map(SuppliesDTO::getIdSuppliesGroup).collect(Collectors.toSet());
checkIfSupplyGroupExist(idSuppliesGroups);
for (SuppliesDTO suppliesDTO : suppliesDTOS) {
validateCreateMultiple(suppliesDTO);
}
Set<Long> idSuppliesGroupInSupplies = suppliesRepository.findIdSuppliesGroupInSupplies();
Set<Long> intersection = new HashSet<>(idSuppliesGroups);
intersection.retainAll(idSuppliesGroupInSupplies);
Set<Long> remainder = new HashSet<>(idSuppliesGroups);
remainder.removeAll(idSuppliesGroupInSupplies);
List<Supplies> savedAll = new ArrayList<>();
if (!intersection.isEmpty()) {
List<Supplies> suppliesLastGroup = suppliesRepository.findLastSuppliesByGroup(intersection);
Map<Long, SupplySplitCode> lastCode = new HashMap<>();
for (Supplies supplies : suppliesLastGroup) {
String[] split = supplies.getCode().split(Constants.UNDERLINED);
SupplySplitCode supplySplitCode = new SupplySplitCode();
supplySplitCode.setCode(split[0]);
supplySplitCode.setNumber(Integer.parseInt(split[split.length - 1]));
lastCode.put(supplies.getIdSuppliesGroup(), supplySplitCode);
}
Map<Long, List<SuppliesDTO>> hashMapSupplies = new HashMap<>();
for (SuppliesDTO suppliesDTO : suppliesDTOS) {
if (!intersection.contains(suppliesDTO.getIdSuppliesGroup())) continue;
if (CollectionUtils.isEmpty(hashMapSupplies.get(suppliesDTO.getIdSuppliesGroup()))) {
List<SuppliesDTO> suppliesDTOList = new ArrayList<>();
suppliesDTOList.add(suppliesDTO);
hashMapSupplies.put(suppliesDTO.getIdSuppliesGroup(), suppliesDTOList);
} else {
List<SuppliesDTO> suppliesDTOList = hashMapSupplies.get(suppliesDTO.getIdSuppliesGroup());
suppliesDTOList.add(suppliesDTO);
hashMapSupplies.put(suppliesDTO.getIdSuppliesGroup(), suppliesDTOList);
}
}
for (Map.Entry<Long, List<SuppliesDTO>> longListEntry : hashMapSupplies.entrySet()) {
if (!lastCode.containsKey(longListEntry.getKey())) {
continue;
}
SupplySplitCode supplySplitCode = lastCode.get(longListEntry.getKey());
List<SuppliesDTO> suppliesDTOList = longListEntry.getValue();
int i = 1;
for (SuppliesDTO suppliesDTO : suppliesDTOList) {
String formattedNumber = String.format("%0" + NUM_DIGITS + "d", supplySplitCode.getNumber() + i);
suppliesDTO.setCode(supplySplitCode.getCode() + Constants.UNDERLINED + formattedNumber);
i++;
savedAll.add(suppliesMapper.toCreateSupplies(suppliesDTO));
}
}
}
if (!remainder.isEmpty()) {
List<SuppliesGroup> suppliesGroups = suppliesGroupRepository.findActiveSupplyGroups(remainder);
Map<Long, String> hashMap = new HashMap<>();
for (SuppliesGroup suppliesGroup : suppliesGroups) {
hashMap.put(suppliesGroup.getId(), suppliesGroup.getCode());
}
Map<Long, List<SuppliesDTO>> map = new HashMap<>();
for (SuppliesDTO suppliesDTO : suppliesDTOS) {
if (!remainder.contains(suppliesDTO.getIdSuppliesGroup())) continue;
if (CollectionUtils.isEmpty(map.get(suppliesDTO.getIdSuppliesGroup()))) {
List<SuppliesDTO> suppliesDTOList = new ArrayList<>();
suppliesDTOList.add(suppliesDTO);
map.put(suppliesDTO.getIdSuppliesGroup(), suppliesDTOList);
} else {
List<SuppliesDTO> suppliesDTOList = map.get(suppliesDTO.getIdSuppliesGroup());
suppliesDTOList.add(suppliesDTO);
map.put(suppliesDTO.getIdSuppliesGroup(), suppliesDTOList);
}
}
for (Map.Entry<Long, List<SuppliesDTO>> longListEntry : map.entrySet()) {
List<SuppliesDTO> suppliesDTOList = longListEntry.getValue();
int i = 1;
String supplyGroupCode = hashMap.get(longListEntry.getKey());
for (SuppliesDTO suppliesDTO : suppliesDTOList) {
String formattedNumber = String.format("%0" + NUM_DIGITS + "d", i);
suppliesDTO.setCode(supplyGroupCode + Constants.UNDERLINED + formattedNumber);
i++;
savedAll.add(suppliesMapper.toCreateSupplies(suppliesDTO));
}
}
}
savedAll = suppliesRepository.saveAll(savedAll);
savedAll.forEach(supplies ->
logService.writeLog(
supplies.getId(),
supplies,
null,
BaseService.getCurrentUser().getLogin(),
"SuppliesServiceImpl.saveMultiple"
)
);
return savedAll.stream().map(suppliesMapper::toDto).collect(Collectors.toList());
}