Multivers Extended V3 - Customer Update
This document describes the process of synchronizing customer data from Multivers Extended V3 to the App4Sales platform. The process updates customer core information, addresses, contact persons, and related commercial settings like price lists and discounts.
Data Source Configuration
The connector retrieves customer data from the Multivers Extended V3 API. The specific endpoints and filters used are managed within the connector's services and are not directly configurable by administrators.
Data Mapping
Customer
App4Sales Field | Source Field (API/Excel/DB) | Logic/Notes |
CustomerCode | Debtor.DebtorId | Unique identifier for the customer. |
CustomerName | Organisation.Name | The name of the customer's organization. |
Debtor.ElectronicMail | The primary email address of the customer. Whitespace is trimmed. | |
Phone | Debtor.Telephone | The primary phone number of the customer. |
Fax | Debtor.Fax | The fax number of the customer. |
LanguageCode | Organisation.LanguageId | Mapped to App4Sales language codes via the `MappedLanguages` table. |
VatCode | Debtor.VatNumber | The customer's VAT number. This field is cleared for USA administrations. |
VatLiable | Debtor.VatLiability | Indicates if the customer is liable for VAT. Set to `false` for USA administrations. |
PaymentConditionCode | Debtor.PaymentConditionId | The code for the customer's payment condition. If empty, it's set to null to prevent foreign key issues. |
UsesPriceField | Debtor.PriceListId | The ID of the standard price list used by the customer. Migrated to a deduplicated pricelist if `EnablePriceDeduplication` is active. Defaults to `1` if the original pricelist is not found. |
ActionPriceList | Debtor.PromotionPriceListId | The ID of the action/promotional price list. Also migrated if `EnablePriceDeduplication` is active. Can be set to a default value using the `DefaultActionPriceListCode` setting. |
CreditLimit | Debtor.CreditLimit | The customer's credit limit. |
IsBlocked | Debtor.Blocked | Indicates if the customer is blocked. |
FreeFields | FreeFieldList | A list of free fields, serialized into an XML string. Can also be populated from `extraCustomerData`. |
ItemFilter | extraCustomerData | Generated from `extraCustomerData` if `CustomerItemFilter` setting is enabled. It's constructed based on columns prefixed with `ItemFilter_`. |
CustomerNote | - | A single note from the backoffice is stored. Existing notes are deleted and recreated. |
CustomerDashboard | - | Dashboard layouts are decoded from Base64 and stored separately. The original field on the customer object is cleared. |
Address
App4Sales Field | Source Field (API/Excel/DB) | Logic/Notes |
AddressType | OrganisationAddress.AddressType | Can be 'Visit', 'Delivery', 'Invoice', etc. If only one of 'Visit' or 'Delivery' exists, the other is created as a copy. Defaults to 'Visit' if empty. |
AddressLine1 | OrganisationAddress.AddressLine1 | The first line of the address. It can be parsed into Street, Number, and Addition if `AddressLine` is null. |
City | OrganisationAddress.City | The city of the address. |
Zipcode | OrganisationAddress.PostalCode | The postal code of the address. |
Country | OrganisationAddress.CountryId | The country of the address. |
Iso2 | OrganisationAddress.CountryId | The 2-letter ISO code of the country. Mapped via `MappedCountries` table. If not found, a lookup is performed based on the country name. |
OrganisationAddress.Email | Email address for the address. Unicode unit separator characters are removed. Inherits from the main customer email if it's a main address and the field is empty. | |
IsMainAddress | - | The first 'Visit' and 'Delivery' address in the list are marked as the main address for their respective types if no main address is specified. |
Contact Person
App4Sales Field | Source Field (API/Excel/DB) | Logic/Notes |
FullName | Person.DisplayName | The full name of the contact person. If not provided, it's constructed from FirstName, MiddleName, and LastName. |
FirstName | - | Parsed from FullName if not provided. |
LastName | - | Parsed from FullName if not provided. |
Person.Email | The email address of the contact person. Whitespace is trimmed. | |
IsMainContactPerson | - | Determined by the `MainContactPerson` on the customer object. If not specified, the first contact in the list is marked as the main contact. |
PasswordWebshop | - | Set to null when running in Updater mode to prevent overwriting existing passwords. |
DynamicFreeFields | - | Converted to a standard XML format for extra fields. |
Discounts
App4Sales Field | Source Field (API/Excel/DB) | Logic/Notes |
CustomerGuid | - | The GUID of the customer the discount belongs to. |
ItemClassId | DiscountsPerItemCLassValue | The ID of the item class the discount applies to. |
ItemClassValue | DiscountsPerItemCLassValue | The specific value within the item class the discount applies to. |
discount | DiscountsPerItemCLassValue | The discount percentage. Only discounts with a value greater than 0 are stored. |
Special Logic & Filters
Customers with an empty `CustomerName` or `CustomerCode` are considered invalid and skipped.
The process runs in batches of 100 customers to manage memory and performance.
The connector can reactivate previously deleted customers by reusing their `CustomerGuid`.
Before processing, a `BeforeUpdateCustomers` script can be executed. After processing, an `UpdateCustomers` script is executed.
When `extraCustomerData` is provided (e.g., from an FTP/CSV file), it can overwrite existing customer fields based on matching property names.
Domain Specifics
Customer Core Fields
The connector synchronizes core customer data, including identity, commercial settings, and status flags. It ensures that essential fields are present and correctly formatted. VAT-related information is cleared for administrations located in the USA.
Addresses
Address information is normalized to ensure data quality. This includes parsing address lines, mapping country codes, and ensuring that both 'Visit' and 'Delivery' addresses are present, creating a copy of one if the other is missing. The main address for each type is also determined and flagged.
Contacts
Contact persons are linked to their respective customers. The connector can parse full names into first and last names and determines a main contact person for each customer. Passwords for contact persons are not updated when the synchronization runs in Updater mode.
Extra Data & Free Fields
The system allows for extending customer data through an `extraCustomerData` source. This data can overwrite standard fields or be used to create custom free fields and fixed item filters for customers. Item filters are constructed from columns with names starting with `ItemFilter_`.
Discounts & Dashboards
Customer-specific discounts for item class values are synchronized, but only if the discount percentage is greater than zero. Customer-specific dashboards are also processed; the Base64-encoded dashboard data is stored, and the field on the customer object is cleared to save memory.
Related Settings & Prerequisites
DefaultActionPriceListCode: If a customer does not have an action price list, this setting can be used to assign a default one.
EnablePriceDeduplication: When enabled, the connector migrates customers to use deduplicated price lists.
CustomerItemFilter: If enabled, the connector will process `extraCustomerData` to create fixed item filters for customers.
AllowedDebtorCodes: A comma-separated list of debtor codes that should be exclusively synchronized.
SkipInactiveCustomersDuringSync: If enabled, inactive customers will be skipped during the synchronization process.