001// --------------------------------------------------------------------------------
002// Copyright 2002-2025 Echo Three, LLC
003//
004// Licensed under the Apache License, Version 2.0 (the "License");
005// you may not use this file except in compliance with the License.
006// You may obtain a copy of the License at
007//
008//     http://www.apache.org/licenses/LICENSE-2.0
009//
010// Unless required by applicable law or agreed to in writing, software
011// distributed under the License is distributed on an "AS IS" BASIS,
012// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013// See the License for the specific language governing permissions and
014// limitations under the License.
015// --------------------------------------------------------------------------------
016
017package com.echothree.model.control.item.server.transfer;
018
019import com.echothree.model.control.accounting.server.control.AccountingControl;
020import com.echothree.model.control.cancellationpolicy.server.control.CancellationPolicyControl;
021import com.echothree.model.control.comment.common.CommentConstants;
022import com.echothree.model.control.core.server.control.EntityInstanceControl;
023import com.echothree.model.control.geo.common.GeoCodeAliasTypes;
024import com.echothree.model.control.geo.common.GeoOptions;
025import com.echothree.model.control.item.common.ItemDescriptionTypes;
026import com.echothree.model.control.item.common.ItemOptions;
027import com.echothree.model.control.item.common.ItemProperties;
028import com.echothree.model.control.item.common.transfer.ItemCountryOfOriginTransfer;
029import com.echothree.model.control.item.common.transfer.ItemTransfer;
030import com.echothree.model.control.item.common.transfer.RelatedItemTransfer;
031import com.echothree.model.control.item.common.workflow.ItemStatusConstants;
032import com.echothree.model.control.item.server.control.ItemControl;
033import com.echothree.model.control.offer.server.control.OfferItemControl;
034import com.echothree.model.control.party.server.control.PartyControl;
035import com.echothree.model.control.rating.common.RatingConstants;
036import com.echothree.model.control.returnpolicy.server.control.ReturnPolicyControl;
037import com.echothree.model.control.sequence.server.control.SequenceControl;
038import com.echothree.model.control.tax.server.control.TaxControl;
039import com.echothree.model.control.uom.server.control.UomControl;
040import com.echothree.model.control.vendor.server.control.VendorControl;
041import com.echothree.model.control.workflow.server.control.WorkflowControl;
042import com.echothree.model.data.item.server.entity.Item;
043import com.echothree.model.data.user.server.entity.UserVisit;
044import com.echothree.util.common.form.TransferProperties;
045import com.echothree.util.common.transfer.ListWrapper;
046import com.echothree.util.common.transfer.MapWrapper;
047import com.echothree.util.server.persistence.Session;
048import com.echothree.util.server.transfer.ListWrapperBuilder;
049import javax.enterprise.context.RequestScoped;
050
051@RequestScoped
052public class ItemTransferCache
053        extends BaseItemTransferCache<Item, ItemTransfer> {
054    
055    AccountingControl accountingControl = Session.getModelController(AccountingControl.class);
056    CancellationPolicyControl cancellationPolicyControl = Session.getModelController(CancellationPolicyControl.class);
057    EntityInstanceControl entityInstanceControl = Session.getModelController(EntityInstanceControl.class);
058    ItemControl itemControl = Session.getModelController(ItemControl.class);
059    PartyControl partyControl = Session.getModelController(PartyControl.class);
060    ReturnPolicyControl returnPolicyControl = Session.getModelController(ReturnPolicyControl.class);
061    SequenceControl sequenceControl = Session.getModelController(SequenceControl.class);
062    TaxControl taxControl = Session.getModelController(TaxControl.class);
063    UomControl uomControl = Session.getModelController(UomControl.class);
064    VendorControl vendorControl = Session.getModelController(VendorControl.class);
065    WorkflowControl workflowControl = Session.getModelController(WorkflowControl.class);
066    
067    boolean includeItemShippingTimes;
068    boolean includeItemAliases;
069    boolean includeItemPrices;
070    boolean includeItemUnitOfMeasureTypes;
071    boolean includeItemDescriptions;
072    boolean includeItemVolumes;
073    boolean includeItemWeights;
074    boolean includeOfferItems;
075    boolean includeVendorItems;
076    boolean includeItemCountryOfOrigins;
077    boolean includeItemKitMembers;
078    boolean includeItemPackCheckRequirements;
079    boolean includeItemUnitCustomerTypeLimits;
080    boolean includeItemUnitLimits;
081    boolean includeItemUnitPriceLimits;
082    boolean includeRelatedItems;
083    boolean includeItemHarmonizedTariffScheduleCodes;
084    boolean includeItemTaxClassifications;
085    boolean includeCustomerComments;
086    boolean includeCustomerServiceComments;
087    boolean includePurchasingComments;
088    boolean includeCustomerRatings;
089    
090    TransferProperties transferProperties;
091    boolean filterItemName;
092    boolean filterItemType;
093    boolean filterItemUseType;
094    boolean filterItemCategory;
095    boolean filterItemAccountingCategory;
096    boolean filterItemPurchasingCategory;
097    boolean filterCompany;
098    boolean filterItemDeliveryType;
099    boolean filterItemInventoryType;
100    boolean filterInventorySerialized;
101    boolean filterSerialNumberSequence;
102    boolean filterShippingChargeExempt;
103    boolean filterUnformattedShippingStartTime;
104    boolean filterShippingStartTime;
105    boolean filterUnformattedShippingEndTime;
106    boolean filterShippingEndTime;
107    boolean filterUnformattedSalesOrderStartTime;
108    boolean filterSalesOrderStartTime;
109    boolean filterUnformattedSalesOrderEndTime;
110    boolean filterSalesOrderEndTime;
111    boolean filterUnformattedPurchaseOrderStartTime;
112    boolean filterPurchaseOrderStartTime;
113    boolean filterUnformattedPurchaseOrderEndTime;
114    boolean filterPurchaseOrderEndTime;
115    boolean filterAllowClubDiscounts;
116    boolean filterAllowCouponDiscounts;
117    boolean filterAllowAssociatePayments;
118    boolean filterUnitOfMeasureKind;
119    boolean filterItemPriceType;
120    boolean filterCancellationPolicy;
121    boolean filterReturnPolicy;
122    boolean filterDescription;
123    boolean filterItemStatus;
124    boolean filterEntityInstance;
125    
126    /** Creates a new instance of ItemTransferCache */
127    protected ItemTransferCache() {
128        super();
129        
130        var options = session.getOptions();
131        if(options != null) {
132            includeItemShippingTimes = options.contains(ItemOptions.ItemIncludeItemShippingTimes);
133            includeItemAliases = options.contains(ItemOptions.ItemIncludeItemAliases);
134            includeItemPrices = options.contains(ItemOptions.ItemIncludeItemPrices);
135            includeItemUnitOfMeasureTypes = options.contains(ItemOptions.ItemIncludeItemUnitOfMeasureTypes);
136            includeItemDescriptions = options.contains(ItemOptions.ItemIncludeItemDescriptions);
137            includeItemVolumes = options.contains(ItemOptions.ItemIncludeItemVolumes);
138            includeItemWeights = options.contains(ItemOptions.ItemIncludeItemWeights);
139            includeOfferItems = options.contains(ItemOptions.ItemIncludeOfferItems);
140            includeVendorItems = options.contains(ItemOptions.ItemIncludeVendorItems);
141            includeItemCountryOfOrigins = options.contains(ItemOptions.ItemIncludeItemCountryOfOrigins);
142            includeItemKitMembers = options.contains(ItemOptions.ItemIncludeItemKitMembers);
143            includeItemPackCheckRequirements = options.contains(ItemOptions.ItemIncludeItemPackCheckRequirements);
144            includeItemUnitCustomerTypeLimits = options.contains(ItemOptions.ItemIncludeItemUnitCustomerTypeLimits);
145            includeItemUnitLimits = options.contains(ItemOptions.ItemIncludeItemUnitLimits);
146            includeItemUnitPriceLimits = options.contains(ItemOptions.ItemIncludeItemUnitPriceLimits);
147            includeRelatedItems = options.contains(ItemOptions.ItemIncludeRelatedItems);
148            includeItemHarmonizedTariffScheduleCodes = options.contains(ItemOptions.ItemIncludeItemHarmonizedTariffScheduleCodes);
149            includeItemTaxClassifications = options.contains(ItemOptions.ItemIncludeItemTaxClassifications);
150            includeCustomerComments = options.contains(ItemOptions.ItemIncludeCustomerComments);
151            includeCustomerServiceComments = options.contains(ItemOptions.ItemIncludeCustomerServiceComments);
152            includePurchasingComments = options.contains(ItemOptions.ItemIncludePurchasingComments);
153            includeCustomerRatings = options.contains(ItemOptions.ItemIncludeCustomerRatings);
154            setIncludeEntityAttributeGroups(options.contains(ItemOptions.ItemIncludeEntityAttributeGroups));
155            setIncludeTagScopes(options.contains(ItemOptions.ItemIncludeTagScopes));
156            
157            if(includeItemHarmonizedTariffScheduleCodes) {
158                verifyOptionDependency(ItemOptions.ItemIncludeItemHarmonizedTariffScheduleCodes, GeoOptions.CountryIncludeAliases);
159            }
160            if(includeItemTaxClassifications) {
161                verifyOptionDependency(ItemOptions.ItemIncludeItemTaxClassifications, GeoOptions.CountryIncludeAliases);
162            }
163        }
164        
165        transferProperties = session.getTransferProperties();
166        if(transferProperties != null) {
167            var properties = transferProperties.getProperties(ItemTransfer.class);
168            
169            if(properties != null) {
170                filterItemName = !properties.contains(ItemProperties.ITEM_NAME);
171                filterItemType = !properties.contains(ItemProperties.ITEM_TYPE);
172                filterItemUseType = !properties.contains(ItemProperties.ITEM_USE_TYPE);
173                filterItemCategory = !properties.contains(ItemProperties.ITEM_CATEGORY);
174                filterItemAccountingCategory = !properties.contains(ItemProperties.ITEM_ACCOUNTING_CATEGORY);
175                filterItemPurchasingCategory = !properties.contains(ItemProperties.ITEM_PURCHASING_CATEGORY);
176                filterCompany = !properties.contains(ItemProperties.COMPANY);
177                filterItemDeliveryType = !properties.contains(ItemProperties.ITEM_DELIVERY_TYPE);
178                filterItemInventoryType = !properties.contains(ItemProperties.ITEM_INVENTORY_TYPE);
179                filterInventorySerialized = !properties.contains(ItemProperties.INVENTORY_SERIALIZED);
180                filterSerialNumberSequence = !properties.contains(ItemProperties.SERIAL_NUMBER_SEQUENCE);
181                filterShippingChargeExempt = !properties.contains(ItemProperties.SHIPPING_CHARGE_EXEMPT);
182                filterUnformattedShippingStartTime = !properties.contains(ItemProperties.UNFORMATTED_SHIPPING_START_TIME);
183                filterShippingStartTime = !properties.contains(ItemProperties.SHIPPING_START_TIME);
184                filterUnformattedShippingEndTime = !properties.contains(ItemProperties.UNFORMATTED_SHIPPING_END_TIME);
185                filterShippingEndTime = !properties.contains(ItemProperties.SHIPPING_END_TIME);
186                filterUnformattedSalesOrderStartTime = !properties.contains(ItemProperties.UNFORMATTED_SALES_ORDER_START_TIME);
187                filterSalesOrderStartTime = !properties.contains(ItemProperties.SALES_ORDER_START_TIME);
188                filterUnformattedSalesOrderEndTime = !properties.contains(ItemProperties.UNFORMATTED_SALES_ORDER_END_TIME);
189                filterSalesOrderEndTime = !properties.contains(ItemProperties.SALES_ORDER_END_TIME);
190                filterUnformattedPurchaseOrderStartTime = !properties.contains(ItemProperties.UNFORMATTED_PURCHASE_ORDER_START_TIME);
191                filterPurchaseOrderStartTime = !properties.contains(ItemProperties.PURCHASE_ORDER_START_TIME);
192                filterUnformattedPurchaseOrderEndTime = !properties.contains(ItemProperties.UNFORMATTED_PURCHASE_ORDER_END_TIME);
193                filterPurchaseOrderEndTime = !properties.contains(ItemProperties.PURCHASE_ORDER_END_TIME);
194                filterAllowClubDiscounts = !properties.contains(ItemProperties.ALLOW_CLUB_DISCOUNTS);
195                filterAllowCouponDiscounts = !properties.contains(ItemProperties.ALLOW_COUPON_DISCOUNTS);
196                filterAllowAssociatePayments = !properties.contains(ItemProperties.ALLOW_ASSOCIATE_PAYMENTS);
197                filterUnitOfMeasureKind = !properties.contains(ItemProperties.UNIT_OF_MEASURE_KIND);
198                filterItemPriceType = !properties.contains(ItemProperties.ITEM_PRICE_TYPE);
199                filterCancellationPolicy = !properties.contains(ItemProperties.CANCELLATION_POLICY);
200                filterReturnPolicy = !properties.contains(ItemProperties.RETURN_POLICY);
201                filterDescription = !properties.contains(ItemProperties.DESCRIPTION);
202                filterItemStatus = !properties.contains(ItemProperties.ITEM_STATUS);
203                filterEntityInstance = !properties.contains(ItemProperties.ENTITY_INSTANCE);
204            }
205        }
206        
207        setIncludeEntityInstance(!filterEntityInstance);
208    }
209    
210    @Override
211    public ItemTransfer getTransfer(UserVisit userVisit, Item item) {
212        var itemTransfer = get(item);
213        
214        if(itemTransfer == null) {
215            var itemDetail = item.getLastDetail();
216            var itemName = filterItemName ? null : itemDetail.getItemName();
217            var itemTypeTransfer = filterItemType ? null : itemControl.getItemTypeTransfer(userVisit, itemDetail.getItemType());
218            var itemUseTypeTransfer = filterItemUseType ? null : itemControl.getItemUseTypeTransfer(userVisit, itemDetail.getItemUseType());
219            var itemCategoryTransfer = filterItemCategory ? null : itemControl.getItemCategoryTransfer(userVisit, itemDetail.getItemCategory());
220            var itemAccountingCategory = filterItemAccountingCategory ? null : itemDetail.getItemAccountingCategory();
221            var itemAccountingCategoryTransfer = itemAccountingCategory == null ? null : accountingControl.getItemAccountingCategoryTransfer(userVisit, itemAccountingCategory);
222            var itemPurchasingCategory = filterItemPurchasingCategory ? null : itemDetail.getItemPurchasingCategory();
223            var itemPurchasingCategoryTransfer = itemPurchasingCategory == null ? null : vendorControl.getItemPurchasingCategoryTransfer(userVisit, itemPurchasingCategory);
224            var companyTransfer = filterCompany ? null : partyControl.getCompanyTransfer(userVisit, itemDetail.getCompanyParty());
225            var itemDeliveryType = filterItemDeliveryType ? null : itemDetail.getItemDeliveryType();
226            var itemDeliveryTypeTransfer = itemDeliveryType == null ? null : itemControl.getItemDeliveryTypeTransfer(userVisit, itemDeliveryType);
227            var itemInventoryType = filterItemInventoryType ? null : itemDetail.getItemInventoryType();
228            var itemInventoryTypeTransfer = itemInventoryType == null ? null : itemControl.getItemInventoryTypeTransfer(userVisit, itemInventoryType);
229            var inventorySerialized = filterInventorySerialized ? null : itemDetail.getInventorySerialized();
230            var serialNumberSequence = filterSerialNumberSequence ? null : itemDetail.getSerialNumberSequence();
231            var serialNumberSequenceTransfer = serialNumberSequence == null ? null : sequenceControl.getSequenceTransfer(userVisit, serialNumberSequence);
232            var shippingChargeExempt = filterShippingChargeExempt ? null : itemDetail.getShippingChargeExempt();
233            var unformattedShippingStartTime = filterUnformattedShippingStartTime ? null : itemDetail.getShippingStartTime();
234            var shippingStartTime = filterShippingStartTime ? null : formatTypicalDateTime(userVisit, unformattedShippingStartTime);
235            var unformattedShippingEndTime = filterUnformattedShippingEndTime ? null : itemDetail.getShippingEndTime();
236            var shippingEndTime = filterShippingEndTime ? null : formatTypicalDateTime(userVisit, unformattedShippingEndTime);
237            var unformattedSalesOrderStartTime = filterUnformattedSalesOrderStartTime ? null : itemDetail.getSalesOrderStartTime();
238            var salesOrderStartTime = filterSalesOrderStartTime ? null : formatTypicalDateTime(userVisit, unformattedSalesOrderStartTime);
239            var unformattedSalesOrderEndTime = filterUnformattedSalesOrderEndTime ? null : itemDetail.getSalesOrderEndTime();
240            var salesOrderEndTime = filterSalesOrderEndTime ? null : formatTypicalDateTime(userVisit, unformattedSalesOrderEndTime);
241            var unformattedPurchaseOrderStartTime = filterUnformattedPurchaseOrderStartTime ? null : itemDetail.getPurchaseOrderStartTime();
242            var purchaseOrderStartTime = filterPurchaseOrderStartTime ? null : formatTypicalDateTime(userVisit, unformattedPurchaseOrderStartTime);
243            var unformattedPurchaseOrderEndTime = filterUnformattedPurchaseOrderEndTime ? null : itemDetail.getPurchaseOrderEndTime();
244            var purchaseOrderEndTime = filterPurchaseOrderEndTime ? null : formatTypicalDateTime(userVisit, unformattedPurchaseOrderEndTime);
245            var allowClubDiscounts = filterAllowClubDiscounts ? null : itemDetail.getAllowClubDiscounts();
246            var allowCouponDiscounts = filterAllowCouponDiscounts ? null : itemDetail.getAllowCouponDiscounts();
247            var allowAssociatePayments = filterAllowAssociatePayments ? null : itemDetail.getAllowAssociatePayments();
248            var unitOfMeasureKindTransfer = filterUnitOfMeasureKind ? null : uomControl.getUnitOfMeasureKindTransfer(userVisit, itemDetail.getUnitOfMeasureKind());
249            var itemPriceTypeTransfer = filterItemPriceType ? null : itemControl.getItemPriceTypeTransfer(userVisit, itemDetail.getItemPriceType());
250            var cancellationPolicy = filterCancellationPolicy ? null : itemDetail.getCancellationPolicy();
251            var cancellationPolicyTransfer = cancellationPolicy == null ? null : cancellationPolicyControl.getCancellationPolicyTransfer(userVisit, cancellationPolicy);
252            var returnPolicy = filterReturnPolicy ? null : itemDetail.getReturnPolicy();
253            var returnPolicyTransfer = returnPolicy == null ? null : returnPolicyControl.getReturnPolicyTransfer(userVisit, returnPolicy);
254            var itemDescriptionType = filterDescription ? null : itemControl.getItemDescriptionTypeByName(ItemDescriptionTypes.DEFAULT_DESCRIPTION.name());
255            var description = itemDescriptionType == null ? null : itemControl.getBestItemStringDescription(itemDescriptionType, item, getLanguage(userVisit));
256
257            var entityInstance = entityInstanceControl.getEntityInstanceByBasePK(item.getPrimaryKey());
258            var itemStatusTransfer = filterItemStatus ? null : workflowControl.getWorkflowEntityStatusTransferByEntityInstanceUsingNames(userVisit,
259                    ItemStatusConstants.Workflow_ITEM_STATUS, entityInstance);
260
261            itemTransfer = new ItemTransfer(itemName, itemTypeTransfer, itemUseTypeTransfer, itemCategoryTransfer, itemAccountingCategoryTransfer,
262                    itemPurchasingCategoryTransfer, companyTransfer, itemDeliveryTypeTransfer, itemInventoryTypeTransfer, inventorySerialized,
263                    serialNumberSequenceTransfer, shippingChargeExempt, unformattedShippingStartTime, shippingStartTime, unformattedShippingEndTime,
264                    shippingEndTime, unformattedSalesOrderStartTime, salesOrderStartTime, unformattedSalesOrderEndTime,
265                    salesOrderEndTime, unformattedPurchaseOrderStartTime, purchaseOrderStartTime, unformattedPurchaseOrderEndTime, purchaseOrderEndTime,
266                    allowClubDiscounts, allowCouponDiscounts, allowAssociatePayments, unitOfMeasureKindTransfer, itemPriceTypeTransfer,
267                    cancellationPolicyTransfer, returnPolicyTransfer, description, itemStatusTransfer);
268            put(userVisit, item, itemTransfer, entityInstance);
269
270            if(includeItemShippingTimes) {
271                itemTransfer.setItemShippingTimes(ListWrapperBuilder.getInstance().filter(transferProperties, itemControl.getItemShippingTimeTransfersByItem(userVisit, item)));
272            }
273
274            if(includeItemAliases) {
275                itemTransfer.setItemAliases(ListWrapperBuilder.getInstance().filter(transferProperties, itemControl.getItemAliasTransfersByItem(userVisit, item)));
276            }
277
278            if(includeItemPrices) {
279                itemTransfer.setItemPrices(ListWrapperBuilder.getInstance().filter(transferProperties, itemControl.getItemPriceTransfersByItem(userVisit, item)));
280            }
281
282            if(includeItemUnitOfMeasureTypes) {
283                itemTransfer.setItemUnitOfMeasureTypes(ListWrapperBuilder.getInstance().filter(transferProperties, itemControl.getItemUnitOfMeasureTypeTransfersByItem(userVisit, item)));
284            }
285
286            if(includeItemDescriptions) {
287                itemTransfer.setItemDescriptions(ListWrapperBuilder.getInstance().filter(transferProperties, itemControl.getItemDescriptionTransfersByItem(userVisit, item)));
288            }
289
290            if(includeItemVolumes) {
291                itemTransfer.setItemVolumes(ListWrapperBuilder.getInstance().filter(transferProperties, itemControl.getItemVolumeTransfersByItem(userVisit, item)));
292            }
293
294            if(includeItemWeights) {
295                itemTransfer.setItemWeights(ListWrapperBuilder.getInstance().filter(transferProperties, itemControl.getItemWeightTransfersByItem(userVisit, item)));
296            }
297
298            if(includeOfferItems) {
299                var offerItemControl = Session.getModelController(OfferItemControl.class);
300
301                itemTransfer.setOfferItems(ListWrapperBuilder.getInstance().filter(transferProperties, offerItemControl.getOfferItemTransfersByItem(userVisit, item)));
302            }
303
304            if(includeVendorItems) {
305                itemTransfer.setVendorItems(ListWrapperBuilder.getInstance().filter(transferProperties, vendorControl.getVendorItemTransfersByItem(userVisit, item)));
306            }
307
308            if(includeItemCountryOfOrigins) {
309                var itemCountryOfOriginTransfers = itemControl.getItemCountryOfOriginTransfersByItem(userVisit, item);
310                var itemCountryOfOrigins = new MapWrapper<ItemCountryOfOriginTransfer>();
311
312                itemCountryOfOriginTransfers.forEach((itemCountryOfOriginTransfer) -> {
313                    itemCountryOfOrigins.put(itemCountryOfOriginTransfer.getCountryGeoCode().getGeoCodeAliases().getMap().get(GeoCodeAliasTypes.COUNTRY_NAME.name()).getAlias(), itemCountryOfOriginTransfer);
314                });
315
316                itemTransfer.setItemCountryOfOrigins(itemCountryOfOrigins);
317            }
318
319            if(includeItemKitMembers) {
320                itemTransfer.setItemKitMembers(ListWrapperBuilder.getInstance().filter(transferProperties, itemControl.getItemKitMemberTransfersByItem(userVisit, item)));
321            }
322
323            if(includeItemPackCheckRequirements) {
324                itemTransfer.setItemPackCheckRequirements(ListWrapperBuilder.getInstance().filter(transferProperties, itemControl.getItemPackCheckRequirementTransfersByItem(userVisit, item)));
325            }
326
327            if(includeItemUnitCustomerTypeLimits) {
328                itemTransfer.setItemUnitCustomerTypeLimits(ListWrapperBuilder.getInstance().filter(transferProperties, itemControl.getItemUnitCustomerTypeLimitTransfersByItem(userVisit, item)));
329            }
330
331            if(includeItemUnitLimits) {
332                itemTransfer.setItemUnitLimits(ListWrapperBuilder.getInstance().filter(transferProperties, itemControl.getItemUnitLimitTransfersByItem(userVisit, item)));
333            }
334
335            if(includeItemUnitPriceLimits) {
336                itemTransfer.setItemUnitPriceLimits(ListWrapperBuilder.getInstance().filter(transferProperties, itemControl.getItemUnitPriceLimitTransfersByItem(userVisit, item)));
337            }
338
339            if(includeRelatedItems) {
340                var relatedItemTypes = itemControl.getRelatedItemTypes();
341                var relatedItems = new MapWrapper<ListWrapper<RelatedItemTransfer>>(relatedItemTypes.size());
342
343                relatedItemTypes.forEach((relatedItemType) -> {
344                    relatedItems.put(relatedItemType.getLastDetail().getRelatedItemTypeName(), new ListWrapper<>(itemControl.getRelatedItemTransfersByRelatedItemTypeAndFromItem(userVisit, relatedItemType, item)));
345                });
346
347                itemTransfer.setRelatedItems(relatedItems);
348            }
349
350            if(includeItemHarmonizedTariffScheduleCodes) {
351                itemTransfer.setItemHarmonizedTariffScheduleCodes(ListWrapperBuilder.getInstance().filter(transferProperties, itemControl.getItemHarmonizedTariffScheduleCodeTransfersByItem(userVisit, item)));
352            }
353
354            if(includeItemTaxClassifications) {
355                itemTransfer.setItemTaxClassifications(ListWrapperBuilder.getInstance().filter(transferProperties, taxControl.getItemTaxClassificationTransfersByItem(userVisit, item)));
356            }
357
358            if(includeCustomerComments) {
359                setupComments(userVisit, null, entityInstance, itemTransfer, CommentConstants.CommentType_ITEM_CUSTOMER);
360            }
361
362            if(includeCustomerServiceComments) {
363                setupComments(userVisit, null, entityInstance, itemTransfer, CommentConstants.CommentType_ITEM_CUSTOMER_SERVICE);
364            }
365
366            if(includePurchasingComments) {
367                setupComments(userVisit, null, entityInstance, itemTransfer, CommentConstants.CommentType_ITEM_PURCHASING);
368            }
369
370            if(includeCustomerRatings) {
371                setupRatings(userVisit, null, entityInstance, itemTransfer, RatingConstants.RatingType_ITEM_CUSTOMER);
372            }
373        }
374        
375        return itemTransfer;
376    }
377    
378}