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.purchase.server.command;
018
019import com.echothree.control.user.purchase.common.form.CreatePurchaseOrderForm;
020import com.echothree.control.user.purchase.common.result.PurchaseResultFactory;
021import com.echothree.model.control.party.common.PartyTypes;
022import com.echothree.model.control.purchase.server.logic.PurchaseOrderLogic;
023import com.echothree.model.control.security.common.SecurityRoleGroups;
024import com.echothree.model.control.security.common.SecurityRoles;
025import com.echothree.model.data.user.common.pk.UserVisitPK;
026import com.echothree.util.common.command.BaseResult;
027import com.echothree.util.common.validation.FieldDefinition;
028import com.echothree.util.common.validation.FieldType;
029import com.echothree.util.server.control.BaseSimpleCommand;
030import com.echothree.util.server.control.CommandSecurityDefinition;
031import com.echothree.util.server.control.PartyTypeDefinition;
032import com.echothree.util.server.control.SecurityRoleDefinition;
033import java.util.Arrays;
034import java.util.Collections;
035import java.util.List;
036
037public class CreatePurchaseOrderCommand
038        extends BaseSimpleCommand<CreatePurchaseOrderForm> {
039
040    private final static CommandSecurityDefinition COMMAND_SECURITY_DEFINITION;
041    private final static List<FieldDefinition> FORM_FIELD_DEFINITIONS;
042
043    static {
044        COMMAND_SECURITY_DEFINITION = new CommandSecurityDefinition(Collections.unmodifiableList(Arrays.asList(
045                new PartyTypeDefinition(PartyTypes.UTILITY.name(), null),
046                new PartyTypeDefinition(PartyTypes.EMPLOYEE.name(), Collections.unmodifiableList(Arrays.asList(
047                    new SecurityRoleDefinition(SecurityRoleGroups.PurchaseOrder.name(), SecurityRoles.Create.name())
048                    )))
049                )));
050
051        FORM_FIELD_DEFINITIONS = Collections.unmodifiableList(Arrays.asList(
052                new FieldDefinition("VendorName", FieldType.ENTITY_NAME, true, null, null),
053                new FieldDefinition("TermName", FieldType.ENTITY_NAME, false, null, null),
054                new FieldDefinition("HoldUntilComplete", FieldType.BOOLEAN, false, null, null),
055                new FieldDefinition("AllowBackorders", FieldType.BOOLEAN, false, null, null),
056                new FieldDefinition("AllowSubstitutions", FieldType.BOOLEAN, false, null, null),
057                new FieldDefinition("AllowCombiningShipments", FieldType.BOOLEAN, false, null, null),
058                new FieldDefinition("Reference", FieldType.STRING, false, 1L, 40L),
059                new FieldDefinition("FreeOnBoardName", FieldType.ENTITY_NAME, false, null, null),
060                new FieldDefinition("WorkflowEntranceName", FieldType.ENTITY_NAME, false, null, null)
061                ));
062    }
063
064    /** Creates a new instance of CreatePurchaseOrderCommand */
065    public CreatePurchaseOrderCommand(UserVisitPK userVisitPK, CreatePurchaseOrderForm form) {
066        super(userVisitPK, form, COMMAND_SECURITY_DEFINITION, FORM_FIELD_DEFINITIONS, false);
067    }
068
069    @Override
070    protected BaseResult execute() {
071        var result = PurchaseResultFactory.getCreatePurchaseOrderResult();
072        var vendorName = form.getVendorName();
073        var termName = form.getTermName();
074        var holdUntilComplete = form.getHoldUntilComplete();
075        var allowBackorders = form.getAllowBackorders();
076        var allowSubstitutions = form.getAllowSubstitutions();
077        var allowCombiningShipments = form.getAllowCombiningShipments();
078        var reference = form.getReference();
079        var freeOnBoardName = form.getFreeOnBoardName();
080        var workflowEntranceName = form.getWorkflowEntranceName();
081
082        var order = PurchaseOrderLogic.getInstance().createPurchaseOrder(session, this, getUserVisit(), vendorName,
083                termName, holdUntilComplete, allowBackorders, allowSubstitutions, allowCombiningShipments, reference,
084                freeOnBoardName, workflowEntranceName, getParty());
085
086        if(!hasExecutionErrors()) {
087            result.setOrderName(order.getLastDetail().getOrderName());
088            result.setEntityRef(order.getPrimaryKey().getEntityRef());
089        }
090
091        return result;
092    }
093
094}