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.control.user.item.server.command;
018
019import com.echothree.control.user.item.common.form.CreateItemPriceForm;
020import com.echothree.model.control.accounting.server.control.AccountingControl;
021import com.echothree.model.control.inventory.common.InventoryConstants;
022import com.echothree.model.control.inventory.server.control.InventoryControl;
023import com.echothree.model.control.item.common.ItemPriceTypes;
024import com.echothree.model.control.item.server.control.ItemControl;
025import com.echothree.model.control.party.common.PartyTypes;
026import com.echothree.model.control.security.common.SecurityRoleGroups;
027import com.echothree.model.control.security.common.SecurityRoles;
028import com.echothree.model.control.uom.server.control.UomControl;
029import com.echothree.model.data.accounting.server.entity.Currency;
030import com.echothree.model.data.inventory.server.entity.InventoryCondition;
031import com.echothree.model.data.inventory.server.entity.InventoryConditionUse;
032import com.echothree.model.data.inventory.server.entity.InventoryConditionUseType;
033import com.echothree.model.data.item.server.entity.Item;
034import com.echothree.model.data.item.server.entity.ItemDetail;
035import com.echothree.model.data.item.server.entity.ItemPrice;
036import com.echothree.model.data.item.server.entity.ItemUnitOfMeasureType;
037import com.echothree.model.data.uom.server.entity.UnitOfMeasureKind;
038import com.echothree.model.data.uom.server.entity.UnitOfMeasureType;
039import com.echothree.model.data.user.common.pk.UserVisitPK;
040import com.echothree.util.common.message.ExecutionErrors;
041import com.echothree.util.common.validation.FieldDefinition;
042import com.echothree.util.common.validation.FieldType;
043import com.echothree.util.common.command.BaseResult;
044import com.echothree.util.common.persistence.BasePK;
045import com.echothree.util.server.control.BaseSimpleCommand;
046import com.echothree.util.server.control.CommandSecurityDefinition;
047import com.echothree.util.server.control.PartyTypeDefinition;
048import com.echothree.util.server.control.SecurityRoleDefinition;
049import com.echothree.util.server.persistence.Session;
050import java.util.Arrays;
051import java.util.Collections;
052import java.util.List;
053
054public class CreateItemPriceCommand
055        extends BaseSimpleCommand<CreateItemPriceForm> {
056
057    private final static CommandSecurityDefinition COMMAND_SECURITY_DEFINITION;
058    private final static List<FieldDefinition> FORM_FIELD_DEFINITIONS;
059    
060    static {
061        COMMAND_SECURITY_DEFINITION = new CommandSecurityDefinition(Collections.unmodifiableList(Arrays.asList(
062                new PartyTypeDefinition(PartyTypes.UTILITY.name(), null),
063                new PartyTypeDefinition(PartyTypes.EMPLOYEE.name(), Collections.unmodifiableList(Arrays.asList(
064                        new SecurityRoleDefinition(SecurityRoleGroups.ItemPrice.name(), SecurityRoles.Create.name())
065                )))
066        )));
067
068        FORM_FIELD_DEFINITIONS = Collections.unmodifiableList(Arrays.asList(
069                new FieldDefinition("ItemName", FieldType.ENTITY_NAME, true, null, null),
070                new FieldDefinition("InventoryConditionName", FieldType.ENTITY_NAME, true, null, null),
071                new FieldDefinition("UnitOfMeasureTypeName", FieldType.ENTITY_NAME, true, null, null),
072                new FieldDefinition("CurrencyIsoName", FieldType.ENTITY_NAME, true, null, null),
073                new FieldDefinition("UnitPrice:CurrencyIsoName,CurrencyIsoName", FieldType.UNSIGNED_PRICE_UNIT, false, null, null),
074                new FieldDefinition("MinimumUnitPrice:CurrencyIsoName,CurrencyIsoName", FieldType.UNSIGNED_PRICE_UNIT, false, null, null),
075                new FieldDefinition("MaximumUnitPrice:CurrencyIsoName,CurrencyIsoName", FieldType.UNSIGNED_PRICE_UNIT, false, null, null),
076                new FieldDefinition("UnitPriceIncrement:CurrencyIsoName,CurrencyIsoName", FieldType.UNSIGNED_PRICE_UNIT, false, null, null)
077                ));
078    }
079    
080    /** Creates a new instance of CreateItemPriceCommand */
081    public CreateItemPriceCommand(UserVisitPK userVisitPK, CreateItemPriceForm form) {
082        super(userVisitPK, form, COMMAND_SECURITY_DEFINITION, FORM_FIELD_DEFINITIONS, false);
083    }
084    
085    @Override
086    protected BaseResult execute() {
087        var itemControl = Session.getModelController(ItemControl.class);
088        String itemName = form.getItemName();
089        Item item = itemControl.getItemByName(itemName);
090        
091        if(item != null) {
092            var inventoryControl = Session.getModelController(InventoryControl.class);
093            String inventoryConditionName = form.getInventoryConditionName();
094            InventoryCondition inventoryCondition = inventoryControl.getInventoryConditionByName(inventoryConditionName);
095            
096            if(inventoryCondition != null) {
097                InventoryConditionUseType inventoryConditionUseType = inventoryControl.getInventoryConditionUseTypeByName(InventoryConstants.InventoryConditionUseType_SALES_ORDER);
098                InventoryConditionUse inventoryConditionUse = inventoryControl.getInventoryConditionUse(inventoryConditionUseType,
099                        inventoryCondition);
100                
101                if(inventoryConditionUse != null) {
102                    var uomControl = Session.getModelController(UomControl.class);
103                    String unitOfMeasureTypeName = form.getUnitOfMeasureTypeName();
104                    ItemDetail itemDetail = item.getLastDetail();
105                    UnitOfMeasureKind unitOfMeasureKind = itemDetail.getUnitOfMeasureKind();
106                    UnitOfMeasureType unitOfMeasureType = uomControl.getUnitOfMeasureTypeByName(unitOfMeasureKind, unitOfMeasureTypeName);
107                    
108                    if(unitOfMeasureType != null) {
109                        ItemUnitOfMeasureType itemUnitOfMeasureType = itemControl.getItemUnitOfMeasureType(item, unitOfMeasureType);
110                        
111                        if(itemUnitOfMeasureType != null) {
112                            var accountingControl = Session.getModelController(AccountingControl.class);
113                            String currencyIsoName = form.getCurrencyIsoName();
114                            Currency currency = accountingControl.getCurrencyByIsoName(currencyIsoName);
115                            
116                            if(currency != null) {
117                                ItemPrice itemPrice = itemControl.getItemPrice(item, inventoryCondition, unitOfMeasureType, currency);
118                                
119                                if(itemPrice == null) {
120                                    String itemPriceTypeName = itemDetail.getItemPriceType().getItemPriceTypeName();
121                                    BasePK createdBy = getPartyPK();
122                                    
123                                    if(itemPriceTypeName.equals(ItemPriceTypes.FIXED.name())) {
124                                        String strUnitPrice = form.getUnitPrice();
125                                        
126                                        if(strUnitPrice != null) {
127                                            Long unitPrice = Long.valueOf(strUnitPrice);
128                                            
129                                            itemPrice = itemControl.createItemPrice(item, inventoryCondition, unitOfMeasureType,
130                                                    currency, createdBy);
131                                            itemControl.createItemFixedPrice(itemPrice, unitPrice, createdBy);
132                                        } else {
133                                            addExecutionError(ExecutionErrors.MissingUnitPrice.name());
134                                        }
135                                    } else if(itemPriceTypeName.equals(ItemPriceTypes.VARIABLE.name())) {
136                                        String strMinimumUnitPrice = form.getMinimumUnitPrice();
137                                        Long minimumUnitPrice = null;
138                                        String strMaximumUnitPrice = form.getMaximumUnitPrice();
139                                        Long maximumUnitPrice = null;
140                                        String strUnitPriceIncrement = form.getUnitPriceIncrement();
141                                        Long unitPriceIncrement = null;
142                                        
143                                        if(strMinimumUnitPrice != null) {
144                                            minimumUnitPrice = Long.valueOf(strMinimumUnitPrice);
145                                        } else {
146                                            addExecutionError(ExecutionErrors.MissingMinimumUnitPrice.name());
147                                        }
148                                        
149                                        if(strMaximumUnitPrice != null) {
150                                            maximumUnitPrice = Long.valueOf(strMaximumUnitPrice);
151                                        } else {
152                                            addExecutionError(ExecutionErrors.MissingMaximumUnitPrice.name());
153                                        }
154                                        
155                                        if(strUnitPriceIncrement != null) {
156                                            unitPriceIncrement = Long.valueOf(strUnitPriceIncrement);
157                                        } else {
158                                            addExecutionError(ExecutionErrors.MissingUnitPriceIncrement.name());
159                                        }
160                                        
161                                        if(minimumUnitPrice != null && maximumUnitPrice != null && unitPriceIncrement != null) {
162                                            itemPrice = itemControl.createItemPrice(item, inventoryCondition, unitOfMeasureType,
163                                                    currency, createdBy);
164                                            itemControl.createItemVariablePrice(itemPrice, minimumUnitPrice, maximumUnitPrice,
165                                                    unitPriceIncrement, createdBy);
166                                        }
167                                    } else {
168                                        addExecutionError(ExecutionErrors.UnknownItemPriceType.name(), itemPriceTypeName);
169                                    }
170                                } else {
171                                    addExecutionError(ExecutionErrors.DuplicateItemPrice.name());
172                                }
173                            } else {
174                                addExecutionError(ExecutionErrors.UnknownCurrencyIsoName.name(), currencyIsoName);
175                            }
176                        } else {
177                            addExecutionError(ExecutionErrors.UnknownItemUnitOfMeasureType.name(), itemName, unitOfMeasureTypeName);
178                        }
179                    } else {
180                        addExecutionError(ExecutionErrors.UnknownUnitOfMeasureTypeName.name(), unitOfMeasureTypeName);
181                    }
182                } else {
183                    addExecutionError(ExecutionErrors.InvalidInventoryCondition.name(), inventoryConditionName);
184                }
185            } else {
186                addExecutionError(ExecutionErrors.UnknownInventoryConditionName.name(), inventoryConditionName);
187            }
188        } else {
189            addExecutionError(ExecutionErrors.UnknownItemName.name(), itemName);
190        }
191        
192        return null;
193    }
194    
195}