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.edit.PartyTrainingClassSessionAnswerEdit; 020import com.echothree.control.user.training.common.edit.TrainingEditFactory; 021import com.echothree.control.user.training.common.form.EditPartyTrainingClassSessionAnswerForm; 022import com.echothree.control.user.training.common.result.EditPartyTrainingClassSessionAnswerResult; 023import com.echothree.control.user.training.common.result.TrainingResultFactory; 024import com.echothree.control.user.training.common.spec.PartyTrainingClassSessionAnswerSpec; 025import com.echothree.model.control.party.common.PartyTypes; 026import com.echothree.model.control.security.common.SecurityRoleGroups; 027import com.echothree.model.control.security.common.SecurityRoles; 028import com.echothree.model.control.training.server.control.TrainingControl; 029import com.echothree.model.control.training.server.logic.PartyTrainingClassLogic; 030import com.echothree.model.control.training.server.logic.PartyTrainingClassSessionLogic; 031import com.echothree.model.control.training.server.logic.TrainingClassLogic; 032import com.echothree.model.data.training.server.entity.PartyTrainingClassSessionAnswer; 033import com.echothree.model.data.training.server.entity.PartyTrainingClassSessionQuestion; 034import com.echothree.model.data.training.server.entity.TrainingClassAnswer; 035import com.echothree.model.data.user.common.pk.UserVisitPK; 036import com.echothree.util.common.validation.FieldDefinition; 037import com.echothree.util.common.validation.FieldType; 038import com.echothree.util.common.command.EditMode; 039import com.echothree.util.server.control.BaseAbstractEditCommand; 040import com.echothree.util.server.control.CommandSecurityDefinition; 041import com.echothree.util.server.control.PartyTypeDefinition; 042import com.echothree.util.server.control.SecurityRoleDefinition; 043import com.echothree.util.server.persistence.Session; 044import com.echothree.util.server.string.DateUtils; 045import java.util.Arrays; 046import java.util.Collections; 047import java.util.List; 048import javax.enterprise.context.RequestScoped; 049 050@RequestScoped 051public class EditPartyTrainingClassSessionAnswerCommand 052 extends BaseAbstractEditCommand<PartyTrainingClassSessionAnswerSpec, PartyTrainingClassSessionAnswerEdit, EditPartyTrainingClassSessionAnswerResult, PartyTrainingClassSessionAnswer, PartyTrainingClassSessionQuestion> { 053 054 private final static CommandSecurityDefinition COMMAND_SECURITY_DEFINITION; 055 private final static List<FieldDefinition> SPEC_FIELD_DEFINITIONS; 056 private final static List<FieldDefinition> EDIT_FIELD_DEFINITIONS; 057 058 static { 059 COMMAND_SECURITY_DEFINITION = new CommandSecurityDefinition(Collections.unmodifiableList(Arrays.asList( 060 new PartyTypeDefinition(PartyTypes.UTILITY.name(), null), 061 new PartyTypeDefinition(PartyTypes.EMPLOYEE.name(), Collections.unmodifiableList(Arrays.asList( 062 new SecurityRoleDefinition(SecurityRoleGroups.PartyTrainingClassSessionAnswer.name(), SecurityRoles.Edit.name()) 063 ))) 064 ))); 065 066 SPEC_FIELD_DEFINITIONS = Collections.unmodifiableList(Arrays.asList( 067 new FieldDefinition("PartyTrainingClassName", FieldType.ENTITY_NAME, true, null, null), 068 new FieldDefinition("PartyTrainingClassSessionSequence", FieldType.UNSIGNED_INTEGER, true, null, null), 069 new FieldDefinition("TrainingClassSectionName", FieldType.ENTITY_NAME, true, null, null), 070 new FieldDefinition("TrainingClassQuestionName", FieldType.ENTITY_NAME, true, null, null), 071 new FieldDefinition("PartyTrainingClassSessionAnswerSequence", FieldType.UNSIGNED_INTEGER, true, null, null) 072 )); 073 074 EDIT_FIELD_DEFINITIONS = Collections.unmodifiableList(Arrays.asList( 075 new FieldDefinition("TrainingClassAnswerName", FieldType.ENTITY_NAME, false, null, null), 076 new FieldDefinition("QuestionStartTime", FieldType.DATE_TIME, true, null, null), 077 new FieldDefinition("QuestionEndTime", FieldType.DATE_TIME, false, null, null) 078 )); 079 } 080 081 /** Creates a new instance of EditPartyTrainingClassSessionAnswerCommand */ 082 public EditPartyTrainingClassSessionAnswerCommand() { 083 super(COMMAND_SECURITY_DEFINITION, SPEC_FIELD_DEFINITIONS, EDIT_FIELD_DEFINITIONS); 084 } 085 086 @Override 087 public EditPartyTrainingClassSessionAnswerResult getResult() { 088 return TrainingResultFactory.getEditPartyTrainingClassSessionAnswerResult(); 089 } 090 091 @Override 092 public PartyTrainingClassSessionAnswerEdit getEdit() { 093 return TrainingEditFactory.getPartyTrainingClassSessionAnswerEdit(); 094 } 095 096 @Override 097 public PartyTrainingClassSessionAnswer getEntity(EditPartyTrainingClassSessionAnswerResult result) { 098 PartyTrainingClassSessionAnswer partyTrainingClassSessionAnswer = null; 099 var partyTrainingClass = PartyTrainingClassLogic.getInstance().getPartyTrainingClassByName(this, spec.getPartyTrainingClassName()); 100 101 if(!hasExecutionErrors()) { 102 var partyTrainingClassSessionSequence = Integer.valueOf(spec.getPartyTrainingClassSessionSequence()); 103 var partyTrainingClassSession = PartyTrainingClassSessionLogic.getInstance().getPartyTrainingClassSession(this, 104 partyTrainingClass, partyTrainingClassSessionSequence); 105 106 if(!hasExecutionErrors()) { 107 var trainingClassSection = TrainingClassLogic.getInstance().getTrainingClassSectionByName(this, 108 partyTrainingClassSession.getLastDetail().getPartyTrainingClass().getLastDetail().getTrainingClass(), 109 spec.getTrainingClassSectionName()); 110 111 if(!hasExecutionErrors()) { 112 var trainingClassQuestion = TrainingClassLogic.getInstance().getTrainingClassQuestionByName(this, trainingClassSection, 113 spec.getTrainingClassQuestionName()); 114 115 if(!hasExecutionErrors()) { 116 var partyTrainingClassSessionQuestion = PartyTrainingClassSessionLogic.getInstance().getPartyTrainingClassSessionQuestion(this, 117 partyTrainingClassSession, trainingClassQuestion); 118 119 if(!hasExecutionErrors()) { 120 var partyTrainingClassSessionAnswerSequence = Integer.valueOf(spec.getPartyTrainingClassSessionAnswerSequence()); 121 122 if(editMode.equals(EditMode.LOCK) || editMode.equals(EditMode.ABANDON)) { 123 partyTrainingClassSessionAnswer = PartyTrainingClassSessionLogic.getInstance().getPartyTrainingClassSessionAnswer(this, 124 partyTrainingClassSessionQuestion, partyTrainingClassSessionAnswerSequence); 125 } else { // EditMode.UPDATE 126 partyTrainingClassSessionAnswer = PartyTrainingClassSessionLogic.getInstance().getPartyTrainingClassSessionAnswerForUpdate(this, 127 partyTrainingClassSessionQuestion, partyTrainingClassSessionAnswerSequence); 128 } 129 } 130 } 131 } 132 } 133 } 134 135 return partyTrainingClassSessionAnswer; 136 } 137 138 @Override 139 public PartyTrainingClassSessionQuestion getLockEntity(PartyTrainingClassSessionAnswer partyTrainingClassSessionAnswer) { 140 return partyTrainingClassSessionAnswer.getPartyTrainingClassSessionQuestion(); 141 } 142 143 @Override 144 public void fillInResult(EditPartyTrainingClassSessionAnswerResult result, PartyTrainingClassSessionAnswer partyTrainingClassSessionAnswer) { 145 var trainingControl = Session.getModelController(TrainingControl.class); 146 147 result.setPartyTrainingClassSessionAnswer(trainingControl.getPartyTrainingClassSessionAnswerTransfer(getUserVisit(), partyTrainingClassSessionAnswer)); 148 } 149 150 TrainingClassAnswer trainingClassAnswer; 151 152 @Override 153 public void doLock(PartyTrainingClassSessionAnswerEdit edit, PartyTrainingClassSessionAnswer partyTrainingClassSessionAnswer) { 154 var dateUtils = DateUtils.getInstance(); 155 var userVisit = getUserVisit(); 156 var preferredDateTimeFormat = getPreferredDateTimeFormat(); 157 158 trainingClassAnswer = partyTrainingClassSessionAnswer.getTrainingClassAnswer(); 159 160 edit.setTrainingClassAnswerName(trainingClassAnswer == null ? null : trainingClassAnswer.getLastDetail().getTrainingClassAnswerName()); 161 edit.setQuestionStartTime(dateUtils.formatTypicalDateTime(userVisit, preferredDateTimeFormat, partyTrainingClassSessionAnswer.getQuestionStartTime())); 162 edit.setQuestionEndTime(dateUtils.formatTypicalDateTime(userVisit, preferredDateTimeFormat, partyTrainingClassSessionAnswer.getQuestionEndTime())); 163 } 164 165 Long questionStartTime; 166 Long questionEndTime; 167 168 @Override 169 public void canUpdate(PartyTrainingClassSessionAnswer partyTrainingClassSessionAnswer) { 170 var trainingClassAnswerName = edit.getTrainingClassAnswerName(); 171 172 trainingClassAnswer = trainingClassAnswerName == null ? null : TrainingClassLogic.getInstance().getTrainingClassAnswerByName(this, 173 partyTrainingClassSessionAnswer.getTrainingClassAnswer().getLastDetail().getTrainingClassQuestion(), trainingClassAnswerName); 174 175 if(!hasExecutionErrors()) { 176 var strQuestionEndTime = edit.getQuestionEndTime(); 177 178 questionStartTime = Long.valueOf(edit.getQuestionStartTime()); 179 questionEndTime = strQuestionEndTime == null ? null : Long.valueOf(strQuestionEndTime); 180 } 181 } 182 183 @Override 184 public void doUpdate(PartyTrainingClassSessionAnswer partyTrainingClassSessionAnswer) { 185 var trainingControl = Session.getModelController(TrainingControl.class); 186 var partyPK = getPartyPK(); 187 var partyTrainingClassSessionAnswerValue = trainingControl.getPartyTrainingClassSessionAnswerValue(partyTrainingClassSessionAnswer); 188 189 partyTrainingClassSessionAnswerValue.setTrainingClassAnswerPK(trainingClassAnswer == null ? null : trainingClassAnswer.getPrimaryKey()); 190 partyTrainingClassSessionAnswerValue.setQuestionStartTime(questionStartTime); 191 partyTrainingClassSessionAnswerValue.setQuestionEndTime(questionEndTime); 192 193 trainingControl.updatePartyTrainingClassSessionAnswerFromValue(partyTrainingClassSessionAnswerValue, partyPK); 194 } 195 196}