/**
* ***************************************************************************
* 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.cmmsMachineParts;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.stereotype.Service;
import com.qcadoo.mes.cmmsMachineParts.constants.CmmsMachinePartsConstants;
import com.qcadoo.mes.cmmsMachineParts.constants.MaintenanceEventContextFields;
import com.qcadoo.mes.cmmsMachineParts.constants.MaintenanceEventFields;
import com.qcadoo.mes.cmmsMachineParts.criteriaModifiers.EventCriteriaModifiersCMP;
import com.qcadoo.model.api.DataDefinition;
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.ComponentState;
import com.qcadoo.view.api.ViewDefinitionState;
import com.qcadoo.view.api.components.FieldComponent;
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.components.lookup.FilterValueHolder;
import com.qcadoo.view.api.ribbon.Ribbon;
import com.qcadoo.view.api.ribbon.RibbonActionItem;
import com.qcadoo.view.api.ribbon.RibbonGroup;
import com.qcadoo.view.internal.components.form.FormComponentState;
@Service
public class MaintenanceEventContextService {
private static final String L_FORM = "form";
private static final String L_GRID = "grid";
private static final String L_PLANNED_EVENT = "plannedEvent";
@Autowired
private DataDefinitionService dataDefinitionService;
@Autowired
private NamedParameterJdbcTemplate jdbcTemplate;
public void confirmOrChangeContext(ViewDefinitionState view, ComponentState componentState, String[] args) {
FormComponent formComponent = (FormComponentState) view.getComponentByReference(L_FORM);
Entity maintenanceEventContextEntity = prepareContextEntity(formComponent.getEntity());
if (maintenanceEventContextEntity.getBooleanField(MaintenanceEventContextFields.CONFIRMED)) {
maintenanceEventContextEntity = changeContext(view, maintenanceEventContextEntity);
} else {
maintenanceEventContextEntity = confirmContext(maintenanceEventContextEntity, args);
}
formComponent.setEntity(maintenanceEventContextEntity);
}
private Entity changeContext(ViewDefinitionState view, Entity maintenanceEventContextEntity) {
FormComponent formComponent = (FormComponentState) view.getComponentByReference(L_FORM);
maintenanceEventContextEntity.setField(MaintenanceEventContextFields.CONFIRMED, false);
maintenanceEventContextEntity = maintenanceEventContextEntity.getDataDefinition().save(maintenanceEventContextEntity);
formComponent.setEntity(maintenanceEventContextEntity);
return maintenanceEventContextEntity;
}
private Entity confirmContext(Entity maintenanceEventContextEntity, String[] args) {
maintenanceEventContextEntity.setField(MaintenanceEventContextFields.CONFIRMED, true);
maintenanceEventContextEntity = maintenanceEventContextEntity.getDataDefinition().save(maintenanceEventContextEntity);
Long maintenanceEventContextEntityId = maintenanceEventContextEntity.getId();
Map<String, Object> parameters = new HashMap<>();
parameters.put("contextId", maintenanceEventContextEntityId);
SqlParameterSource namedParameters = new MapSqlParameterSource(parameters);
if (args.length > 0 && args[0].equals(L_PLANNED_EVENT)) {
String sql = "update cmmsmachineparts_plannedevent set plannedeventcontext_id = :contextId";
jdbcTemplate.update(sql, namedParameters);
} else {
String sql = "update cmmsmachineparts_maintenanceevent set maintenanceeventcontext_id = :contextId";
jdbcTemplate.update(sql, namedParameters);
}
return maintenanceEventContextEntity;
}
public Entity prepareContextEntity(Entity maintenanceEventContextEntity) {
SearchCriteriaBuilder searchCriteriaBuilder = maintenanceEventContextEntity.getDataDefinition().find();
searchCriteriaBuilder.add(SearchRestrictions.belongsTo(MaintenanceEventContextFields.DIVISION,
maintenanceEventContextEntity.getBelongsToField(MaintenanceEventContextFields.DIVISION)));
searchCriteriaBuilder.add(SearchRestrictions.belongsTo(MaintenanceEventContextFields.FACTORY,
maintenanceEventContextEntity.getBelongsToField(MaintenanceEventContextFields.FACTORY)));
Entity maintenanceEventContextEntityFromDb = searchCriteriaBuilder.uniqueResult();
if (maintenanceEventContextEntityFromDb == null) {
maintenanceEventContextEntity.setField(MaintenanceEventContextFields.CONFIRMED, false);
maintenanceEventContextEntity = maintenanceEventContextEntity.getDataDefinition().save(maintenanceEventContextEntity);
} else {
Long id = maintenanceEventContextEntity.getId();
maintenanceEventContextEntity = maintenanceEventContextEntityFromDb;
if (id == null) {
maintenanceEventContextEntity.setField(MaintenanceEventContextFields.CONFIRMED, false);
}
}
return maintenanceEventContextEntity;
}
public void beforeRenderListView(final ViewDefinitionState view) {
FormComponent formComponent = (FormComponent) view.getComponentByReference(L_FORM);
Entity maintenanceEventContext = formComponent.getEntity();
if (maintenanceEventContext.getBooleanField(MaintenanceEventContextFields.CONFIRMED)) {
prepareViewWithContext(view, maintenanceEventContext);
} else {
prepareViewWithEmptyContext(view, maintenanceEventContext);
}
}
private void prepareViewWithContext(ViewDefinitionState view, Entity maintenanceEventContext) {
setEnableOfRibbonActions(view, true);
setEnableOfContextTab(view, false);
setEnableOfMainTab(view, true);
setGridFilterParameters(view, maintenanceEventContext);
}
private void prepareViewWithEmptyContext(ViewDefinitionState view, Entity maintenanceEventContext) {
GridComponent grid = (GridComponent) view.getComponentByReference(L_GRID);
grid.setEntities(Arrays.asList());
setEnableOfRibbonActions(view, false);
setEnableOfContextTab(view, true);
setEnableOfMainTab(view, false);
}
private void setEnableOfContextTab(ViewDefinitionState view, boolean enabled) {
view.<FieldComponent> tryFindComponentByReference(MaintenanceEventContextFields.FACTORY).orNull().setEnabled(enabled);
view.<FieldComponent> tryFindComponentByReference(MaintenanceEventContextFields.DIVISION).orNull().setEnabled(enabled);
}
private void setEnableOfMainTab(ViewDefinitionState view, boolean enabled) {
view.getComponentByReference(L_GRID).setEnabled(enabled);
}
private void setEnableOfRibbonActions(ViewDefinitionState viewDefinitionState, boolean enabled) {
WindowComponent window = (WindowComponent) viewDefinitionState.getComponentByReference("window");
Ribbon ribbon = window.getRibbon();
RibbonGroup customActions = ribbon.getGroupByName("customActions");
if (customActions == null) {
return;
}
for (RibbonActionItem ribbonActionItem : customActions.getItems()) {
ribbonActionItem.setEnabled(enabled);
ribbonActionItem.requestUpdate(true);
}
}
private void setGridFilterParameters(ViewDefinitionState view, Entity maintenanceEventContext) {
GridComponent gridComponent = (GridComponent) view.getComponentByReference(L_GRID);
FilterValueHolder filterValueHolder = gridComponent.getFilterValue();
Entity factoryEntity = maintenanceEventContext.getBelongsToField(MaintenanceEventContextFields.FACTORY);
if (factoryEntity != null) {
filterValueHolder.put(EventCriteriaModifiersCMP.L_MAINTENANCE_EVENT_CONTEXT_FACTORY,
Math.toIntExact(factoryEntity.getId()));
}
Entity divisionEntity = maintenanceEventContext.getBelongsToField(MaintenanceEventContextFields.DIVISION);
if (divisionEntity != null) {
filterValueHolder.put(EventCriteriaModifiersCMP.L_MAINTENANCE_EVENT_CONTEXT_DIVISION,
Math.toIntExact(divisionEntity.getId()));
}
gridComponent.setFilterValue(filterValueHolder);
}
public void onSelectedEventChange(ViewDefinitionState view) {
GridComponent grid = (GridComponent) view.getComponentByReference(L_GRID);
FormComponent form = (FormComponent) view.getComponentByReference(L_FORM);
DataDefinition maintenanceEventDD = dataDefinitionService.get(CmmsMachinePartsConstants.PLUGIN_IDENTIFIER,
CmmsMachinePartsConstants.MODEL_MAINTENANCE_EVENT);
for (Entity eventEntity : grid.getSelectedEntities()) {
eventEntity.setField(MaintenanceEventFields.MAINTENANCE_EVENT_CONTEXT, form.getEntityId());
maintenanceEventDD.save(eventEntity);
}
}
public Entity getCurrentContext(ViewDefinitionState viewDefinitionState, ComponentState triggerState, String[] args) {
FormComponent formComponent = (FormComponentState) viewDefinitionState.getComponentByReference(L_FORM);
return prepareContextEntity(formComponent.getEntity());
}
}