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