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.item.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.item.server.control.ItemControl;
027import com.echothree.model.control.uom.server.graphql.UnitOfMeasureTypeObject;
028import com.echothree.model.control.uom.server.graphql.UomSecurityUtils;
029import com.echothree.model.data.item.server.entity.ItemFixedPrice;
030import com.echothree.model.data.item.server.entity.ItemPrice;
031import com.echothree.model.data.item.server.entity.ItemVariablePrice;
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("item price object")
039@GraphQLName("ItemPrice")
040public class ItemPriceObject
041        extends BaseObject {
042
043    private final ItemPrice itemPrice; // Always Present
044
045    public ItemPriceObject(ItemPrice itemPrice) {
046        this.itemPrice = itemPrice;
047    }
048
049    String itemPriceTypeName;
050
051    private String getItemPriceTypeName() {
052        if(itemPriceTypeName == null) {
053            itemPriceTypeName = itemPrice.getItem().getLastDetail().getItemPriceType().getItemPriceTypeName();
054        }
055
056        return itemPriceTypeName;
057    }
058
059    private ItemFixedPrice itemFixedPrice;
060
061    private ItemFixedPrice getItemFixedPrice() {
062        if(itemFixedPrice == null) {
063            if(getItemPriceTypeName().equals(ItemPriceTypes.FIXED.name())) {
064                var itemControl = Session.getModelController(ItemControl.class);
065
066                itemFixedPrice = itemControl.getItemFixedPrice(itemPrice);
067            }
068        }
069
070        return itemFixedPrice;
071    }
072
073    private ItemVariablePrice itemVariablePrice;
074
075    private ItemVariablePrice getItemVariablePrice() {
076        if(itemVariablePrice == null) {
077            if(getItemPriceTypeName().equals(ItemPriceTypes.VARIABLE.name())) {
078                var itemControl = Session.getModelController(ItemControl.class);
079
080                itemVariablePrice = itemControl.getItemVariablePrice(itemPrice);
081            }
082        }
083
084        return itemVariablePrice;
085    }
086
087    @GraphQLField
088    @GraphQLDescription("item")
089    public ItemObject getItem(final DataFetchingEnvironment env) {
090        return ItemSecurityUtils.getHasItemAccess(env) ? new ItemObject(itemPrice.getItem()) : null;
091    }
092
093    @GraphQLField
094    @GraphQLDescription("inventory condition")
095    public InventoryConditionObject getInventoryCondition(final DataFetchingEnvironment env) {
096        return InventorySecurityUtils.getHasInventoryConditionAccess(env) ? new InventoryConditionObject(itemPrice.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(itemPrice.getUnitOfMeasureType()) : null;
103    }
104
105    @GraphQLField
106    @GraphQLDescription("currency")
107    public CurrencyObject getCurrency(final DataFetchingEnvironment env) {
108        return AccountingSecurityUtils.getHasCurrencyAccess(env) ? new CurrencyObject(itemPrice.getCurrency()) : null;
109    }
110
111    @GraphQLField
112    @GraphQLDescription("unit price")
113    public UnitPriceObject getUnitPrice() {
114        var itemFixedPrice = getItemFixedPrice().getUnitPrice();
115
116        return itemFixedPrice == null ? null : new UnitPriceObject(itemPrice.getCurrency(), itemFixedPrice);
117    }
118
119    @GraphQLField
120    @GraphQLDescription("minimum unit price")
121    public UnitPriceObject getMinimumUnitPrice() {
122        var itemVariablePrice = getItemVariablePrice();
123
124        return itemVariablePrice == null ? null : new UnitPriceObject(itemPrice.getCurrency(), itemVariablePrice.getMinimumUnitPrice());
125    }
126
127    @GraphQLField
128    @GraphQLDescription("maximum unit price")
129    public UnitPriceObject getMaximumUnitPrice() {
130        var itemVariablePrice = getItemVariablePrice();
131
132        return itemVariablePrice == null ? null : new UnitPriceObject(itemPrice.getCurrency(), itemVariablePrice.getMaximumUnitPrice());
133    }
134
135    @GraphQLField
136    @GraphQLDescription("unit price increment")
137    public UnitPriceObject getUnitPriceIncrement() {
138        var itemVariablePrice = getItemVariablePrice();
139
140        return itemVariablePrice == null ? null : new UnitPriceObject(itemPrice.getCurrency(), itemVariablePrice.getUnitPriceIncrement());
141    }
142
143}