/** * *************************************************************************** * Copyright (c) 2010 Qcadoo Limited * Project: Qcadoo MES * Version: 1.4 * * This file is part of Qcadoo. * * Qcadoo is free software; you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published * by the Free Software Foundation; either version 3 of the License, * or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * *************************************************************************** */ package com.qcadoo.mes.assignmentToShift.hooks; import java.util.List; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.google.common.collect.Lists; import com.qcadoo.mes.assignmentToShift.constants.AssignmentToShiftConstants; import com.qcadoo.mes.assignmentToShift.constants.AssignmentToShiftFields; import com.qcadoo.mes.assignmentToShift.constants.StaffAssignmentToShiftState; import com.qcadoo.mes.assignmentToShift.states.constants.AssignmentToShiftState; import com.qcadoo.mes.assignmentToShift.states.constants.AssignmentToShiftStateStringValues; import com.qcadoo.model.api.DataDefinitionService; import com.qcadoo.model.api.Entity; import com.qcadoo.model.api.search.CustomRestriction; import com.qcadoo.model.api.search.SearchCriteriaBuilder; import com.qcadoo.model.api.search.SearchRestrictions; import com.qcadoo.view.api.ComponentState; import com.qcadoo.view.api.ViewDefinitionState; import com.qcadoo.view.api.components.FormComponent; import com.qcadoo.view.api.components.GridComponent; import com.qcadoo.view.api.components.WindowComponent; import com.qcadoo.view.api.ribbon.Ribbon; import com.qcadoo.view.api.ribbon.RibbonActionItem; import com.qcadoo.view.api.ribbon.RibbonGroup; @Service public class AssignmentToShiftDetailsHooks { public static final String L_WINDOW = "window"; public static final String L_FORM = "form"; public static final String L_ACTIONS = "actions"; public static final String L_STATUS = "status"; public static final String L_COPY = "copy"; public static final String L_SAVE = "save"; public static final String L_SAVE_BACK = "saveBack"; public static final String L_SAVE_NEW = "saveNew"; public static final String L_DELETE = "delete"; public static final String L_ACCEPT_ASSIGNMENT_TO_SHIFT = "acceptAssignmentToShift"; public static final String L_CORRECT_ASSIGNMENT_TO_SHIFT = "correctAssignmentToShift"; public static final String L_ACCEPT_CORRECTED_ASSIGNMENT_TO_SHIFT = "acceptCorrectedAssignmentToShift"; public static final String L_COPY_STAFF_ASSIGNMENT_TO_SHIFT = "copyStaffAssignmentToShift"; public static final String L_ASSIGNMENT_TO_SHIFT_INFO_IS_WAITING_FOR_SYNC = "assignmentToShift.assignmentToShift.info.isWaitingForSync"; public static final String L_ASSIGNMENT_TO_SHIFT_STATE_DOES_NOT_ALLOW_EDITING = "assignmentToShift.assignmentToShiftDetails.window.ribbon.stateDoesNotAllowEditing"; private static final Logger LOG = LoggerFactory.getLogger(AssignmentToShiftDetailsHooks.class); private static final String L_ADD_MANY_WORKERS = "addManyWorkers"; private static final String L_ADD = "add"; private static CustomRestriction customRestrictionAccepted = new CustomRestriction() { @Override public void addRestriction(final SearchCriteriaBuilder searchBuilder) { searchBuilder.add(SearchRestrictions.eq(AssignmentToShiftFields.STATE, StaffAssignmentToShiftState.ACCEPTED.getStringValue())); } }; private static CustomRestriction customRestrictionSimple = new CustomRestriction() { @Override public void addRestriction(final SearchCriteriaBuilder searchBuilder) { searchBuilder.add(SearchRestrictions.eq(AssignmentToShiftFields.STATE, StaffAssignmentToShiftState.SIMPLE.getStringValue())); } }; private static CustomRestriction customRestrictionCorrected = new CustomRestriction() { @Override public void addRestriction(final SearchCriteriaBuilder searchBuilder) { searchBuilder.add(SearchRestrictions.eq(AssignmentToShiftFields.STATE, StaffAssignmentToShiftState.CORRECTED.getStringValue())); } }; @Autowired private DataDefinitionService dataDefinitionService; public final void onBeforeRender(final ViewDefinitionState view) { addDiscriminatorRestrictionToStaffAssignmentGrid(view); addDiscriminatorRestrictionToCorrectedStaffAssignmentGrid(view); addDiscriminatorRestrictionToAcceptedStaffAssignmentGrid(view); FormComponent assignmentToShiftForm = (FormComponent) view.getComponentByReference(L_FORM); disableButtonsWhenNotExternalSynchronized(view, assignmentToShiftForm.getEntity()); Long assignmentToShiftFormId = assignmentToShiftForm.getEntityId(); if (assignmentToShiftFormId == null) { return; } Entity assignmentToShift = getAssignmentToShift(assignmentToShiftFormId); disableFormWhenStateIsAcceptedOrCorrected(view, assignmentToShift); showExternalSyncNotification(assignmentToShiftForm, assignmentToShift); showLastStateChangeFailNotification(assignmentToShiftForm, assignmentToShift); } private Entity getAssignmentToShift(final Long assignmentToShiftFormId) { return dataDefinitionService.get(AssignmentToShiftConstants.PLUGIN_IDENTIFIER, AssignmentToShiftConstants.MODEL_ASSIGNMENT_TO_SHIFT).get(assignmentToShiftFormId); } private final void addDiscriminatorRestrictionToStaffAssignmentGrid(final ViewDefinitionState view) { GridComponent staffAssignmentToShiftsGrid = (GridComponent) view .getComponentByReference(AssignmentToShiftFields.STAFF_ASSIGNMENT_TO_SHIFTS); staffAssignmentToShiftsGrid.setCustomRestriction(customRestrictionSimple); } private final void addDiscriminatorRestrictionToCorrectedStaffAssignmentGrid(final ViewDefinitionState view) { GridComponent correctedStaffAssignmentToShiftsGrid = (GridComponent) view .getComponentByReference(AssignmentToShiftFields.CORRECTED_STAFF_ASSIGNMENT_TO_SHIFTS); correctedStaffAssignmentToShiftsGrid.setCustomRestriction(customRestrictionCorrected); } private final void addDiscriminatorRestrictionToAcceptedStaffAssignmentGrid(final ViewDefinitionState view) { GridComponent plannedStaffAssignmentToShiftsGrid = (GridComponent) view .getComponentByReference(AssignmentToShiftFields.PLANNED_STAFF_ASSIGNMENT_TO_SHIFTS); plannedStaffAssignmentToShiftsGrid.setCustomRestriction(customRestrictionAccepted); } private void disableButtonsWhenNotExternalSynchronized(final ViewDefinitionState view, Entity assignmentToShift) { WindowComponent window = (WindowComponent) view.getComponentByReference(L_WINDOW); Ribbon ribbon = window.getRibbon(); RibbonGroup actionsRibbonGroup = ribbon.getGroupByName(L_ACTIONS); RibbonGroup statusRibbonGroup = ribbon.getGroupByName(L_STATUS); RibbonGroup copyRibbonGroup = ribbon.getGroupByName(L_COPY); RibbonGroup addRibbonGroup = ribbon.getGroupByName(L_ADD); RibbonActionItem saveRibbonActionItem = actionsRibbonGroup.getItemByName(L_SAVE); RibbonActionItem saveBackRibbonActionItem = actionsRibbonGroup.getItemByName(L_SAVE_BACK); RibbonActionItem saveNewRibbonActionItem = actionsRibbonGroup.getItemByName(L_SAVE_NEW); RibbonActionItem deleteRibbonActionItem = actionsRibbonGroup.getItemByName(L_DELETE); RibbonActionItem acceptAssignmentToShiftRibbonActionItem = statusRibbonGroup.getItemByName(L_ACCEPT_ASSIGNMENT_TO_SHIFT); RibbonActionItem correctAssignmentToShiftRibbonActionItem = statusRibbonGroup .getItemByName(L_CORRECT_ASSIGNMENT_TO_SHIFT); RibbonActionItem acceptCorrectedAssignmentToShiftRibbonActionItem = statusRibbonGroup .getItemByName(L_ACCEPT_CORRECTED_ASSIGNMENT_TO_SHIFT); RibbonActionItem copyStaffAssignmentToShiftRibbonActionItem = copyRibbonGroup .getItemByName(L_COPY_STAFF_ASSIGNMENT_TO_SHIFT); RibbonActionItem addManyWorkersRibbonActionItem = addRibbonGroup.getItemByName(L_ADD_MANY_WORKERS); GridComponent staffAssignmentToShiftsGrid = (GridComponent) view .getComponentByReference(AssignmentToShiftFields.STAFF_ASSIGNMENT_TO_SHIFTS); String state = assignmentToShift.getStringField(AssignmentToShiftFields.STATE); AssignmentToShiftState assignmentToShiftState = AssignmentToShiftState.parseString(state); Long assignmentToShiftId = assignmentToShift.getId(); boolean isSaved = (assignmentToShiftId != null); if (isSaved) { assignmentToShift = getAssignmentToShift(assignmentToShiftId); } boolean isExternalSynchronized = assignmentToShift.getBooleanField(AssignmentToShiftFields.EXTERNAL_SYNCHRONIZED); boolean areSelected = !staffAssignmentToShiftsGrid.getSelectedEntities().isEmpty(); boolean isEnabled = isSaved ? isExternalSynchronized && assignmentToShiftState.isEditingAllowed() : true; String message = null; if (!isEnabled) { if (isExternalSynchronized) { message = L_ASSIGNMENT_TO_SHIFT_STATE_DOES_NOT_ALLOW_EDITING; } else { message = L_ASSIGNMENT_TO_SHIFT_INFO_IS_WAITING_FOR_SYNC; } } List<RibbonActionItem> ribbonActionItems = Lists.newArrayList(saveRibbonActionItem, saveBackRibbonActionItem, saveNewRibbonActionItem, deleteRibbonActionItem, acceptAssignmentToShiftRibbonActionItem, correctAssignmentToShiftRibbonActionItem, acceptCorrectedAssignmentToShiftRibbonActionItem, copyStaffAssignmentToShiftRibbonActionItem, addManyWorkersRibbonActionItem); for (RibbonActionItem ribbonActionItem : ribbonActionItems) { if (ribbonActionItem != null) { String ribbonActionItemName = ribbonActionItem.getName(); if (AssignmentToShiftStateStringValues.DRAFT.equals(state) && (L_CORRECT_ASSIGNMENT_TO_SHIFT.equals(ribbonActionItemName) || L_ACCEPT_CORRECTED_ASSIGNMENT_TO_SHIFT .equals(ribbonActionItemName))) { ribbonActionItem.setEnabled(false); ribbonActionItem.setMessage(message); } else if ((AssignmentToShiftStateStringValues.ACCEPTED.equals(state) || AssignmentToShiftStateStringValues.CORRECTED .equals(state)) && L_CORRECT_ASSIGNMENT_TO_SHIFT.equals(ribbonActionItemName)) { ribbonActionItem.setEnabled(true); } else if (AssignmentToShiftStateStringValues.DURING_CORRECTION.equals(state) && (L_DELETE.equals(ribbonActionItemName) || L_ACCEPT_ASSIGNMENT_TO_SHIFT.equals(ribbonActionItemName) || L_CORRECT_ASSIGNMENT_TO_SHIFT .equals(ribbonActionItemName))) { ribbonActionItem.setEnabled(false); ribbonActionItem.setMessage(message); } else if (L_COPY_STAFF_ASSIGNMENT_TO_SHIFT.equals(ribbonActionItemName) && !areSelected) { ribbonActionItem.setEnabled(false); } else if (L_ADD_MANY_WORKERS.equals(ribbonActionItemName) && !isSaved) { ribbonActionItem.setEnabled(false); } else { ribbonActionItem.setEnabled(isEnabled); ribbonActionItem.setMessage(message); } ribbonActionItem.requestUpdate(true); } } } private void disableFormWhenStateIsAcceptedOrCorrected(final ViewDefinitionState view, final Entity assignmentToShift) { FormComponent assignmentToShiftForm = (FormComponent) view.getComponentByReference(L_FORM); GridComponent staffAssignmentToShiftsGrid = (GridComponent) view .getComponentByReference(AssignmentToShiftFields.STAFF_ASSIGNMENT_TO_SHIFTS); boolean isExternalSynchronized = assignmentToShift.getBooleanField(AssignmentToShiftFields.EXTERNAL_SYNCHRONIZED); String state = assignmentToShift.getStringField(AssignmentToShiftFields.STATE); if (!isExternalSynchronized || AssignmentToShiftState.ACCEPTED.getStringValue().equals(state) || AssignmentToShiftState.CORRECTED.getStringValue().equals(state)) { assignmentToShiftForm.setFormEnabled(false); staffAssignmentToShiftsGrid.setEditable(false); } else { assignmentToShiftForm.setFormEnabled(true); staffAssignmentToShiftsGrid.setEditable(true); } } private void showExternalSyncNotification(final FormComponent assignmentToShiftForm, final Entity assignmentToShift) { boolean isExternalSynchronized = assignmentToShift.getBooleanField(AssignmentToShiftFields.EXTERNAL_SYNCHRONIZED); if (!isExternalSynchronized) { assignmentToShiftForm.addMessage("assignmentToShift.assignmentToShift.info.isWaitingForSync", ComponentState.MessageType.INFO, true); } } private void showLastStateChangeFailNotification(final FormComponent assignmentToShiftForm, final Entity assignmentToShift) { boolean showLastStateChangeResults = assignmentToShift .getBooleanField(AssignmentToShiftFields.SHOW_LAST_STATE_CHANGE_RESULT); if (!showLastStateChangeResults) { return; } boolean lastStateChangeFails = assignmentToShift.getBooleanField(AssignmentToShiftFields.LAST_STATE_CHANGE_FAILS); if (lastStateChangeFails) { showStateChangeFailureNotification(assignmentToShiftForm, assignmentToShift); } else { showStateChangeSuccessNotification(assignmentToShiftForm); } removeShowLastResultsFlag(assignmentToShift); } private void showStateChangeSuccessNotification(final FormComponent assignmentToShiftForm) { assignmentToShiftForm.addMessage("assignmentToShift.assignmentToShift.info.lastStateChangeSucceed", ComponentState.MessageType.SUCCESS, true); } private void showStateChangeFailureNotification(final FormComponent assignmentToShiftForm, final Entity assignmentToShift) { String lastStateChangeFailCause = assignmentToShift.getStringField(AssignmentToShiftFields.LAST_STATE_CHANGE_FAIL_CAUSE); if (StringUtils.isEmpty(lastStateChangeFailCause)) { assignmentToShiftForm.addMessage("assignmentToShift.assignmentToShift.info.lastStateChangeFails", ComponentState.MessageType.FAILURE, false); } else { assignmentToShiftForm.addMessage("assignmentToShift.assignmentToShift.info.lastStateChangeFails.withCause", ComponentState.MessageType.FAILURE, false, lastStateChangeFailCause); } } private void removeShowLastResultsFlag(final Entity assignmentToShift) { assignmentToShift.setField(AssignmentToShiftFields.SHOW_LAST_STATE_CHANGE_RESULT, false); Entity savedAssignmentToShift = assignmentToShift.getDataDefinition().save(assignmentToShift); if (!savedAssignmentToShift.isValid() && LOG.isWarnEnabled()) { LOG.warn("Can't remove 'showLastStateChangeResults' flag because of validation errors in entity: " + savedAssignmentToShift); } } }