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