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.training.server.command; 018 019import com.echothree.control.user.training.common.form.CreateTrainingClassForm; 020import com.echothree.control.user.training.common.result.CreateTrainingClassResult; 021import com.echothree.control.user.training.common.result.TrainingResultFactory; 022import com.echothree.model.control.core.common.MimeTypeUsageTypes; 023import com.echothree.model.control.core.server.logic.MimeTypeLogic; 024import com.echothree.model.control.party.common.PartyTypes; 025import com.echothree.model.control.security.common.SecurityRoleGroups; 026import com.echothree.model.control.security.common.SecurityRoles; 027import com.echothree.model.control.training.server.logic.TrainingClassLogic; 028import com.echothree.model.control.uom.common.UomConstants; 029import com.echothree.model.control.uom.server.logic.UnitOfMeasureTypeLogic; 030import com.echothree.model.control.workeffort.common.workeffort.TrainingConstants; 031import com.echothree.model.control.workeffort.server.control.WorkEffortControl; 032import com.echothree.model.data.training.server.entity.TrainingClass; 033import com.echothree.model.data.workeffort.server.entity.WorkEffortScope; 034import com.echothree.util.common.command.BaseResult; 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.server.control.BaseSimpleCommand; 039import com.echothree.util.server.control.CommandSecurityDefinition; 040import com.echothree.util.server.control.PartyTypeDefinition; 041import com.echothree.util.server.control.SecurityRoleDefinition; 042import java.util.List; 043import javax.enterprise.context.Dependent; 044import javax.inject.Inject; 045 046@Dependent 047public class CreateTrainingClassCommand 048 extends BaseSimpleCommand<CreateTrainingClassForm> { 049 050 private final static CommandSecurityDefinition COMMAND_SECURITY_DEFINITION; 051 private final static List<FieldDefinition> FORM_FIELD_DEFINITIONS; 052 053 static { 054 COMMAND_SECURITY_DEFINITION = new CommandSecurityDefinition(List.of( 055 new PartyTypeDefinition(PartyTypes.UTILITY.name(), null), 056 new PartyTypeDefinition(PartyTypes.EMPLOYEE.name(), List.of( 057 new SecurityRoleDefinition(SecurityRoleGroups.TrainingClass.name(), SecurityRoles.Create.name()) 058 )) 059 )); 060 061 FORM_FIELD_DEFINITIONS = List.of( 062 new FieldDefinition("TrainingClassName", FieldType.ENTITY_NAME, true, null, null), 063 new FieldDefinition("EstimatedReadingTime", FieldType.UNSIGNED_LONG, false, null, null), 064 new FieldDefinition("EstimatedReadingTimeUnitOfMeasureTypeName", FieldType.ENTITY_NAME, false, null, null), 065 new FieldDefinition("ReadingTimeAllowed", FieldType.UNSIGNED_LONG, false, null, null), 066 new FieldDefinition("ReadingTimeAllowedUnitOfMeasureTypeName", FieldType.ENTITY_NAME, false, null, null), 067 new FieldDefinition("EstimatedTestingTime", FieldType.UNSIGNED_LONG, false, null, null), 068 new FieldDefinition("EstimatedTestingTimeUnitOfMeasureTypeName", FieldType.ENTITY_NAME, false, null, null), 069 new FieldDefinition("TestingTimeAllowed", FieldType.UNSIGNED_LONG, false, null, null), 070 new FieldDefinition("TestingTimeAllowedUnitOfMeasureTypeName", FieldType.ENTITY_NAME, false, null, null), 071 new FieldDefinition("RequiredCompletionTime", FieldType.UNSIGNED_LONG, false, null, null), 072 new FieldDefinition("RequiredCompletionTimeUnitOfMeasureTypeName", FieldType.ENTITY_NAME, false, null, null), 073 new FieldDefinition("WorkEffortScopeName", FieldType.ENTITY_NAME, false, null, null), 074 new FieldDefinition("DefaultPercentageToPass", FieldType.FRACTIONAL_PERCENT, false, null, null), 075 new FieldDefinition("OverallQuestionCount", FieldType.UNSIGNED_INTEGER, false, null, null), 076 new FieldDefinition("TestingValidityTime", FieldType.UNSIGNED_LONG, false, null, null), 077 new FieldDefinition("TestingValidityTimeUnitOfMeasureTypeName", FieldType.ENTITY_NAME, false, null, null), 078 new FieldDefinition("ExpiredRetentionTime", FieldType.UNSIGNED_LONG, false, null, null), 079 new FieldDefinition("ExpiredRetentionTimeUnitOfMeasureTypeName", FieldType.ENTITY_NAME, false, null, null), 080 new FieldDefinition("AlwaysReassignOnExpiration", FieldType.BOOLEAN, true, null, null), 081 new FieldDefinition("IsDefault", FieldType.BOOLEAN, true, null, null), 082 new FieldDefinition("SortOrder", FieldType.SIGNED_INTEGER, true, null, null), 083 new FieldDefinition("Description", FieldType.STRING, false, 1L, 132L), 084 new FieldDefinition("OverviewMimeTypeName", FieldType.MIME_TYPE, false, null, null), 085 new FieldDefinition("Overview", FieldType.STRING, false, null, null), 086 new FieldDefinition("IntroductionMimeTypeName", FieldType.MIME_TYPE, false, null, null), 087 new FieldDefinition("Introduction", FieldType.STRING, false, null, null) 088 ); 089 } 090 091 @Inject 092 WorkEffortControl workEffortControl; 093 094 @Inject 095 MimeTypeLogic mimeTypeLogic; 096 097 @Inject 098 TrainingClassLogic trainingClassLogic; 099 100 @Inject 101 UnitOfMeasureTypeLogic unitOfMeasureTypeLogic; 102 103 104 /** Creates a new instance of CreateTrainingClassCommand */ 105 public CreateTrainingClassCommand() { 106 super(COMMAND_SECURITY_DEFINITION, FORM_FIELD_DEFINITIONS, false); 107 } 108 109 @Override 110 protected BaseResult execute() { 111 var result = TrainingResultFactory.getCreateTrainingClassResult(); 112 TrainingClass trainingClass = null; 113 var overview = form.getOverview(); 114 var overviewMimeType = mimeTypeLogic.checkMimeType(this, form.getOverviewMimeTypeName(), overview, MimeTypeUsageTypes.TEXT.name(), 115 ExecutionErrors.MissingRequiredOverviewMimeTypeName.name(), ExecutionErrors.MissingRequiredOverview.name(), 116 ExecutionErrors.UnknownOverviewMimeTypeName.name(), ExecutionErrors.UnknownOverviewMimeTypeUsage.name()); 117 118 if(!hasExecutionErrors()) { 119 var introduction = form.getIntroduction(); 120 var introductionMimeType = mimeTypeLogic.checkMimeType(this, form.getIntroductionMimeTypeName(), introduction, MimeTypeUsageTypes.TEXT.name(), 121 ExecutionErrors.MissingRequiredIntroductionMimeTypeName.name(), ExecutionErrors.MissingRequiredIntroduction.name(), 122 ExecutionErrors.UnknownIntroductionMimeTypeName.name(), ExecutionErrors.UnknownIntroductionMimeTypeUsage.name()); 123 124 if(!hasExecutionErrors()) { 125 var estimatedReadingTime = unitOfMeasureTypeLogic.checkUnitOfMeasure(this, UomConstants.UnitOfMeasureKindUseType_TIME, 126 form.getEstimatedReadingTime(), form.getEstimatedReadingTimeUnitOfMeasureTypeName(), 127 null, ExecutionErrors.MissingRequiredEstimatedReadingTime.name(), null, ExecutionErrors.MissingRequiredEstimatedReadingTimeUnitOfMeasureTypeName.name(), 128 null, ExecutionErrors.UnknownEstimatedReadingTimeUnitOfMeasureTypeName.name()); 129 130 if(!hasExecutionErrors()) { 131 var readingTimeAllowed = unitOfMeasureTypeLogic.checkUnitOfMeasure(this, UomConstants.UnitOfMeasureKindUseType_TIME, 132 form.getReadingTimeAllowed(), form.getReadingTimeAllowedUnitOfMeasureTypeName(), 133 null, ExecutionErrors.MissingRequiredReadingTimeAllowed.name(), null, ExecutionErrors.MissingRequiredReadingTimeAllowedUnitOfMeasureTypeName.name(), 134 null, ExecutionErrors.UnknownReadingTimeAllowedUnitOfMeasureTypeName.name()); 135 136 if(!hasExecutionErrors()) { 137 var estimatedTestingTime = unitOfMeasureTypeLogic.checkUnitOfMeasure(this, UomConstants.UnitOfMeasureKindUseType_TIME, 138 form.getEstimatedTestingTime(), form.getEstimatedTestingTimeUnitOfMeasureTypeName(), 139 null, ExecutionErrors.MissingRequiredEstimatedTestingTime.name(), null, ExecutionErrors.MissingRequiredEstimatedTestingTimeUnitOfMeasureTypeName.name(), 140 null, ExecutionErrors.UnknownEstimatedTestingTimeUnitOfMeasureTypeName.name()); 141 142 if(!hasExecutionErrors()) { 143 var testingTimeAllowed = unitOfMeasureTypeLogic.checkUnitOfMeasure(this, UomConstants.UnitOfMeasureKindUseType_TIME, 144 form.getTestingTimeAllowed(), form.getTestingTimeAllowedUnitOfMeasureTypeName(), 145 null, ExecutionErrors.MissingRequiredTestingTimeAllowed.name(), null, ExecutionErrors.MissingRequiredTestingTimeAllowedUnitOfMeasureTypeName.name(), 146 null, ExecutionErrors.UnknownTestingTimeAllowedUnitOfMeasureTypeName.name()); 147 148 if(!hasExecutionErrors()) { 149 var requiredCompletionTime = unitOfMeasureTypeLogic.checkUnitOfMeasure(this, UomConstants.UnitOfMeasureKindUseType_TIME, 150 form.getRequiredCompletionTime(), form.getRequiredCompletionTimeUnitOfMeasureTypeName(), 151 null, ExecutionErrors.MissingRequiredRequiredCompletionTime.name(), null, ExecutionErrors.MissingRequiredRequiredCompletionTimeUnitOfMeasureTypeName.name(), 152 null, ExecutionErrors.UnknownRequiredCompletionTimeUnitOfMeasureTypeName.name()); 153 154 if(!hasExecutionErrors()) { 155 var workEffortScopeName = form.getWorkEffortScopeName(); 156 WorkEffortScope workEffortScope = null; 157 158 if(workEffortScopeName != null) { 159 var workEffortType = workEffortControl.getWorkEffortTypeByName(TrainingConstants.WorkEffortType_TRAINING); 160 161 if(workEffortType != null) { 162 workEffortScope = workEffortControl.getWorkEffortScopeByName(workEffortType, workEffortScopeName); 163 164 if(workEffortScope == null) { 165 addExecutionError(ExecutionErrors.UnknownWorkEffortScopeName.name(), TrainingConstants.WorkEffortType_TRAINING, 166 workEffortScopeName); 167 } 168 } else { 169 addExecutionError(ExecutionErrors.UnknownWorkEffortTypeName.name(), TrainingConstants.WorkEffortType_TRAINING); 170 } 171 } 172 173 if(!hasExecutionErrors()) { 174 var testingValidityTime = unitOfMeasureTypeLogic.checkUnitOfMeasure(this, UomConstants.UnitOfMeasureKindUseType_TIME, 175 form.getTestingValidityTime(), form.getTestingValidityTimeUnitOfMeasureTypeName(), 176 null, ExecutionErrors.MissingRequiredTestingValidityTime.name(), null, ExecutionErrors.MissingRequiredTestingValidityTimeUnitOfMeasureTypeName.name(), 177 null, ExecutionErrors.UnknownTestingValidityTimeUnitOfMeasureTypeName.name()); 178 179 if(!hasExecutionErrors()) { 180 var expiredRetentionTime = unitOfMeasureTypeLogic.checkUnitOfMeasure(this, UomConstants.UnitOfMeasureKindUseType_TIME, 181 form.getExpiredRetentionTime(), form.getExpiredRetentionTimeUnitOfMeasureTypeName(), 182 null, ExecutionErrors.MissingRequiredExpiredRetentionTime.name(), null, ExecutionErrors.MissingRequiredExpiredRetentionTimeUnitOfMeasureTypeName.name(), 183 null, ExecutionErrors.UnknownExpiredRetentionTimeUnitOfMeasureTypeName.name()); 184 185 if(!hasExecutionErrors()) { 186 var trainingClassName = form.getTrainingClassName(); 187 var strDefaultPercentageToPass = form.getDefaultPercentageToPass(); 188 var defaultPercentageToPass = strDefaultPercentageToPass == null ? null : Integer.valueOf(strDefaultPercentageToPass); 189 var strOverallQuestionCount = form.getOverallQuestionCount(); 190 var overallQuestionCount = strOverallQuestionCount == null ? null : Integer.valueOf(strOverallQuestionCount); 191 var alwaysReassignOnExpiration = Boolean.valueOf(form.getAlwaysReassignOnExpiration()); 192 var isDefault = Boolean.valueOf(form.getIsDefault()); 193 var sortOrder = Integer.valueOf(form.getSortOrder()); 194 var description = form.getDescription(); 195 var createdBy = getPartyPK(); 196 197 trainingClass = trainingClassLogic.createTrainingClass(this, trainingClassName, estimatedReadingTime, 198 readingTimeAllowed, estimatedTestingTime, testingTimeAllowed, requiredCompletionTime, 199 workEffortScope, defaultPercentageToPass, overallQuestionCount, testingValidityTime, 200 expiredRetentionTime, alwaysReassignOnExpiration, isDefault, sortOrder, 201 getPreferredLanguage(), description, overviewMimeType, overview, 202 introductionMimeType, introduction, createdBy); 203 } 204 } 205 } 206 } 207 } 208 } 209 } 210 } 211 } 212 } 213 214 if(trainingClass != null) { 215 result.setTrainingClassName(trainingClass.getLastDetail().getTrainingClassName()); 216 result.setEntityRef(trainingClass.getPrimaryKey().getEntityRef()); 217 } 218 219 return result; 220 } 221 222}