/** * *************************************************************************** * 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.orders; import java.util.Calendar; import java.util.Collections; import java.util.Date; import java.util.List; import java.util.Locale; import java.util.Set; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.google.common.collect.Sets; import com.qcadoo.localization.api.TranslationService; import com.qcadoo.mes.basic.ParameterService; import com.qcadoo.mes.basic.constants.ProductFields; import com.qcadoo.mes.orders.constants.OrderFields; import com.qcadoo.mes.orders.constants.OrdersConstants; import com.qcadoo.mes.orders.constants.ParameterFieldsO; import com.qcadoo.mes.orders.states.constants.OrderState; import com.qcadoo.mes.productionLines.constants.ParameterFieldsPL; import com.qcadoo.mes.technologies.constants.TechnologyFields; import com.qcadoo.mes.technologies.constants.TechnologyOperationComponentFields; import com.qcadoo.model.api.DataDefinition; import com.qcadoo.model.api.DataDefinitionService; import com.qcadoo.model.api.Entity; import com.qcadoo.view.api.ViewDefinitionState; import com.qcadoo.view.api.components.CheckBoxComponent; import com.qcadoo.view.api.components.FieldComponent; @Service public class OrderServiceImpl implements OrderService { private static final String L_EMPTY_NUMBER = ""; private static final Set<String> L_ORDER_STARTED_STATES = Collections .unmodifiableSet(Sets.newHashSet(OrderState.IN_PROGRESS.getStringValue(), OrderState.COMPLETED.getStringValue(), OrderState.INTERRUPTED.getStringValue())); @Autowired private DataDefinitionService dataDefinitionService; @Autowired private TranslationService translationService; @Autowired private ParameterService parameterService; @Autowired private TechnologyServiceO technologyServiceO; @Override public Entity getOrder(final Long orderId) { return getOrderDataDefinition().get(orderId); } private DataDefinition getOrderDataDefinition() { return dataDefinitionService.get(OrdersConstants.PLUGIN_IDENTIFIER, OrdersConstants.MODEL_ORDER); } @Override public boolean isOrderStarted(final String state) { return L_ORDER_STARTED_STATES.contains(state); } @Override public Entity getDefaultProductionLine() { return parameterService.getParameter().getBelongsToField(ParameterFieldsPL.DEFAULT_PRODUCTION_LINE); } @Override public String makeDefaultName(final Entity product, Entity technology, final Locale locale) { if (technology == null) { technology = technologyServiceO.getDefaultTechnology(product); } String technologyNumber = L_EMPTY_NUMBER; Calendar cal = Calendar.getInstance(locale); cal.setTime(new Date()); if (technology != null) { technologyNumber = "tech. " + technology.getStringField(TechnologyFields.NUMBER); return translationService.translate("orders.order.name.default", locale, product.getStringField(OrderFields.NAME), product.getStringField(ProductFields.NUMBER), technologyNumber, cal.get(Calendar.YEAR) + "." + (cal.get(Calendar.MONTH) + 1) + "." + cal.get(Calendar.DAY_OF_MONTH)); } else { return translationService.translate("orders.order.name.defaultFromProduct", locale, product.getStringField(OrderFields.NAME), product.getStringField(ProductFields.NUMBER), cal.get(Calendar.YEAR) + "." + (cal.get(Calendar.MONTH) + 1) + "." + cal.get(Calendar.DAY_OF_MONTH)); } } // FIXME - this method doesn't have anything in common with production orders.. @Override public void changeFieldState(final ViewDefinitionState view, final String booleanFieldComponentName, final String fieldComponentName) { CheckBoxComponent booleanCheckBox = (CheckBoxComponent) view.getComponentByReference(booleanFieldComponentName); FieldComponent fieldComponent = (FieldComponent) view.getComponentByReference(fieldComponentName); if (booleanCheckBox.isChecked()) { fieldComponent.setEnabled(true); fieldComponent.requestComponentUpdateState(); } else { fieldComponent.setEnabled(false); fieldComponent.requestComponentUpdateState(); } } @Override public boolean checkComponentOrderHasTechnology(final DataDefinition dataDefinition, final Entity entity) { Entity order = null; if (OrdersConstants.MODEL_ORDER.equals(entity.getDataDefinition().getName())) { order = entity; } else { order = entity.getBelongsToField(OrdersConstants.MODEL_ORDER); } if (order == null) { return true; } if (order.getField(OrderFields.TECHNOLOGY) == null) { entity.addError(dataDefinition.getField(OrdersConstants.MODEL_ORDER), "orders.validate.global.error.orderMustHaveTechnology"); return false; } else { return true; } } @Override public boolean checkAutogenealogyRequired() { Entity parameter = parameterService.getParameter(); if (parameter.getField("batchForDoneOrder") == null) { return false; } else { return !"01none".equals(parameter.getStringField("batchForDoneOrder")); } } @Override public boolean checkRequiredBatch(final Entity order) { Entity technology = order.getBelongsToField(OrderFields.TECHNOLOGY); if (technology != null) { if (order.getHasManyField("genealogies").isEmpty()) { if (technology.getBooleanField("batchRequired")) { return false; } if (technology.getBooleanField("shiftFeatureRequired")) { return false; } if (technology.getBooleanField("postFeatureRequired")) { return false; } if (technology.getBooleanField("otherFeatureRequired")) { return false; } for (Entity operationComponent : technology.getTreeField(TechnologyFields.OPERATION_COMPONENTS)) { for (Entity operationProductComponent : operationComponent .getHasManyField(TechnologyOperationComponentFields.OPERATION_PRODUCT_IN_COMPONENTS)) { if (operationProductComponent.getBooleanField("batchRequired")) { return false; } } } } for (Entity genealogy : order.getHasManyField("genealogies")) { if (technology.getBooleanField("batchRequired") && genealogy.getField("batch") == null) { return false; } if (technology.getBooleanField("shiftFeatureRequired")) { List<Entity> entityList = genealogy.getHasManyField("shiftFeatures"); if (entityList.isEmpty()) { return false; } } if (technology.getBooleanField("postFeatureRequired")) { List<Entity> entityList = genealogy.getHasManyField("postFeatures"); if (entityList.isEmpty()) { return false; } } if (technology.getBooleanField("otherFeatureRequired")) { List<Entity> entityList = genealogy.getHasManyField("otherFeatures"); if (entityList.isEmpty()) { return false; } } for (Entity genealogyProductIn : genealogy.getHasManyField("productInComponents")) { if (genealogyProductIn.getBelongsToField("productInComponent").getBooleanField("batchRequired")) { List<Entity> entityList = genealogyProductIn.getHasManyField("batch"); if (entityList.isEmpty()) { return false; } } } } } return true; } @Override public boolean isPktEnabled() { return parameterService.getParameter().getBooleanField(ParameterFieldsO.ENABLE_PKT); } @Override public String buildOrderDescription(Entity masterOrder,Entity technology,boolean fillOrderDescriptionBasedOnTechnology){ StringBuilder builder = new StringBuilder(); if(masterOrder !=null){ String poNumber = ""; String direction = ""; if (masterOrder.getStringField("poNumber") != null) { poNumber = masterOrder.getStringField("poNumber"); } if (masterOrder.getStringField("direction") != null) { direction = masterOrder.getStringField("direction"); } if (!poNumber.isEmpty()) { builder.append("PO"); builder.append(poNumber); if(direction.isEmpty()){ builder.append("\n"); } } if (!direction.isEmpty()) { builder.append("-"); builder.append(direction); builder.append("\n"); } if(technology == null && masterOrder.getBelongsToField("technology") !=null){ if(fillOrderDescriptionBasedOnTechnology){ String technologyDescription = masterOrder.getBelongsToField("technology").getStringField(TechnologyFields.DESCRIPTION); if (technologyDescription != null) { builder.append(technologyDescription); } } } } if(technology != null){ if(fillOrderDescriptionBasedOnTechnology) { String technologyDescription = technology.getStringField(TechnologyFields.DESCRIPTION); if (technologyDescription != null) { builder.append(technologyDescription); } } } return builder.toString(); } }