package com.qcadoo.mes.materialFlowResources.service;
import com.qcadoo.localization.api.TranslationService;
import com.qcadoo.mes.basic.ParameterService;
import com.qcadoo.mes.materialFlowResources.constants.DocumentFields;
import com.qcadoo.mes.materialFlowResources.constants.MaterialFlowResourcesConstants;
import com.qcadoo.mes.materialFlowResources.constants.PositionFields;
import com.qcadoo.mes.materialFlowResources.constants.StorageLocationFields;
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.security.api.UserService;
import com.qcadoo.view.api.utils.NumberGeneratorService;
import org.springframework.context.i18n.LocaleContextHolder;
import java.util.List;
import java.util.Optional;
public class ReceiptDocumentForReleaseHelper {
private final DataDefinitionService dataDefinitionService;
private final ResourceManagementService resourceManagementService;
private final UserService userService;
private final NumberGeneratorService numberGeneratorService;
private final TranslationService translationService;
private final ParameterService parameterService;
public ReceiptDocumentForReleaseHelper(final DataDefinitionService dataDefinitionService,
final ResourceManagementService resourceManagementService, final UserService userService,
NumberGeneratorService numberGeneratorService, final TranslationService translationService,
final ParameterService parameterService) {
this.dataDefinitionService = dataDefinitionService;
this.resourceManagementService = resourceManagementService;
this.userService = userService;
this.numberGeneratorService = numberGeneratorService;
this.translationService = translationService;
this.parameterService = parameterService;
}
public boolean tryBuildConnectedPZDocument(Entity document, boolean fillDescription) {
DocumentBuilder pzBuilder = new DocumentBuilder(dataDefinitionService, resourceManagementService, userService,
numberGeneratorService, translationService, parameterService);
Entity documentDb = document.getDataDefinition().get(document.getId());
Entity location = document.getBelongsToField(DocumentFields.LINKED_PZ_DOCUMENT_LOCATION);
pzBuilder = pzBuilder.receipt(location);
if (fillDescription) {
pzBuilder = pzBuilder.setField(DocumentFields.DESCRIPTION,
buildDescription(documentDb.getStringField(DocumentFields.NUMBER)));
}
fillPositions(location, document, pzBuilder);
Entity connectedReceiptDocument = null;
if (parameterService.getParameter().getStringField("documentsStatus").equals("01accepted")) {
connectedReceiptDocument = pzBuilder.setAccepted().build();
} else {
connectedReceiptDocument = pzBuilder.build();
}
if (!connectedReceiptDocument.isValid()) {
document.addGlobalError("materialFlowResources.document.error.creationConnectedDocument");
return false;
}
return true;
}
private void fillPositions(Entity location, Entity document, DocumentBuilder pzBuilder) {
List<Entity> positions = document.getHasManyField(DocumentFields.POSITIONS);
positions.forEach(pos -> {
Entity pzPosition = pos.copy();
pzPosition.setId(null);
pzPosition.setField(PositionFields.DOCUMENT, null);
pzPosition.setField(PositionFields.RESOURCE, null);
pzPosition.setField(PositionFields.TYPE_OF_PALLET, null);
pzPosition.setField(PositionFields.PALLET_NUMBER, null);
Optional<Entity> maybyStorageLocation = findStorageLocationForProduct(pos.getBelongsToField(PositionFields.PRODUCT),
location);
if (maybyStorageLocation.isPresent()) {
pzPosition.setField(PositionFields.STORAGE_LOCATION, maybyStorageLocation.get());
} else {
pzPosition.setField(PositionFields.STORAGE_LOCATION, null);
}
pzBuilder.addPosition(pzPosition);
});
}
private String buildDescription(String number) {
return translationService.translate("materialFlowResources.document.description.forTemplate",
LocaleContextHolder.getLocale(), number);
}
public Optional<Entity> findStorageLocationForProduct(final Entity product, final Entity location) {
SearchCriteriaBuilder scb = dataDefinitionService.get(MaterialFlowResourcesConstants.PLUGIN_IDENTIFIER,
MaterialFlowResourcesConstants.MODEL_STORAGE_LOCATION).find();
scb.add(SearchRestrictions.belongsTo(StorageLocationFields.PRODUCT, product));
scb.add(SearchRestrictions.belongsTo(StorageLocationFields.LOCATION, location));
return Optional.ofNullable(scb.setMaxResults(1).uniqueResult());
}
}