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.cancellationpolicy.server.command; 018 019import com.echothree.control.user.cancellationpolicy.common.edit.CancellationPolicyEdit; 020import com.echothree.control.user.cancellationpolicy.common.edit.CancellationPolicyEditFactory; 021import com.echothree.control.user.cancellationpolicy.common.form.EditCancellationPolicyForm; 022import com.echothree.control.user.cancellationpolicy.common.result.CancellationPolicyResultFactory; 023import com.echothree.control.user.cancellationpolicy.common.result.EditCancellationPolicyResult; 024import com.echothree.control.user.cancellationpolicy.common.spec.CancellationPolicySpec; 025import com.echothree.model.control.cancellationpolicy.server.control.CancellationPolicyControl; 026import com.echothree.model.control.core.common.MimeTypeUsageTypes; 027import com.echothree.model.control.core.server.logic.MimeTypeLogic; 028import com.echothree.model.control.party.common.PartyTypes; 029import com.echothree.model.control.security.common.SecurityRoleGroups; 030import com.echothree.model.control.security.common.SecurityRoles; 031import com.echothree.model.data.cancellationpolicy.server.entity.CancellationKind; 032import com.echothree.model.data.cancellationpolicy.server.entity.CancellationPolicy; 033import com.echothree.model.data.core.server.entity.MimeType; 034import com.echothree.model.data.user.common.pk.UserVisitPK; 035import com.echothree.util.common.message.ExecutionErrors; 036import com.echothree.util.common.validation.FieldDefinition; 037import com.echothree.util.common.validation.FieldType; 038import com.echothree.util.common.command.EditMode; 039import com.echothree.util.server.control.BaseAbstractEditCommand; 040import com.echothree.util.server.control.CommandSecurityDefinition; 041import com.echothree.util.server.control.PartyTypeDefinition; 042import com.echothree.util.server.control.SecurityRoleDefinition; 043import java.util.List; 044import javax.enterprise.context.Dependent; 045import javax.inject.Inject; 046 047@Dependent 048public class EditCancellationPolicyCommand 049 extends BaseAbstractEditCommand<CancellationPolicySpec, CancellationPolicyEdit, EditCancellationPolicyResult, CancellationPolicy, CancellationPolicy> { 050 051 private final static CommandSecurityDefinition COMMAND_SECURITY_DEFINITION; 052 private final static List<FieldDefinition> SPEC_FIELD_DEFINITIONS; 053 private final static List<FieldDefinition> EDIT_FIELD_DEFINITIONS; 054 055 static { 056 COMMAND_SECURITY_DEFINITION = new CommandSecurityDefinition(List.of( 057 new PartyTypeDefinition(PartyTypes.UTILITY.name(), null), 058 new PartyTypeDefinition(PartyTypes.EMPLOYEE.name(), List.of( 059 new SecurityRoleDefinition(SecurityRoleGroups.CancellationPolicy.name(), SecurityRoles.Edit.name()) 060 )) 061 )); 062 063 SPEC_FIELD_DEFINITIONS = List.of( 064 new FieldDefinition("CancellationKindName", FieldType.ENTITY_NAME, true, null, null), 065 new FieldDefinition("CancellationPolicyName", FieldType.ENTITY_NAME, true, null, null) 066 ); 067 068 EDIT_FIELD_DEFINITIONS = List.of( 069 new FieldDefinition("CancellationPolicyName", FieldType.ENTITY_NAME, true, null, null), 070 new FieldDefinition("IsDefault", FieldType.BOOLEAN, true, null, null), 071 new FieldDefinition("SortOrder", FieldType.SIGNED_INTEGER, true, null, null), 072 new FieldDefinition("Description", FieldType.STRING, false, 1L, 132L), 073 new FieldDefinition("PolicyMimeTypeName", FieldType.MIME_TYPE, false, null, null), 074 new FieldDefinition("Policy", FieldType.STRING, false, null, null) 075 ); 076 } 077 078 @Inject 079 CancellationPolicyControl cancellationPolicyControl; 080 081 @Inject 082 MimeTypeLogic mimeTypeLogic; 083 084 /** Creates a new instance of EditCancellationPolicyCommand */ 085 public EditCancellationPolicyCommand() { 086 super(COMMAND_SECURITY_DEFINITION, SPEC_FIELD_DEFINITIONS, EDIT_FIELD_DEFINITIONS); 087 } 088 089 @Override 090 public EditCancellationPolicyResult getResult() { 091 return CancellationPolicyResultFactory.getEditCancellationPolicyResult(); 092 } 093 094 @Override 095 public CancellationPolicyEdit getEdit() { 096 return CancellationPolicyEditFactory.getCancellationPolicyEdit(); 097 } 098 099 CancellationKind cancellationKind; 100 101 @Override 102 public CancellationPolicy getEntity(EditCancellationPolicyResult result) { 103 CancellationPolicy cancellationPolicy = null; 104 var cancellationKindName = spec.getCancellationKindName(); 105 106 cancellationKind = cancellationPolicyControl.getCancellationKindByName(cancellationKindName); 107 108 if(cancellationKind != null) { 109 var cancellationPolicyName = spec.getCancellationPolicyName(); 110 111 if(editMode.equals(EditMode.LOCK) || editMode.equals(EditMode.ABANDON)) { 112 cancellationPolicy = cancellationPolicyControl.getCancellationPolicyByName(cancellationKind, cancellationPolicyName); 113 } else { // EditMode.UPDATE 114 cancellationPolicy = cancellationPolicyControl.getCancellationPolicyByNameForUpdate(cancellationKind, cancellationPolicyName); 115 } 116 117 if(cancellationPolicy != null) { 118 result.setCancellationPolicy(cancellationPolicyControl.getCancellationPolicyTransfer(getUserVisit(), cancellationPolicy)); 119 } else { 120 addExecutionError(ExecutionErrors.UnknownCancellationPolicyName.name(), cancellationKindName, cancellationPolicyName); 121 } 122 } else { 123 addExecutionError(ExecutionErrors.UnknownCancellationKindName.name(), cancellationKindName); 124 } 125 126 return cancellationPolicy; 127 } 128 129 @Override 130 public CancellationPolicy getLockEntity(CancellationPolicy cancellationPolicy) { 131 return cancellationPolicy; 132 } 133 134 @Override 135 public void fillInResult(EditCancellationPolicyResult result, CancellationPolicy cancellationPolicy) { 136 result.setCancellationPolicy(cancellationPolicyControl.getCancellationPolicyTransfer(getUserVisit(), cancellationPolicy)); 137 } 138 139 MimeType policyMimeType; 140 141 @Override 142 public void doLock(CancellationPolicyEdit edit, CancellationPolicy cancellationPolicy) { 143 var cancellationPolicyTranslation = cancellationPolicyControl.getCancellationPolicyTranslation(cancellationPolicy, getPreferredLanguage()); 144 var cancellationPolicyDetail = cancellationPolicy.getLastDetail(); 145 146 edit.setCancellationPolicyName(cancellationPolicyDetail.getCancellationPolicyName()); 147 edit.setIsDefault(cancellationPolicyDetail.getIsDefault().toString()); 148 edit.setSortOrder(cancellationPolicyDetail.getSortOrder().toString()); 149 150 if(cancellationPolicyTranslation != null) { 151 policyMimeType = cancellationPolicyTranslation.getPolicyMimeType(); 152 153 edit.setDescription(cancellationPolicyTranslation.getDescription()); 154 edit.setPolicyMimeTypeName(policyMimeType == null? null: policyMimeType.getLastDetail().getMimeTypeName()); 155 edit.setPolicy(cancellationPolicyTranslation.getPolicy()); 156 } 157 } 158 159 @Override 160 public void canUpdate(CancellationPolicy cancellationPolicy) { 161 var cancellationPolicyName = edit.getCancellationPolicyName(); 162 var duplicateCancellationPolicy = cancellationPolicyControl.getCancellationPolicyByName(cancellationKind, cancellationPolicyName); 163 164 if(duplicateCancellationPolicy != null && !cancellationPolicy.equals(duplicateCancellationPolicy)) { 165 addExecutionError(ExecutionErrors.DuplicateCancellationPolicyName.name(), cancellationPolicyName); 166 } else { 167 var policyMimeTypeName = edit.getPolicyMimeTypeName(); 168 var policy = edit.getPolicy(); 169 170 policyMimeType = mimeTypeLogic.checkMimeType(this, policyMimeTypeName, policy, MimeTypeUsageTypes.TEXT.name(), 171 ExecutionErrors.MissingRequiredPolicyMimeTypeName.name(), ExecutionErrors.MissingRequiredPolicy.name(), 172 ExecutionErrors.UnknownPolicyMimeTypeName.name(), ExecutionErrors.UnknownPolicyMimeTypeUsage.name()); 173 } 174 } 175 176 @Override 177 public void doUpdate(CancellationPolicy cancellationPolicy) { 178 var partyPK = getPartyPK(); 179 var cancellationPolicyDetailValue = cancellationPolicyControl.getCancellationPolicyDetailValueForUpdate(cancellationPolicy); 180 var cancellationPolicyTranslation = cancellationPolicyControl.getCancellationPolicyTranslationForUpdate(cancellationPolicy, getPreferredLanguage()); 181 var description = edit.getDescription(); 182 var policy = edit.getPolicy(); 183 184 cancellationPolicyDetailValue.setCancellationPolicyName(edit.getCancellationPolicyName()); 185 cancellationPolicyDetailValue.setIsDefault(Boolean.valueOf(edit.getIsDefault())); 186 cancellationPolicyDetailValue.setSortOrder(Integer.valueOf(edit.getSortOrder())); 187 188 cancellationPolicyControl.updateCancellationPolicyFromValue(cancellationPolicyDetailValue, partyPK); 189 190 if(cancellationPolicyTranslation == null && (description != null || policy != null)) { 191 cancellationPolicyControl.createCancellationPolicyTranslation(cancellationPolicy, getPreferredLanguage(), description, policyMimeType, policy, 192 partyPK); 193 } else if(cancellationPolicyTranslation != null && (description == null && policy == null)) { 194 cancellationPolicyControl.deleteCancellationPolicyTranslation(cancellationPolicyTranslation, partyPK); 195 } else if(cancellationPolicyTranslation != null && (description != null || policy != null)) { 196 var cancellationPolicyTranslationValue = cancellationPolicyControl.getCancellationPolicyTranslationValue(cancellationPolicyTranslation); 197 198 cancellationPolicyTranslationValue.setDescription(description); 199 cancellationPolicyTranslationValue.setPolicyMimeTypePK(policyMimeType == null? null: policyMimeType.getPrimaryKey()); 200 cancellationPolicyTranslationValue.setPolicy(policy); 201 cancellationPolicyControl.updateCancellationPolicyTranslationFromValue(cancellationPolicyTranslationValue, partyPK); 202 } 203 } 204 205}