001// -------------------------------------------------------------------------------- 002// Copyright 2002-2025 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.model.control.core.common.MimeTypeUsageTypes; 021import com.echothree.model.control.core.server.logic.MimeTypeLogic; 022import com.echothree.model.control.party.common.PartyTypes; 023import com.echothree.model.control.security.common.SecurityRoleGroups; 024import com.echothree.model.control.security.common.SecurityRoles; 025import com.echothree.model.control.training.server.control.TrainingControl; 026import com.echothree.model.control.uom.common.UomConstants; 027import com.echothree.model.control.uom.server.logic.UnitOfMeasureTypeLogic; 028import com.echothree.model.control.workeffort.common.workeffort.TrainingConstants; 029import com.echothree.model.control.workeffort.server.control.WorkEffortControl; 030import com.echothree.model.data.user.common.pk.UserVisitPK; 031import com.echothree.model.data.workeffort.server.entity.WorkEffortScope; 032import com.echothree.util.common.message.ExecutionErrors; 033import com.echothree.util.common.validation.FieldDefinition; 034import com.echothree.util.common.validation.FieldType; 035import com.echothree.util.common.command.BaseResult; 036import com.echothree.util.server.control.BaseSimpleCommand; 037import com.echothree.util.server.control.CommandSecurityDefinition; 038import com.echothree.util.server.control.PartyTypeDefinition; 039import com.echothree.util.server.control.SecurityRoleDefinition; 040import com.echothree.util.server.persistence.Session; 041import java.util.Arrays; 042import java.util.Collections; 043import java.util.List; 044import javax.enterprise.context.RequestScoped; 045 046@RequestScoped 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(Collections.unmodifiableList(Arrays.asList( 055 new PartyTypeDefinition(PartyTypes.UTILITY.name(), null), 056 new PartyTypeDefinition(PartyTypes.EMPLOYEE.name(), Collections.unmodifiableList(Arrays.asList( 057 new SecurityRoleDefinition(SecurityRoleGroups.TrainingClass.name(), SecurityRoles.Create.name()) 058 ))) 059 ))); 060 061 FORM_FIELD_DEFINITIONS = Collections.unmodifiableList(Arrays.asList( 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 /** Creates a new instance of CreateTrainingClassCommand */ 092 public CreateTrainingClassCommand() { 093 super(COMMAND_SECURITY_DEFINITION, FORM_FIELD_DEFINITIONS, false); 094 } 095 096 @Override 097 protected BaseResult execute() { 098 var trainingControl = Session.getModelController(TrainingControl.class); 099 var trainingClassName = form.getTrainingClassName(); 100 var trainingClass = trainingControl.getTrainingClassByName(trainingClassName); 101 102 if(trainingClass == null) { 103 var mimeTypeLogic = MimeTypeLogic.getInstance(); 104 var overview = form.getOverview(); 105 var overviewMimeType = mimeTypeLogic.checkMimeType(this, form.getOverviewMimeTypeName(), overview, MimeTypeUsageTypes.TEXT.name(), 106 ExecutionErrors.MissingRequiredOverviewMimeTypeName.name(), ExecutionErrors.MissingRequiredOverview.name(), 107 ExecutionErrors.UnknownOverviewMimeTypeName.name(), ExecutionErrors.UnknownOverviewMimeTypeUsage.name()); 108 109 if(!hasExecutionErrors()) { 110 var introduction = form.getIntroduction(); 111 var introductionMimeType = mimeTypeLogic.checkMimeType(this, form.getIntroductionMimeTypeName(), introduction, MimeTypeUsageTypes.TEXT.name(), 112 ExecutionErrors.MissingRequiredIntroductionMimeTypeName.name(), ExecutionErrors.MissingRequiredIntroduction.name(), 113 ExecutionErrors.UnknownIntroductionMimeTypeName.name(), ExecutionErrors.UnknownIntroductionMimeTypeUsage.name()); 114 115 if(!hasExecutionErrors()) { 116 var unitOfMeasureTypeLogic = UnitOfMeasureTypeLogic.getInstance(); 117 var estimatedReadingTime = unitOfMeasureTypeLogic.checkUnitOfMeasure(this, UomConstants.UnitOfMeasureKindUseType_TIME, 118 form.getEstimatedReadingTime(), form.getEstimatedReadingTimeUnitOfMeasureTypeName(), 119 null, ExecutionErrors.MissingRequiredEstimatedReadingTime.name(), null, ExecutionErrors.MissingRequiredEstimatedReadingTimeUnitOfMeasureTypeName.name(), 120 null, ExecutionErrors.UnknownEstimatedReadingTimeUnitOfMeasureTypeName.name()); 121 122 if(!hasExecutionErrors()) { 123 var readingTimeAllowed = unitOfMeasureTypeLogic.checkUnitOfMeasure(this, UomConstants.UnitOfMeasureKindUseType_TIME, 124 form.getReadingTimeAllowed(), form.getReadingTimeAllowedUnitOfMeasureTypeName(), 125 null, ExecutionErrors.MissingRequiredReadingTimeAllowed.name(), null, ExecutionErrors.MissingRequiredReadingTimeAllowedUnitOfMeasureTypeName.name(), 126 null, ExecutionErrors.UnknownReadingTimeAllowedUnitOfMeasureTypeName.name()); 127 128 if(!hasExecutionErrors()) { 129 var estimatedTestingTime = unitOfMeasureTypeLogic.checkUnitOfMeasure(this, UomConstants.UnitOfMeasureKindUseType_TIME, 130 form.getEstimatedTestingTime(), form.getEstimatedTestingTimeUnitOfMeasureTypeName(), 131 null, ExecutionErrors.MissingRequiredEstimatedTestingTime.name(), null, ExecutionErrors.MissingRequiredEstimatedTestingTimeUnitOfMeasureTypeName.name(), 132 null, ExecutionErrors.UnknownEstimatedTestingTimeUnitOfMeasureTypeName.name()); 133 134 if(!hasExecutionErrors()) { 135 var testingTimeAllowed = unitOfMeasureTypeLogic.checkUnitOfMeasure(this, UomConstants.UnitOfMeasureKindUseType_TIME, 136 form.getTestingTimeAllowed(), form.getTestingTimeAllowedUnitOfMeasureTypeName(), 137 null, ExecutionErrors.MissingRequiredTestingTimeAllowed.name(), null, ExecutionErrors.MissingRequiredTestingTimeAllowedUnitOfMeasureTypeName.name(), 138 null, ExecutionErrors.UnknownTestingTimeAllowedUnitOfMeasureTypeName.name()); 139 140 if(!hasExecutionErrors()) { 141 var requiredCompletionTime = unitOfMeasureTypeLogic.checkUnitOfMeasure(this, UomConstants.UnitOfMeasureKindUseType_TIME, 142 form.getRequiredCompletionTime(), form.getRequiredCompletionTimeUnitOfMeasureTypeName(), 143 null, ExecutionErrors.MissingRequiredRequiredCompletionTime.name(), null, ExecutionErrors.MissingRequiredRequiredCompletionTimeUnitOfMeasureTypeName.name(), 144 null, ExecutionErrors.UnknownRequiredCompletionTimeUnitOfMeasureTypeName.name()); 145 146 if(!hasExecutionErrors()) { 147 var workEffortScopeName = form.getWorkEffortScopeName(); 148 WorkEffortScope workEffortScope = null; 149 150 if(workEffortScopeName != null) { 151 var workEffortControl = Session.getModelController(WorkEffortControl.class); 152 var workEffortType = workEffortControl.getWorkEffortTypeByName(TrainingConstants.WorkEffortType_TRAINING); 153 154 if(workEffortType != null) { 155 workEffortScope = workEffortControl.getWorkEffortScopeByName(workEffortType, workEffortScopeName); 156 157 if(workEffortScope == null) { 158 addExecutionError(ExecutionErrors.UnknownWorkEffortScopeName.name(), TrainingConstants.WorkEffortType_TRAINING, 159 workEffortScopeName); 160 } 161 } else { 162 addExecutionError(ExecutionErrors.UnknownWorkEffortTypeName.name(), TrainingConstants.WorkEffortType_TRAINING); 163 } 164 } 165 166 if(!hasExecutionErrors()) { 167 var testingValidityTime = unitOfMeasureTypeLogic.checkUnitOfMeasure(this, UomConstants.UnitOfMeasureKindUseType_TIME, 168 form.getTestingValidityTime(), form.getTestingValidityTimeUnitOfMeasureTypeName(), 169 null, ExecutionErrors.MissingRequiredTestingValidityTime.name(), null, ExecutionErrors.MissingRequiredTestingValidityTimeUnitOfMeasureTypeName.name(), 170 null, ExecutionErrors.UnknownTestingValidityTimeUnitOfMeasureTypeName.name()); 171 172 if(!hasExecutionErrors()) { 173 var expiredRetentionTime = unitOfMeasureTypeLogic.checkUnitOfMeasure(this, UomConstants.UnitOfMeasureKindUseType_TIME, 174 form.getExpiredRetentionTime(), form.getExpiredRetentionTimeUnitOfMeasureTypeName(), 175 null, ExecutionErrors.MissingRequiredExpiredRetentionTime.name(), null, ExecutionErrors.MissingRequiredExpiredRetentionTimeUnitOfMeasureTypeName.name(), 176 null, ExecutionErrors.UnknownExpiredRetentionTimeUnitOfMeasureTypeName.name()); 177 178 if(!hasExecutionErrors()) { 179 var createdBy = getPartyPK(); 180 var strDefaultPercentageToPass = form.getDefaultPercentageToPass(); 181 var defaultPercentageToPass = strDefaultPercentageToPass == null ? null : Integer.valueOf(strDefaultPercentageToPass); 182 var strOverallQuestionCount = form.getOverallQuestionCount(); 183 var overallQuestionCount = strOverallQuestionCount == null ? null : Integer.valueOf(strOverallQuestionCount); 184 var alwaysReassignOnExpiration = Boolean.valueOf(form.getAlwaysReassignOnExpiration()); 185 var isDefault = Boolean.valueOf(form.getIsDefault()); 186 var sortOrder = Integer.valueOf(form.getSortOrder()); 187 var description = form.getDescription(); 188 189 trainingClass = trainingControl.createTrainingClass(trainingClassName, estimatedReadingTime, 190 readingTimeAllowed, estimatedTestingTime, testingTimeAllowed, requiredCompletionTime, 191 workEffortScope, defaultPercentageToPass, overallQuestionCount, testingValidityTime, 192 expiredRetentionTime, alwaysReassignOnExpiration, isDefault, sortOrder, createdBy); 193 194 if(description != null || overview != null || introduction != null) { 195 trainingControl.createTrainingClassTranslation(trainingClass, getPreferredLanguage(), description, 196 overviewMimeType, overview, introductionMimeType, introduction, createdBy); 197 } 198 } 199 } 200 } 201 } 202 } 203 } 204 } 205 } 206 } 207 } 208 } else { 209 addExecutionError(ExecutionErrors.DuplicateTrainingClassName.name(), trainingClassName); 210 } 211 212 return null; 213 } 214 215}