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.offer.server.transfer; 018 019import javax.inject.Inject; 020import com.echothree.model.control.accounting.server.control.AccountingControl; 021import com.echothree.model.control.inventory.server.control.InventoryControl; 022import com.echothree.model.control.item.common.ItemPriceTypes; 023import com.echothree.model.control.offer.common.OfferProperties; 024import com.echothree.model.control.offer.common.transfer.OfferItemPriceTransfer; 025import com.echothree.model.control.offer.server.control.OfferItemControl; 026import com.echothree.model.control.uom.server.control.UomControl; 027import com.echothree.model.data.offer.server.entity.OfferItemFixedPrice; 028import com.echothree.model.data.offer.server.entity.OfferItemPrice; 029import com.echothree.model.data.offer.server.entity.OfferItemVariablePrice; 030import com.echothree.model.data.user.server.entity.UserVisit; 031import com.echothree.util.common.form.TransferProperties; 032import com.echothree.util.common.transfer.HistoryTransfer; 033import com.echothree.util.common.transfer.ListWrapper; 034import com.echothree.util.server.string.AmountUtils; 035import com.echothree.util.server.transfer.HistoryCache; 036import java.util.ArrayList; 037import java.util.List; 038import javax.enterprise.context.RequestScoped; 039 040@RequestScoped 041public class OfferItemPriceTransferCache 042 extends BaseOfferTransferCache<OfferItemPrice, OfferItemPriceTransfer> 043 implements HistoryCache<OfferItemPrice, OfferItemPriceTransfer> { 044 045 @Inject 046 AccountingControl accountingControl; 047 048 @Inject 049 InventoryControl inventoryControl; 050 051 @Inject 052 OfferItemControl offerItemControl; 053 054 @Inject 055 UomControl uomControl; 056 057 TransferProperties transferProperties; 058 boolean filterOfferItem; 059 boolean filterInventoryCondition; 060 boolean filterUnitOfMeasureType; 061 boolean filterCurrency; 062 boolean filterUnformattedUnitPrice; 063 boolean filterUnitPrice; 064 boolean filterUnformattedMinimumUnitPrice; 065 boolean filterMinimumUnitPrice; 066 boolean filterUnformattedMaximumUnitPrice; 067 boolean filterMaximumUnitPrice; 068 boolean filterUnformattedUnitPriceIncrement; 069 boolean filterUnitPriceIncrement; 070 boolean filterUnformattedFromTime; 071 boolean filterFromTime; 072 boolean filterUnformattedThruTime; 073 boolean filterThruTime; 074 075 /** Creates a new instance of OfferItemPriceTransferCache */ 076 protected OfferItemPriceTransferCache() { 077 super(); 078 079 transferProperties = session.getTransferProperties(); 080 if(transferProperties != null) { 081 var properties = transferProperties.getProperties(OfferItemPriceTransfer.class); 082 083 if(properties != null) { 084 filterOfferItem = !properties.contains(OfferProperties.OFFER_ITEM); 085 filterInventoryCondition = !properties.contains(OfferProperties.INVENTORY_CONDITION); 086 filterUnitOfMeasureType = !properties.contains(OfferProperties.UNIT_OF_MEASURE_TYPE); 087 filterCurrency = !properties.contains(OfferProperties.CURRENCY); 088 filterUnformattedUnitPrice = !properties.contains(OfferProperties.UNFORMATTED_UNIT_PRICE); 089 filterUnitPrice = !properties.contains(OfferProperties.UNIT_PRICE); 090 filterUnformattedMinimumUnitPrice = !properties.contains(OfferProperties.UNFORMATTED_MINIMUM_UNIT_PRICE); 091 filterMinimumUnitPrice = !properties.contains(OfferProperties.MINIMUM_UNIT_PRICE); 092 filterUnformattedMaximumUnitPrice = !properties.contains(OfferProperties.UNFORMATTED_MAXIMUM_UNIT_PRICE); 093 filterMaximumUnitPrice = !properties.contains(OfferProperties.MAXIMUM_UNIT_PRICE); 094 filterUnformattedUnitPriceIncrement = !properties.contains(OfferProperties.UNFORMATTED_UNIT_PRICE_INCREMENT); 095 filterUnitPriceIncrement = !properties.contains(OfferProperties.UNIT_PRICE_INCREMENT); 096 filterUnformattedFromTime = !properties.contains(OfferProperties.UNFORMATTED_FROM_TIME); 097 filterFromTime = !properties.contains(OfferProperties.FROM_TIME); 098 filterUnformattedThruTime = !properties.contains(OfferProperties.UNFORMATTED_THRU_TIME); 099 filterThruTime = !properties.contains(OfferProperties.THRU_TIME); 100 } 101 } 102 } 103 104 private OfferItemPriceTransfer getOfferItemPriceTransfer(final UserVisit userVisit, OfferItemPrice offerItemPrice, OfferItemFixedPrice offerItemFixedPrice, 105 OfferItemVariablePrice offerItemVariablePrice) { 106 var offerItem = filterOfferItem ? null : offerItemPrice.getOfferItem(); 107 var offerItemTransfer = offerItem == null ? null : offerItemControl.getOfferItemTransfer(userVisit, offerItem); 108 var inventoryCondition = filterInventoryCondition ? null : offerItemPrice.getInventoryCondition(); 109 var inventoryConditionTransfer = inventoryCondition == null ? null : inventoryControl.getInventoryConditionTransfer(userVisit, inventoryCondition); 110 var unitOfMeasureType = filterUnitOfMeasureType ? null : offerItemPrice.getUnitOfMeasureType(); 111 var unitOfMeasureTypeTransfer = unitOfMeasureType == null ? null : uomControl.getUnitOfMeasureTypeTransfer(userVisit, unitOfMeasureType); 112 var currency = offerItemPrice.getCurrency(); 113 var currencyTransfer = filterCurrency ? null : accountingControl.getCurrencyTransfer(userVisit, currency); 114 Long unformattedUnitPrice = null; 115 String unitPrice = null; 116 Long unformattedMinimumUnitPrice = null; 117 String minimumUnitPrice = null; 118 Long unformattedMaximumUnitPrice = null; 119 String maximumUnitPrice = null; 120 Long unformattedUnitPriceIncrement = null; 121 String unitPriceIncrement = null; 122 123 if(offerItemFixedPrice != null) { 124 unformattedUnitPrice = filterUnformattedUnitPrice ? null : offerItemFixedPrice.getUnitPrice(); 125 unitPrice = filterUnitPrice ? null : AmountUtils.getInstance().formatPriceUnit(currency, offerItemFixedPrice.getUnitPrice()); 126 } 127 128 if(offerItemVariablePrice != null) { 129 unformattedMinimumUnitPrice = filterUnformattedMinimumUnitPrice ? null : offerItemVariablePrice.getMinimumUnitPrice(); 130 minimumUnitPrice = filterMinimumUnitPrice ? null : AmountUtils.getInstance().formatPriceUnit(currency, offerItemVariablePrice.getMinimumUnitPrice()); 131 unformattedMaximumUnitPrice = filterUnformattedMaximumUnitPrice ? null : offerItemVariablePrice.getMaximumUnitPrice(); 132 maximumUnitPrice = filterMaximumUnitPrice ? null : AmountUtils.getInstance().formatPriceUnit(currency, offerItemVariablePrice.getMaximumUnitPrice()); 133 unformattedUnitPriceIncrement = filterUnformattedUnitPriceIncrement ? null : offerItemVariablePrice.getUnitPriceIncrement(); 134 unitPriceIncrement = filterUnitPriceIncrement ? null : AmountUtils.getInstance().formatPriceUnit(currency, offerItemVariablePrice.getUnitPriceIncrement()); 135 } 136 137 return new OfferItemPriceTransfer(offerItemTransfer, inventoryConditionTransfer, unitOfMeasureTypeTransfer, currencyTransfer, unformattedUnitPrice, 138 unitPrice, unformattedMinimumUnitPrice, minimumUnitPrice, unformattedMaximumUnitPrice, maximumUnitPrice, unformattedUnitPriceIncrement, 139 unitPriceIncrement); 140 } 141 142 @Override 143 public ListWrapper<HistoryTransfer<OfferItemPriceTransfer>> getHistory(final UserVisit userVisit, OfferItemPrice offerItemPrice) { 144 List<HistoryTransfer<OfferItemPriceTransfer>> historyTransfers = null; 145 var itemPriceTypeName = offerItemPrice.getOfferItem().getItem().getLastDetail().getItemPriceType().getItemPriceTypeName(); 146 147 if(ItemPriceTypes.FIXED.name().equals(itemPriceTypeName)) { 148 var offerItemFixedPriceHistory = offerItemControl.getOfferItemFixedPriceHistory(offerItemPrice); 149 150 historyTransfers = new ArrayList<>(offerItemFixedPriceHistory.size()); 151 152 for(var offerItemFixedPrice : offerItemFixedPriceHistory) { 153 var unformattedFromTime = filterUnformattedFromTime ? null : offerItemFixedPrice.getFromTime(); 154 var fromTime = filterFromTime ? null : formatTypicalDateTime(userVisit, offerItemFixedPrice.getFromTime()); 155 var unformattedThruTime = filterUnformattedThruTime ? null : offerItemFixedPrice.getThruTime(); 156 var thruTime = filterThruTime ? null : formatTypicalDateTime(userVisit, offerItemFixedPrice.getThruTime()); 157 158 historyTransfers.add(new HistoryTransfer<>(getOfferItemPriceTransfer(userVisit, offerItemPrice, offerItemFixedPrice, null), 159 unformattedFromTime, fromTime, unformattedThruTime, thruTime)); 160 } 161 } else if(ItemPriceTypes.VARIABLE.name().equals(itemPriceTypeName)) { 162 var offerItemVariablePriceHistory = offerItemControl.getOfferItemVariablePriceHistory(offerItemPrice); 163 164 historyTransfers = new ArrayList<>(offerItemVariablePriceHistory.size()); 165 166 for(var offerItemVariablePrice : offerItemVariablePriceHistory) { 167 var unformattedFromTime = filterUnformattedFromTime ? null : offerItemVariablePrice.getFromTime(); 168 var fromTime = filterFromTime ? null : formatTypicalDateTime(userVisit, offerItemVariablePrice.getFromTime()); 169 var unformattedThruTime = filterUnformattedThruTime ? null : offerItemVariablePrice.getThruTime(); 170 var thruTime = filterThruTime ? null : formatTypicalDateTime(userVisit, offerItemVariablePrice.getThruTime()); 171 172 historyTransfers.add(new HistoryTransfer<>(getOfferItemPriceTransfer(userVisit, offerItemPrice, null, offerItemVariablePrice), 173 unformattedFromTime, fromTime, unformattedThruTime, thruTime)); 174 } 175 } 176 177 return new ListWrapper<>(historyTransfers); 178 } 179 180 public OfferItemPriceTransfer getTransfer(UserVisit userVisit, OfferItemPrice offerItemPrice) { 181 var offerItemPriceTransfer = get(offerItemPrice); 182 183 if(offerItemPriceTransfer == null) { 184 OfferItemFixedPrice offerItemFixedPrice = null; 185 OfferItemVariablePrice offerItemVariablePrice = null; 186 var itemPriceTypeName = offerItemPrice.getOfferItem().getItem().getLastDetail().getItemPriceType().getItemPriceTypeName(); 187 188 if(ItemPriceTypes.FIXED.name().equals(itemPriceTypeName)) { 189 offerItemFixedPrice = offerItemControl.getOfferItemFixedPrice(offerItemPrice); 190 } else if(ItemPriceTypes.VARIABLE.name().equals(itemPriceTypeName)) { 191 offerItemVariablePrice = offerItemControl.getOfferItemVariablePrice(offerItemPrice); 192 } 193 194 offerItemPriceTransfer = getOfferItemPriceTransfer(userVisit, offerItemPrice, offerItemFixedPrice, offerItemVariablePrice); 195 196 put(userVisit, offerItemPrice, offerItemPriceTransfer); 197 } 198 199 return offerItemPriceTransfer; 200 } 201 202}