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 /** Creates a new instance of CreateTrainingClassCommand */ 104 public CreateTrainingClassCommand() { 105 super(COMMAND_SECURITY_DEFINITION, FORM_FIELD_DEFINITIONS, false); 106 } 107 108 @Override 109 protected BaseResult execute() { 110 var result = TrainingResultFactory.getCreateTrainingClassResult(); 111 TrainingClass trainingClass = null; 112 var overview = form.getOverview(); 113 var overviewMimeType = mimeTypeLogic.checkMimeType(this, form.getOverviewMimeTypeName(), overview, MimeTypeUsageTypes.TEXT.name(), 114 ExecutionErrors.MissingRequiredOverviewMimeTypeName.name(), ExecutionErrors.MissingRequiredOverview.name(), 115 ExecutionErrors.UnknownOverviewMimeTypeName.name(), ExecutionErrors.UnknownOverviewMimeTypeUsage.name()); 116 117 if(!hasExecutionErrors()) { 118 var introduction = form.getIntroduction(); 119 var introductionMimeType = mimeTypeLogic.checkMimeType(this, form.getIntroductionMimeTypeName(), introduction, MimeTypeUsageTypes.TEXT.name(), 120 ExecutionErrors.MissingRequiredIntroductionMimeTypeName.name(), ExecutionErrors.MissingRequiredIntroduction.name(), 121 ExecutionErrors.UnknownIntroductionMimeTypeName.name(), ExecutionErrors.UnknownIntroductionMimeTypeUsage.name()); 122 123 if(!hasExecutionErrors()) { 124 var estimatedReadingTime = unitOfMeasureTypeLogic.checkUnitOfMeasure(this, UomConstants.UnitOfMeasureKindUseType_TIME, 125 form.getEstimatedReadingTime(), form.getEstimatedReadingTimeUnitOfMeasureTypeName(), 126 null, ExecutionErrors.MissingRequiredEstimatedReadingTime.name(), null, ExecutionErrors.MissingRequiredEstimatedReadingTimeUnitOfMeasureTypeName.name(), 127 null, ExecutionErrors.UnknownEstimatedReadingTimeUnitOfMeasureTypeName.name()); 128 129 if(!hasExecutionErrors()) { 130 var readingTimeAllowed = unitOfMeasureTypeLogic.checkUnitOfMeasure(this, UomConstants.UnitOfMeasureKindUseType_TIME, 131 form.getReadingTimeAllowed(), form.getReadingTimeAllowedUnitOfMeasureTypeName(), 132 null, ExecutionErrors.MissingRequiredReadingTimeAllowed.name(), null, ExecutionErrors.MissingRequiredReadingTimeAllowedUnitOfMeasureTypeName.name(), 133 null, ExecutionErrors.UnknownReadingTimeAllowedUnitOfMeasureTypeName.name()); 134 135 if(!hasExecutionErrors()) { 136 var estimatedTestingTime = unitOfMeasureTypeLogic.checkUnitOfMeasure(this, UomConstants.UnitOfMeasureKindUseType_TIME, 137 form.getEstimatedTestingTime(), form.getEstimatedTestingTimeUnitOfMeasureTypeName(), 138 null, ExecutionErrors.MissingRequiredEstimatedTestingTime.name(), null, ExecutionErrors.MissingRequiredEstimatedTestingTimeUnitOfMeasureTypeName.name(), 139 null, ExecutionErrors.UnknownEstimatedTestingTimeUnitOfMeasureTypeName.name()); 140 141 if(!hasExecutionErrors()) { 142 var testingTimeAllowed = unitOfMeasureTypeLogic.checkUnitOfMeasure(this, UomConstants.UnitOfMeasureKindUseType_TIME, 143 form.getTestingTimeAllowed(), form.getTestingTimeAllowedUnitOfMeasureTypeName(), 144 null, ExecutionErrors.MissingRequiredTestingTimeAllowed.name(), null, ExecutionErrors.MissingRequiredTestingTimeAllowedUnitOfMeasureTypeName.name(), 145 null, ExecutionErrors.UnknownTestingTimeAllowedUnitOfMeasureTypeName.name()); 146 147 if(!hasExecutionErrors()) { 148 var requiredCompletionTime = unitOfMeasureTypeLogic.checkUnitOfMeasure(this, UomConstants.UnitOfMeasureKindUseType_TIME, 149 form.getRequiredCompletionTime(), form.getRequiredCompletionTimeUnitOfMeasureTypeName(), 150 null, ExecutionErrors.MissingRequiredRequiredCompletionTime.name(), null, ExecutionErrors.MissingRequiredRequiredCompletionTimeUnitOfMeasureTypeName.name(), 151 null, ExecutionErrors.UnknownRequiredCompletionTimeUnitOfMeasureTypeName.name()); 152 153 if(!hasExecutionErrors()) { 154 var workEffortScopeName = form.getWorkEffortScopeName(); 155 WorkEffortScope workEffortScope = null; 156 157 if(workEffortScopeName != null) { 158 var workEffortType = workEffortControl.getWorkEffortTypeByName(TrainingConstants.WorkEffortType_TRAINING); 159 160 if(workEffortType != null) { 161 workEffortScope = workEffortControl.getWorkEffortScopeByName(workEffortType, workEffortScopeName); 162 163 if(workEffortScope == null) { 164 addExecutionError(ExecutionErrors.UnknownWorkEffortScopeName.name(), TrainingConstants.WorkEffortType_TRAINING, 165 workEffortScopeName); 166 } 167 } else { 168 addExecutionError(ExecutionErrors.UnknownWorkEffortTypeName.name(), TrainingConstants.WorkEffortType_TRAINING); 169 } 170 } 171 172 if(!hasExecutionErrors()) { 173 var testingValidityTime = unitOfMeasureTypeLogic.checkUnitOfMeasure(this, UomConstants.UnitOfMeasureKindUseType_TIME, 174 form.getTestingValidityTime(), form.getTestingValidityTimeUnitOfMeasureTypeName(), 175 null, ExecutionErrors.MissingRequiredTestingValidityTime.name(), null, ExecutionErrors.MissingRequiredTestingValidityTimeUnitOfMeasureTypeName.name(), 176 null, ExecutionErrors.UnknownTestingValidityTimeUnitOfMeasureTypeName.name()); 177 178 if(!hasExecutionErrors()) { 179 var expiredRetentionTime = unitOfMeasureTypeLogic.checkUnitOfMeasure(this, UomConstants.UnitOfMeasureKindUseType_TIME, 180 form.getExpiredRetentionTime(), form.getExpiredRetentionTimeUnitOfMeasureTypeName(), 181 null, ExecutionErrors.MissingRequiredExpiredRetentionTime.name(), null, ExecutionErrors.MissingRequiredExpiredRetentionTimeUnitOfMeasureTypeName.name(), 182 null, ExecutionErrors.UnknownExpiredRetentionTimeUnitOfMeasureTypeName.name()); 183 184 if(!hasExecutionErrors()) { 185 var trainingClassName = form.getTrainingClassName(); 186 var strDefaultPercentageToPass = form.getDefaultPercentageToPass(); 187 var defaultPercentageToPass = strDefaultPercentageToPass == null ? null : Integer.valueOf(strDefaultPercentageToPass); 188 var strOverallQuestionCount = form.getOverallQuestionCount(); 189 var overallQuestionCount = strOverallQuestionCount == null ? null : Integer.valueOf(strOverallQuestionCount); 190 var alwaysReassignOnExpiration = Boolean.valueOf(form.getAlwaysReassignOnExpiration()); 191 var isDefault = Boolean.valueOf(form.getIsDefault()); 192 var sortOrder = Integer.valueOf(form.getSortOrder()); 193 var description = form.getDescription(); 194 var createdBy = getPartyPK(); 195 196 trainingClass = trainingClassLogic.createTrainingClass(this, trainingClassName, estimatedReadingTime, 197 readingTimeAllowed, estimatedTestingTime, testingTimeAllowed, requiredCompletionTime, 198 workEffortScope, defaultPercentageToPass, overallQuestionCount, testingValidityTime, 199 expiredRetentionTime, alwaysReassignOnExpiration, isDefault, sortOrder, 200 getPreferredLanguage(), description, overviewMimeType, overview, 201 introductionMimeType, introduction, createdBy); 202 } 203 } 204 } 205 } 206 } 207 } 208 } 209 } 210 } 211 } 212 213 if(trainingClass != null) { 214 result.setTrainingClassName(trainingClass.getLastDetail().getTrainingClassName()); 215 result.setEntityRef(trainingClass.getPrimaryKey().getEntityRef()); 216 } 217 218 return result; 219 } 220 221}