001// --------------------------------------------------------------------------------
002// Copyright 2002-2026 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.party.server.command;
018
019import com.echothree.control.user.party.common.edit.CompanyEdit;
020import com.echothree.control.user.party.common.edit.PartyEditFactory;
021import com.echothree.control.user.party.common.form.EditCompanyForm;
022import com.echothree.control.user.party.common.result.PartyResultFactory;
023import com.echothree.control.user.party.common.spec.CompanySpec;
024import com.echothree.model.control.accounting.server.control.AccountingControl;
025import com.echothree.model.control.party.server.control.PartyControl;
026import com.echothree.model.data.accounting.server.entity.Currency;
027import com.echothree.model.data.user.common.pk.UserVisitPK;
028import com.echothree.util.common.message.ExecutionErrors;
029import com.echothree.util.common.validation.FieldDefinition;
030import com.echothree.util.common.validation.FieldType;
031import com.echothree.util.common.command.BaseResult;
032import com.echothree.util.common.command.EditMode;
033import com.echothree.util.server.control.BaseEditCommand;
034import com.echothree.util.server.persistence.Session;
035import java.util.List;
036import javax.enterprise.context.Dependent;
037
038@Dependent
039public class EditCompanyCommand
040        extends BaseEditCommand<CompanySpec, CompanyEdit> {
041    
042    private final static List<FieldDefinition> SPEC_FIELD_DEFINITIONS;
043    private final static List<FieldDefinition> EDIT_FIELD_DEFINITIONS;
044    
045    static {
046        SPEC_FIELD_DEFINITIONS = List.of(
047                new FieldDefinition("CompanyName", FieldType.ENTITY_NAME, true, null, null)
048                );
049        
050        EDIT_FIELD_DEFINITIONS = List.of(
051                new FieldDefinition("CompanyName", FieldType.ENTITY_NAME, true, null, null),
052                new FieldDefinition("Name", FieldType.STRING, true, 1L, 60L),
053                new FieldDefinition("PreferredLanguageIsoName", FieldType.ENTITY_NAME, false, null, null),
054                new FieldDefinition("PreferredCurrencyIsoName", FieldType.ENTITY_NAME, false, null, null),
055                new FieldDefinition("PreferredJavaTimeZoneName", FieldType.TIME_ZONE_NAME, false, null, null),
056                new FieldDefinition("PreferredDateTimeFormatName", FieldType.ENTITY_NAME, false, null, null),
057                new FieldDefinition("IsDefault", FieldType.BOOLEAN, true, null, null),
058                new FieldDefinition("SortOrder", FieldType.SIGNED_INTEGER, true, null, null)
059                );
060    }
061    
062    /** Creates a new instance of EditCompanyCommand */
063    public EditCompanyCommand() {
064        super(null, SPEC_FIELD_DEFINITIONS, EDIT_FIELD_DEFINITIONS);
065    }
066    
067    @Override
068    protected BaseResult execute() {
069        var partyControl = Session.getModelController(PartyControl.class);
070        var result = PartyResultFactory.getEditCompanyResult();
071        var originalCompanyName = spec.getCompanyName();
072        var partyCompany = partyControl.getPartyCompanyByNameForUpdate(originalCompanyName);
073        
074        if(partyCompany != null) {
075            var party = partyCompany.getParty();
076            
077            if(editMode.equals(EditMode.LOCK)) {
078                result.setCompany(partyControl.getCompanyTransfer(getUserVisit(), partyCompany));
079                
080                if(lockEntity(party)) {
081                    var edit = PartyEditFactory.getCompanyEdit();
082                    var partyDetail = party.getLastDetail();
083                    var partyGroup = partyControl.getPartyGroup(party);
084                    var preferredLanguage = partyDetail.getPreferredLanguage();
085                    var preferredCurrency = partyDetail.getPreferredCurrency();
086                    var preferredTimeZone = partyDetail.getPreferredTimeZone();
087                    var preferredDateTimeFormat = partyDetail.getPreferredDateTimeFormat();
088                    
089                    result.setEdit(edit);
090                    edit.setCompanyName(partyCompany.getPartyCompanyName());
091                    edit.setName(partyGroup.getName());
092                    edit.setPreferredLanguageIsoName(preferredLanguage == null? null: preferredLanguage.getLanguageIsoName());
093                    edit.setPreferredCurrencyIsoName(preferredCurrency == null? null: preferredCurrency.getCurrencyIsoName());
094                    edit.setPreferredJavaTimeZoneName(preferredTimeZone == null? null: preferredTimeZone.getLastDetail().getJavaTimeZoneName());
095                    edit.setPreferredDateTimeFormatName(preferredDateTimeFormat == null? null: preferredDateTimeFormat.getLastDetail().getDateTimeFormatName());
096                    edit.setIsDefault(partyCompany.getIsDefault().toString());
097                    edit.setSortOrder(partyCompany.getSortOrder().toString());
098                } else {
099                    addExecutionError(ExecutionErrors.EntityLockFailed.name());
100                }
101                
102                result.setEntityLock(getEntityLockTransfer(party));
103            } else if(editMode.equals(EditMode.ABANDON)) {
104                unlockEntity(party);
105            } else if(editMode.equals(EditMode.UPDATE)) {
106                var partyCompanyValue = partyControl.getPartyCompanyValueForUpdate(partyCompany);
107                var companyName = edit.getCompanyName();
108                var duplicatePartyCompany = partyControl.getPartyCompanyByName(companyName);
109                
110                if(duplicatePartyCompany == null || duplicatePartyCompany.getPrimaryKey().equals(partyCompanyValue.getPrimaryKey())) {
111                    var preferredLanguageIsoName = edit.getPreferredLanguageIsoName();
112                    var preferredLanguage = preferredLanguageIsoName == null? null: partyControl.getLanguageByIsoName(preferredLanguageIsoName);
113                    
114                    if(preferredLanguageIsoName == null || (preferredLanguage != null)) {
115                        var preferredJavaTimeZoneName = edit.getPreferredJavaTimeZoneName();
116                        var preferredTimeZone = preferredJavaTimeZoneName == null? null: partyControl.getTimeZoneByJavaName(preferredJavaTimeZoneName);
117                        
118                        if(preferredJavaTimeZoneName == null || (preferredTimeZone != null)) {
119                            var preferredDateTimeFormatName = edit.getPreferredDateTimeFormatName();
120                            var preferredDateTimeFormat = preferredDateTimeFormatName == null? null: partyControl.getDateTimeFormatByName(preferredDateTimeFormatName);
121                            
122                            if(preferredDateTimeFormatName == null || (preferredDateTimeFormat != null)) {
123                                var preferredCurrencyIsoName = edit.getPreferredCurrencyIsoName();
124                                Currency preferredCurrency;
125                                
126                                if(preferredCurrencyIsoName == null)
127                                    preferredCurrency = null;
128                                else {
129                                    var accountingControl = Session.getModelController(AccountingControl.class);
130                                    preferredCurrency = accountingControl.getCurrencyByIsoName(preferredCurrencyIsoName);
131                                }
132                                
133                                if(preferredCurrencyIsoName == null || (preferredCurrency != null)) {
134                                    if(lockEntityForUpdate(party)) {
135                                        try {
136                                            var updatedBy = getPartyPK();
137                                            var partyDetailValue = partyControl.getPartyDetailValueForUpdate(party);
138                                            var partyGroupValue = partyControl.getPartyGroupValueForUpdate(party);
139                                            
140                                            partyCompanyValue.setPartyCompanyName(companyName);
141                                            partyGroupValue.setName(edit.getName());
142                                            partyCompanyValue.setIsDefault(Boolean.valueOf(edit.getIsDefault()));
143                                            partyCompanyValue.setSortOrder(Integer.valueOf(edit.getSortOrder()));
144                                            
145                                            partyControl.updatePartyCompanyFromValue(partyCompanyValue, updatedBy);
146                                            partyControl.updatePartyFromValue(partyDetailValue, updatedBy);
147                                            partyControl.updatePartyGroupFromValue(partyGroupValue, updatedBy);
148                                        } finally {
149                                            unlockEntity(party);
150                                        }
151                                    } else {
152                                        addExecutionError(ExecutionErrors.EntityLockStale.name());
153                                    }
154                                } else {
155                                    addExecutionError(ExecutionErrors.UnknownCurrencyIsoName.name(), preferredCurrencyIsoName);
156                                }
157                            } else {
158                                addExecutionError(ExecutionErrors.UnknownDateTimeFormatName.name(), preferredDateTimeFormatName);
159                            }
160                        } else {
161                            addExecutionError(ExecutionErrors.UnknownJavaTimeZoneName.name(), preferredJavaTimeZoneName);
162                        }
163                    } else {
164                        addExecutionError(ExecutionErrors.UnknownLanguageIsoName.name(), preferredLanguageIsoName);
165                    }
166                } else {
167                    addExecutionError(ExecutionErrors.DuplicateCompanyName.name(), companyName);
168                }
169                
170                if(hasExecutionErrors()) {
171                    result.setCompany(partyControl.getCompanyTransfer(getUserVisit(), partyCompany));
172                    result.setEntityLock(getEntityLockTransfer(party));
173                }
174            }
175        } else {
176            addExecutionError(ExecutionErrors.UnknownCompanyName.name(), originalCompanyName);
177        }
178        
179        return result;
180    }
181    
182}