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