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;
}