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