package com.qcadoo.mes.cmmsMachineParts.hooks; import com.qcadoo.localization.api.utils.DateUtils; import com.qcadoo.mes.basic.constants.UserFields; import com.qcadoo.mes.cmmsMachineParts.constants.CmmsMachinePartsConstants; import com.qcadoo.mes.cmmsMachineParts.constants.StaffWorkTimeFields; import com.qcadoo.mes.cmmsMachineParts.states.constants.MaintenanceEventStateChangeFields; import com.qcadoo.mes.cmmsMachineParts.states.constants.MaintenanceEventStateStringValues; 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.SearchRestrictions; import com.qcadoo.security.api.SecurityService; import com.qcadoo.security.constants.QcadooSecurityConstants; import com.qcadoo.view.api.ViewDefinitionState; import com.qcadoo.view.api.components.FieldComponent; import com.qcadoo.view.api.components.FormComponent; import com.qcadoo.view.api.components.LookupComponent; import org.joda.time.DateTime; import org.joda.time.Seconds; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.Date; import java.util.Optional; @Service public class StaffWorkTimeDetailsHooks { @Autowired private SecurityService securityService; @Autowired private DataDefinitionService dataDefinitionService; public void onBeforeRender(final ViewDefinitionState view) { fillDefaultValues(view); } private void fillDefaultValues(final ViewDefinitionState view) { Long loggedUser = securityService.getCurrentUserId(); LookupComponent lookupComponent = (LookupComponent) view.getComponentByReference(StaffWorkTimeFields.WORKER); if (lookupComponent.getFieldValue() == null) { Entity user = dataDefinitionService.get(QcadooSecurityConstants.PLUGIN_IDENTIFIER, QcadooSecurityConstants.MODEL_USER) .get(loggedUser); if (user.getBelongsToField(UserFields.STAFF) != null) { lookupComponent.setFieldValue(user.getBelongsToField(UserFields.STAFF).getId()); lookupComponent.requestComponentUpdateState(); } } FormComponent form = (FormComponent) view.getComponentByReference("form"); Entity event = form.getPersistedEntityWithIncludedFormValues().getBelongsToField(StaffWorkTimeFields.MAINTENANCE_EVNET); Optional<Date> from = findDate(event, MaintenanceEventStateStringValues.IN_PROGRESS); Optional<Date> to = findDate(event, MaintenanceEventStateStringValues.EDITED); FieldComponent dateFrom = (FieldComponent) view .getComponentByReference(StaffWorkTimeFields.EFFECTIVE_EXECUTION_TIME_START); FieldComponent dateTo = (FieldComponent) view.getComponentByReference(StaffWorkTimeFields.EFFECTIVE_EXECUTION_TIME_END); if (from.isPresent() && dateFrom.getFieldValue() == null) { dateFrom.setFieldValue(DateUtils.toDateTimeString(from.get())); dateFrom.requestComponentUpdateState(); } if (to.isPresent() && dateTo.getFieldValue() == null) { dateTo.setFieldValue(DateUtils.toDateTimeString(to.get())); dateTo.requestComponentUpdateState(); FieldComponent laborTimeFieldComponent = (FieldComponent) view .getComponentByReference(StaffWorkTimeFields.LABOR_TIME); calculateLaborTime(laborTimeFieldComponent, from, to); } } private void calculateLaborTime(FieldComponent laborTimeFieldComponent, Optional<Date> from, Optional<Date> to) { if (from.isPresent() && to.isPresent() && from.get().before(to.get())) { Seconds seconds = Seconds.secondsBetween(new DateTime(from.get()), new DateTime(to.get())); laborTimeFieldComponent.setFieldValue(Integer.valueOf(seconds.getSeconds())); laborTimeFieldComponent.requestComponentUpdateState(); } } private Optional<Date> findDate(final Entity event, String state) { SearchCriteriaBuilder sb = dataDefinitionService .get(CmmsMachinePartsConstants.PLUGIN_IDENTIFIER, CmmsMachinePartsConstants.MODEL_MAINTENANCE_EVENT_STATE_CHANGE) .find(); sb.add(SearchRestrictions .belongsTo(MaintenanceEventStateChangeFields.MAINTENANCE_EVENT, CmmsMachinePartsConstants.PLUGIN_IDENTIFIER, CmmsMachinePartsConstants.MODEL_MAINTENANCE_EVENT, event.getId())); sb.add(SearchRestrictions.eq(MaintenanceEventStateChangeFields.TARGET_STATE, state)); sb.add(SearchRestrictions.eq(MaintenanceEventStateChangeFields.STATUS, "03successful")); sb.addOrder(SearchOrders.asc(MaintenanceEventStateChangeFields.DATE_AND_TIME)); sb.setMaxResults(1); Entity result = sb.uniqueResult(); if (result == null) { return Optional.ofNullable(null); } return Optional.ofNullable(result.getDateField(MaintenanceEventStateChangeFields.DATE_AND_TIME)); } }