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 java.util.List;
035import javax.enterprise.context.Dependent;
036import javax.inject.Inject;
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    @Inject
063    AccountingControl accountingControl;
064
065    @Inject
066    PartyControl partyControl;
067
068    
069    /** Creates a new instance of EditCompanyCommand */
070    public EditCompanyCommand() {
071        super(null, SPEC_FIELD_DEFINITIONS, EDIT_FIELD_DEFINITIONS);
072    }
073    
074    @Override
075    protected BaseResult execute() {
076        var result = PartyResultFactory.getEditCompanyResult();
077        var originalCompanyName = spec.getCompanyName();
078        var partyCompany = partyControl.getPartyCompanyByNameForUpdate(originalCompanyName);
079        
080        if(partyCompany != null) {
081            var party = partyCompany.getParty();
082            
083            if(editMode.equals(EditMode.LOCK)) {
084                result.setCompany(partyControl.getCompanyTransfer(getUserVisit(), partyCompany));
085                
086                if(lockEntity(party)) {
087                    var edit = PartyEditFactory.getCompanyEdit();
088                    var partyDetail = party.getLastDetail();
089                    var partyGroup = partyControl.getPartyGroup(party);
090                    var preferredLanguage = partyDetail.getPreferredLanguage();
091                    var preferredCurrency = partyDetail.getPreferredCurrency();
092                    var preferredTimeZone = partyDetail.getPreferredTimeZone();
093                    var preferredDateTimeFormat = partyDetail.getPreferredDateTimeFormat();
094                    
095                    result.setEdit(edit);
096                    edit.setCompanyName(partyCompany.getPartyCompanyName());
097                    edit.setName(partyGroup.getName());
098                    edit.setPreferredLanguageIsoName(preferredLanguage == null? null: preferredLanguage.getLanguageIsoName());
099                    edit.setPreferredCurrencyIsoName(preferredCurrency == null? null: preferredCurrency.getCurrencyIsoName());
100                    edit.setPreferredJavaTimeZoneName(preferredTimeZone == null? null: preferredTimeZone.getLastDetail().getJavaTimeZoneName());
101                    edit.setPreferredDateTimeFormatName(preferredDateTimeFormat == null? null: preferredDateTimeFormat.getLastDetail().getDateTimeFormatName());
102                    edit.setIsDefault(partyCompany.getIsDefault().toString());
103                    edit.setSortOrder(partyCompany.getSortOrder().toString());
104                } else {
105                    addExecutionError(ExecutionErrors.EntityLockFailed.name());
106                }
107                
108                result.setEntityLock(getEntityLockTransfer(party));
109            } else if(editMode.equals(EditMode.ABANDON)) {
110                unlockEntity(party);
111            } else if(editMode.equals(EditMode.UPDATE)) {
112                var partyCompanyValue = partyControl.getPartyCompanyValueForUpdate(partyCompany);
113                var companyName = edit.getCompanyName();
114                var duplicatePartyCompany = partyControl.getPartyCompanyByName(companyName);
115                
116                if(duplicatePartyCompany == null || duplicatePartyCompany.getPrimaryKey().equals(partyCompanyValue.getPrimaryKey())) {
117                    var preferredLanguageIsoName = edit.getPreferredLanguageIsoName();
118                    var preferredLanguage = preferredLanguageIsoName == null? null: partyControl.getLanguageByIsoName(preferredLanguageIsoName);
119                    
120                    if(preferredLanguageIsoName == null || (preferredLanguage != null)) {
121                        var preferredJavaTimeZoneName = edit.getPreferredJavaTimeZoneName();
122                        var preferredTimeZone = preferredJavaTimeZoneName == null? null: partyControl.getTimeZoneByJavaName(preferredJavaTimeZoneName);
123                        
124                        if(preferredJavaTimeZoneName == null || (preferredTimeZone != null)) {
125                            var preferredDateTimeFormatName = edit.getPreferredDateTimeFormatName();
126                            var preferredDateTimeFormat = preferredDateTimeFormatName == null? null: partyControl.getDateTimeFormatByName(preferredDateTimeFormatName);
127                            
128                            if(preferredDateTimeFormatName == null || (preferredDateTimeFormat != null)) {
129                                var preferredCurrencyIsoName = edit.getPreferredCurrencyIsoName();
130                                Currency preferredCurrency;
131                                
132                                if(preferredCurrencyIsoName == null)
133                                    preferredCurrency = null;
134                                else {
135                                    preferredCurrency = accountingControl.getCurrencyByIsoName(preferredCurrencyIsoName);
136                                }
137                                
138                                if(preferredCurrencyIsoName == null || (preferredCurrency != null)) {
139                                    if(lockEntityForUpdate(party)) {
140                                        try {
141                                            var updatedBy = getPartyPK();
142                                            var partyDetailValue = partyControl.getPartyDetailValueForUpdate(party);
143                                            var partyGroupValue = partyControl.getPartyGroupValueForUpdate(party);
144                                            
145                                            partyCompanyValue.setPartyCompanyName(companyName);
146                                            partyGroupValue.setName(edit.getName());
147                                            partyCompanyValue.setIsDefault(Boolean.valueOf(edit.getIsDefault()));
148                                            partyCompanyValue.setSortOrder(Integer.valueOf(edit.getSortOrder()));
149                                            
150                                            partyControl.updatePartyCompanyFromValue(partyCompanyValue, updatedBy);
151                                            partyControl.updatePartyFromValue(partyDetailValue, updatedBy);
152                                            partyControl.updatePartyGroupFromValue(partyGroupValue, updatedBy);
153                                        } finally {
154                                            unlockEntity(party);
155                                        }
156                                    } else {
157                                        addExecutionError(ExecutionErrors.EntityLockStale.name());
158                                    }
159                                } else {
160                                    addExecutionError(ExecutionErrors.UnknownCurrencyIsoName.name(), preferredCurrencyIsoName);
161                                }
162                            } else {
163                                addExecutionError(ExecutionErrors.UnknownDateTimeFormatName.name(), preferredDateTimeFormatName);
164                            }
165                        } else {
166                            addExecutionError(ExecutionErrors.UnknownJavaTimeZoneName.name(), preferredJavaTimeZoneName);
167                        }
168                    } else {
169                        addExecutionError(ExecutionErrors.UnknownLanguageIsoName.name(), preferredLanguageIsoName);
170                    }
171                } else {
172                    addExecutionError(ExecutionErrors.DuplicateCompanyName.name(), companyName);
173                }
174                
175                if(hasExecutionErrors()) {
176                    result.setCompany(partyControl.getCompanyTransfer(getUserVisit(), partyCompany));
177                    result.setEntityLock(getEntityLockTransfer(party));
178                }
179            }
180        } else {
181            addExecutionError(ExecutionErrors.UnknownCompanyName.name(), originalCompanyName);
182        }
183        
184        return result;
185    }
186    
187}