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