/**
* ***************************************************************************
* 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.cmmsMachineParts;
import com.qcadoo.mes.cmmsMachineParts.constants.CmmsMachinePartsConstants;
import com.qcadoo.mes.cmmsMachineParts.constants.MaintenanceEventFields;
import com.qcadoo.mes.cmmsMachineParts.constants.MaintenanceEventType;
import com.qcadoo.mes.cmmsMachineParts.states.constants.MaintenanceEventStateStringValues;
import com.qcadoo.model.api.DataDefinition;
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.SearchOrders;
import com.qcadoo.model.api.search.SearchProjections;
import com.qcadoo.model.api.search.SearchRestrictions;
import com.qcadoo.security.constants.QcadooSecurityConstants;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Optional;
@Service
public class MaintenanceEventService {
@Autowired
private DataDefinitionService dataDefinitionService;
public boolean existOpenFailrueForObjectFromEvent(final Entity event) {
return !getExistingEventsForEvent(event, MaintenanceEventType.FAILURE.getStringValue()).isEmpty();
}
public List<Entity> getExistingEventsForEvent(final Entity event, final String type) {
SearchCriteriaBuilder scb = getMaintenanceEventDD().find();
if (event.getId() != null) {
scb = scb.add(SearchRestrictions.ne("id", event.getId()));
}
scb = scb.add(SearchRestrictions.eq(MaintenanceEventFields.TYPE, type));
scb = scb.add(SearchRestrictions.or(
SearchRestrictions.eq(MaintenanceEventFields.STATE, MaintenanceEventStateStringValues.NEW),
SearchRestrictions.eq(MaintenanceEventFields.STATE, MaintenanceEventStateStringValues.IN_PROGRESS)));
if (event.getBelongsToField(MaintenanceEventFields.SUBASSEMBLY) != null) {
scb.add(SearchRestrictions.belongsTo(MaintenanceEventFields.SUBASSEMBLY,
event.getBelongsToField(MaintenanceEventFields.SUBASSEMBLY)));
} else {
scb = scb.add(SearchRestrictions.isNull(MaintenanceEventFields.SUBASSEMBLY));
}
if (event.getBelongsToField(MaintenanceEventFields.WORKSTATION) != null) {
scb.add(SearchRestrictions.belongsTo(MaintenanceEventFields.WORKSTATION,
event.getBelongsToField(MaintenanceEventFields.WORKSTATION)));
} else {
scb = scb.add(SearchRestrictions.isNull(MaintenanceEventFields.WORKSTATION));
}
if (event.getBelongsToField(MaintenanceEventFields.PRODUCTION_LINE) != null) {
scb.add(SearchRestrictions.belongsTo(MaintenanceEventFields.PRODUCTION_LINE,
event.getBelongsToField(MaintenanceEventFields.PRODUCTION_LINE)));
} else {
scb = scb.add(SearchRestrictions.isNull(MaintenanceEventFields.PRODUCTION_LINE));
}
if (event.getBelongsToField(MaintenanceEventFields.DIVISION) != null) {
scb.add(SearchRestrictions.belongsTo(MaintenanceEventFields.DIVISION,
event.getBelongsToField(MaintenanceEventFields.DIVISION)));
} else {
scb = scb.add(SearchRestrictions.isNull(MaintenanceEventFields.DIVISION));
}
if (event.getBelongsToField(MaintenanceEventFields.FACTORY) != null) {
scb.add(SearchRestrictions.belongsTo(MaintenanceEventFields.FACTORY,
event.getBelongsToField(MaintenanceEventFields.FACTORY)));
} else {
scb = scb.add(SearchRestrictions.isNull(MaintenanceEventFields.FACTORY));
}
return scb.list().getEntities();
}
public DataDefinition getMaintenanceEventDD() {
return dataDefinitionService.get(CmmsMachinePartsConstants.PLUGIN_IDENTIFIER,
CmmsMachinePartsConstants.MODEL_MAINTENANCE_EVENT);
}
public Optional<Entity> getPlannedEventForMaintenanceEvent(final Entity maintenanceEvent) {
List<Entity> plannedEvents = maintenanceEvent.getHasManyField(MaintenanceEventFields.PLANNED_EVENTS);
if (plannedEvents.isEmpty()) {
return Optional.empty();
}
return Optional.of(plannedEvents.get(0));
}
public boolean existsNewEventsToNotification(Long currentUserId) {
Entity user = dataDefinitionService.get(QcadooSecurityConstants.PLUGIN_IDENTIFIER, QcadooSecurityConstants.MODEL_USER)
.get(currentUserId);
Entity factory = user.getBelongsToField("factory");
SearchCriteriaBuilder scb = getMaintenanceEventDD()
.find()
.setProjection(SearchProjections.alias(SearchProjections.rowCount(), "countrows"))
.add(SearchRestrictions.eq(MaintenanceEventFields.SOUND_NOTIFICATIONS, true));
if (factory != null) {
scb = scb.add(SearchRestrictions.belongsTo("factory", factory));
}
scb = scb.addOrder(SearchOrders.asc("countrows"));
Entity entity = scb.setFirstResult(0).setMaxResults(1).uniqueResult();
if (entity.getLongField("countrows") > 0) {
return true;
}
return false;
}
}