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.letter.server.command; 018 019import com.echothree.control.user.letter.common.edit.LetterEditFactory; 020import com.echothree.control.user.letter.common.edit.LetterSourceEdit; 021import com.echothree.control.user.letter.common.form.EditLetterSourceForm; 022import com.echothree.control.user.letter.common.result.EditLetterSourceResult; 023import com.echothree.control.user.letter.common.result.LetterResultFactory; 024import com.echothree.control.user.letter.common.spec.LetterSourceSpec; 025import com.echothree.model.control.contact.server.control.ContactControl; 026import com.echothree.model.control.letter.server.control.LetterControl; 027import com.echothree.model.control.party.common.PartyTypes; 028import com.echothree.model.control.security.common.SecurityRoleGroups; 029import com.echothree.model.control.security.common.SecurityRoles; 030import com.echothree.model.data.contact.server.entity.PartyContactMechanism; 031import com.echothree.model.data.letter.server.entity.LetterSource; 032import com.echothree.model.data.letter.server.entity.LetterSourceDescription; 033import com.echothree.model.data.letter.server.entity.LetterSourceDetail; 034import com.echothree.model.data.letter.server.value.LetterSourceDescriptionValue; 035import com.echothree.model.data.letter.server.value.LetterSourceDetailValue; 036import com.echothree.model.data.party.server.entity.Party; 037import com.echothree.model.data.user.common.pk.UserVisitPK; 038import com.echothree.util.common.message.ExecutionErrors; 039import com.echothree.util.common.validation.FieldDefinition; 040import com.echothree.util.common.validation.FieldType; 041import com.echothree.util.common.command.BaseResult; 042import com.echothree.util.common.command.EditMode; 043import com.echothree.util.server.control.BaseEditCommand; 044import com.echothree.util.server.control.CommandSecurityDefinition; 045import com.echothree.util.server.control.PartyTypeDefinition; 046import com.echothree.util.server.control.SecurityRoleDefinition; 047import com.echothree.util.server.persistence.Session; 048import java.util.Arrays; 049import java.util.Collections; 050import java.util.List; 051 052public class EditLetterSourceCommand 053 extends BaseEditCommand<LetterSourceSpec, LetterSourceEdit> { 054 055 private final static CommandSecurityDefinition COMMAND_SECURITY_DEFINITION; 056 private final static List<FieldDefinition> SPEC_FIELD_DEFINITIONS; 057 private final static List<FieldDefinition> EDIT_FIELD_DEFINITIONS; 058 059 static { 060 COMMAND_SECURITY_DEFINITION = new CommandSecurityDefinition(Collections.unmodifiableList(Arrays.asList( 061 new PartyTypeDefinition(PartyTypes.UTILITY.name(), null), 062 new PartyTypeDefinition(PartyTypes.EMPLOYEE.name(), Collections.unmodifiableList(Arrays.asList( 063 new SecurityRoleDefinition(SecurityRoleGroups.LetterSource.name(), SecurityRoles.Edit.name()) 064 ))) 065 ))); 066 067 SPEC_FIELD_DEFINITIONS = Collections.unmodifiableList(Arrays.asList( 068 new FieldDefinition("LetterSourceName", FieldType.ENTITY_NAME, true, null, null) 069 )); 070 071 EDIT_FIELD_DEFINITIONS = Collections.unmodifiableList(Arrays.asList( 072 new FieldDefinition("LetterSourceName", FieldType.ENTITY_NAME, true, null, null), 073 new FieldDefinition("EmailAddressContactMechanismName", FieldType.ENTITY_NAME, false, null, null), 074 new FieldDefinition("EmailAddressContactMechanismAliasTypeName", FieldType.ENTITY_NAME, false, null, null), 075 new FieldDefinition("EmailAddressContactMechanismAlias", FieldType.ENTITY_NAME, false, null, null), 076 new FieldDefinition("PostalAddressContactMechanismName", FieldType.ENTITY_NAME, false, null, null), 077 new FieldDefinition("PostalAddressContactMechanismAliasTypeName", FieldType.ENTITY_NAME, false, null, null), 078 new FieldDefinition("PostalAddressContactMechanismAlias", FieldType.ENTITY_NAME, false, null, null), 079 new FieldDefinition("LetterSourceContactMechanismName", FieldType.ENTITY_NAME, false, null, null), 080 new FieldDefinition("LetterSourceContactMechanismAliasTypeName", FieldType.ENTITY_NAME, false, null, null), 081 new FieldDefinition("LetterSourceContactMechanismAlias", FieldType.ENTITY_NAME, false, null, null), 082 new FieldDefinition("IsDefault", FieldType.BOOLEAN, true, null, null), 083 new FieldDefinition("SortOrder", FieldType.SIGNED_INTEGER, true, null, null), 084 new FieldDefinition("Description", FieldType.STRING, false, 1L, 132L) 085 )); 086 } 087 088 /** Creates a new instance of EditLetterSourceCommand */ 089 public EditLetterSourceCommand(UserVisitPK userVisitPK, EditLetterSourceForm form) { 090 super(userVisitPK, form, COMMAND_SECURITY_DEFINITION, SPEC_FIELD_DEFINITIONS, EDIT_FIELD_DEFINITIONS); 091 } 092 093 @Override 094 protected BaseResult execute() { 095 var letterControl = Session.getModelController(LetterControl.class); 096 EditLetterSourceResult result = LetterResultFactory.getEditLetterSourceResult(); 097 098 if(editMode.equals(EditMode.LOCK)) { 099 String letterSourceName = spec.getLetterSourceName(); 100 LetterSource letterSource = letterControl.getLetterSourceByName(letterSourceName); 101 102 if(letterSource != null) { 103 result.setLetterSource(letterControl.getLetterSourceTransfer(getUserVisit(), letterSource)); 104 105 if(lockEntity(letterSource)) { 106 LetterSourceDescription letterSourceDescription = letterControl.getLetterSourceDescription(letterSource, getPreferredLanguage()); 107 LetterSourceEdit edit = LetterEditFactory.getLetterSourceEdit(); 108 LetterSourceDetail letterSourceDetail = letterSource.getLastDetail(); 109 110 result.setEdit(edit); 111 edit.setLetterSourceName(letterSourceDetail.getLetterSourceName()); 112 edit.setEmailAddressContactMechanismName(letterSourceDetail.getEmailAddressPartyContactMechanism().getLastDetail().getContactMechanism().getLastDetail().getContactMechanismName()); 113 edit.setPostalAddressContactMechanismName(letterSourceDetail.getPostalAddressPartyContactMechanism().getLastDetail().getContactMechanism().getLastDetail().getContactMechanismName()); 114 edit.setLetterSourceContactMechanismName(letterSourceDetail.getLetterSourcePartyContactMechanism().getLastDetail().getContactMechanism().getLastDetail().getContactMechanismName()); 115 edit.setIsDefault(letterSourceDetail.getIsDefault().toString()); 116 edit.setSortOrder(letterSourceDetail.getSortOrder().toString()); 117 118 if(letterSourceDescription != null) 119 edit.setDescription(letterSourceDescription.getDescription()); 120 } else { 121 addExecutionError(ExecutionErrors.EntityLockFailed.name()); 122 } 123 124 result.setEntityLock(getEntityLockTransfer(letterSource)); 125 } else { 126 addExecutionError(ExecutionErrors.UnknownLetterSourceName.name(), letterSourceName); 127 } 128 } else if(editMode.equals(EditMode.UPDATE)) { 129 String letterSourceName = spec.getLetterSourceName(); 130 LetterSource letterSource = letterControl.getLetterSourceByNameForUpdate(letterSourceName); 131 132 if(letterSource != null) { 133 letterSourceName = edit.getLetterSourceName(); 134 LetterSource duplicateLetterSource = letterControl.getLetterSourceByName(letterSourceName); 135 136 if(duplicateLetterSource == null || letterSource.equals(duplicateLetterSource)) { 137 var contactControl = Session.getModelController(ContactControl.class); 138 Party companyParty = letterSource.getLastDetail().getCompanyParty(); 139 LetterSourceCommandUtil letterSourceCommandUtil = LetterSourceCommandUtil.getInstance(); 140 PartyContactMechanism emailAddressPartyContactMechanism = letterSourceCommandUtil.getEmailAddressContactMechanism(this, edit, contactControl, 141 companyParty); 142 143 if(!hasExecutionErrors()) { 144 PartyContactMechanism postalAddressPartyContactMechanism = letterSourceCommandUtil.getPostalAddressContactMechanism(this, edit, 145 contactControl, companyParty); 146 147 if(!hasExecutionErrors()) { 148 PartyContactMechanism letterSourcePartyContactMechanism = letterSourceCommandUtil.getLetterSourceContactMechanism(this, edit, 149 contactControl, companyParty); 150 151 if(!hasExecutionErrors()) { 152 if(lockEntityForUpdate(letterSource)) { 153 try { 154 var partyPK = getPartyPK(); 155 LetterSourceDetailValue letterSourceDetailValue = letterControl.getLetterSourceDetailValueForUpdate(letterSource); 156 LetterSourceDescription letterSourceDescription = letterControl.getLetterSourceDescriptionForUpdate(letterSource, getPreferredLanguage()); 157 String description = edit.getDescription(); 158 159 letterSourceDetailValue.setLetterSourceName(edit.getLetterSourceName()); 160 letterSourceDetailValue.setEmailAddressPartyContactMechanismPK(emailAddressPartyContactMechanism.getPrimaryKey()); 161 letterSourceDetailValue.setPostalAddressPartyContactMechanismPK(postalAddressPartyContactMechanism.getPrimaryKey()); 162 letterSourceDetailValue.setLetterSourcePartyContactMechanismPK(letterSourcePartyContactMechanism.getPrimaryKey()); 163 letterSourceDetailValue.setIsDefault(Boolean.valueOf(edit.getIsDefault())); 164 letterSourceDetailValue.setSortOrder(Integer.valueOf(edit.getSortOrder())); 165 166 letterControl.updateLetterSourceFromValue(letterSourceDetailValue, partyPK); 167 168 if(letterSourceDescription == null && description != null) { 169 letterControl.createLetterSourceDescription(letterSource, getPreferredLanguage(), description, partyPK); 170 } else if(letterSourceDescription != null && description == null) { 171 letterControl.deleteLetterSourceDescription(letterSourceDescription, partyPK); 172 } else if(letterSourceDescription != null && description != null) { 173 LetterSourceDescriptionValue letterSourceDescriptionValue = letterControl.getLetterSourceDescriptionValue(letterSourceDescription); 174 175 letterSourceDescriptionValue.setDescription(description); 176 letterControl.updateLetterSourceDescriptionFromValue(letterSourceDescriptionValue, partyPK); 177 } 178 } finally { 179 unlockEntity(letterSource); 180 } 181 } else { 182 addExecutionError(ExecutionErrors.EntityLockStale.name()); 183 } 184 } 185 } 186 } 187 188 } else { 189 addExecutionError(ExecutionErrors.DuplicateLetterSourceName.name(), letterSourceName); 190 } 191 } else { 192 addExecutionError(ExecutionErrors.UnknownLetterSourceName.name(), letterSourceName); 193 } 194 195 if(hasExecutionErrors()) { 196 result.setLetterSource(letterControl.getLetterSourceTransfer(getUserVisit(), letterSource)); 197 result.setEntityLock(getEntityLockTransfer(letterSource)); 198 } 199 } 200 201 return result; 202 } 203 204}