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.order.server.graphql;
018
019import com.echothree.model.control.cancellationpolicy.server.graphql.CancellationPolicyObject;
020import com.echothree.model.control.cancellationpolicy.server.graphql.CancellationPolicySecurityUtils;
021import com.echothree.model.control.graphql.server.graphql.BaseEntityInstanceObject;
022import com.echothree.model.control.inventory.server.graphql.InventoryConditionObject;
023import com.echothree.model.control.inventory.server.graphql.InventorySecurityUtils;
024import com.echothree.model.control.item.server.graphql.ItemObject;
025import com.echothree.model.control.item.server.graphql.ItemSecurityUtils;
026import com.echothree.model.control.returnpolicy.server.graphql.ReturnPolicyObject;
027import com.echothree.model.control.returnpolicy.server.graphql.ReturnPolicySecurityUtils;
028import com.echothree.model.control.uom.server.graphql.UnitOfMeasureTypeObject;
029import com.echothree.model.control.uom.server.graphql.UomSecurityUtils;
030import com.echothree.model.data.order.server.entity.OrderLine;
031import com.echothree.model.data.order.server.entity.OrderLineDetail;
032import graphql.annotations.annotationTypes.GraphQLDescription;
033import graphql.annotations.annotationTypes.GraphQLField;
034import graphql.schema.DataFetchingEnvironment;
035
036public abstract class BaseOrderLineObject
037        extends BaseEntityInstanceObject {
038
039    private final OrderLine orderLine; // Always Present
040
041    protected BaseOrderLineObject(final OrderLine orderLine) {
042        super(orderLine.getPrimaryKey());
043
044        this.orderLine = orderLine;
045    }
046
047    private OrderLineDetail orderLineDetail; // Optional, use getOrderDetail()
048    
049    private OrderLineDetail getOrderLineDetail() {
050        if(orderLineDetail == null) {
051            orderLineDetail = orderLine.getLastDetail();
052        }
053        
054        return orderLineDetail;
055    }
056
057    @GraphQLField
058    @GraphQLDescription("order line sequence")
059    public Integer getOrderLineSequence() {
060        return getOrderLineDetail().getOrderLineSequence();
061    }
062
063    @GraphQLField
064    @GraphQLDescription("parent order line")
065    public OrderLineObject getParentOrderLine(final DataFetchingEnvironment env) {
066        var parentOrderLine = getOrderLineDetail().getParentOrderLine();
067
068        return parentOrderLine == null ? null : new OrderLineObject(parentOrderLine);
069    }
070
071    // TODO: Order Shipment Group
072
073    @GraphQLField
074    @GraphQLDescription("item")
075    public ItemObject getItem(final DataFetchingEnvironment env) {
076        return ItemSecurityUtils.getHasItemAccess(env) ? new ItemObject(getOrderLineDetail().getItem()) : null;
077    }
078
079    @GraphQLField
080    @GraphQLDescription("inventory condition")
081    public InventoryConditionObject getInventoryCondition(final DataFetchingEnvironment env) {
082        return InventorySecurityUtils.getHasInventoryConditionAccess(env) ? new InventoryConditionObject(getOrderLineDetail().getInventoryCondition()) : null;
083    }
084
085    @GraphQLField
086    @GraphQLDescription("unit of measure type")
087    public UnitOfMeasureTypeObject getUnitOfMeasureType(final DataFetchingEnvironment env) {
088        return UomSecurityUtils.getHasUnitOfMeasureTypeAccess(env) ? new UnitOfMeasureTypeObject(getOrderLineDetail().getUnitOfMeasureType()) : null;
089    }
090
091    @GraphQLField
092    @GraphQLDescription("quantity")
093    public Long getQuantity() {
094        return getOrderLineDetail().getQuantity();
095    }
096
097    @GraphQLField
098    @GraphQLDescription("unformattedUnitAmount")
099    public Long getUnformattedUnitAmount(final DataFetchingEnvironment env) {
100        return getOrderLineDetail().getUnitAmount();
101    }
102
103    // Unit Amount must be formatted in subclass - it could be a Cost or a Price.
104
105    @GraphQLField
106    @GraphQLDescription("description")
107    public String getDescription() {
108        return getOrderLineDetail().getDescription();
109    }
110
111    @GraphQLField
112    @GraphQLDescription("cancellation policy")
113    public CancellationPolicyObject getCancellationPolicy(final DataFetchingEnvironment env) {
114        var cancellationPolicy = getOrderLineDetail().getCancellationPolicy();
115
116        return cancellationPolicy == null ? null : CancellationPolicySecurityUtils.getHasCancellationPolicyAccess(env) ?
117                new CancellationPolicyObject(cancellationPolicy) : null;
118    }
119
120    @GraphQLField
121    @GraphQLDescription("return policy")
122    public ReturnPolicyObject getReturnPolicy(final DataFetchingEnvironment env) {
123        var returnPolicy = getOrderLineDetail().getReturnPolicy();
124
125        return returnPolicy == null ? null : ReturnPolicySecurityUtils.getHasReturnPolicyAccess(env) ?
126                new ReturnPolicyObject(returnPolicy) : null;
127    }
128
129    @GraphQLField
130    @GraphQLDescription("taxable")
131    public Boolean getTaxable() {
132        return getOrderLineDetail().getTaxable();
133    }
134
135}