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.EmployeeEdit; 020import com.echothree.control.user.party.common.edit.PartyEditFactory; 021import com.echothree.control.user.party.common.form.EditEmployeeForm; 022import com.echothree.control.user.party.common.result.EditEmployeeResult; 023import com.echothree.control.user.party.common.result.PartyResultFactory; 024import com.echothree.control.user.party.common.spec.EmployeeSpec; 025import com.echothree.model.control.accounting.server.control.AccountingControl; 026import com.echothree.model.control.employee.server.control.EmployeeControl; 027import com.echothree.model.control.party.common.PartyTypes; 028import com.echothree.model.control.party.server.control.PartyControl; 029import com.echothree.model.control.security.common.SecurityRoleGroups; 030import com.echothree.model.control.security.common.SecurityRoles; 031import com.echothree.model.control.security.server.control.SecurityControl; 032import com.echothree.model.data.accounting.server.entity.Currency; 033import com.echothree.model.data.employee.server.entity.EmployeeType; 034import com.echothree.model.data.employee.server.entity.PartyEmployee; 035import com.echothree.model.data.party.server.entity.DateTimeFormat; 036import com.echothree.model.data.party.server.entity.Language; 037import com.echothree.model.data.party.server.entity.Party; 038import com.echothree.model.data.party.server.entity.TimeZone; 039import com.echothree.model.data.security.server.entity.PartySecurityRoleTemplate; 040import com.echothree.model.data.user.common.pk.UserVisitPK; 041import com.echothree.util.common.command.EditMode; 042import com.echothree.util.common.message.ExecutionErrors; 043import com.echothree.util.common.validation.FieldDefinition; 044import com.echothree.util.common.validation.FieldType; 045import com.echothree.util.server.control.BaseAbstractEditCommand; 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.EntityPermission; 050import com.echothree.util.server.persistence.Session; 051import java.util.List; 052import org.apache.commons.codec.language.Soundex; 053import javax.enterprise.context.Dependent; 054 055@Dependent 056public class EditEmployeeCommand 057 extends BaseAbstractEditCommand<EmployeeSpec, EmployeeEdit, EditEmployeeResult, Party, Party> { 058 059 private final static CommandSecurityDefinition COMMAND_SECURITY_DEFINITION; 060 private final static List<FieldDefinition> SPEC_FIELD_DEFINITIONS; 061 private final static List<FieldDefinition> EDIT_FIELD_DEFINITIONS; 062 063 static { 064 COMMAND_SECURITY_DEFINITION = new CommandSecurityDefinition(List.of( 065 new PartyTypeDefinition(PartyTypes.UTILITY.name(), null), 066 new PartyTypeDefinition(PartyTypes.EMPLOYEE.name(), List.of( 067 new SecurityRoleDefinition(SecurityRoleGroups.Employee.name(), SecurityRoles.Edit.name()) 068 )) 069 )); 070 071 SPEC_FIELD_DEFINITIONS = List.of( 072 new FieldDefinition("EmployeeName", FieldType.ENTITY_NAME, true, null, null) 073 ); 074 075 EDIT_FIELD_DEFINITIONS = List.of( 076 new FieldDefinition("EmployeeTypeName", FieldType.ENTITY_NAME, true, null, null), 077 new FieldDefinition("PersonalTitleId", FieldType.ID, false, null, null), 078 new FieldDefinition("FirstName", FieldType.STRING, true, 1L, 20L), 079 new FieldDefinition("MiddleName", FieldType.STRING, false, 1L, 20L), 080 new FieldDefinition("LastName", FieldType.STRING, true, 1L, 20L), 081 new FieldDefinition("NameSuffixId", FieldType.ID, false, null, null), 082 new FieldDefinition("PreferredLanguageIsoName", FieldType.ENTITY_NAME, false, null, null), 083 new FieldDefinition("PreferredCurrencyIsoName", FieldType.ENTITY_NAME, false, null, null), 084 new FieldDefinition("PreferredJavaTimeZoneName", FieldType.TIME_ZONE_NAME, false, null, null), 085 new FieldDefinition("PreferredDateTimeFormatName", FieldType.ENTITY_NAME, false, null, null), 086 new FieldDefinition("PartySecurityRoleTemplateName", FieldType.ENTITY_NAME, true, null, null) 087 ); 088 } 089 090 /** Creates a new instance of EditEmployeeCommand */ 091 public EditEmployeeCommand() { 092 super(COMMAND_SECURITY_DEFINITION, SPEC_FIELD_DEFINITIONS, EDIT_FIELD_DEFINITIONS); 093 } 094 095 @Override 096 public EditEmployeeResult getResult() { 097 return PartyResultFactory.getEditEmployeeResult(); 098 } 099 100 @Override 101 public EmployeeEdit getEdit() { 102 return PartyEditFactory.getEmployeeEdit(); 103 } 104 105 @Override 106 public Party getEntity(EditEmployeeResult result) { 107 var employeeControl = Session.getModelController(EmployeeControl.class); 108 PartyEmployee partyEmployee; 109 var employeeName = spec.getEmployeeName(); 110 111 if(editMode.equals(EditMode.LOCK) || editMode.equals(EditMode.ABANDON)) { 112 partyEmployee = employeeControl.getPartyEmployeeByName(employeeName); 113 } else { // EditMode.UPDATE 114 partyEmployee = employeeControl.getPartyEmployeeByNameForUpdate(employeeName); 115 } 116 117 if(partyEmployee != null) { 118 result.setEmployee(employeeControl.getEmployeeTransfer(getUserVisit(), partyEmployee.getParty())); 119 } else { 120 addExecutionError(ExecutionErrors.UnknownEmployeeName.name(), employeeName); 121 } 122 123 return partyEmployee.getParty(); 124 } 125 126 @Override 127 public Party getLockEntity(Party party) { 128 return party; 129 } 130 131 @Override 132 public void fillInResult(EditEmployeeResult result, Party party) { 133 var employeeControl = Session.getModelController(EmployeeControl.class); 134 135 result.setEmployee(employeeControl.getEmployeeTransfer(getUserVisit(), party)); 136 } 137 138 @Override 139 public void doLock(EmployeeEdit edit, Party party) { 140 var employeeControl = Session.getModelController(EmployeeControl.class); 141 var partyControl = Session.getModelController(PartyControl.class); 142 var securityControl = Session.getModelController(SecurityControl.class); 143 var partyEmployee = employeeControl.getPartyEmployee(party); 144 var partyDetail = party.getLastDetail(); 145 var preferredLanguage = partyDetail.getPreferredLanguage(); 146 var preferredCurrency = partyDetail.getPreferredCurrency(); 147 var preferredTimeZone = partyDetail.getPreferredTimeZone(); 148 var dateTimeFormat = partyDetail.getPreferredDateTimeFormat(); 149 var person = partyControl.getPerson(party); 150 var personalTitle = person.getPersonalTitle(); 151 var nameSuffix = person.getNameSuffix(); 152 var partySecurityRoleTemplateUse = securityControl.getPartySecurityRoleTemplateUse(party); 153 154 edit.setEmployeeTypeName(partyEmployee.getEmployeeType().getLastDetail().getEmployeeTypeName()); 155 edit.setPersonalTitleId(personalTitle == null? null: personalTitle.getPrimaryKey().getEntityId().toString()); 156 edit.setFirstName(person.getFirstName()); 157 edit.setMiddleName(person.getMiddleName()); 158 edit.setLastName(person.getLastName()); 159 edit.setNameSuffixId(nameSuffix == null? null: nameSuffix.getPrimaryKey().getEntityId().toString()); 160 edit.setPreferredLanguageIsoName(preferredLanguage == null? null: preferredLanguage.getLanguageIsoName()); 161 edit.setPreferredCurrencyIsoName(preferredCurrency == null? null: preferredCurrency.getCurrencyIsoName()); 162 edit.setPreferredJavaTimeZoneName(preferredTimeZone == null? null: preferredTimeZone.getLastDetail().getJavaTimeZoneName()); 163 edit.setPreferredDateTimeFormatName(dateTimeFormat == null? null: dateTimeFormat.getLastDetail().getDateTimeFormatName()); 164 edit.setPartySecurityRoleTemplateName(partySecurityRoleTemplateUse.getPartySecurityRoleTemplate().getLastDetail().getPartySecurityRoleTemplateName()); 165 } 166 167 EmployeeType employeeType; 168 Language preferredLanguage; 169 TimeZone preferredTimeZone; 170 DateTimeFormat preferredDateTimeFormat; 171 Currency preferredCurrency; 172 PartySecurityRoleTemplate partySecurityRoleTemplate; 173 174 @Override 175 public void canUpdate(Party party) { 176 var employeeControl = Session.getModelController(EmployeeControl.class); 177 var partyControl = Session.getModelController(PartyControl.class); 178 var securityControl = Session.getModelController(SecurityControl.class); 179 var employeeTypeName = edit.getEmployeeTypeName(); 180 181 employeeType = employeeControl.getEmployeeTypeByName(employeeTypeName); 182 183 if(employeeType != null) { 184 var preferredLanguageIsoName = edit.getPreferredLanguageIsoName(); 185 186 preferredLanguage = preferredLanguageIsoName == null ? null : partyControl.getLanguageByIsoName(preferredLanguageIsoName); 187 188 if(preferredLanguageIsoName == null || (preferredLanguage != null)) { 189 var preferredJavaTimeZoneName = edit.getPreferredJavaTimeZoneName(); 190 191 preferredTimeZone = preferredJavaTimeZoneName == null ? null : partyControl.getTimeZoneByJavaName(preferredJavaTimeZoneName); 192 193 if(preferredJavaTimeZoneName == null || (preferredTimeZone != null)) { 194 var preferredDateTimeFormatName = edit.getPreferredDateTimeFormatName(); 195 196 preferredDateTimeFormat = preferredDateTimeFormatName == null ? null : partyControl.getDateTimeFormatByName(preferredDateTimeFormatName); 197 198 if(preferredDateTimeFormatName == null || (preferredDateTimeFormat != null)) { 199 var preferredCurrencyIsoName = edit.getPreferredCurrencyIsoName(); 200 201 if(preferredCurrencyIsoName == null) { 202 preferredCurrency = null; 203 } else { 204 var accountingControl = Session.getModelController(AccountingControl.class); 205 preferredCurrency = accountingControl.getCurrencyByIsoName(preferredCurrencyIsoName); 206 } 207 208 if(preferredCurrencyIsoName == null || (preferredCurrency != null)) { 209 var partySecurityRoleTemplateName = edit.getPartySecurityRoleTemplateName(); 210 211 partySecurityRoleTemplate = securityControl.getPartySecurityRoleTemplateByName(partySecurityRoleTemplateName); 212 213 if(partySecurityRoleTemplate == null) { 214 addExecutionError(ExecutionErrors.UnknownPartySecurityRoleTemplateName.name(), partySecurityRoleTemplateName); 215 } 216 } else { 217 addExecutionError(ExecutionErrors.UnknownCurrencyIsoName.name(), preferredCurrencyIsoName); 218 } 219 } else { 220 addExecutionError(ExecutionErrors.UnknownDateTimeFormatName.name(), preferredDateTimeFormatName); 221 } 222 } else { 223 addExecutionError(ExecutionErrors.UnknownJavaTimeZoneName.name(), preferredJavaTimeZoneName); 224 } 225 } else { 226 addExecutionError(ExecutionErrors.UnknownLanguageIsoName.name(), preferredLanguageIsoName); 227 } 228 } else { 229 addExecutionError(ExecutionErrors.UnknownEmployeeTypeName.name(), employeeTypeName); 230 } 231 } 232 233 @Override 234 public void doUpdate(Party party) { 235 var employeeControl = Session.getModelController(EmployeeControl.class); 236 var partyControl = Session.getModelController(PartyControl.class); 237 var securityControl = Session.getModelController(SecurityControl.class); 238 var soundex = new Soundex(); 239 var partyDetailValue = partyControl.getPartyDetailValueForUpdate(party); 240 var partyEmployee = employeeControl.getPartyEmployeeForUpdate(party); 241 var partyEmployeeValue = employeeControl.getPartyEmployeeValue(partyEmployee); 242 var personValue = partyControl.getPersonValueForUpdate(party); 243 var personalTitleId = edit.getPersonalTitleId(); 244 var personalTitle = personalTitleId == null ? null : partyControl.convertPersonalTitleIdToEntity(personalTitleId, EntityPermission.READ_ONLY); 245 var firstName = edit.getFirstName(); 246 var firstNameSdx = soundex.encode(firstName); 247 var middleName = edit.getMiddleName(); 248 var middleNameSdx = middleName == null ? null : soundex.encode(middleName); 249 var lastName = edit.getLastName(); 250 var lastNameSdx = soundex.encode(lastName); 251 var nameSuffixId = edit.getNameSuffixId(); 252 var nameSuffix = nameSuffixId == null ? null : partyControl.convertNameSuffixIdToEntity(nameSuffixId, EntityPermission.READ_ONLY); 253 var partySecurityRoleTemplateUseValue = securityControl.getPartySecurityRoleTemplateUseValueForUpdate(party); 254 255 partyEmployeeValue.setEmployeeTypePK(employeeType.getPrimaryKey()); 256 257 partyDetailValue.setPreferredLanguagePK(preferredLanguage == null? null: preferredLanguage.getPrimaryKey()); 258 partyDetailValue.setPreferredTimeZonePK(preferredTimeZone == null? null: preferredTimeZone.getPrimaryKey()); 259 partyDetailValue.setPreferredDateTimeFormatPK(preferredDateTimeFormat == null? null: preferredDateTimeFormat.getPrimaryKey()); 260 partyDetailValue.setPreferredCurrencyPK(preferredCurrency == null? null: preferredCurrency.getPrimaryKey()); 261 262 personValue.setPersonalTitlePK(personalTitle == null? null: personalTitle.getPrimaryKey()); 263 personValue.setFirstName(firstName); 264 personValue.setFirstNameSdx(firstNameSdx); 265 personValue.setMiddleName(middleName); 266 personValue.setMiddleNameSdx(middleNameSdx); 267 personValue.setLastName(lastName); 268 personValue.setLastNameSdx(lastNameSdx); 269 personValue.setNameSuffixPK(nameSuffix == null? null: nameSuffix.getPrimaryKey()); 270 271 partySecurityRoleTemplateUseValue.setPartySecurityRoleTemplatePK(partySecurityRoleTemplate.getPrimaryKey()); 272 273 var updatedBy = getPartyPK(); 274 employeeControl.updatePartyEmployeeFromValue(partyEmployeeValue, updatedBy); 275 partyControl.updatePartyFromValue(partyDetailValue, updatedBy); 276 partyControl.updatePersonFromValue(personValue, updatedBy); 277 securityControl.updatePartySecurityRoleTemplateUseFromValue(partySecurityRoleTemplateUseValue, updatedBy); 278 } 279 280}