/** * *************************************************************************** * 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.basicProductionCounting; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import java.util.stream.Collectors; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.google.common.collect.Maps; import com.google.common.collect.Sets; import com.qcadoo.mes.basic.constants.ProductFields; import com.qcadoo.mes.basicProductionCounting.constants.BasicProductionCountingConstants; import com.qcadoo.mes.basicProductionCounting.constants.BasicProductionCountingFields; import com.qcadoo.mes.basicProductionCounting.constants.OrderFieldsBPC; import com.qcadoo.mes.basicProductionCounting.constants.ProductionCountingOperationRunFields; import com.qcadoo.mes.basicProductionCounting.constants.ProductionCountingQuantityFields; import com.qcadoo.mes.basicProductionCounting.constants.ProductionCountingQuantityRole; import com.qcadoo.mes.basicProductionCounting.constants.ProductionCountingQuantityTypeOfMaterial; import com.qcadoo.mes.orders.constants.OrderFields; import com.qcadoo.mes.orders.states.constants.OrderState; import com.qcadoo.mes.technologies.ProductQuantitiesService; import com.qcadoo.mes.technologies.constants.MrpAlgorithm; import com.qcadoo.mes.technologies.constants.OperationProductInComponentFields; import com.qcadoo.mes.technologies.constants.TechnologiesConstants; import com.qcadoo.mes.technologies.constants.TechnologyFields; import com.qcadoo.mes.technologies.constants.TechnologyOperationComponentFields; import com.qcadoo.mes.technologies.dto.OperationProductComponentHolder; import com.qcadoo.mes.technologies.dto.OperationProductComponentWithQuantityContainer; import com.qcadoo.model.api.BigDecimalUtils; import com.qcadoo.model.api.DataDefinition; import com.qcadoo.model.api.DataDefinitionService; import com.qcadoo.model.api.Entity; import com.qcadoo.model.api.NumberService; import com.qcadoo.model.api.search.SearchCriteriaBuilder; import com.qcadoo.model.api.search.SearchRestrictions; import com.qcadoo.view.api.ViewDefinitionState; import com.qcadoo.view.api.components.FieldComponent; import com.qcadoo.view.api.components.LookupComponent; import com.qcadoo.view.constants.RowStyle; @Service public class BasicProductionCountingServiceImpl implements BasicProductionCountingService { @Autowired private DataDefinitionService dataDefinitionService; @Autowired private NumberService numberService; @Autowired private ProductQuantitiesService productQuantitiesService; @Autowired private ProductionCountingQuantitySetService productionCountingQuantitySetService; @Override public void createProductionCountingQuantitiesAndOperationRuns(final Entity order) { Map<Long, BigDecimal> operationRuns = Maps.newHashMap(); Set<OperationProductComponentHolder> nonComponents = Sets.newHashSet(); final OperationProductComponentWithQuantityContainer productComponentQuantities = productQuantitiesService .getProductComponentWithQuantities(Arrays.asList(order), operationRuns, nonComponents); createProductionCountingOperationRuns(order, operationRuns); createProductionCountingQuantities(order, productComponentQuantities, nonComponents); } private void createProductionCountingOperationRuns(final Entity order, final Map<Long, BigDecimal> operationRuns) { for (Entry<Long, BigDecimal> operationRun : operationRuns.entrySet()) { Entity technologyOperationComponent = productQuantitiesService.getTechnologyOperationComponent(operationRun.getKey()); BigDecimal runs = operationRun.getValue(); createProductionCountingOperationRun(order, technologyOperationComponent, runs); } } @Override public Entity createProductionCountingOperationRun(final Entity order, final Entity technologyOperationComponent, final BigDecimal runs) { Entity productionCountingOperationRun = getProductionCountingOperationRunDD().create(); productionCountingOperationRun.setField(ProductionCountingOperationRunFields.ORDER, order); productionCountingOperationRun.setField(ProductionCountingOperationRunFields.TECHNOLOGY_OPERATION_COMPONENT, technologyOperationComponent); productionCountingOperationRun.setField(ProductionCountingOperationRunFields.RUNS, numberService.setScale(runs)); productionCountingOperationRun = productionCountingOperationRun.getDataDefinition().save(productionCountingOperationRun); return productionCountingOperationRun; } private void createProductionCountingQuantities(final Entity order, final OperationProductComponentWithQuantityContainer productComponentQuantities, final Set<OperationProductComponentHolder> nonComponents) { List<Entity> productionCountingQuantities = new ArrayList<>(); for (Entry<OperationProductComponentHolder, BigDecimal> productComponentQuantity : productComponentQuantities.asMap() .entrySet()) { OperationProductComponentHolder operationProductComponentHolder = productComponentQuantity.getKey(); BigDecimal plannedQuantity = productComponentQuantity.getValue(); Entity technologyOperationComponent = operationProductComponentHolder.getTechnologyOperationComponent(); Entity product = operationProductComponentHolder.getProduct(); String role = getRole(operationProductComponentHolder); boolean isNonComponent = nonComponents.contains(operationProductComponentHolder); Entity productionCountingQuantity = createProductionCountingQuantity(order, technologyOperationComponent, product, role, isNonComponent, plannedQuantity); productionCountingQuantities.add(productionCountingQuantity); } productionCountingQuantitySetService.markIntermediateInProductionCountingQuantities(productionCountingQuantities); } @Override public Entity createProductionCountingQuantity(final Entity order, final Entity technologyOperationComponent, final Entity product, final String role, final boolean isNonComponent, final BigDecimal plannedQuantity) { Entity productionCountingQuantity = getProductionCountingQuantityDD().create(); productionCountingQuantity.setField(ProductionCountingQuantityFields.ORDER, order); productionCountingQuantity.setField(ProductionCountingQuantityFields.TECHNOLOGY_OPERATION_COMPONENT, technologyOperationComponent); productionCountingQuantity.setField(ProductionCountingQuantityFields.PRODUCT, product); productionCountingQuantity.setField(ProductionCountingQuantityFields.ROLE, role); productionCountingQuantity.setField(ProductionCountingQuantityFields.TYPE_OF_MATERIAL, getTypeOfMaterial(order, technologyOperationComponent, product, role, isNonComponent)); productionCountingQuantity.setField(ProductionCountingQuantityFields.IS_NON_COMPONENT, isNonComponent); productionCountingQuantity.setField(ProductionCountingQuantityFields.PLANNED_QUANTITY, numberService.setScale(plannedQuantity)); productionCountingQuantity = productionCountingQuantity.getDataDefinition().save(productionCountingQuantity); return productionCountingQuantity; } private String getRole(final OperationProductComponentHolder operationProductComponentHolder) { if (operationProductComponentHolder.isEntityTypeSame(TechnologiesConstants.MODEL_OPERATION_PRODUCT_IN_COMPONENT)) { return ProductionCountingQuantityRole.USED.getStringValue(); } else if (operationProductComponentHolder.isEntityTypeSame(TechnologiesConstants.MODEL_OPERATION_PRODUCT_OUT_COMPONENT)) { return ProductionCountingQuantityRole.PRODUCED.getStringValue(); } else { return ProductionCountingQuantityRole.USED.getStringValue(); } } private String getTypeOfMaterial(final Entity order, final Entity technologyOperationComponent, final Entity product, final String role, boolean isNonComponent) { if (isNonComponent) { return ProductionCountingQuantityTypeOfMaterial.INTERMEDIATE.getStringValue(); } else if (isRoleProduced(role)) { if (checkIfProductIsFinalProduct(order, technologyOperationComponent, product)) { return ProductionCountingQuantityTypeOfMaterial.FINAL_PRODUCT.getStringValue(); } else if (checkIfProductAlreadyExists(technologyOperationComponent, product)) { return ProductionCountingQuantityTypeOfMaterial.INTERMEDIATE.getStringValue(); } else { return ProductionCountingQuantityTypeOfMaterial.WASTE.getStringValue(); } } else { return ProductionCountingQuantityTypeOfMaterial.COMPONENT.getStringValue(); } } private boolean checkIfProductIsFinalProduct(final Entity order, final Entity technologyOperationComponent, final Entity product) { return (checkIfProductsAreSame(order, product) && checkIfTechnologyOperationComponentsAreSame(order, technologyOperationComponent)); } private boolean checkIfProductsAreSame(final Entity order, final Entity product) { Entity orderProduct = order.getBelongsToField(OrderFields.PRODUCT); if (orderProduct == null) { return false; } else { return product.getId().equals(orderProduct.getId()); } } private boolean checkIfTechnologyOperationComponentsAreSame(final Entity order, final Entity technologyOperationComponent) { Entity orderTechnologyOperationComponent = getOrderTechnologyOperationComponent(order); if (orderTechnologyOperationComponent == null) { return false; } else { return technologyOperationComponent.getId().equals(orderTechnologyOperationComponent.getId()); } } private boolean isRoleProduced(final String role) { return ProductionCountingQuantityRole.PRODUCED.getStringValue().equals(role); } private Entity getOrderTechnologyOperationComponent(final Entity order) { Entity technology = order.getBelongsToField(OrderFields.TECHNOLOGY); if (technology == null) { return null; } else { Entity technologyOperationComponent = technology.getTreeField(TechnologyFields.OPERATION_COMPONENTS).getRoot(); return technologyOperationComponent; } } private boolean checkIfProductAlreadyExists(final Entity technologyOperationComponent, final Entity product) { if (technologyOperationComponent == null) { return false; } else { Entity previousTechnologyOperationComponent = technologyOperationComponent .getBelongsToField(TechnologyOperationComponentFields.PARENT); if (previousTechnologyOperationComponent == null) { return false; } else { return checkIfProductExists(previousTechnologyOperationComponent, product); } } } private boolean checkIfProductExists(final Entity previousTechnologyOperationComponent, final Entity product) { return (previousTechnologyOperationComponent .getHasManyField(TechnologyOperationComponentFields.OPERATION_PRODUCT_IN_COMPONENTS).find() .add(SearchRestrictions.belongsTo(OperationProductInComponentFields.PRODUCT, product)).list() .getTotalNumberOfEntities() == 1); } @Override public void updateProductionCountingQuantitiesAndOperationRuns(final Entity order) { final Map<Long, BigDecimal> operationRuns = Maps.newHashMap(); final Set<OperationProductComponentHolder> nonComponents = Sets.newHashSet(); final OperationProductComponentWithQuantityContainer productComponentQuantities = productQuantitiesService .getProductComponentWithQuantities(Arrays.asList(order), operationRuns, nonComponents); updateProductionCountingOperationRuns(order, operationRuns); updateProductionCountingQuantities(order, productComponentQuantities, nonComponents); } private void updateProductionCountingOperationRuns(final Entity order, final Map<Long, BigDecimal> operationRuns) { for (Entry<Long, BigDecimal> operationRun : operationRuns.entrySet()) { Entity technologyOperationComponent = productQuantitiesService.getTechnologyOperationComponent(operationRun.getKey()); BigDecimal runs = operationRun.getValue(); updateProductionCountingOperationRun(order, technologyOperationComponent, runs); } } private void updateProductionCountingOperationRun(final Entity order, final Entity technologyOperationComponent, final BigDecimal runs) { Entity productionCountingOperationRun = getProductionCountingOperationRunDD() .find() .add(SearchRestrictions.belongsTo(ProductionCountingOperationRunFields.ORDER, order)) .add(SearchRestrictions.belongsTo(ProductionCountingOperationRunFields.TECHNOLOGY_OPERATION_COMPONENT, technologyOperationComponent)).setMaxResults(1).uniqueResult(); if (productionCountingOperationRun != null) { productionCountingOperationRun.setField(ProductionCountingOperationRunFields.ORDER, order); productionCountingOperationRun.setField(ProductionCountingOperationRunFields.TECHNOLOGY_OPERATION_COMPONENT, technologyOperationComponent); productionCountingOperationRun.setField(ProductionCountingOperationRunFields.RUNS, runs); productionCountingOperationRun.getDataDefinition().save(productionCountingOperationRun); } } private void updateProductionCountingQuantities(final Entity order, final OperationProductComponentWithQuantityContainer productComponentQuantities, final Set<OperationProductComponentHolder> nonComponents) { for (Entry<OperationProductComponentHolder, BigDecimal> productComponentQuantity : productComponentQuantities.asMap() .entrySet()) { OperationProductComponentHolder operationProductComponentHolder = productComponentQuantity.getKey(); BigDecimal plannedQuantity = productComponentQuantity.getValue(); Entity technologyOperationComponent = operationProductComponentHolder.getTechnologyOperationComponent(); Entity product = operationProductComponentHolder.getProduct(); String role = getRole(operationProductComponentHolder); boolean isNonComponent = nonComponents.contains(operationProductComponentHolder); updateProductionCountingQuantity(order, technologyOperationComponent, product, role, isNonComponent, plannedQuantity); } updateProductionCountingQuantity(order, getOrderTechnologyOperationComponent(order), order.getBelongsToField(OrderFields.PRODUCT), ProductionCountingQuantityRole.PRODUCED.getStringValue(), false, order.getDecimalField(OrderFields.PLANNED_QUANTITY)); } private void updateProductionCountingQuantity(final Entity order, final Entity technologyOperationComponent, final Entity product, final String role, final boolean isNonComponent, final BigDecimal plannedQuantity) { Entity productionCountingQuantity = getProductionCountingQuantityDD() .find() .add(SearchRestrictions.belongsTo(ProductionCountingQuantityFields.ORDER, order)) .add(SearchRestrictions.belongsTo(ProductionCountingQuantityFields.TECHNOLOGY_OPERATION_COMPONENT, technologyOperationComponent)) .add(SearchRestrictions.belongsTo(ProductionCountingQuantityFields.PRODUCT, product)) .add(SearchRestrictions.eq(ProductionCountingQuantityFields.ROLE, role)).setMaxResults(1).uniqueResult(); if (productionCountingQuantity != null) { productionCountingQuantity.setField(ProductionCountingQuantityFields.ORDER, order); productionCountingQuantity.setField(ProductionCountingQuantityFields.TECHNOLOGY_OPERATION_COMPONENT, technologyOperationComponent); productionCountingQuantity.setField(ProductionCountingQuantityFields.PRODUCT, product); productionCountingQuantity.setField(ProductionCountingQuantityFields.ROLE, role); productionCountingQuantity.setField(ProductionCountingQuantityFields.IS_NON_COMPONENT, isNonComponent); productionCountingQuantity.setField(ProductionCountingQuantityFields.PLANNED_QUANTITY, numberService.setScale(plannedQuantity)); productionCountingQuantity.getDataDefinition().save(productionCountingQuantity); } } public void createBasicProductionCountings(final Entity order) { final List<Entity> basicProductionCountings = getBasicProductionCountingDD().find() .add(SearchRestrictions.belongsTo(BasicProductionCountingFields.ORDER, order)).list().getEntities(); if (basicProductionCountings == null || basicProductionCountings.isEmpty()) { final List<Entity> productionCountingQuantities = order .getHasManyField(OrderFieldsBPC.PRODUCTION_COUNTING_QUANTITIES) .find() .add(SearchRestrictions.or(SearchRestrictions.eq(ProductionCountingQuantityFields.ROLE, ProductionCountingQuantityRole.USED.getStringValue()), SearchRestrictions.and(SearchRestrictions.eq( ProductionCountingQuantityFields.ROLE, ProductionCountingQuantityRole.PRODUCED.getStringValue()), SearchRestrictions.eq(ProductionCountingQuantityFields.TYPE_OF_MATERIAL, ProductionCountingQuantityTypeOfMaterial.WASTE.getStringValue())))).list().getEntities(); Set<Long> alreadyAddedProducts = Sets.newHashSet(); for (Entity productionCountingQuantity : productionCountingQuantities) { Entity product = productionCountingQuantity.getBelongsToField(ProductionCountingQuantityFields.PRODUCT); if (!alreadyAddedProducts.contains(product.getId())) { createBasicProductionCounting(order, product); alreadyAddedProducts.add(product.getId()); } } createBasicProductionCounting(order, order.getBelongsToField(OrderFields.PRODUCT)); } } @Override public Entity createBasicProductionCounting(final Entity order, final Entity product) { Entity basicProductionCounting = getBasicProductionCountingDD().create(); basicProductionCounting.setField(BasicProductionCountingFields.ORDER, order); basicProductionCounting.setField(BasicProductionCountingFields.PRODUCT, product); basicProductionCounting .setField(BasicProductionCountingFields.PRODUCED_QUANTITY, numberService.setScale(BigDecimal.ZERO)); basicProductionCounting.setField(BasicProductionCountingFields.USED_QUANTITY, numberService.setScale(BigDecimal.ZERO)); basicProductionCounting = basicProductionCounting.getDataDefinition().save(basicProductionCounting); return basicProductionCounting; } @Override public void associateProductionCountingQuantitiesWithBasicProductionCountings(final Entity order) { final List<Entity> basicProductionCountings = order.getHasManyField(OrderFieldsBPC.BASIC_PRODUCTION_COUNTINGS).find() .list().getEntities(); for (Entity basicProductionCounting : basicProductionCountings) { Entity product = basicProductionCounting.getBelongsToField(BasicProductionCountingFields.PRODUCT); final List<Entity> productionCountingQuantities = order .getHasManyField(OrderFieldsBPC.PRODUCTION_COUNTING_QUANTITIES).find() .add(SearchRestrictions.belongsTo(BasicProductionCountingFields.PRODUCT, product)).list().getEntities(); basicProductionCounting.setField(BasicProductionCountingFields.PRODUCTION_COUNTING_QUANTITIES, productionCountingQuantities); basicProductionCounting.getDataDefinition().save(basicProductionCounting); } } @Override public void updateProducedQuantity(final Entity order) { final List<Entity> basicProductionCountings = order.getHasManyField(OrderFieldsBPC.BASIC_PRODUCTION_COUNTINGS).find() .list().getEntities(); for (Entity basicProductionCounting : basicProductionCountings) { Entity product = basicProductionCounting.getBelongsToField(BasicProductionCountingFields.PRODUCT); if (order.getBelongsToField(OrderFields.PRODUCT).getId().equals(product.getId())) { basicProductionCounting.setField(BasicProductionCountingFields.PRODUCED_QUANTITY, order.getDecimalField(OrderFields.DONE_QUANTITY)); basicProductionCounting.getDataDefinition().save(basicProductionCounting); } } } @Override public List<Entity> getUsedMaterialsFromProductionCountingQuantities(Entity order) { return getUsedMaterialsFromProductionCountingQuantities(order, false); } @Override public List<Entity> getUsedMaterialsFromProductionCountingQuantities(Entity order, boolean onlyComponents) { SearchCriteriaBuilder scb = order .getHasManyField(OrderFieldsBPC.PRODUCTION_COUNTING_QUANTITIES) .find() .add(SearchRestrictions.eq(ProductionCountingQuantityFields.ROLE, ProductionCountingQuantityRole.USED.getStringValue())); if (onlyComponents) { scb.add(SearchRestrictions.eq(ProductionCountingQuantityFields.TYPE_OF_MATERIAL, ProductionCountingQuantityTypeOfMaterial.COMPONENT.getStringValue())); } return scb.list().getEntities(); } @Override public List<Entity> getMaterialsForOperationFromProductionCountingQuantities(Entity order, Entity operationComponent) { SearchCriteriaBuilder scb = order .getHasManyField(OrderFieldsBPC.PRODUCTION_COUNTING_QUANTITIES) .find() .add(SearchRestrictions.belongsTo(ProductionCountingQuantityFields.TECHNOLOGY_OPERATION_COMPONENT, operationComponent)); return scb.list().getEntities(); } @Override public Map<Long, BigDecimal> getNeededProductQuantities(List<Entity> orders, MrpAlgorithm algorithm) { List<Entity> draftOrders = orders.stream() .filter(order -> OrderState.PENDING.getStringValue().equals(order.getStringField(OrderFields.STATE))) .collect(Collectors.toList()); List<Entity> otherOrders = orders.stream() .filter(order -> !OrderState.PENDING.getStringValue().equals(order.getStringField(OrderFields.STATE))) .collect(Collectors.toList()); Map<Long, BigDecimal> neededProductQuantities = productQuantitiesService.getNeededProductQuantities(draftOrders, algorithm, true); if (neededProductQuantities == null) { neededProductQuantities = Maps.newHashMap(); } for (Entity order : otherOrders) { List<Entity> productionCountingQuantities = getUsedMaterialsFromProductionCountingQuantities(order); for (Entity pcq : productionCountingQuantities) { Long productId = pcq.getBelongsToField(ProductionCountingQuantityFields.PRODUCT).getId(); if (neededProductQuantities.containsKey(productId)) { neededProductQuantities.put(productId, pcq.getDecimalField(ProductionCountingQuantityFields.PLANNED_QUANTITY) .add(neededProductQuantities.get(productId))); } else { neededProductQuantities .put(productId, pcq.getDecimalField(ProductionCountingQuantityFields.PLANNED_QUANTITY)); } } } return neededProductQuantities; } @Override public Entity getBasicProductionCounting(final Long basicProductionCoutningId) { return getBasicProductionCountingDD().get(basicProductionCoutningId); } @Override public Entity getProductionCountingQuantity(final Long productionCountingQuantityId) { return getBasicProductionCountingDD().get(productionCountingQuantityId); } @Override public DataDefinition getBasicProductionCountingDD() { return dataDefinitionService.get(BasicProductionCountingConstants.PLUGIN_IDENTIFIER, BasicProductionCountingConstants.MODEL_BASIC_PRODUCTION_COUNTING); } @Override public DataDefinition getProductionCountingQuantityDD() { return dataDefinitionService.get(BasicProductionCountingConstants.PLUGIN_IDENTIFIER, BasicProductionCountingConstants.MODEL_PRODUCTION_COUNTING_QUANTITY); } private DataDefinition getProductionCountingOperationRunDD() { return dataDefinitionService.get(BasicProductionCountingConstants.PLUGIN_IDENTIFIER, BasicProductionCountingConstants.MODEL_PRODUCTION_COUNTING_OPERATON_RUN); } @Override public BigDecimal getProducedQuantityFromBasicProductionCountings(final Entity order) { BigDecimal doneQuantity = BigDecimal.ZERO; Entity product = order.getBelongsToField(OrderFields.PRODUCT); List<Entity> basicProductionCountings = dataDefinitionService .get(BasicProductionCountingConstants.PLUGIN_IDENTIFIER, BasicProductionCountingConstants.MODEL_BASIC_PRODUCTION_COUNTING).find() .add(SearchRestrictions.belongsTo(BasicProductionCountingFields.ORDER, order)) .add(SearchRestrictions.belongsTo(BasicProductionCountingFields.PRODUCT, product)).list().getEntities(); for (Entity basicProductionCounting : basicProductionCountings) { BigDecimal producedQuantity = BigDecimalUtils.convertNullToZero(basicProductionCounting .getDecimalField(BasicProductionCountingFields.PRODUCED_QUANTITY)); doneQuantity = doneQuantity.add(producedQuantity, numberService.getMathContext()); } return numberService.setScale(doneQuantity); } @Override public void fillUnitFields(final ViewDefinitionState view, final String productName, final List<String> referenceNames) { LookupComponent productLookup = (LookupComponent) view.getComponentByReference(productName); Entity product = productLookup.getEntity(); String unit = ""; if (product != null) { unit = product.getStringField(ProductFields.UNIT); } for (String referenceName : referenceNames) { FieldComponent field = (FieldComponent) view.getComponentByReference(referenceName); field.setFieldValue(unit); field.requestComponentUpdateState(); } } @Override public void setTechnologyOperationComponentFieldRequired(final ViewDefinitionState view) { FieldComponent typeOfMaterialField = (FieldComponent) view .getComponentByReference(ProductionCountingQuantityFields.TYPE_OF_MATERIAL); LookupComponent technologyOperationComponentLookup = (LookupComponent) view .getComponentByReference(ProductionCountingQuantityFields.TECHNOLOGY_OPERATION_COMPONENT); String typeOfMaterial = (String) typeOfMaterialField.getFieldValue(); boolean isRequired = ProductionCountingQuantityTypeOfMaterial.INTERMEDIATE.getStringValue().equals(typeOfMaterial); technologyOperationComponentLookup.setRequired(isRequired); } @Override public Set<String> fillRowStylesDependsOfTypeOfMaterial(final Entity productionCountingQuantity) { final Set<String> rowStyles = Sets.newHashSet(); final String typeOfMaterial = productionCountingQuantity .getStringField(ProductionCountingQuantityFields.TYPE_OF_MATERIAL); if (ProductionCountingQuantityTypeOfMaterial.COMPONENT.getStringValue().equals(typeOfMaterial)) { rowStyles.add(RowStyle.GREEN_BACKGROUND); } else if (ProductionCountingQuantityTypeOfMaterial.INTERMEDIATE.getStringValue().equals(typeOfMaterial)) { rowStyles.add(RowStyle.BLUE_BACKGROUND); } else if (ProductionCountingQuantityTypeOfMaterial.FINAL_PRODUCT.getStringValue().equals(typeOfMaterial)) { rowStyles.add(RowStyle.YELLOW_BACKGROUND); } else { rowStyles.add(RowStyle.BROWN_BACKGROUND); } return rowStyles; } }