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