private int evaluateOperationTime(final Entity order, final Entity operationComponent, final boolean includeTpz, final boolean includeAdditionalTime, final Map<Long, BigDecimal> operationRuns, final Entity productionLine, final boolean maxForWorkstation, final OperationProductComponentWithQuantityContainer productComponentQuantities) { int operationTime = evaluateSingleOperationTime(operationComponent, includeTpz, includeAdditionalTime, operationRuns, productionLine, maxForWorkstation); int offset = 0; List<Entity> childs = Lists.newArrayList(operationComponent.getHasManyField("children")); for (Entity child : childs) { int childTime = evaluateOperationTime(order, child, includeTpz, includeAdditionalTime, operationRuns, productionLine, maxForWorkstation, productComponentQuantities); if ("02specified".equals(child.getStringField("nextOperationAfterProducedType"))) { int childTimeTotal = evaluateSingleOperationTime(child, includeTpz, includeAdditionalTime, operationRuns, productionLine, true); int childTimeForQuantity = evaluateSingleOperationTimeIncludedNextOperationAfterProducedQuantity(child, includeTpz, false, operationRuns, productionLine, true, productComponentQuantities); int difference = childTimeTotal - childTimeForQuantity; childTime -= difference; } if (childTime > offset) { offset = childTime; } } Entity operCompTimeCalculation = operationWorkTimeService.createOrGetOperCompTimeCalculation(order, operationComponent); if (operCompTimeCalculation != null) { operCompTimeCalculation.setField(OperCompTimeCalculationsFields.OPERATION_OFF_SET, offset); operCompTimeCalculation.setField(OperCompTimeCalculationsFields.EFFECTIVE_OPERATION_REALIZATION_TIME, operationTime); operCompTimeCalculation.getDataDefinition().save(operCompTimeCalculation); } return offset + operationTime; }