Work in progress - Customer Address¶
Each customer need to provide an address while registering, but it's possible add and manage additional addresses. These customer addresses are used for payment or shipping and can be selected in the checkout process.
The following sections describe the model, use cases, business rules, and events.
Aggregate root and domain model¶
The aggregate root Gambio\Admin\Modules\Customer\Submodules\Address\Model\CustomerAddress provides information like street name,
house number, city, and similar. Addresses can be marked as default shipping or payment addresses.
Use cases using read service¶
Fetching all or a specific customer address¶
/** $readService \Gambio\Admin\Modules\Customer\Submodules\Address\Services\CustomerAddressReadService **/
$allCustomerAddresses = $readService->getAllCustomerAddresses();
$allCustomersAddresses = $readService->getCustomerAddressesByCustomerId(1);
$specificCustomerAddress = $readService->getCustomerAddressById(1);
$defaultPaymentAddress = $readService->getDefaultPaymentAddressByCustomerId(1);
$defaultShippingAddress = $readService->getDefaultShippingAddressByCustomerId(1);
Use cases using write service¶
Updating the personal details¶
/** $readService \Gambio\Admin\Modules\Customer\Submodules\Address\Services\CustomerAddressReadService **/
/** $writeService \Gambio\Admin\Modules\Customer\Submodules\Address\Services\CustomerAddressWriteService **/
/** $factory \Gambio\Admin\Modules\Customer\Submodules\Address\Services\CustomerAddressFactory **/
$gender = 'm'; // or $gender = \Gambio\Admin\Modules\Customer\Submodules\Address\Model\CustomerAddress::GENDER_MALE;
$firstName = 'John';
$lastName = 'Doe';
$companyName = 'Gambio GmbH';
$personalDetails = $factory->createPersonalDetails($gender, $firstName, $lastName, $companyName);
$customerAddress = $readService->getCustomerAddressById(1);
$customerAddress->updatePersonalDetails($personalDetails);
$writeService->storeCustomerAddresses($customerAddress);
// Method can handle multiple customer addresses like:
// $writeService->storeCustomerAddresses($customerAddress1, $customerAddress2, $customerAddress3);
Updating the location details¶
/** $readService \Gambio\Admin\Modules\Customer\Submodules\Address\Services\CustomerAddressReadService **/
/** $writeService \Gambio\Admin\Modules\Customer\Submodules\Address\Services\CustomerAddressWriteService **/
/** $factory \Gambio\Admin\Modules\Customer\Submodules\Address\Services\CustomerAddressFactory **/
$street = 'Parallelweg';
$houseNumber = '30';
$additionalInfo = '';
$suburb = '';
$postcode = '28217';
$city = 'Bremen';
$state = 'Bremen';
$countryId = 81;
$zoneId = 1355;
$locationDetails = $factory->createLocationDetails(
$street,
$houseNumber,
$additionalInfo,
$suburb,
$postcode,
$city,
$state,
$countryId,
$zoneId
);
$customerAddress = $readService->getCustomerAddressById(1);
$customerAddress->updateLocationDetails($personalDetails);
$writeService->storeCustomerAddresses($customerAddress);
// Method can handle multiple customer addresses like:
// $writeService->storeCustomerAddresses($customerAddress1, $customerAddress2, $customerAddress3);
Mark as default payment address¶
/** $readService \Gambio\Admin\Modules\Customer\Submodules\Address\Services\CustomerAddressReadService **/
/** $writeService \Gambio\Admin\Modules\Customer\Submodules\Address\Services\CustomerAddressWriteService **/
/** $factory \Gambio\Admin\Modules\Customer\Submodules\Address\Services\CustomerAddressFactory **/
$customerAddress = $readService->getCustomerAddressById(1);
$customerAddress->setAsPaymentDefaultAddress();
$writeService->storeCustomerAddresses($customerAddress);
// Method can handle multiple customer addresses like:
// $writeService->storeCustomerAddresses($customerAddress1, $customerAddress2, $customerAddress3);
Mark as default shipping address¶
/** $readService \Gambio\Admin\Modules\Customer\Submodules\Address\Services\CustomerAddressReadService **/
/** $writeService \Gambio\Admin\Modules\Customer\Submodules\Address\Services\CustomerAddressWriteService **/
/** $factory \Gambio\Admin\Modules\Customer\Submodules\Address\Services\CustomerAddressFactory **/
$customerAddress = $readService->getCustomerAddressById(1);
$customerAddress->setAsShippingDefaultAddress();
$writeService->storeCustomerAddresses($customerAddress);
// Method can handle multiple customer addresses like:
// $writeService->storeCustomerAddresses($customerAddress1, $customerAddress2, $customerAddress3);
Creating a new customer address¶
/** $writeService \Gambio\Admin\Modules\Customer\Submodules\Address\Services\CustomerAddressWriteService **/
/** $factory \Gambio\Admin\Modules\Customer\Submodules\Address\Services\CustomerAddressFactory **/
$gender = 'm'; // or $gender = \Gambio\Admin\Modules\Customer\Submodules\Address\Model\CustomerAddress::GENDER_MALE;
$firstName = 'John';
$lastName = 'Doe';
$companyName = 'Gambio GmbH';
$street = 'Parallelweg';
$houseNumber = '30';
$additionalInfo = '';
$suburb = '';
$postcode = '28217';
$city = 'Bremen';
$state = 'Bremen';
$countryId = 81;
$zoneId = 1355;
$customerId = 1;
$personalDetails = $factory->createPersonalDetails($gender, $firstName, $lastName, $companyName);
$locationDetails = $factory->createLocationDetails(
$street, $houseNumber, $additionalInfo, $suburb,
$postcode, $city, $state, $countryId, $zoneId
);
$id = $writeService->createCustomerAddress($customerID, $personalDetails, $locationDetails);
Creating multiple customer addresses at once¶
You can create multiple customer addresses at once if you provide all needed information as an array.
/** $writeService \Gambio\Admin\Modules\Customer\Submodules\Address\Services\CustomerAddressWriteService **/
/** $factory \Gambio\Admin\Modules\Customer\Submodules\Address\Services\CustomerAddressFactory **/
$genders = ['m', 'w'];
$firstNames = ['John', 'Jane'];
$lastNames = ['Doe', 'Doe'];
$companyNames = ['Gambio GmbH', 'Gambio GmbH'];
$streets = ['Parallelweg', 'Parallelweg'];
$houseNumbers = ['30', '30'];
$additionalInfos = ['', ''];
$suburbs = ['', ''];
$postcodes = ['28217', '28217'];
$citys = ['Bremen', 'Bremen'];
$states = ['Bremen', 'Bremen'];
$countryIds = [81, 81];
$zoneIds = [1355, 1355];
$customerIds = [1, 1];
$personalDetails = [
$factory->createPersonalDetails($genders[0], $firstNames[0], $lastNames[0], $companyNames[0]),
$factory->createPersonalDetails($genders[1], $firstNames[1], $lastNames[1], $companyNames[1]),
];
$locationDetails = [
$factory->createLocationDetails(
$streets[0], $houseNumbers[0], $additionalInfos[0], $suburbs[0],
$postcodes[0], $citys[0], $states[0], $countryIds[0], $zoneIds[0]
),
$factory->createLocationDetails(
$streets[1], $houseNumbers[1], $additionalInfos[1], $suburbs[1],
$postcodes[1], $citys[1], $states[1], $countryIds[1], $zoneIds[1]
),
];
$ids = $writeService->createMultipleCustomerAddresses(
[$customerIds[0], $personalDetails[0], $locationDetails[0]],
[$customerIds[1], $personalDetails[1], $locationDetails[1]]
);
Delete customer addresses¶
/** $writeService \Gambio\Admin\Modules\Customer\Submodules\Address\Services\CustomerAddressWriteService **/
$id = 1;
$writeService->deleteCustomerAddresses($id);
// Method can handle multiple IDs like: $writeService->deleteCustomerAddresses($id1, $id2, $id3);
Use cases using filter service¶
Filter all customer addresses including sorting and pagination¶
/** $filterService \Gambio\Admin\Modules\Customer\Submodules\Address\Services\CustomerAddressFilterService **/
$filters = [
'companyNames' => '*Gambio*', // Company name contains "Gambio"
];
$sorting = '-createdOn'; // In descending order of creation date
$limit = 25;
$offset = 0;
$filteredCustomerAddresses = $filterService->filterCustomerAddresses($filters, $sorting, $limit, $offset);
$totalCountOfFilteredCustomerAddresses = $filterService->getCustomerAddressesTotalCount($filters);
Filtering¶
The filter array that is given to the filter service maps the attributes of the customer address and the filtering term.
The assigned string (e.g. get|2020-01-01) always contains the comparison value, but it also may contain an
operation (e.g. gte for greater than or equals to). Leaving the operation (e.g. 2020-01-01) will be the same
as using equals to (eq).
The following table shows all attributes and the operations that can be used on them.
like (*) |
equals to (eq) |
lower than (lt) |
lower than or equals to (lte) |
greater than (gt) |
greater than or equals to (gte) |
|
|---|---|---|---|---|---|---|
id |
X | X | X | X | X | |
customerId |
X | X | X | X | X | |
isPaymentDefault |
X | |||||
isShippingDefault |
X | |||||
personal.gender |
X | X | ||||
personal.firstName |
X | X | ||||
personal.lastName |
X | X | ||||
personal.companyName |
X | X | ||||
location.street |
X | X | ||||
location.houseNumber |
X | X | ||||
location.additionalInfo |
X | X | ||||
location.suburb |
X | X | ||||
location.postcode |
X | X | ||||
location.city |
X | X | ||||
location.state |
X | X | ||||
location.countryId |
X | X | ||||
location.zoneId |
X | X | ||||
createdOn |
X | X | X | X | X | |
lastModified |
X | X | X | X | X |
Sorting¶
To change the sorting, you can provide a string that describes the sorting order. The string must contain the
attributes used for sorting. If there is a minus (-) in front of the attribute, it will be sorted in descending
order. You can use multiple attributes to change the sorting order by linking them with a comma (,).
Business rules¶
- Minimal length of attributes (first name, street, etc.) is determined by the general shop configurations.
ENTRY_CITY_MIN_LENGTHENTRY_COMPANY_MIN_LENGTHENTRY_FIRST_NAME_MIN_LENGTHENTRY_HOUSENUMBER_MIN_LENGTHENTRY_LAST_NAME_MIN_LENGTHENTRY_PASSWORD_MIN_LENGTHENTRY_POSTCODE_MIN_LENGTHENTRY_STATE_MIN_LENGTHENTRY_STREET_ADDRESS_MIN_LENGTHENTRY_TELEPHONE_MIN_LENGTH- Each customer can only have one default payment and shipping address.
- The attribute gender can only be used, if the configuration
ACCOUNT_ADDITIONAL_INFOis enabled. - The attribute state can only be used, if the configuration
ACCOUNT_STATEis enabled. - The attribute suburb can only be used, if the configuration
ACCOUNT_SUBURBis enabled. - The attribute suburb can only be used, if the configuration
ACCOUNT_SUBURBis enabled. - The attributes street and house number are splitted, if the configuration
ACCOUNT_SPLIT_STREET_INFORMATIONis enabled.
Domain events¶
| Event | Description |
|---|---|
Gambio\Admin\Modules\Customer\Submodules\Address\Model\Events\CustomerAddressCreated |
Will be raised if a customer address has been created. |
Gambio\Admin\Modules\Customer\Submodules\Address\Model\Events\CustomerAddressDeleted |
Will be raised if a customer address has been removed. |
Gambio\Admin\Modules\Customer\Submodules\Address\Model\Events\CustomersPaymentMarkedAsDefaultAddress |
Will be raised if a customer address has been marked as payment default address. |
Gambio\Admin\Modules\Customer\Submodules\Address\Model\Events\CustomersShippingMarkedAsDefaultAddress |
Will be raised if a customer address has been marked as shipping default address. |
Gambio\Admin\Modules\Customer\Submodules\Address\Model\Events\CustomerAddressLocationDetailsUpdate |
Will be raised if the location details has been updated. |
Gambio\Admin\Modules\Customer\Submodules\Address\Model\Events\CustomerAddressPersonalDetailsUpdate |
Will be raised if the personal details has been updated. |