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