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.graphql;
018
019import com.echothree.model.control.accounting.server.graphql.AccountingSecurityUtils;
020import com.echothree.model.control.accounting.server.graphql.CurrencyObject;
021import com.echothree.model.control.graphql.server.graphql.BaseObject;
022import com.echothree.model.control.graphql.server.graphql.UnitPriceObject;
023import com.echothree.model.control.inventory.server.graphql.InventoryConditionObject;
024import com.echothree.model.control.inventory.server.graphql.InventorySecurityUtils;
025import com.echothree.model.control.item.common.ItemPriceTypes;
026import com.echothree.model.control.offer.server.control.OfferItemControl;
027import com.echothree.model.control.uom.server.graphql.UnitOfMeasureTypeObject;
028import com.echothree.model.control.uom.server.graphql.UomSecurityUtils;
029import com.echothree.model.data.offer.server.entity.OfferItemFixedPrice;
030import com.echothree.model.data.offer.server.entity.OfferItemPrice;
031import com.echothree.model.data.offer.server.entity.OfferItemVariablePrice;
032import com.echothree.util.server.persistence.Session;
033import graphql.annotations.annotationTypes.GraphQLDescription;
034import graphql.annotations.annotationTypes.GraphQLField;
035import graphql.annotations.annotationTypes.GraphQLName;
036import graphql.schema.DataFetchingEnvironment;
037
038@GraphQLDescription("offer item price object")
039@GraphQLName("OfferItemPrice")
040public class OfferItemPriceObject
041        extends BaseObject {
042    
043    private final OfferItemPrice offerItemPrice; // Always Present
044    
045    public OfferItemPriceObject(OfferItemPrice offerItemPrice) {
046        this.offerItemPrice = offerItemPrice;
047    }
048
049    String offerItemPriceTypeName;
050
051    private String getOfferItemPriceTypeName() {
052        if(offerItemPriceTypeName == null) {
053            offerItemPriceTypeName = offerItemPrice.getOfferItem().getItem().getLastDetail().getItemPriceType().getItemPriceTypeName();
054        }
055
056        return offerItemPriceTypeName;
057    }
058
059    private OfferItemFixedPrice offerItemFixedPrice;
060
061    private OfferItemFixedPrice getOfferItemFixedPrice() {
062        if(offerItemFixedPrice == null) {
063            if(getOfferItemPriceTypeName().equals(ItemPriceTypes.FIXED.name())) {
064                var offerItemControl = Session.getModelController(OfferItemControl.class);
065
066                offerItemFixedPrice = offerItemControl.getOfferItemFixedPrice(offerItemPrice);
067            }
068        }
069
070        return offerItemFixedPrice;
071    }
072
073    private OfferItemVariablePrice offerItemVariablePrice;
074
075    private OfferItemVariablePrice getOfferItemVariablePrice() {
076        if(offerItemVariablePrice == null) {
077            if(getOfferItemPriceTypeName().equals(ItemPriceTypes.VARIABLE.name())) {
078                var offerItemControl = Session.getModelController(OfferItemControl.class);
079
080                offerItemVariablePrice = offerItemControl.getOfferItemVariablePrice(offerItemPrice);
081            }
082        }
083
084        return offerItemVariablePrice;
085    }
086
087    @GraphQLField
088    @GraphQLDescription("offer item")
089    public OfferItemObject getOfferItem(final DataFetchingEnvironment env) {
090        return OfferSecurityUtils.getHasOfferItemAccess(env) ? new OfferItemObject(offerItemPrice.getOfferItem()) : null;
091    }
092
093    @GraphQLField
094    @GraphQLDescription("inventory condition")
095    public InventoryConditionObject getInventoryCondition(final DataFetchingEnvironment env) {
096        return InventorySecurityUtils.getHasInventoryConditionAccess(env) ? new InventoryConditionObject(offerItemPrice.getInventoryCondition()) : null;
097    }
098
099    @GraphQLField
100    @GraphQLDescription("unit of measure type")
101    public UnitOfMeasureTypeObject getUnitOfMeasureType(final DataFetchingEnvironment env) {
102        return UomSecurityUtils.getHasUnitOfMeasureTypeAccess(env) ? new UnitOfMeasureTypeObject(offerItemPrice.getUnitOfMeasureType()) : null;
103    }
104
105    @GraphQLField
106    @GraphQLDescription("currency")
107    public CurrencyObject getCurrency(final DataFetchingEnvironment env) {
108        return AccountingSecurityUtils.getHasCurrencyAccess(env) ? new CurrencyObject(offerItemPrice.getCurrency()) : null;
109    }
110
111    @GraphQLField
112    @GraphQLDescription("unit price")
113    public UnitPriceObject getUnitPrice() {
114        var itemFixedPrice = getOfferItemFixedPrice();
115
116        return itemFixedPrice == null ? null : new UnitPriceObject(offerItemPrice.getCurrency(), itemFixedPrice.getUnitPrice());
117    }
118
119    @GraphQLField
120    @GraphQLDescription("minimum unit price")
121    public UnitPriceObject getMinimumUnitPrice() {
122        var itemVariablePrice = getOfferItemVariablePrice();
123
124        return itemVariablePrice == null ? null : new UnitPriceObject(offerItemPrice.getCurrency(), itemVariablePrice.getMinimumUnitPrice());
125    }
126
127    @GraphQLField
128    @GraphQLDescription("maximum unit price")
129    public UnitPriceObject getMaximumUnitPrice() {
130        var itemVariablePrice = getOfferItemVariablePrice();
131
132        return itemVariablePrice == null ? null : new UnitPriceObject(offerItemPrice.getCurrency(), itemVariablePrice.getMaximumUnitPrice());
133    }
134
135    @GraphQLField
136    @GraphQLDescription("unit price increment")
137    public UnitPriceObject getUnitPriceIncrement() {
138        var itemVariablePrice = getOfferItemVariablePrice();
139
140        return itemVariablePrice == null ? null : new UnitPriceObject(offerItemPrice.getCurrency(), itemVariablePrice.getUnitPriceIncrement());
141    }
142
143}