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.edit.TrainingClassEdit;
020import com.echothree.control.user.training.common.edit.TrainingEditFactory;
021import com.echothree.control.user.training.common.form.EditTrainingClassForm;
022import com.echothree.control.user.training.common.result.EditTrainingClassResult;
023import com.echothree.control.user.training.common.result.TrainingResultFactory;
024import com.echothree.control.user.training.common.spec.TrainingClassSpec;
025import com.echothree.model.control.core.common.MimeTypeUsageTypes;
026import com.echothree.model.control.core.server.logic.MimeTypeLogic;
027import com.echothree.model.control.party.common.PartyTypes;
028import com.echothree.model.control.security.common.SecurityRoleGroups;
029import com.echothree.model.control.security.common.SecurityRoles;
030import com.echothree.model.control.training.server.control.TrainingControl;
031import com.echothree.model.control.uom.common.UomConstants;
032import com.echothree.model.control.uom.server.logic.UnitOfMeasureTypeLogic;
033import com.echothree.model.control.workeffort.common.workeffort.TrainingConstants;
034import com.echothree.model.control.workeffort.server.control.WorkEffortControl;
035import com.echothree.model.data.core.server.entity.MimeType;
036import com.echothree.model.data.training.server.entity.TrainingClass;
037import com.echothree.model.data.training.server.entity.TrainingClassDetail;
038import com.echothree.model.data.training.server.entity.TrainingClassTranslation;
039import com.echothree.model.data.training.server.value.TrainingClassDetailValue;
040import com.echothree.model.data.training.server.value.TrainingClassTranslationValue;
041import com.echothree.model.data.user.common.pk.UserVisitPK;
042import com.echothree.model.data.workeffort.server.entity.WorkEffortScope;
043import com.echothree.model.data.workeffort.server.entity.WorkEffortType;
044import com.echothree.util.common.message.ExecutionErrors;
045import com.echothree.util.common.validation.FieldDefinition;
046import com.echothree.util.common.validation.FieldType;
047import com.echothree.util.common.command.EditMode;
048import com.echothree.util.server.control.BaseAbstractEditCommand;
049import com.echothree.util.server.control.CommandSecurityDefinition;
050import com.echothree.util.server.control.PartyTypeDefinition;
051import com.echothree.util.server.control.SecurityRoleDefinition;
052import com.echothree.util.server.persistence.Session;
053import com.echothree.util.server.string.PercentUtils;
054import java.util.Arrays;
055import java.util.Collections;
056import java.util.List;
057
058public class EditTrainingClassCommand
059        extends BaseAbstractEditCommand<TrainingClassSpec, TrainingClassEdit, EditTrainingClassResult, TrainingClass, TrainingClass> {
060    
061    private final static CommandSecurityDefinition COMMAND_SECURITY_DEFINITION;
062    private final static List<FieldDefinition> SPEC_FIELD_DEFINITIONS;
063    private final static List<FieldDefinition> EDIT_FIELD_DEFINITIONS;
064    
065    static {
066        COMMAND_SECURITY_DEFINITION = new CommandSecurityDefinition(Collections.unmodifiableList(Arrays.asList(
067                new PartyTypeDefinition(PartyTypes.UTILITY.name(), null),
068                new PartyTypeDefinition(PartyTypes.EMPLOYEE.name(), Collections.unmodifiableList(Arrays.asList(
069                        new SecurityRoleDefinition(SecurityRoleGroups.TrainingClass.name(), SecurityRoles.Edit.name())
070                        )))
071                )));
072
073        SPEC_FIELD_DEFINITIONS = Collections.unmodifiableList(Arrays.asList(
074                new FieldDefinition("TrainingClassName", FieldType.ENTITY_NAME, true, null, null)
075                ));
076
077        EDIT_FIELD_DEFINITIONS = Collections.unmodifiableList(Arrays.asList(
078                new FieldDefinition("TrainingClassName", FieldType.ENTITY_NAME, true, null, null),
079                new FieldDefinition("EstimatedReadingTime", FieldType.UNSIGNED_LONG, false, null, null),
080                new FieldDefinition("EstimatedReadingTimeUnitOfMeasureTypeName", FieldType.ENTITY_NAME, false, null, null),
081                new FieldDefinition("ReadingTimeAllowed", FieldType.UNSIGNED_LONG, false, null, null),
082                new FieldDefinition("ReadingTimeAllowedUnitOfMeasureTypeName", FieldType.ENTITY_NAME, false, null, null),
083                new FieldDefinition("EstimatedTestingTime", FieldType.UNSIGNED_LONG, false, null, null),
084                new FieldDefinition("EstimatedTestingTimeUnitOfMeasureTypeName", FieldType.ENTITY_NAME, false, null, null),
085                new FieldDefinition("TestingTimeAllowed", FieldType.UNSIGNED_LONG, false, null, null),
086                new FieldDefinition("TestingTimeAllowedUnitOfMeasureTypeName", FieldType.ENTITY_NAME, false, null, null),
087                new FieldDefinition("RequiredCompletionTime", FieldType.UNSIGNED_LONG, false, null, null),
088                new FieldDefinition("RequiredCompletionTimeUnitOfMeasureTypeName", FieldType.ENTITY_NAME, false, null, null),
089                new FieldDefinition("WorkEffortScopeName", FieldType.ENTITY_NAME, false, null, null),
090                new FieldDefinition("DefaultPercentageToPass", FieldType.FRACTIONAL_PERCENT, false, null, null),
091                new FieldDefinition("OverallQuestionCount", FieldType.UNSIGNED_INTEGER, false, null, null),
092                new FieldDefinition("TestingValidityTime", FieldType.UNSIGNED_LONG, false, null, null),
093                new FieldDefinition("TestingValidityTimeUnitOfMeasureTypeName", FieldType.ENTITY_NAME, false, null, null),
094                new FieldDefinition("ExpiredRetentionTime", FieldType.UNSIGNED_LONG, false, null, null),
095                new FieldDefinition("ExpiredRetentionTimeUnitOfMeasureTypeName", FieldType.ENTITY_NAME, false, null, null),
096                new FieldDefinition("AlwaysReassignOnExpiration", FieldType.BOOLEAN, true, null, null),
097                new FieldDefinition("IsDefault", FieldType.BOOLEAN, true, null, null),
098                new FieldDefinition("SortOrder", FieldType.SIGNED_INTEGER, true, null, null),
099                new FieldDefinition("Description", FieldType.STRING, false, 1L, 132L),
100                new FieldDefinition("OverviewMimeTypeName", FieldType.MIME_TYPE, false, null, null),
101                new FieldDefinition("Overview", FieldType.STRING, false, null, null),
102                new FieldDefinition("IntroductionMimeTypeName", FieldType.MIME_TYPE, false, null, null),
103                new FieldDefinition("Introduction", FieldType.STRING, false, null, null)
104                ));
105    }
106    
107    /** Creates a new instance of EditTrainingClassCommand */
108    public EditTrainingClassCommand(UserVisitPK userVisitPK, EditTrainingClassForm form) {
109        super(userVisitPK, form, COMMAND_SECURITY_DEFINITION, SPEC_FIELD_DEFINITIONS, EDIT_FIELD_DEFINITIONS);
110    }
111    
112    @Override
113    public EditTrainingClassResult getResult() {
114        return TrainingResultFactory.getEditTrainingClassResult();
115    }
116
117    @Override
118    public TrainingClassEdit getEdit() {
119        return TrainingEditFactory.getTrainingClassEdit();
120    }
121
122    @Override
123    public TrainingClass getEntity(EditTrainingClassResult result) {
124        var trainingControl = Session.getModelController(TrainingControl.class);
125        TrainingClass trainingClass = null;
126        String trainingClassName = spec.getTrainingClassName();
127
128        if(editMode.equals(EditMode.LOCK) || editMode.equals(EditMode.ABANDON)) {
129            trainingClass = trainingControl.getTrainingClassByName(trainingClassName);
130        } else { // EditMode.UPDATE
131            trainingClass = trainingControl.getTrainingClassByNameForUpdate(trainingClassName);
132        }
133
134        if(trainingClass != null) {
135            result.setTrainingClass(trainingControl.getTrainingClassTransfer(getUserVisit(), trainingClass));
136        } else {
137            addExecutionError(ExecutionErrors.UnknownTrainingClassName.name(), trainingClassName);
138        }
139
140        return trainingClass;
141    }
142
143    @Override
144    public TrainingClass getLockEntity(TrainingClass trainingClass) {
145        return trainingClass;
146    }
147
148    @Override
149    public void fillInResult(EditTrainingClassResult result, TrainingClass trainingClass) {
150        var trainingControl = Session.getModelController(TrainingControl.class);
151
152        result.setTrainingClass(trainingControl.getTrainingClassTransfer(getUserVisit(), trainingClass));
153    }
154
155    MimeType overviewMimeType;
156    MimeType introductionMimeType;
157    
158    @Override
159    public void doLock(TrainingClassEdit edit, TrainingClass trainingClass) {
160        var trainingControl = Session.getModelController(TrainingControl.class);
161        UnitOfMeasureTypeLogic unitOfMeasureTypeLogic = UnitOfMeasureTypeLogic.getInstance();
162        TrainingClassTranslation trainingClassTranslation = trainingControl.getTrainingClassTranslation(trainingClass, getPreferredLanguage());
163        TrainingClassDetail trainingClassDetail = trainingClass.getLastDetail();
164        WorkEffortScope workEffortScope = trainingClassDetail.getWorkEffortScope();
165        Integer overallQuestionCount = trainingClassDetail.getOverallQuestionCount();
166        UnitOfMeasureTypeLogic.StringUnitOfMeasure stringUnitOfMeasure;
167
168        edit.setTrainingClassName(trainingClassDetail.getTrainingClassName());
169        stringUnitOfMeasure = unitOfMeasureTypeLogic.unitOfMeasureToString(this, UomConstants.UnitOfMeasureKindUseType_TIME, trainingClassDetail.getEstimatedReadingTime());
170        edit.setEstimatedReadingTimeUnitOfMeasureTypeName(stringUnitOfMeasure.getUnitOfMeasureTypeName());
171        edit.setEstimatedReadingTime(stringUnitOfMeasure.getValue());
172        stringUnitOfMeasure = unitOfMeasureTypeLogic.unitOfMeasureToString(this, UomConstants.UnitOfMeasureKindUseType_TIME, trainingClassDetail.getReadingTimeAllowed());
173        edit.setReadingTimeAllowedUnitOfMeasureTypeName(stringUnitOfMeasure.getUnitOfMeasureTypeName());
174        edit.setReadingTimeAllowed(stringUnitOfMeasure.getValue());
175        stringUnitOfMeasure = unitOfMeasureTypeLogic.unitOfMeasureToString(this, UomConstants.UnitOfMeasureKindUseType_TIME, trainingClassDetail.getEstimatedTestingTime());
176        edit.setEstimatedTestingTimeUnitOfMeasureTypeName(stringUnitOfMeasure.getUnitOfMeasureTypeName());
177        edit.setEstimatedTestingTime(stringUnitOfMeasure.getValue());
178        stringUnitOfMeasure = unitOfMeasureTypeLogic.unitOfMeasureToString(this, UomConstants.UnitOfMeasureKindUseType_TIME, trainingClassDetail.getTestingTimeAllowed());
179        edit.setTestingTimeAllowedUnitOfMeasureTypeName(stringUnitOfMeasure.getUnitOfMeasureTypeName());
180        edit.setTestingTimeAllowed(stringUnitOfMeasure.getValue());
181        stringUnitOfMeasure = unitOfMeasureTypeLogic.unitOfMeasureToString(this, UomConstants.UnitOfMeasureKindUseType_TIME, trainingClassDetail.getRequiredCompletionTime());
182        edit.setRequiredCompletionTimeUnitOfMeasureTypeName(stringUnitOfMeasure.getUnitOfMeasureTypeName());
183        edit.setRequiredCompletionTime(stringUnitOfMeasure.getValue());
184        edit.setWorkEffortScopeName(workEffortScope == null ? null : workEffortScope.getLastDetail().getWorkEffortScopeName());
185        edit.setDefaultPercentageToPass(PercentUtils.getInstance().formatFractionalPercent(trainingClassDetail.getDefaultPercentageToPass()));
186        edit.setOverallQuestionCount(overallQuestionCount == null? null: overallQuestionCount.toString());
187        stringUnitOfMeasure = unitOfMeasureTypeLogic.unitOfMeasureToString(this, UomConstants.UnitOfMeasureKindUseType_TIME, trainingClassDetail.getTestingValidityTime());
188        edit.setTestingValidityTimeUnitOfMeasureTypeName(stringUnitOfMeasure.getUnitOfMeasureTypeName());
189        edit.setTestingValidityTime(stringUnitOfMeasure.getValue());
190        stringUnitOfMeasure = unitOfMeasureTypeLogic.unitOfMeasureToString(this, UomConstants.UnitOfMeasureKindUseType_TIME, trainingClassDetail.getExpiredRetentionTime());
191        edit.setExpiredRetentionTimeUnitOfMeasureTypeName(stringUnitOfMeasure.getUnitOfMeasureTypeName());
192        edit.setExpiredRetentionTime(stringUnitOfMeasure.getValue());
193        edit.setAlwaysReassignOnExpiration(trainingClassDetail.getAlwaysReassignOnExpiration().toString());
194        edit.setIsDefault(trainingClassDetail.getIsDefault().toString());
195        edit.setSortOrder(trainingClassDetail.getSortOrder().toString());
196
197        if(trainingClassTranslation != null) {
198            overviewMimeType = trainingClassTranslation.getOverviewMimeType();
199            introductionMimeType = trainingClassTranslation.getIntroductionMimeType();
200
201            edit.setDescription(trainingClassTranslation.getDescription());
202            edit.setOverviewMimeTypeName(overviewMimeType == null? null: overviewMimeType.getLastDetail().getMimeTypeName());
203            edit.setOverview(trainingClassTranslation.getOverview());
204            edit.setIntroductionMimeTypeName(introductionMimeType == null? null: introductionMimeType.getLastDetail().getMimeTypeName());
205            edit.setIntroduction(trainingClassTranslation.getIntroduction());
206        }
207    }
208
209    Long estimatedReadingTime;
210    Long readingTimeAllowed;
211    Long estimatedTestingTime;
212    Long testingTimeAllowed;
213    Long requiredCompletionTime;
214    WorkEffortScope workEffortScope;
215    Long testingValidityTime;
216    Long expiredRetentionTime;
217    
218    @Override
219    public void canUpdate(TrainingClass trainingClass) {
220        var trainingControl = Session.getModelController(TrainingControl.class);
221        String trainingClassName = edit.getTrainingClassName();
222        TrainingClass duplicateTrainingClass = trainingControl.getTrainingClassByName(trainingClassName);
223
224        if(duplicateTrainingClass != null && !trainingClass.equals(duplicateTrainingClass)) {
225            addExecutionError(ExecutionErrors.DuplicateTrainingClassName.name(), trainingClassName);
226        } else {
227            MimeTypeLogic mimeTypeLogic = MimeTypeLogic.getInstance();
228            String overviewMimeTypeName = edit.getOverviewMimeTypeName();
229            String overview = edit.getOverview();
230
231            overviewMimeType = mimeTypeLogic.checkMimeType(this, overviewMimeTypeName, overview, MimeTypeUsageTypes.TEXT.name(),
232                    ExecutionErrors.MissingRequiredOverviewMimeTypeName.name(), ExecutionErrors.MissingRequiredOverview.name(),
233                    ExecutionErrors.UnknownOverviewMimeTypeName.name(), ExecutionErrors.UnknownOverviewMimeTypeUsage.name());
234
235            if(!hasExecutionErrors()) {
236                String introductionMimeTypeName = edit.getIntroductionMimeTypeName();
237                String introduction = edit.getIntroduction();
238
239                introductionMimeType = mimeTypeLogic.checkMimeType(this, introductionMimeTypeName, introduction, MimeTypeUsageTypes.TEXT.name(),
240                        ExecutionErrors.MissingRequiredIntroductionMimeTypeName.name(), ExecutionErrors.MissingRequiredIntroduction.name(),
241                        ExecutionErrors.UnknownIntroductionMimeTypeName.name(), ExecutionErrors.UnknownIntroductionMimeTypeUsage.name());
242
243                if(!hasExecutionErrors()) {
244                    UnitOfMeasureTypeLogic unitOfMeasureTypeLogic = UnitOfMeasureTypeLogic.getInstance();
245
246                    estimatedReadingTime = unitOfMeasureTypeLogic.checkUnitOfMeasure(this, UomConstants.UnitOfMeasureKindUseType_TIME,
247                            edit.getEstimatedReadingTime(), edit.getEstimatedReadingTimeUnitOfMeasureTypeName(),
248                            null, ExecutionErrors.MissingRequiredEstimatedReadingTime.name(), null, ExecutionErrors.MissingRequiredEstimatedReadingTimeUnitOfMeasureTypeName.name(),
249                            null, ExecutionErrors.UnknownEstimatedReadingTimeUnitOfMeasureTypeName.name());
250
251                    if(!hasExecutionErrors()) {
252                        readingTimeAllowed = unitOfMeasureTypeLogic.checkUnitOfMeasure(this, UomConstants.UnitOfMeasureKindUseType_TIME,
253                                edit.getReadingTimeAllowed(), edit.getReadingTimeAllowedUnitOfMeasureTypeName(),
254                                null, ExecutionErrors.MissingRequiredReadingTimeAllowed.name(), null, ExecutionErrors.MissingRequiredReadingTimeAllowedUnitOfMeasureTypeName.name(),
255                                null, ExecutionErrors.UnknownReadingTimeAllowedUnitOfMeasureTypeName.name());
256
257                        if(!hasExecutionErrors()) {
258                            estimatedTestingTime = unitOfMeasureTypeLogic.checkUnitOfMeasure(this, UomConstants.UnitOfMeasureKindUseType_TIME,
259                                    edit.getEstimatedTestingTime(), edit.getEstimatedTestingTimeUnitOfMeasureTypeName(),
260                                    null, ExecutionErrors.MissingRequiredEstimatedTestingTime.name(), null, ExecutionErrors.MissingRequiredEstimatedTestingTimeUnitOfMeasureTypeName.name(),
261                                    null, ExecutionErrors.UnknownEstimatedTestingTimeUnitOfMeasureTypeName.name());
262
263                            if(!hasExecutionErrors()) {
264                                testingTimeAllowed = unitOfMeasureTypeLogic.checkUnitOfMeasure(this, UomConstants.UnitOfMeasureKindUseType_TIME,
265                                        edit.getTestingTimeAllowed(), edit.getTestingTimeAllowedUnitOfMeasureTypeName(),
266                                        null, ExecutionErrors.MissingRequiredTestingTimeAllowed.name(), null, ExecutionErrors.MissingRequiredTestingTimeAllowedUnitOfMeasureTypeName.name(),
267                                        null, ExecutionErrors.UnknownTestingTimeAllowedUnitOfMeasureTypeName.name());
268
269                                if(!hasExecutionErrors()) {
270                                    requiredCompletionTime = unitOfMeasureTypeLogic.checkUnitOfMeasure(this, UomConstants.UnitOfMeasureKindUseType_TIME,
271                                            edit.getRequiredCompletionTime(), edit.getRequiredCompletionTimeUnitOfMeasureTypeName(),
272                                            null, ExecutionErrors.MissingRequiredRequiredCompletionTime.name(), null, ExecutionErrors.MissingRequiredRequiredCompletionTimeUnitOfMeasureTypeName.name(),
273                                            null, ExecutionErrors.UnknownRequiredCompletionTimeUnitOfMeasureTypeName.name());
274
275                                    if(!hasExecutionErrors()) {
276                                        String workEffortScopeName = edit.getWorkEffortScopeName();
277
278                                        if(workEffortScopeName != null) {
279                                            var workEffortControl = Session.getModelController(WorkEffortControl.class);
280                                            WorkEffortType workEffortType = workEffortControl.getWorkEffortTypeByName(TrainingConstants.WorkEffortType_TRAINING);
281
282                                            if(workEffortType != null) {
283                                                workEffortScope = workEffortControl.getWorkEffortScopeByName(workEffortType, workEffortScopeName);
284
285                                                if(workEffortScope == null) {
286                                                    addExecutionError(ExecutionErrors.UnknownWorkEffortScopeName.name(), TrainingConstants.WorkEffortType_TRAINING,
287                                                            workEffortScopeName);
288                                                }
289                                            } else {
290                                                addExecutionError(ExecutionErrors.UnknownWorkEffortTypeName.name(), TrainingConstants.WorkEffortType_TRAINING);
291                                            }
292                                        }
293
294                                        if(!hasExecutionErrors()) {
295                                            testingValidityTime = unitOfMeasureTypeLogic.checkUnitOfMeasure(this, UomConstants.UnitOfMeasureKindUseType_TIME,
296                                                    edit.getTestingValidityTime(), edit.getTestingValidityTimeUnitOfMeasureTypeName(),
297                                                    null, ExecutionErrors.MissingRequiredTestingValidityTime.name(), null, ExecutionErrors.MissingRequiredTestingValidityTimeUnitOfMeasureTypeName.name(),
298                                                    null, ExecutionErrors.UnknownTestingValidityTimeUnitOfMeasureTypeName.name());
299
300                                            if(!hasExecutionErrors()) {
301                                                expiredRetentionTime = unitOfMeasureTypeLogic.checkUnitOfMeasure(this, UomConstants.UnitOfMeasureKindUseType_TIME,
302                                                        edit.getExpiredRetentionTime(), edit.getExpiredRetentionTimeUnitOfMeasureTypeName(),
303                                                        null, ExecutionErrors.MissingRequiredExpiredRetentionTime.name(), null, ExecutionErrors.MissingRequiredExpiredRetentionTimeUnitOfMeasureTypeName.name(),
304                                                        null, ExecutionErrors.UnknownExpiredRetentionTimeUnitOfMeasureTypeName.name());
305                                            }
306                                        }
307                                    }
308                                }
309                            }
310                        }
311                    }
312                }
313            }
314        }
315    }
316    
317    @Override
318    public void doUpdate(TrainingClass trainingClass) {
319        var trainingControl = Session.getModelController(TrainingControl.class);
320        var partyPK = getPartyPK();
321        TrainingClassDetailValue trainingClassDetailValue = trainingControl.getTrainingClassDetailValueForUpdate(trainingClass);
322        TrainingClassTranslation trainingClassTranslation = trainingControl.getTrainingClassTranslationForUpdate(trainingClass, getPreferredLanguage());
323        String defaultPercentageToPass = edit.getDefaultPercentageToPass();
324        String overallQuestionCount = edit.getOverallQuestionCount();
325        String description = edit.getDescription();
326        String overview = edit.getOverview();
327        String introduction = edit.getIntroduction();
328
329        trainingClassDetailValue.setTrainingClassName(edit.getTrainingClassName());
330        trainingClassDetailValue.setEstimatedReadingTime(estimatedReadingTime);
331        trainingClassDetailValue.setReadingTimeAllowed(readingTimeAllowed);
332        trainingClassDetailValue.setEstimatedTestingTime(estimatedTestingTime);
333        trainingClassDetailValue.setTestingTimeAllowed(testingTimeAllowed);
334        trainingClassDetailValue.setRequiredCompletionTime(requiredCompletionTime);
335        trainingClassDetailValue.setWorkEffortScopePK(workEffortScope == null ? null : workEffortScope.getPrimaryKey());
336        trainingClassDetailValue.setDefaultPercentageToPass(defaultPercentageToPass == null? null: Integer.valueOf(defaultPercentageToPass));
337        trainingClassDetailValue.setOverallQuestionCount(overallQuestionCount == null? null: Integer.valueOf(overallQuestionCount));
338        trainingClassDetailValue.setTestingValidityTime(testingValidityTime);
339        trainingClassDetailValue.setExpiredRetentionTime(expiredRetentionTime);
340        trainingClassDetailValue.setAlwaysReassignOnExpiration(Boolean.valueOf(edit.getAlwaysReassignOnExpiration()));
341        trainingClassDetailValue.setIsDefault(Boolean.valueOf(edit.getIsDefault()));
342        trainingClassDetailValue.setSortOrder(Integer.valueOf(edit.getSortOrder()));
343
344        trainingControl.updateTrainingClassFromValue(trainingClassDetailValue, partyPK);
345
346        if(trainingClassTranslation == null && (description != null || overview != null || introduction != null)) {
347            trainingControl.createTrainingClassTranslation(trainingClass, getPreferredLanguage(), description, overviewMimeType, overview, introductionMimeType,
348                    introduction, partyPK);
349        } else if(trainingClassTranslation != null && (description == null && overview == null && introduction == null)) {
350            trainingControl.deleteTrainingClassTranslation(trainingClassTranslation, partyPK);
351        } else if(trainingClassTranslation != null && (description != null || overview != null || introduction != null)) {
352            TrainingClassTranslationValue trainingClassTranslationValue = trainingControl.getTrainingClassTranslationValue(trainingClassTranslation);
353
354            trainingClassTranslationValue.setDescription(description);
355            trainingClassTranslationValue.setOverviewMimeTypePK(overviewMimeType == null? null: overviewMimeType.getPrimaryKey());
356            trainingClassTranslationValue.setOverview(overview);
357            trainingClassTranslationValue.setIntroductionMimeTypePK(introductionMimeType == null? null: introductionMimeType.getPrimaryKey());
358            trainingClassTranslationValue.setIntroduction(introduction);
359            trainingControl.updateTrainingClassTranslationFromValue(trainingClassTranslationValue, partyPK);
360        }
361    }
362
363}