package com.qcadoo.mes.materialFlowResources;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.qcadoo.mes.basic.constants.PalletNumberFields;
import com.qcadoo.mes.materialFlowResources.constants.MaterialFlowResourcesConstants;
import com.qcadoo.mes.materialFlowResources.constants.ResourceFields;
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.SearchQueryBuilder;
@Service
public class PalletValidatorService {
@Autowired
private DataDefinitionService dataDefinitionService;
public boolean validatePalletForDeliveredProduct(Entity deliveredProduct) {
Entity location = deliveredProduct.getBelongsToField("delivery").getBelongsToField("location");
if (location == null) {
return true;
}
Entity palletNumberEntity = deliveredProduct.getBelongsToField("palletNumber");
Entity storageLocationEntity = deliveredProduct.getBelongsToField("storageLocation");
String palletType = deliveredProduct.getStringField("palletType");
String palletNumber = palletNumberEntity != null ? palletNumberEntity.getStringField(PalletNumberFields.NUMBER) : null;
String storageLocation = storageLocationEntity != null ? storageLocationEntity
.getStringField(StorageLocationFields.NUMBER) : null;
return validatePallet(palletNumber, palletType, storageLocation, deliveredProduct, location);
}
public boolean validatePalletForResource(Entity resource) {
Entity palletNumberEntity = resource.getBelongsToField(ResourceFields.PALLET_NUMBER);
Entity storageLocationEntity = resource.getBelongsToField(ResourceFields.STORAGE_LOCATION);
String palletType = resource.getStringField(ResourceFields.TYPE_OF_PALLET);
String palletNumber = palletNumberEntity != null ? palletNumberEntity.getStringField(PalletNumberFields.NUMBER) : null;
String storageLocation = storageLocationEntity != null ? storageLocationEntity
.getStringField(StorageLocationFields.NUMBER) : null;
Entity location = resource.getBelongsToField(ResourceFields.LOCATION);
return validatePallet(palletNumber, palletType, storageLocation, resource, location);
}
private boolean validatePallet(String palletNumber, String palletType, String storageLocation, Entity entity, Entity location) {
return !existsOtherResourceForPalletNumber(palletNumber, palletType, storageLocation, entity, location)
&& !existsOtherPositionForPalletNumber(palletNumber, palletType, storageLocation, entity, location)
&& !existsOtherDeliveredProductForPalletNumber(palletNumber, palletType, storageLocation, entity, location);
}
private boolean existsOtherPositionForPalletNumber(String palletNumber, String palletType, String storageLocation,
Entity entity, Entity location) {
StringBuilder query = new StringBuilder();
query.append("select count(dp) as cnt from #materialFlowResources_position dp JOIN dp.palletNumber as pallet ");
query.append("JOIN dp.document as document ");
query.append("JOIN document.locationTo as location ");
query.append("LEFT JOIN dp.storageLocation storageLocation ");
query.append("WHERE pallet.number = :palletNumber ");
query.append("AND document.state = '01draft' ");
query.append("AND (storageLocation.number <> :storageLocation OR dp.typeOfPallet <> :palletType) ");
query.append("AND location.id = :locationId ");
if (entity.getId() != null) {
query.append("AND dp.id <> :dpId ");
}
SearchQueryBuilder find = dataDefinitionService.get(MaterialFlowResourcesConstants.PLUGIN_IDENTIFIER,
MaterialFlowResourcesConstants.MODEL_POSITION).find(query.toString());
find.setString("palletType", palletType);
find.setString("palletNumber", palletNumber);
find.setString("storageLocation", storageLocation);
find.setLong("locationId", location.getId());
if (entity.getId() != null) {
find.setLong("dpId", entity.getId());
}
Entity countResults = find.uniqueResult();
boolean exists = ((Long) countResults.getField("cnt")) > 0L;
if (exists) {
entity.addError(entity.getDataDefinition().getField("palletNumber"),
"documentGrid.error.position.existsOtherPositionForPalletAndStorageLocation");
}
return exists;
}
private boolean existsOtherResourceForPalletNumber(String palletNumber, String palletType, String storageLocation,
Entity entity, Entity location) {
StringBuilder query = new StringBuilder();
query.append("select count(dp) as cnt from #materialFlowResources_resource dp JOIN dp.palletNumber as pallet ");
query.append("JOIN dp.location AS location ");
query.append("LEFT JOIN dp.storageLocation storageLocation ");
query.append("WHERE pallet.number = :palletNumber ");
query.append("AND (storageLocation.number <> :storageLocation OR dp.typeOfPallet <> :palletType) ");
query.append("AND location.id = :locationId ");
if (entity.getId() != null) {
query.append("AND dp.id <> :resourceId ");
}
SearchQueryBuilder find = dataDefinitionService.get(MaterialFlowResourcesConstants.PLUGIN_IDENTIFIER,
MaterialFlowResourcesConstants.MODEL_RESOURCE).find(query.toString());
find.setString("palletType", palletType);
find.setString("palletNumber", palletNumber);
find.setString("storageLocation", storageLocation);
find.setLong("locationId", location.getId());
if (entity.getId() != null) {
find.setLong("resourceId", entity.getId());
}
Entity countResults = find.uniqueResult();
boolean exists = ((Long) countResults.getField("cnt")) > 0L;
if (exists) {
entity.addError(entity.getDataDefinition().getField("palletNumber"),
"documentGrid.error.position.existsOtherResourceForPalletAndStorageLocation");
}
return exists;
}
private boolean existsOtherDeliveredProductForPalletNumber(String palletNumber, String palletType, String storageLocation,
Entity entity, Entity location) {
StringBuilder query = new StringBuilder();
query.append("select count(dp) as cnt from #deliveries_deliveredProduct dp JOIN dp.palletNumber as pallet ");
query.append("JOIN dp.delivery delivery ");
query.append("JOIN delivery.location AS location ");
query.append("LEFT JOIN dp.storageLocation storageLocation ");
query.append("WHERE pallet.number = :palletNumber ");
query.append("AND delivery.state <> '06received' AND delivery.state <> '04declined' ");
query.append("AND (storageLocation.number <> :storageLocation OR dp.palletType <> :palletType) ");
query.append("AND location.id = :locationId ");
if (entity.getId() != null) {
query.append("AND dp.id <> :dpId ");
}
SearchQueryBuilder find = dataDefinitionService.get("deliveries", "deliveredProduct").find(query.toString());
find.setString("palletType", palletType);
find.setString("palletNumber", palletNumber);
find.setString("storageLocation", storageLocation);
find.setLong("locationId", location.getId());
if (entity.getId() != null) {
find.setLong("dpId", entity.getId());
}
Entity countResults = find.uniqueResult();
boolean exists = ((Long) countResults.getField("cnt")) > 0L;
if (exists) {
entity.addError(entity.getDataDefinition().getField("palletNumber"),
"documentGrid.error.position.existsOtherDeliveredProductForPalletAndStorageLocation");
}
return exists;
}
}