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.vendor.server.command;
018
019import com.echothree.control.user.vendor.common.edit.VendorEdit;
020import com.echothree.control.user.vendor.common.edit.VendorEditFactory;
021import com.echothree.control.user.vendor.common.form.EditVendorForm;
022import com.echothree.control.user.vendor.common.result.EditVendorResult;
023import com.echothree.control.user.vendor.common.result.VendorResultFactory;
024import com.echothree.control.user.vendor.common.spec.VendorUniversalSpec;
025import com.echothree.model.control.accounting.common.AccountingConstants;
026import com.echothree.model.control.accounting.server.control.AccountingControl;
027import com.echothree.model.control.cancellationpolicy.common.CancellationKinds;
028import com.echothree.model.control.cancellationpolicy.server.control.CancellationPolicyControl;
029import com.echothree.model.control.item.server.control.ItemControl;
030import com.echothree.model.control.party.common.PartyTypes;
031import com.echothree.model.control.party.server.control.PartyControl;
032import com.echothree.model.control.returnpolicy.common.ReturnKinds;
033import com.echothree.model.control.returnpolicy.server.control.ReturnPolicyControl;
034import com.echothree.model.control.security.common.SecurityRoleGroups;
035import com.echothree.model.control.security.common.SecurityRoles;
036import com.echothree.model.control.vendor.server.control.VendorControl;
037import com.echothree.model.control.vendor.server.logic.VendorLogic;
038import com.echothree.model.data.accounting.server.entity.Currency;
039import com.echothree.model.data.accounting.server.entity.GlAccount;
040import com.echothree.model.data.cancellationpolicy.server.entity.CancellationPolicy;
041import com.echothree.model.data.item.server.entity.ItemAliasType;
042import com.echothree.model.data.party.server.entity.DateTimeFormat;
043import com.echothree.model.data.party.server.entity.Language;
044import com.echothree.model.data.party.server.entity.Party;
045import com.echothree.model.data.party.server.entity.TimeZone;
046import com.echothree.model.data.returnpolicy.server.entity.ReturnPolicy;
047import com.echothree.model.data.user.common.pk.UserVisitPK;
048import com.echothree.model.data.vendor.server.entity.Vendor;
049import com.echothree.util.common.command.EditMode;
050import com.echothree.util.common.form.BaseForm;
051import com.echothree.util.common.message.ExecutionErrors;
052import com.echothree.util.common.validation.FieldDefinition;
053import com.echothree.util.common.validation.FieldType;
054import com.echothree.util.server.control.BaseAbstractEditCommand;
055import com.echothree.util.server.control.CommandSecurityDefinition;
056import com.echothree.util.server.control.PartyTypeDefinition;
057import com.echothree.util.server.control.SecurityRoleDefinition;
058import com.echothree.util.server.persistence.EntityPermission;
059import com.echothree.util.server.persistence.Session;
060import com.echothree.util.server.string.AmountUtils;
061import com.echothree.util.server.validation.Validator;
062import java.util.Arrays;
063import java.util.Collections;
064import java.util.List;
065import org.apache.commons.codec.language.Soundex;
066import javax.enterprise.context.RequestScoped;
067
068@RequestScoped
069public class EditVendorCommand
070        extends BaseAbstractEditCommand<VendorUniversalSpec, VendorEdit, EditVendorResult, Party, Party> {
071
072    private final static CommandSecurityDefinition COMMAND_SECURITY_DEFINITION;
073    private final static List<FieldDefinition> SPEC_FIELD_DEFINITIONS;
074    private final static List<FieldDefinition> EDIT_FIELD_DEFINITIONS;
075    
076    static {
077        COMMAND_SECURITY_DEFINITION = new CommandSecurityDefinition(Collections.unmodifiableList(Arrays.asList(
078                new PartyTypeDefinition(PartyTypes.UTILITY.name(), null),
079                new PartyTypeDefinition(PartyTypes.EMPLOYEE.name(), Collections.unmodifiableList(Arrays.asList(
080                    new SecurityRoleDefinition(SecurityRoleGroups.Vendor.name(), SecurityRoles.Edit.name())
081                    )))
082                )));
083        
084        SPEC_FIELD_DEFINITIONS = Collections.unmodifiableList(Arrays.asList(
085                new FieldDefinition("VendorName", FieldType.ENTITY_NAME, false, null, null),
086                new FieldDefinition("PartyName", FieldType.ENTITY_NAME, false, null, null),
087                new FieldDefinition("EntityRef", FieldType.ENTITY_REF, false, null, null),
088                new FieldDefinition("Uuid", FieldType.UUID, false, null, null)
089        ));
090        
091        EDIT_FIELD_DEFINITIONS = Collections.unmodifiableList(Arrays.asList(
092                new FieldDefinition("VendorName", FieldType.ENTITY_NAME, true, null, null),
093                new FieldDefinition("VendorTypeName", FieldType.ENTITY_NAME, true, null, null),
094                new FieldDefinition("MinimumPurchaseOrderLines", FieldType.UNSIGNED_INTEGER, false, null, null),
095                new FieldDefinition("MaximumPurchaseOrderLines", FieldType.UNSIGNED_INTEGER, false, null, null),
096                new FieldDefinition("MinimumPurchaseOrderAmount", FieldType.UNSIGNED_COST_LINE, false, null, null),
097                new FieldDefinition("MaximumPurchaseOrderAmount", FieldType.UNSIGNED_COST_LINE, false, null, null),
098                new FieldDefinition("UseItemPurchasingCategories", FieldType.BOOLEAN, true, null, null),
099                new FieldDefinition("DefaultItemAliasTypeName", FieldType.ENTITY_NAME, false, null, null),
100                new FieldDefinition("CancellationPolicyName", FieldType.ENTITY_NAME, false, null, null),
101                new FieldDefinition("ReturnPolicyName", FieldType.ENTITY_NAME, false, null, null),
102                new FieldDefinition("ApGlAccountName", FieldType.ENTITY_NAME, false, null, null),
103                new FieldDefinition("PersonalTitleId", FieldType.ID, false, null, null),
104                new FieldDefinition("FirstName", FieldType.STRING, false, 1L, 20L),
105                new FieldDefinition("MiddleName", FieldType.STRING, false, 1L, 20L),
106                new FieldDefinition("LastName", FieldType.STRING, false, 1L, 20L),
107                new FieldDefinition("NameSuffixId", FieldType.ID, false, null, null),
108                new FieldDefinition("Name", FieldType.STRING, false, 1L, 60L),
109                new FieldDefinition("PreferredLanguageIsoName", FieldType.ENTITY_NAME, false, null, null),
110                new FieldDefinition("PreferredCurrencyIsoName", FieldType.ENTITY_NAME, false, null, null),
111                new FieldDefinition("PreferredJavaTimeZoneName", FieldType.STRING, false, null, null),
112                new FieldDefinition("PreferredDateTimeFormatName", FieldType.ENTITY_NAME, false, null, null),
113                new FieldDefinition("HoldUntilComplete", FieldType.BOOLEAN, true, null, null),
114                new FieldDefinition("AllowBackorders", FieldType.BOOLEAN, true, null, null),
115                new FieldDefinition("AllowSubstitutions", FieldType.BOOLEAN, true, null, null),
116                new FieldDefinition("AllowCombiningShipments", FieldType.BOOLEAN, true, null, null),
117                new FieldDefinition("RequireReference", FieldType.BOOLEAN, true, null, null),
118                new FieldDefinition("AllowReferenceDuplicates", FieldType.BOOLEAN, true, null, null),
119                new FieldDefinition("ReferenceValidationPattern", FieldType.REGULAR_EXPRESSION, false, null, null)
120                ));
121    }
122    
123    /** Creates a new instance of EditVendorCommand */
124    public EditVendorCommand() {
125        super(COMMAND_SECURITY_DEFINITION, SPEC_FIELD_DEFINITIONS, EDIT_FIELD_DEFINITIONS);
126    }
127    
128    @Override
129    protected void setupValidatorForEdit(Validator validator, BaseForm specForm) {
130        var vendorControl = Session.getModelController(VendorControl.class);
131        var vendorName = spec.getVendorName();
132        
133        if(vendorName != null) {
134            var vendor = vendorControl.getVendorByNameForUpdate(vendorName);
135            
136            if(vendor != null) {
137                var partyControl = Session.getModelController(PartyControl.class);
138                
139                validator.setCurrency(partyControl.getPreferredCurrency(vendor.getParty()));
140            }
141        }
142    }
143
144    @Override
145    public EditVendorResult getResult() {
146        return VendorResultFactory.getEditVendorResult();
147    }
148
149    @Override
150    public VendorEdit getEdit() {
151        return VendorEditFactory.getVendorEdit();
152    }
153
154    @Override
155    public Party getEntity(EditVendorResult result) {
156        var vendorControl = Session.getModelController(VendorControl.class);
157        Vendor vendor;
158
159        if(editMode.equals(EditMode.LOCK) || editMode.equals(EditMode.ABANDON)) {
160            vendor = VendorLogic.getInstance().getVendorByUniversalSpec(this, spec);
161        } else { // EditMode.UPDATE
162            vendor = VendorLogic.getInstance().getVendorByUniversalSpecForUpdate(this, spec);
163        }
164
165        if(!hasExecutionErrors()) {
166            result.setVendor(vendorControl.getVendorTransfer(getUserVisit(), vendor));
167        }
168
169        return vendor.getParty();
170    }
171
172    @Override
173    public Party getLockEntity(Party party) {
174        return party;
175    }
176
177    @Override
178    public void fillInResult(EditVendorResult result, Party party) {
179        var vendorControl = Session.getModelController(VendorControl.class);
180
181        result.setVendor(vendorControl.getVendorTransfer(getUserVisit(), party));
182    }
183
184    @Override
185    public void doLock(VendorEdit edit, Party party) {
186        var partyControl = Session.getModelController(PartyControl.class);
187        var vendorControl = Session.getModelController(VendorControl.class);
188        var vendor = vendorControl.getVendor(party);
189        var amountUtils = AmountUtils.getInstance();
190        var vendorPreferredCurrency = getPreferredCurrency(party);
191        var partyDetail = party.getLastDetail();
192        var partyGroup = partyControl.getPartyGroup(party);
193        var apGlAccount = vendor.getApGlAccount();
194        var cancellationPolicy = vendor.getCancellationPolicy();
195        var returnPolicy = vendor.getReturnPolicy();
196        var minimumPurchaseOrderLines = vendor.getMinimumPurchaseOrderLines();
197        var maximumPurchaseOrderLines = vendor.getMaximumPurchaseOrderLines();
198        var minimumPurchaseOrderAmount = vendor.getMinimumPurchaseOrderAmount();
199        var maximumPurchaseOrderAmount = vendor.getMaximumPurchaseOrderAmount();
200        var itemAliasType = vendor.getDefaultItemAliasType();
201        var preferredLanguage = partyDetail.getPreferredLanguage();
202        var preferredCurrency = partyDetail.getPreferredCurrency();
203        var preferredTimeZone = partyDetail.getPreferredTimeZone();
204        var dateTimeFormat = partyDetail.getPreferredDateTimeFormat();
205        var person = partyControl.getPerson(party);
206        var personalTitle = person == null ? null : person.getPersonalTitle();
207        var nameSuffix = person == null ? null : person.getNameSuffix();
208
209        edit.setVendorName(vendor.getVendorName());
210        edit.setVendorTypeName(vendor.getVendorType().getLastDetail().getVendorTypeName());
211        edit.setMinimumPurchaseOrderLines(minimumPurchaseOrderLines == null ? null : minimumPurchaseOrderLines.toString());
212        edit.setMaximumPurchaseOrderLines(maximumPurchaseOrderLines == null ? null : maximumPurchaseOrderLines.toString());
213        edit.setMinimumPurchaseOrderAmount(minimumPurchaseOrderAmount == null ? null : amountUtils.formatCostLine(vendorPreferredCurrency, minimumPurchaseOrderAmount));
214        edit.setMaximumPurchaseOrderAmount(maximumPurchaseOrderAmount == null ? null : amountUtils.formatCostLine(vendorPreferredCurrency, maximumPurchaseOrderAmount));
215        edit.setUseItemPurchasingCategories(vendor.getUseItemPurchasingCategories().toString());
216        edit.setCancellationPolicyName(cancellationPolicy == null ? null : cancellationPolicy.getLastDetail().getCancellationPolicyName());
217        edit.setReturnPolicyName(returnPolicy == null ? null : returnPolicy.getLastDetail().getReturnPolicyName());
218        edit.setApGlAccountName(apGlAccount == null ? null : apGlAccount.getLastDetail().getGlAccountName());
219        edit.setHoldUntilComplete(vendor.getHoldUntilComplete().toString());
220        edit.setAllowBackorders(vendor.getAllowBackorders().toString());
221        edit.setAllowSubstitutions(vendor.getAllowSubstitutions().toString());
222        edit.setAllowCombiningShipments(vendor.getAllowCombiningShipments().toString());
223        edit.setRequireReference(vendor.getRequireReference().toString());
224        edit.setAllowReferenceDuplicates(vendor.getAllowReferenceDuplicates().toString());
225        edit.setReferenceValidationPattern(vendor.getReferenceValidationPattern());
226        edit.setDefaultItemAliasTypeName(itemAliasType == null ? null : itemAliasType.getLastDetail().getItemAliasTypeName());
227        edit.setPersonalTitleId(personalTitle == null ? null : personalTitle.getPrimaryKey().getEntityId().toString());
228        edit.setFirstName(person == null ? null : person.getFirstName());
229        edit.setMiddleName(person == null ? null : person.getMiddleName());
230        edit.setLastName(person == null ? null : person.getLastName());
231        edit.setNameSuffixId(nameSuffix == null ? null : nameSuffix.getPrimaryKey().getEntityId().toString());
232        edit.setName(partyGroup == null ? null : partyGroup.getName());
233        edit.setPreferredLanguageIsoName(preferredLanguage == null ? null : preferredLanguage.getLanguageIsoName());
234        edit.setPreferredCurrencyIsoName(preferredCurrency == null ? null : preferredCurrency.getCurrencyIsoName());
235        edit.setPreferredJavaTimeZoneName(preferredTimeZone == null ? null : preferredTimeZone.getLastDetail().getJavaTimeZoneName());
236        edit.setPreferredDateTimeFormatName(dateTimeFormat == null ? null : dateTimeFormat.getLastDetail().getDateTimeFormatName());
237    }
238
239    CancellationPolicy cancellationPolicy;
240    ReturnPolicy returnPolicy;
241    GlAccount apGlAccount;
242    ItemAliasType defaultItemAliasType;
243    Language preferredLanguage;
244    TimeZone preferredTimeZone;
245    DateTimeFormat preferredDateTimeFormat;
246    Currency preferredCurrency;
247
248    @Override
249    public void canUpdate(Party party) {
250        var partyControl = Session.getModelController(PartyControl.class);
251        var vendorControl = Session.getModelController(VendorControl.class);
252        var vendor = vendorControl.getVendorForUpdate(party);
253        var vendorName = edit.getVendorName();
254        var duplicateVendor = vendorControl.getVendorByName(vendorName);
255
256        if(duplicateVendor == null || duplicateVendor.getPrimaryKey().equals(vendor.getPrimaryKey())) {
257            var vendorTypeName = edit.getVendorTypeName();
258            var vendorType = vendorControl.getVendorTypeByName(vendorTypeName);
259
260            if(vendorType != null) {
261                var cancellationPolicyName = edit.getCancellationPolicyName();
262
263                if(cancellationPolicyName != null) {
264                    var cancellationPolicyControl = Session.getModelController(CancellationPolicyControl.class);
265                    var cancellationKind = cancellationPolicyControl.getCancellationKindByName(CancellationKinds.VENDOR_CANCELLATION.name());
266
267                    cancellationPolicy = cancellationPolicyControl.getCancellationPolicyByName(cancellationKind, cancellationPolicyName);
268                }
269
270                if(cancellationPolicyName == null || cancellationPolicy != null) {
271                    var returnPolicyName = edit.getReturnPolicyName();
272
273                    if(returnPolicyName != null) {
274                        var returnPolicyControl = Session.getModelController(ReturnPolicyControl.class);
275                        var returnKind = returnPolicyControl.getReturnKindByName(ReturnKinds.VENDOR_RETURN.name());
276
277                        returnPolicy = returnPolicyControl.getReturnPolicyByName(returnKind, returnPolicyName);
278                    }
279
280                    if(returnPolicyName == null || returnPolicy != null) {
281                        var accountingControl = Session.getModelController(AccountingControl.class);
282                        var apGlAccountName = edit.getApGlAccountName();
283
284                        apGlAccount = apGlAccountName == null ? null : accountingControl.getGlAccountByName(apGlAccountName);
285
286                        if(apGlAccountName == null || apGlAccount != null) {
287                            var glAccountCategoryName = apGlAccount == null ? null : apGlAccount.getLastDetail().getGlAccountCategory().getLastDetail().getGlAccountCategoryName();
288
289                            if(glAccountCategoryName == null || glAccountCategoryName.equals(AccountingConstants.GlAccountCategory_ACCOUNTS_PAYABLE)) {
290                                var itemControl = Session.getModelController(ItemControl.class);
291                                var defaultItemAliasTypeName = edit.getDefaultItemAliasTypeName();
292
293                                defaultItemAliasType = itemControl.getItemAliasTypeByName(defaultItemAliasTypeName);
294
295                                if(defaultItemAliasTypeName == null || defaultItemAliasType != null) {
296                                    if(defaultItemAliasType == null || !defaultItemAliasType.getLastDetail().getAllowMultiple()) {
297                                        var preferredLanguageIsoName = edit.getPreferredLanguageIsoName();
298                                        preferredLanguage = preferredLanguageIsoName == null ? null : partyControl.getLanguageByIsoName(preferredLanguageIsoName);
299
300                                        if(preferredLanguageIsoName == null || (preferredLanguage != null)) {
301                                            var preferredJavaTimeZoneName = edit.getPreferredJavaTimeZoneName();
302                                            preferredTimeZone = preferredJavaTimeZoneName == null ? null : partyControl.getTimeZoneByJavaName(preferredJavaTimeZoneName);
303
304                                            if(preferredJavaTimeZoneName == null || (preferredTimeZone != null)) {
305                                                var preferredDateTimeFormatName = edit.getPreferredDateTimeFormatName();
306                                                preferredDateTimeFormat = preferredDateTimeFormatName == null ? null : partyControl.getDateTimeFormatByName(preferredDateTimeFormatName);
307
308                                                if(preferredDateTimeFormatName == null || (preferredDateTimeFormat != null)) {
309                                                    var preferredCurrencyIsoName = edit.getPreferredCurrencyIsoName();
310
311                                                    if(preferredCurrencyIsoName == null) {
312                                                        preferredCurrency = null;
313                                                    } else {
314                                                        preferredCurrency = accountingControl.getCurrencyByIsoName(preferredCurrencyIsoName);
315                                                    }
316
317                                                    if(preferredCurrencyIsoName != null && (preferredCurrency == null)) {
318                                                        addExecutionError(ExecutionErrors.UnknownCurrencyIsoName.name(), preferredCurrencyIsoName);
319                                                    }
320                                                } else {
321                                                    addExecutionError(ExecutionErrors.UnknownDateTimeFormatName.name(), preferredDateTimeFormatName);
322                                                }
323                                            } else {
324                                                addExecutionError(ExecutionErrors.UnknownJavaTimeZoneName.name(), preferredJavaTimeZoneName);
325                                            }
326                                        } else {
327                                            addExecutionError(ExecutionErrors.UnknownLanguageIsoName.name(), preferredLanguageIsoName);
328                                        }
329                                    } else {
330                                        addExecutionError(ExecutionErrors.InvalidItemAliasType.name(), defaultItemAliasTypeName);
331                                    }
332                                } else {
333                                    addExecutionError(ExecutionErrors.UnknownDefaultItemAliasTypeName.name(), defaultItemAliasTypeName);
334                                }
335                            } else {
336                                addExecutionError(ExecutionErrors.InvalidGlAccountCategory.name(), glAccountCategoryName);
337                            }
338                        } else {
339                            addExecutionError(ExecutionErrors.UnknownApGlAccountName.name(), apGlAccountName);
340                        }
341                    } else {
342                        addExecutionError(ExecutionErrors.UnknownReturnPolicyName.name(), returnPolicyName);
343                    }
344                } else {
345                    addExecutionError(ExecutionErrors.UnknownCancellationPolicyName.name(), cancellationPolicyName);
346                }
347            } else {
348                addExecutionError(ExecutionErrors.UnknownVendorTypeName.name(), vendorTypeName);
349            }
350        } else {
351            addExecutionError(ExecutionErrors.DuplicateVendorName.name(), vendorName);
352        }
353    }
354
355    @Override
356    public void doUpdate(Party party) {
357        var partyControl = Session.getModelController(PartyControl.class);
358        var vendorControl = Session.getModelController(VendorControl.class);
359        var soundex = new Soundex();
360        var vendor = vendorControl.getVendorForUpdate(party);
361        var vendorValue = vendorControl.getVendorValue(vendor);
362        var partyDetailValue = partyControl.getPartyDetailValueForUpdate(party);
363        var partyGroup = partyControl.getPartyGroupForUpdate(party);
364        var person = partyControl.getPersonForUpdate(party);
365        var minimumPurchaseOrderLines = edit.getMinimumPurchaseOrderLines();
366        var maximumPurchaseOrderLines = edit.getMaximumPurchaseOrderLines();
367        var minimumPurchaseOrderAmount = edit.getMinimumPurchaseOrderAmount();
368        var maximumPurchaseOrderAmount = edit.getMaximumPurchaseOrderAmount();
369        var personalTitleId = edit.getPersonalTitleId();
370        var personalTitle = personalTitleId == null ? null : partyControl.convertPersonalTitleIdToEntity(personalTitleId, EntityPermission.READ_ONLY);
371        var firstName = edit.getFirstName();
372        var firstNameSdx = soundex.encode(firstName);
373        var middleName = edit.getMiddleName();
374        var middleNameSdx = middleName == null ? null : soundex.encode(middleName);
375        var lastName = edit.getLastName();
376        var lastNameSdx = soundex.encode(lastName);
377        var nameSuffixId = edit.getNameSuffixId();
378        var nameSuffix = nameSuffixId == null ? null : partyControl.convertNameSuffixIdToEntity(nameSuffixId, EntityPermission.READ_ONLY);
379        var name = edit.getName();
380        var updatedBy = getPartyPK();
381
382        vendorValue.setVendorName(edit.getVendorName());
383        vendorValue.setMinimumPurchaseOrderLines(minimumPurchaseOrderLines == null ? null : Integer.valueOf(minimumPurchaseOrderLines));
384        vendorValue.setMaximumPurchaseOrderLines(maximumPurchaseOrderLines == null ? null : Integer.valueOf(maximumPurchaseOrderLines));
385        vendorValue.setMinimumPurchaseOrderAmount(minimumPurchaseOrderAmount == null ? null : Long.valueOf(minimumPurchaseOrderAmount));
386        vendorValue.setMaximumPurchaseOrderAmount(maximumPurchaseOrderAmount == null ? null : Long.valueOf(maximumPurchaseOrderAmount));
387        vendorValue.setUseItemPurchasingCategories(Boolean.valueOf(edit.getUseItemPurchasingCategories()));
388        vendorValue.setDefaultItemAliasTypePK(defaultItemAliasType == null ? null : defaultItemAliasType.getPrimaryKey());
389        vendorValue.setCancellationPolicyPK(cancellationPolicy == null ? null : cancellationPolicy.getPrimaryKey());
390        vendorValue.setReturnPolicyPK(returnPolicy == null ? null : returnPolicy.getPrimaryKey());
391        vendorValue.setApGlAccountPK(apGlAccount == null ? null : apGlAccount.getPrimaryKey());
392        vendorValue.setHoldUntilComplete(Boolean.valueOf(edit.getHoldUntilComplete()));
393        vendorValue.setAllowBackorders(Boolean.valueOf(edit.getAllowBackorders()));
394        vendorValue.setAllowSubstitutions(Boolean.valueOf(edit.getAllowSubstitutions()));
395        vendorValue.setAllowCombiningShipments(Boolean.valueOf(edit.getAllowCombiningShipments()));
396        vendorValue.setRequireReference(Boolean.valueOf(edit.getRequireReference()));
397        vendorValue.setAllowReferenceDuplicates(Boolean.valueOf(edit.getAllowReferenceDuplicates()));
398        vendorValue.setReferenceValidationPattern(edit.getReferenceValidationPattern());
399
400        partyDetailValue.setPreferredLanguagePK(preferredLanguage == null ? null : preferredLanguage.getPrimaryKey());
401        partyDetailValue.setPreferredTimeZonePK(preferredTimeZone == null ? null : preferredTimeZone.getPrimaryKey());
402        partyDetailValue.setPreferredDateTimeFormatPK(preferredDateTimeFormat == null ? null : preferredDateTimeFormat.getPrimaryKey());
403        partyDetailValue.setPreferredCurrencyPK(preferredCurrency == null ? null : preferredCurrency.getPrimaryKey());
404
405        if(name != null) {
406            if(partyGroup != null) {
407                var partyGroupValue = partyControl.getPartyGroupValue(partyGroup);
408
409                partyGroupValue.setName(name);
410                partyControl.updatePartyGroupFromValue(partyGroupValue, updatedBy);
411            } else {
412                partyControl.createPartyGroup(party, name, updatedBy);
413            }
414        } else {
415            if(partyGroup != null) {
416                partyControl.deletePartyGroup(partyGroup, updatedBy);
417            }
418        }
419
420        if(personalTitle != null || firstName != null || middleName != null || lastName != null || nameSuffix != null) {
421            if(person != null) {
422                var personValue = partyControl.getPersonValue(person);
423
424                personValue.setPersonalTitlePK(personalTitle == null ? null : personalTitle.getPrimaryKey());
425                personValue.setFirstName(firstName);
426                personValue.setFirstNameSdx(firstNameSdx);
427                personValue.setMiddleName(middleName);
428                personValue.setMiddleNameSdx(middleNameSdx);
429                personValue.setLastName(lastName);
430                personValue.setLastNameSdx(lastNameSdx);
431                personValue.setNameSuffixPK(nameSuffix == null ? null : nameSuffix.getPrimaryKey());
432                partyControl.updatePersonFromValue(personValue, updatedBy);
433            } else {
434                partyControl.createPerson(party, personalTitle, firstName, firstNameSdx, middleName,
435                        middleNameSdx, lastName, lastNameSdx, nameSuffix, updatedBy);
436            }
437        } else {
438            if(person != null) {
439                partyControl.deletePerson(person, updatedBy);
440            }
441        }
442
443        vendorControl.updateVendorFromValue(vendorValue, updatedBy);
444        partyControl.updatePartyFromValue(partyDetailValue, updatedBy);
445    }
446
447}