package com.qcadoo.mes.assignmentToShift.criteriaModifiers;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.qcadoo.localization.api.utils.DateUtils;
import com.qcadoo.mes.assignmentToShift.constants.AssignmentToShiftConstants;
import com.qcadoo.mes.assignmentToShift.constants.AssignmentToShiftFields;
import com.qcadoo.mes.basic.ParameterService;
import com.qcadoo.mes.basic.constants.StaffFields;
import com.qcadoo.model.api.DataDefinitionService;
import com.qcadoo.model.api.Entity;
import com.qcadoo.model.api.search.SearchCriteriaBuilder;
import com.qcadoo.model.api.search.SearchRestrictions;
import com.qcadoo.view.api.components.LookupComponent;
import com.qcadoo.view.api.components.lookup.FilterValueHolder;
@Service
public class StaffCriteriaModifier {
@Autowired
private DataDefinitionService dataDefinitionService;
@Autowired
private ParameterService parameterService;
private static final String CREW_FILTER_VALUE = "crewId";
private static final String WORKERS_IDS = "workersIds";
public void filterByCrew(final SearchCriteriaBuilder scb, final FilterValueHolder filterValueHolder) {
if (filterValueHolder.has(CREW_FILTER_VALUE)) {
Long crewId = filterValueHolder.getLong(CREW_FILTER_VALUE);
scb.add(SearchRestrictions.eq(StaffFields.CREW + ".id", crewId));
}
}
public void filterByCrewAndUnassigned(final SearchCriteriaBuilder scb, final FilterValueHolder filterValueHolder) {
filterByCrew(scb, filterValueHolder);
hideAssignedWorkers(scb, filterValueHolder);
}
public void putCrewNumber(final LookupComponent lookupComponent, final Entity crew) {
FilterValueHolder valueHolder = lookupComponent.getFilterValue();
if (crew != null) {
valueHolder.put(CREW_FILTER_VALUE, crew.getId());
} else {
valueHolder.remove(CREW_FILTER_VALUE);
}
lookupComponent.setFilterValue(valueHolder);
}
public void hideAssignedWorkers(final SearchCriteriaBuilder scb, final FilterValueHolder filterValueHolder) {
boolean shouldHideAssignedWorkers = parameterService.getParameter().getBooleanField("hideAssignedStaff");
if (shouldHideAssignedWorkers) {
if (filterValueHolder.has(WORKERS_IDS)) {
List<Long> ids = filterValueHolder.getListOfLongs(WORKERS_IDS);
scb.add(SearchRestrictions.not(SearchRestrictions.in("id", ids)));
}
}
}
public void setFilterParameters(final LookupComponent staffLookup, Entity assignmentToShift) {
FilterValueHolder filter = staffLookup.getFilterValue();
Date startDate = assignmentToShift.getDateField(AssignmentToShiftFields.START_DATE);
String hql = "select staff.worker.id as workerId from #assignmentToShift_staffAssignmentToShift staff "
+ " where staff.assignmentToShift.startDate = '" + DateUtils.toDateString(startDate) + "'";
List<Entity> workersIds = dataDefinitionService
.get(AssignmentToShiftConstants.PLUGIN_IDENTIFIER, AssignmentToShiftConstants.MODEL_STAFF_ASSIGNMENT_TO_SHIFT)
.find(hql).list().getEntities();
if (!workersIds.isEmpty()) {
filter.put("workersIds", workersIds.stream().map(id -> id.getLongField("workerId")).collect(Collectors.toList()));
staffLookup.setFilterValue(filter);
}
}
}