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.party.server.command; 018 019import com.echothree.control.user.party.common.edit.DivisionEdit; 020import com.echothree.control.user.party.common.edit.PartyEditFactory; 021import com.echothree.control.user.party.common.form.EditDivisionForm; 022import com.echothree.control.user.party.common.result.EditDivisionResult; 023import com.echothree.control.user.party.common.result.PartyResultFactory; 024import com.echothree.control.user.party.common.spec.DivisionSpec; 025import com.echothree.model.control.accounting.server.control.AccountingControl; 026import com.echothree.model.control.party.server.control.PartyControl; 027import com.echothree.model.data.accounting.server.entity.Currency; 028import com.echothree.model.data.party.common.pk.PartyPK; 029import com.echothree.model.data.party.server.entity.DateTimeFormat; 030import com.echothree.model.data.party.server.entity.Language; 031import com.echothree.model.data.party.server.entity.Party; 032import com.echothree.model.data.party.server.entity.PartyCompany; 033import com.echothree.model.data.party.server.entity.PartyDetail; 034import com.echothree.model.data.party.server.entity.PartyDivision; 035import com.echothree.model.data.party.server.entity.PartyGroup; 036import com.echothree.model.data.party.server.entity.TimeZone; 037import com.echothree.model.data.party.server.value.PartyDetailValue; 038import com.echothree.model.data.party.server.value.PartyDivisionValue; 039import com.echothree.model.data.party.server.value.PartyGroupValue; 040import com.echothree.model.data.user.common.pk.UserVisitPK; 041import com.echothree.util.common.message.ExecutionErrors; 042import com.echothree.util.common.validation.FieldDefinition; 043import com.echothree.util.common.validation.FieldType; 044import com.echothree.util.common.command.BaseResult; 045import com.echothree.util.common.command.EditMode; 046import com.echothree.util.server.control.BaseEditCommand; 047import com.echothree.util.server.persistence.Session; 048import java.util.Arrays; 049import java.util.Collections; 050import java.util.List; 051 052public class EditDivisionCommand 053 extends BaseEditCommand<DivisionSpec, DivisionEdit> { 054 055 private final static List<FieldDefinition> SPEC_FIELD_DEFINITIONS; 056 private final static List<FieldDefinition> EDIT_FIELD_DEFINITIONS; 057 058 static { 059 SPEC_FIELD_DEFINITIONS = Collections.unmodifiableList(Arrays.asList( 060 new FieldDefinition("CompanyName", FieldType.ENTITY_NAME, true, null, null), 061 new FieldDefinition("DivisionName", FieldType.ENTITY_NAME, true, null, null) 062 )); 063 064 EDIT_FIELD_DEFINITIONS = Collections.unmodifiableList(Arrays.asList( 065 new FieldDefinition("DivisionName", FieldType.ENTITY_NAME, true, null, null), 066 new FieldDefinition("Name", FieldType.STRING, true, 1L, 60L), 067 new FieldDefinition("PreferredLanguageIsoName", FieldType.ENTITY_NAME, false, null, null), 068 new FieldDefinition("PreferredCurrencyIsoName", FieldType.ENTITY_NAME, false, null, null), 069 new FieldDefinition("PreferredJavaTimeZoneName", FieldType.TIME_ZONE_NAME, false, null, null), 070 new FieldDefinition("PreferredDateTimeFormatName", FieldType.ENTITY_NAME, false, null, null), 071 new FieldDefinition("IsDefault", FieldType.BOOLEAN, true, null, null), 072 new FieldDefinition("SortOrder", FieldType.SIGNED_INTEGER, true, null, null) 073 )); 074 } 075 076 /** Creates a new instance of EditDivisionCommand */ 077 public EditDivisionCommand(UserVisitPK userVisitPK, EditDivisionForm form) { 078 super(userVisitPK, form, null, SPEC_FIELD_DEFINITIONS, EDIT_FIELD_DEFINITIONS); 079 } 080 081 @Override 082 protected BaseResult execute() { 083 var partyControl = Session.getModelController(PartyControl.class); 084 EditDivisionResult result = PartyResultFactory.getEditDivisionResult(); 085 String companyName = spec.getCompanyName(); 086 PartyCompany partyCompany = partyControl.getPartyCompanyByName(companyName); 087 088 if(partyCompany != null) { 089 String originalDivisionName = spec.getDivisionName(); 090 Party partyCompanyParty = partyCompany.getParty(); 091 PartyDivision partyDivision = partyControl.getPartyDivisionByNameForUpdate(partyCompanyParty, originalDivisionName); 092 093 if(partyDivision != null) { 094 Party party = partyDivision.getParty(); 095 096 if(editMode.equals(EditMode.LOCK)) { 097 result.setDivision(partyControl.getDivisionTransfer(getUserVisit(), partyDivision)); 098 099 if(lockEntity(party)) { 100 DivisionEdit edit = PartyEditFactory.getDivisionEdit(); 101 PartyDetail partyDetail = party.getLastDetail(); 102 PartyGroup partyGroup = partyControl.getPartyGroup(party); 103 Language preferredLanguage = partyDetail.getPreferredLanguage(); 104 Currency preferredCurrency = partyDetail.getPreferredCurrency(); 105 TimeZone preferredTimeZone = partyDetail.getPreferredTimeZone(); 106 DateTimeFormat preferredDateTimeFormat = partyDetail.getPreferredDateTimeFormat(); 107 108 result.setEdit(edit); 109 edit.setDivisionName(partyDivision.getPartyDivisionName()); 110 edit.setName(partyGroup.getName()); 111 edit.setPreferredLanguageIsoName(preferredLanguage == null? null: preferredLanguage.getLanguageIsoName()); 112 edit.setPreferredCurrencyIsoName(preferredCurrency == null? null: preferredCurrency.getCurrencyIsoName()); 113 edit.setPreferredJavaTimeZoneName(preferredTimeZone == null? null: preferredTimeZone.getLastDetail().getJavaTimeZoneName()); 114 edit.setPreferredDateTimeFormatName(preferredDateTimeFormat == null? null: preferredDateTimeFormat.getLastDetail().getDateTimeFormatName()); 115 edit.setIsDefault(partyDivision.getIsDefault().toString()); 116 edit.setSortOrder(partyDivision.getSortOrder().toString()); 117 } else { 118 addExecutionError(ExecutionErrors.EntityLockFailed.name()); 119 } 120 121 result.setEntityLock(getEntityLockTransfer(party)); 122 } else if(editMode.equals(EditMode.ABANDON)) { 123 unlockEntity(party); 124 } else if(editMode.equals(EditMode.UPDATE)) { 125 PartyDivisionValue partyDivisionValue = partyControl.getPartyDivisionValueForUpdate(partyDivision); 126 String divisionName = edit.getDivisionName(); 127 PartyDivision duplicatePartyDivision = partyControl.getPartyDivisionByName(partyCompanyParty, divisionName); 128 129 if(duplicatePartyDivision == null || duplicatePartyDivision.getPrimaryKey().equals(partyDivisionValue.getPrimaryKey())) { 130 String preferredLanguageIsoName = edit.getPreferredLanguageIsoName(); 131 Language preferredLanguage = preferredLanguageIsoName == null? null: partyControl.getLanguageByIsoName(preferredLanguageIsoName); 132 133 if(preferredLanguageIsoName == null || (preferredLanguage != null)) { 134 String preferredJavaTimeZoneName = edit.getPreferredJavaTimeZoneName(); 135 TimeZone preferredTimeZone = preferredJavaTimeZoneName == null? null: partyControl.getTimeZoneByJavaName(preferredJavaTimeZoneName); 136 137 if(preferredJavaTimeZoneName == null || (preferredTimeZone != null)) { 138 String preferredDateTimeFormatName = edit.getPreferredDateTimeFormatName(); 139 DateTimeFormat preferredDateTimeFormat = preferredDateTimeFormatName == null? null: partyControl.getDateTimeFormatByName(preferredDateTimeFormatName); 140 141 if(preferredDateTimeFormatName == null || (preferredDateTimeFormat != null)) { 142 String preferredCurrencyIsoName = edit.getPreferredCurrencyIsoName(); 143 Currency preferredCurrency; 144 145 if(preferredCurrencyIsoName == null) 146 preferredCurrency = null; 147 else { 148 var accountingControl = Session.getModelController(AccountingControl.class); 149 preferredCurrency = accountingControl.getCurrencyByIsoName(preferredCurrencyIsoName); 150 } 151 152 if(preferredCurrencyIsoName == null || (preferredCurrency != null)) { 153 if(lockEntityForUpdate(party)) { 154 try { 155 PartyPK updatedBy = getPartyPK(); 156 PartyDetailValue partyDetailValue = partyControl.getPartyDetailValueForUpdate(party); 157 PartyGroupValue partyGroupValue = partyControl.getPartyGroupValueForUpdate(party); 158 159 partyDivisionValue.setPartyDivisionName(divisionName); 160 partyGroupValue.setName(edit.getName()); 161 partyDivisionValue.setIsDefault(Boolean.valueOf(edit.getIsDefault())); 162 partyDivisionValue.setSortOrder(Integer.valueOf(edit.getSortOrder())); 163 164 partyControl.updatePartyDivisionFromValue(partyDivisionValue, updatedBy); 165 partyControl.updatePartyFromValue(partyDetailValue, updatedBy); 166 partyControl.updatePartyGroupFromValue(partyGroupValue, updatedBy); 167 } finally { 168 unlockEntity(party); 169 } 170 } else { 171 addExecutionError(ExecutionErrors.EntityLockStale.name()); 172 } 173 } else { 174 addExecutionError(ExecutionErrors.UnknownCurrencyIsoName.name(), preferredCurrencyIsoName); 175 } 176 } else { 177 addExecutionError(ExecutionErrors.UnknownDateTimeFormatName.name(), preferredDateTimeFormatName); 178 } 179 } else { 180 addExecutionError(ExecutionErrors.UnknownJavaTimeZoneName.name(), preferredJavaTimeZoneName); 181 } 182 } else { 183 addExecutionError(ExecutionErrors.UnknownLanguageIsoName.name(), preferredLanguageIsoName); 184 } 185 } else { 186 addExecutionError(ExecutionErrors.DuplicateDivisionName.name(), divisionName); 187 } 188 189 if(hasExecutionErrors()) { 190 result.setDivision(partyControl.getDivisionTransfer(getUserVisit(), partyDivision)); 191 result.setEntityLock(getEntityLockTransfer(party)); 192 } 193 } 194 } else { 195 addExecutionError(ExecutionErrors.UnknownDivisionName.name(), originalDivisionName); 196 } 197 } else { 198 addExecutionError(ExecutionErrors.UnknownCompanyName.name(), companyName); 199 } 200 201 return result; 202 } 203 204}