/** * *************************************************************************** * 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.deliveries.hooks; import com.google.common.base.Strings; import com.google.common.collect.Lists; import com.qcadoo.mes.basic.ParameterService; import com.qcadoo.mes.basic.util.CurrencyService; import com.qcadoo.mes.deliveries.DeliveriesService; import com.qcadoo.mes.deliveries.constants.CompanyFieldsD; import com.qcadoo.mes.deliveries.constants.DeliveriesConstants; import com.qcadoo.mes.deliveries.constants.DeliveryFields; import com.qcadoo.mes.deliveries.roles.DeliveryRole; import com.qcadoo.mes.deliveries.states.constants.DeliveryState; import com.qcadoo.mes.deliveries.states.constants.DeliveryStateChangeFields; import com.qcadoo.mes.states.constants.StateChangeStatus; import com.qcadoo.mes.states.service.client.util.StateChangeHistoryService; import com.qcadoo.model.api.Entity; import com.qcadoo.model.api.search.CustomRestriction; import com.qcadoo.security.api.SecurityService; import com.qcadoo.security.api.UserService; import com.qcadoo.view.api.ViewDefinitionState; import com.qcadoo.view.api.components.*; import com.qcadoo.view.api.ribbon.RibbonActionItem; import com.qcadoo.view.api.ribbon.RibbonGroup; import com.qcadoo.view.api.utils.NumberGeneratorService; import java.util.ArrayList; import java.util.Iterator; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; @Service public class DeliveryDetailsHooks { private static final String L_FORM = "form"; private static final String L_WINDOW = "window"; private static final String L_RELATED_DELIVERY = "relatedDelivery"; private static final String L_CREATE_RELATED_DELIVERY = "createRelatedDelivery"; private static final String L_SHOW_RELATED_DELIVERIES = "showRelatedDeliveries"; private static final String L_COPY_ORDERED_PRODUCTS_TO_DELIVERY = "copyOrderedProductsToDelivered"; private static final String L_COPY_PRODUCTS_WITHOUT_QUANTITY = "copyProductsWithoutQuantityAndPrice"; private static final String L_COPY_PRODUCTS_WITH_QUANTITY = "copyProductsWithQuantityAndPrice"; @Autowired private DeliveriesService deliveriesService; @Autowired private NumberGeneratorService numberGeneratorService; @Autowired private StateChangeHistoryService stateChangeHistoryService; @Autowired private CurrencyService currencyService; @Autowired private ParameterService parameterService; @Autowired private SecurityService securityService; @Autowired private UserService userService; public void generateDeliveryNumber(final ViewDefinitionState view) { numberGeneratorService.generateAndInsertNumber(view, DeliveriesConstants.PLUGIN_IDENTIFIER, DeliveriesConstants.MODEL_DELIVERY, L_FORM, DeliveryFields.NUMBER); } public void fillCompanyFieldsForSupplier(final ViewDefinitionState view) { LookupComponent supplierLookup = (LookupComponent) view.getComponentByReference(DeliveryFields.SUPPLIER); FieldComponent deliveryDateBufferField = (FieldComponent) view .getComponentByReference(DeliveryFields.DELIVERY_DATE_BUFFER); FieldComponent paymentFormField = (FieldComponent) view.getComponentByReference(DeliveryFields.PAYMENT_FORM); Entity supplier = supplierLookup.getEntity(); if (supplier == null) { deliveryDateBufferField.setFieldValue(null); paymentFormField.setFieldValue(null); } else { deliveryDateBufferField.setFieldValue(supplier.getIntegerField(CompanyFieldsD.BUFFER)); paymentFormField.setFieldValue(supplier.getStringField(CompanyFieldsD.PAYMENT_FORM)); } deliveryDateBufferField.requestComponentUpdateState(); paymentFormField.requestComponentUpdateState(); } public void changeFieldsEnabledDependOnState(final ViewDefinitionState view) { FormComponent deliveryForm = (FormComponent) view.getComponentByReference(L_FORM); FieldComponent stateField = (FieldComponent) view.getComponentByReference(DeliveryFields.STATE); String state = stateField.getFieldValue().toString(); if (deliveryForm.getEntityId() == null) { changeFieldsEnabled(view, true, false, false); } else { if (DeliveryState.PREPARED.getStringValue().equals(state) || DeliveryState.APPROVED.getStringValue().equals(state)) { changeFieldsEnabled(view, false, false, true); } else if (DeliveryState.DECLINED.getStringValue().equals(state) || DeliveryState.RECEIVED.getStringValue().equals(state) || DeliveryState.RECEIVE_CONFIRM_WAITING.getStringValue().equals(state)) { changeFieldsEnabled(view, false, false, false); } else { changeFieldsEnabled(view, true, true, true); } } } private void changeFieldsEnabled(final ViewDefinitionState view, final boolean enabledForm, final boolean enabledOrderedGrid, final boolean enabledDeliveredGrid) { FormComponent deliveryForm = (FormComponent) view.getComponentByReference(L_FORM); GridComponent orderedProducts = (GridComponent) view.getComponentByReference(DeliveryFields.ORDERED_PRODUCTS); GridComponent deliveredProducts = (GridComponent) view.getComponentByReference(DeliveryFields.DELIVERED_PRODUCTS); deliveryForm.setFormEnabled(enabledForm); orderedProducts.setEnabled(enabledOrderedGrid); orderedProducts.setEditable(enabledOrderedGrid); deliveredProducts.setEnabled(enabledDeliveredGrid); deliveredProducts.setEditable(enabledDeliveredGrid); } public void fillDeliveryAddressDefaultValue(final ViewDefinitionState view) { FormComponent form = (FormComponent) view.getComponentByReference(L_FORM); if (form.getEntityId() != null) { return; } FieldComponent deliveryAddressField = (FieldComponent) view.getComponentByReference(DeliveryFields.DELIVERY_ADDRESS); String deliveryAddress = (String) deliveryAddressField.getFieldValue(); if (StringUtils.isEmpty(deliveryAddress)) { deliveryAddressField.setFieldValue(deliveriesService.getDeliveryAddressDefaultValue()); } } public void fillDescriptionDefaultValue(final ViewDefinitionState view) { FormComponent deliveryForm = (FormComponent) view.getComponentByReference(L_FORM); if (deliveryForm.getEntityId() != null) { return; } FieldComponent descriptionField = (FieldComponent) view.getComponentByReference(DeliveryFields.DESCRIPTION); String description = (String) descriptionField.getFieldValue(); if (StringUtils.isEmpty(description)) { descriptionField.setFieldValue(deliveriesService.getDescriptionDefaultValue()); } } public void filterStateChangeHistory(final ViewDefinitionState view) { final GridComponent historyGrid = (GridComponent) view.getComponentByReference("loggingsGrid"); final CustomRestriction onlySuccessfulRestriction = stateChangeHistoryService.buildStatusRestriction( DeliveryStateChangeFields.STATUS, Lists.newArrayList(StateChangeStatus.SUCCESSFUL.getStringValue())); historyGrid.setCustomRestriction(onlySuccessfulRestriction); } public void updateRelatedDeliveryButtonsState(final ViewDefinitionState view) { FormComponent deliveryForm = (FormComponent) view.getComponentByReference(L_FORM); Long deliveryId = deliveryForm.getEntityId(); WindowComponent window = (WindowComponent) view.getComponentByReference(L_WINDOW); RibbonGroup reports = (RibbonGroup) window.getRibbon().getGroupByName(L_RELATED_DELIVERY); RibbonActionItem createRelatedDelivery = (RibbonActionItem) reports.getItemByName(L_CREATE_RELATED_DELIVERY); RibbonActionItem showRelatedDelivery = (RibbonActionItem) reports.getItemByName(L_SHOW_RELATED_DELIVERIES); if (deliveryId == null) { return; } Entity delivery = deliveriesService.getDelivery(deliveryId); List<Entity> relatedDeliveries = delivery.getHasManyField(DeliveryFields.RELATED_DELIVERIES); boolean received = DeliveryState.RECEIVED.getStringValue().equals(delivery.getStringField(DeliveryFields.STATE)); boolean receiveConfirmWaiting = DeliveryState.RECEIVE_CONFIRM_WAITING.getStringValue().equals( delivery.getStringField(DeliveryFields.STATE)); boolean created = ((relatedDeliveries != null) && !relatedDeliveries.isEmpty()); updateButtonState(createRelatedDelivery, (received || receiveConfirmWaiting) && !created); updateButtonState(showRelatedDelivery, (received || receiveConfirmWaiting) && created); } private void updateButtonState(final RibbonActionItem ribbonActionItem, final boolean isEnabled) { ribbonActionItem.setEnabled(isEnabled); ribbonActionItem.requestUpdate(true); } public void fillCurrencyFields(final ViewDefinitionState view) { List<String> referenceNames = Lists.newArrayList("deliveredProductsCumulatedTotalPriceCurrency", "orderedProductsCumulatedTotalPriceCurrency"); FormComponent form = (FormComponent) view.getComponentByReference(L_FORM); Entity delivery = form.getEntity(); deliveriesService.fillCurrencyFieldsForDelivery(view, referenceNames, delivery); LookupComponent currency = (LookupComponent) view.getComponentByReference(DeliveryFields.CURRENCY); if (currency.getFieldValue() == null && form.getEntityId() == null) { Entity currencyEntity = currencyService.getCurrentCurrency(); currency.setFieldValue(currencyEntity.getId()); currency.requestComponentUpdateState(); } } public void disableShowProductButton(final ViewDefinitionState view) { deliveriesService.disableShowProductButton(view); } public void fillLocationDefaultValue(final ViewDefinitionState view) { FormComponent deliveryForm = (FormComponent) view.getComponentByReference(L_FORM); if (deliveryForm.getEntityId() != null) { return; } LookupComponent locationField = (LookupComponent) view.getComponentByReference(DeliveryFields.LOCATION); Entity location = locationField.getEntity(); if (location == null && !view.isViewAfterReload()) { Entity defaultLocation = parameterService.getParameter().getBelongsToField(DeliveryFields.LOCATION); if (defaultLocation == null) { locationField.setFieldValue(null); } else { locationField.setFieldValue(defaultLocation.getId()); } locationField.requestComponentUpdateState(); } } public void changeLocationEnabledDependOnState(final ViewDefinitionState view) { FormComponent deliveryForm = (FormComponent) view.getComponentByReference(L_FORM); LookupComponent locationField = (LookupComponent) view.getComponentByReference(DeliveryFields.LOCATION); if (deliveryForm.getEntityId() == null) { locationField.setEnabled(true); } else { FieldComponent stateField = (FieldComponent) view.getComponentByReference(DeliveryFields.STATE); String state = stateField.getFieldValue().toString(); if (DeliveryState.DECLINED.getStringValue().equals(state) || DeliveryState.RECEIVED.getStringValue().equals(state) || DeliveryState.RECEIVE_CONFIRM_WAITING.getStringValue().equals(state)) { locationField.setEnabled(false); } else { locationField.setEnabled(true); } } } public void updateCopyOrderedProductButtonsState(final ViewDefinitionState view) { FormComponent deliveryForm = (FormComponent) view.getComponentByReference(L_FORM); Long deliveryId = deliveryForm.getEntityId(); WindowComponent window = (WindowComponent) view.getComponentByReference(L_WINDOW); RibbonGroup reports = (RibbonGroup) window.getRibbon().getGroupByName(L_COPY_ORDERED_PRODUCTS_TO_DELIVERY); RibbonActionItem copyWithout = (RibbonActionItem) reports.getItemByName(L_COPY_PRODUCTS_WITHOUT_QUANTITY); RibbonActionItem copyWith = (RibbonActionItem) reports.getItemByName(L_COPY_PRODUCTS_WITH_QUANTITY); if (deliveryId == null) { return; } Entity delivery = deliveriesService.getDelivery(deliveryId); boolean hasOrderedProducts = !delivery.getHasManyField(DeliveryFields.ORDERED_PRODUCTS).isEmpty(); String state = delivery.getStringField(DeliveryFields.STATE); boolean isFinished = DeliveryState.RECEIVED.getStringValue().equals(state) || DeliveryState.DECLINED.getStringValue().equals(state); copyWith.setEnabled(hasOrderedProducts && !isFinished); copyWithout.setEnabled(hasOrderedProducts && !isFinished); copyWith.requestUpdate(true); copyWithout.requestUpdate(true); } public void processRoles(final ViewDefinitionState view) { Entity currentUser = userService.getCurrentUserEntity(); for (DeliveryRole role : DeliveryRole.values()) { if (!securityService.hasRole(currentUser, role.toString())) { role.processRole(view); } } } public void onBeforeRender(final ViewDefinitionState view) { orderGridByProductNumber(view); } private void orderGridByProductNumber(ViewDefinitionState view) { GridComponent gridComponent = (GridComponent) view.getComponentByReference("orderedProducts"); String productNumberFilter = gridComponent.getFilters().get("productNumber"); if (!Strings.isNullOrEmpty(productNumberFilter) && productNumberFilter.startsWith("[") && productNumberFilter.endsWith("]")) { List<Entity> orderedProductsEntities = gridComponent.getEntities(); List<Entity> sortedEntities = new ArrayList<>(); for (String f : getSortedItemsFromFilter(productNumberFilter)) { for (Iterator<Entity> iter = orderedProductsEntities.listIterator(); iter.hasNext();) { Entity entity = iter.next(); if (f.equals(entity.getStringField("productNumber"))) { sortedEntities.add(entity); iter.remove(); break; } } } sortedEntities.addAll(orderedProductsEntities); gridComponent.setEntities(sortedEntities); } } private String[] getSortedItemsFromFilter(String productNumberFilter) { productNumberFilter = productNumberFilter.substring(1, productNumberFilter.length() - 1); return productNumberFilter.split(","); } }