diff --git a/_includes/pbc/all/install-features/202400.0/install-the-cart-notes-feature.md b/_includes/pbc/all/install-features/202400.0/install-the-cart-notes-feature.md new file mode 100644 index 00000000000..bc823a4b08f --- /dev/null +++ b/_includes/pbc/all/install-features/202400.0/install-the-cart-notes-feature.md @@ -0,0 +1,84 @@ + + +{% info_block errorBox %} + +This feature integration guide expects the basic feature to be in place. +The current feature integration guide adds the Cart Notes Backend API functionality. + +{% endinfo_block %} + +## Prerequisites + +To start feature integration, integrate the required feature: + +| NAME | VERSION | INTEGRATE GUIDE | +|------------------|------------------|----------------------------------------------------------------------------------------------------------------------------------------------| +| Order Management | {{page.version}} | [Order Management feature integration](/docs/scos/dev/feature-integration-guides/{{page.version}}/install-the-order-management-feature.html) | + +## 1) Install the required modules using Composer + +```bash +composer require spryker/cart-notes-backend-api:^0.1.0 --update-with-dependencies +``` + +Ensure that the following modules have been installed: + +| MODULE | EXPECTED DIRECTORY | +|-----------------------|-----------------------------------------| +| CartNotesBackendApi | vendor/spryker/cart-notes-backend-api | + +## 2) Set up transfer objects + +Generate transfers: + +```bash +console transfer:generate +``` + +{% info_block warningBox "Verification" %} + +Make sure that the following changes have been triggered in transfer objects: + +| TRANSFER | TYPE | EVENT | PATH | +|------------------------------|----------|---------|------------------------------------------------------------------| +| OrdersBackendApiAttributes.cartNote | property | created | src/Generated/Shared/Transfer/OrdersBackendApiAttributesTransfer | + +{% endinfo_block %} + +## 3) Set up behavior + +1. Enable the following behaviors by registering the plugins: + +| PLUGIN | SPECIFICATION | PREREQUISITES | NAMESPACE | +|------------------------------------------|------------------------------------------------------------------------|---------------|---------------------------------------------------------------| +| CartNoteOrdersBackendApiAttributesMapperPlugin | Expands `OrdersBackendApiAttributes.cartNote` with `Order.cartNote` property. | | Spryker\Glue\CartNotesBackendApi\Plugin\SalesOrdersBackendApi | + +**src/Pyz/Glue/SalesOrdersBackendApi/SalesOrdersBackendApiDependencyProvider.php** + +```php + + */ + protected function getOrdersBackendApiAttributesMapperPlugins(): array + { + return [ + new CartNoteOrdersBackendApiAttributesMapperPlugin(), + ]; + } +} +``` + +{% info_block warningBox "Verification" %} + +Make sure that `sales-orders` resources from `SalesOrdersBackendApiResource::getOrderResourceCollection()` results contain cart note data: `OrderResourceCollectionTransfer.orderResources.attributes.cartNote` are set for the orders that have cart notes. + +{% endinfo_block %} \ No newline at end of file diff --git a/_includes/pbc/all/install-features/202400.0/install-the-order-management-feature.md b/_includes/pbc/all/install-features/202400.0/install-the-order-management-feature.md new file mode 100644 index 00000000000..4a4150cd43d --- /dev/null +++ b/_includes/pbc/all/install-features/202400.0/install-the-order-management-feature.md @@ -0,0 +1,1316 @@ + + + +This document describes how to integrate the [Order Management](/docs/scos/user/features/{{page.version}}/order-management-feature-overview/order-management-feature-overview.html) feature into a Spryker project. + +{% info_block warningBox "Included features" %} + +The following feature integration guide expects the basic feature to be in place. It only adds the following functionalities: + +- Order cancellation behavior +- Show `display names` for order item states +- Invoice generation +- Custom order reference +- Sales Orders Backend API + +{% endinfo_block %} + + +## Install feature core + +Follow the steps below to install the Order Management feature core. + +### Prerequisites + +Install the required features: + +| NAME | VERSION | INTEGRATION GUIDE | +|---|---|---| +| Spryker Core | {{page.version}} | [Spryker Core feature integration](/docs/pbc/all/miscellaneous/{{page.version}}/install-and-upgrade/install-features/install-the-spryker-core-feature.html)| +| Mailing and Notifications | {{page.version}} | [Mailing and notifications feature integration](/docs/scos/dev/feature-integration-guides/{{page.version}}/mailing-and-notifications-feature-integration.html) +| Order Management | {{page.version}} | [Order Management feature integration](/docs/pbc/all/order-management-system/{{page.version}}/base-shop/install-and-upgrade/install-features/install-the-order-management-feature.html) +| Persistent Cart | {{page.version}} | | + +### 1) Install the required modules using Composer + +```bash +composer require spryker-feature/order-management: "{{page.version}}" --update-with-dependencies +``` + +{% info_block warningBox "Verification" %} + +Make sure that the following modules have been installed: + +| MODULE | EXPECTED DIRECTORY | +|-------------------------|-------------------------------------------| +| OrderCustomReference | vendor/spryker/order-custom-reference | +| OrderCustomReferenceGui | vendor/spryker/order-custom-reference-gui | +| SalesOrdersBackendApi | vendor/spryker/sales-orders-backend-api | + + {% endinfo_block %} + +## 2) Set up database schema and transfer objects + +Apply database changes and generate transfer changes: + +```bash +console transfer:generate +console propel:install +``` + +{% info_block warningBox "Verification" %} + +Make sure that the following changes have been applied in the database: + +| DATABASE ENTITY | TYPE | EVENT | +|----------------------------------------|--------|---------| +| spy_sales_order_invoice | table | created | +| spy_sales_order.order_custom_reference | column | created | + +Make sure that the following changes have been applied in transfer objects: + +| TRANSFER | TYPE | EVENT | PATH | +|---------------------------------------------------|----------|---------|--------------------------------------------------------------------| +| OrderInvoice | class | created | src/Generated/Shared/Transfer/OrderInvoiceTransfer | +| OrderInvoiceSendRequest | class | created | src/Generated/Shared/Transfer/OrderInvoiceSendRequestTransfer | +| OrderInvoiceSendResponse | class | created | src/Generated/Shared/Transfer/OrderInvoiceSendResponseTransfer | +| OrderInvoiceCriteria | class | created | src/Generated/Shared/Transfer/OrderInvoiceCriteriaTransfer | +| OrderInvoiceCollection | class | created | src/Generated/Shared/Transfer/OrderInvoiceCollectionTransfer | +| OrderInvoiceResponse | class | created | src/Generated/Shared/Transfer/OrderInvoiceResponseTransfer | +| OrderCustomReferenceResponse | class | created | src/Generated/Shared/Transfer/OrderCustomReferenceResponseTransfer | +| OrdersBackendApiAttributes | class | created | src/Generated/Shared/Transfer/OrdersBackendApiAttributesTransfer | +| OrderResourceCollection | class | created | src/Generated/Shared/Transfer/OrderResourceCollectionTransfer | +| Mail.recipientBccs | property | created | src/Generated/Shared/Transfer/MailTransfer | +| Quote.orderCustomReference | property | created | src/Generated/Shared/Transfer/QuoteTransfer | +| QuoteUpdateRequestAttributes.orderCustomReference | property | created | src/Generated/Shared/Transfer/QuoteUpdateRequestAttributesTransfer | +| Order.orderCustomReference | property | created | src/Generated/Shared/Transfer/OrderTransfer | + +{% endinfo_block %} + +### 3) Set up configuration + +Set up the following configuration. + +#### Configure OMS + +{% info_block infoBox %} + +- The `cancellable` flag allows proceeding to the `order cancel` process. +- The `display` attribute allows attaching the `display name` attribute to specific order item states. +- The `DummyInvoice` sub-process allows triggering `invoice-generate` events. + +{% endinfo_block %} + +1. Create the OMS sub-process file: + +
+ config/Zed/oms/DummySubprocess/DummyInvoice01.xml + +```xml + + + + + + + + + + + confirmed + invoice generated + invoice-generate + + + + invoice generated + waiting + invoice-generated + + + + + + + + + + +``` +
+ +{% info_block warningBox "Verification" %} + +Verify the invoice state machine configuration in the following step. + +{% endinfo_block %} + +2. Using the following process as an example, adjust your OMS state-machine configuration according to your project's requirements. + +
config/Zed/oms/DummyPayment01.xml + +```xml + + + + + + + DummyInvoice + + + + + cancellable + + + cancellable + + + exclude from customer + + + exclude from customer + + + cancellable + + + cancellable + + + + + + + + + + + new + payment pending + authorize + + + + new + invalid + authorize + + + + new + cancelled + cancel + + + + payment pending + paid + pay + + + + payment pending + cancelled + pay + + + + payment pending + cancelled + cancel + + + + paid + confirmed + confirm + + + + confirmed + waiting + skip timeout + + + + confirmed + cancelled + cancel + + + + waiting + exported + check giftcard purchase + + + + waiting + gift card purchased + check giftcard purchase + + + + gift card shipped + delivered + complete gift card creation + + + + exported + shipped + ship + + + + shipped + delivered + stock-update + + + + delivered + closed + close + + + + + + + + + + + + + + + + + + + + +``` +
+ +{% info_block warningBox "Verification" %} + +Ensure that you've configured OMS: + +1. In the Back Office, go to **Administration > OMS**. + +2. Select **DummyPayment01 [preview-version]** and check the following: + +- The `new`, `payment pending`, `paid`, and `confirmed` states keep the `cancellable` tag inside. +- The `invoice generated` state has been added. + +{% endinfo_block %} + +#### Configure the fallback display name prefix + +Adjust configuration according to your project's requirements: + +**src/Pyz/Zed/Oms/OmsConfig.php** + +```php +src/Pyz/Zed/SalesInvoice/Presentation/Invoice/Invoice.twig + +```twig +{%- raw -%} +{# @var order \Generated\Shared\Transfer\OrderTransfer #} +{# @var invoice \Generated\Shared\Transfer\OrderInvoiceTransfer #} + + + + + + + + + + + + + + + + + + + + + +
+ Logo + + {{ 'order_invoice.invoice_template.company.name' | trans }} +
{{ 'order_invoice.invoice_template.company.group' | trans }}
+
{{ 'order_invoice.invoice_template.company.address' | trans | raw }}
+
+
+ {{ 'order_invoice.invoice_template.merchant.name' | trans }} +
{{ 'order_invoice.invoice_template.merchant.address' | trans }}
+
+
+ {{ order.billingAddress.firstName }} {{ order.billingAddress.lastName }}
+ {{ order.billingAddress.address1 }} {{ order.billingAddress.address2 }} {{ order.billingAddress.address3 }}
+ {{ order.billingAddress.zipcode }} {{ order.billingAddress.city }}
+ {{ order.billingAddress.region }} +
+
+
{{ invoice.issueDate | date('d. M Y') }}
+
+ + + + + + + + +
+
+ {{ 'order_invoice.invoice_template.reference' | trans }} {{ invoice.reference }} +
+
+
{{ 'order_invoice.invoice_template.introduction' | trans }}
+
+ + + + + + + + + + + + + {% set linenumber = 0 %} + {% set renderedBundles = [] %} + {% set taxes = {} %} + {% set itemSumByTaxes = {} %} + + {% for item in order.items %} + {# @var item \Generated\Shared\Transfer\ItemTransfer #} + + {% set taxRate = item.taxRate %} + {% set rateSum = taxes[item.taxRate] | default(0) + item.sumTaxAmountFullAggregation %} + {% set taxes = taxes | merge({ (taxRate): rateSum }) %} + {% set rateItemSum = itemSumByTaxes[taxRate] | default(0) + item.sumPriceToPayAggregation %} + {% set itemSumByTaxes = itemSumByTaxes | merge({ (taxRate): rateItemSum }) %} + + {% if item.productBundle is not defined or item.productBundle is null %} + {% set linenumber = linenumber + 1 %} + + + + + + + + + {% endif %} + + {% if item.productBundle is defined and item.productBundle is not null %} + {% if item.relatedBundleItemIdentifier not in renderedBundles %} + {# @var productBundle \Generated\Shared\Transfer\ItemTransfer #} + + {% set linenumber = linenumber + 1 %} + {% set productBundle = item.productBundle %} + + + + + + + + + + {% for bundleditem in order.items %} + {% if item.relatedBundleItemIdentifier == bundleditem.relatedBundleItemIdentifier %} + + + + + + + + {% endif %} + {% endfor %} + + {% set renderedBundles = renderedBundles | merge([item.relatedBundleItemIdentifier]) %} + {% endif %} + {% endif %} + {% endfor %} + + {% for expense in order.expenses %} + {% set linenumber = linenumber + 1 %} + {% set taxRate = expense.taxRate %} + {% set rateSum = taxes[expense.taxRate] | default(0) + expense.sumTaxAmount %} + {% set taxes = taxes | merge({ (taxRate): rateSum }) %} + {% set rateItemSum = itemSumByTaxes[taxRate] | default(0) + expense.sumPriceToPayAggregation %} + {% set itemSumByTaxes = itemSumByTaxes | merge({ (taxRate): rateItemSum }) %} + + + + + + + + + {% endfor %} + + + + + + + + + + + + + {% for rate, tax in taxes %} + + + + + + + {% endfor %} + + + + + + + + + + + + +
{{ 'order_invoice.invoice_template.table.number' | trans }}{{ 'order_invoice.invoice_template.table.quantity' | trans }}{{ 'order_invoice.invoice_template.table.name' | trans }}{{ 'order_invoice.invoice_template.table.tax' | trans }}{{ 'order_invoice.invoice_template.table.price' | trans | raw }}
{{ linenumber }}{{ item.quantity }}{{ item.name }}{{ item.taxRate | number_format }}%{{ item.sumPriceToPayAggregation | money(true, order.currencyIsoCode) }}
{{ linenumber }}{{ productBundle.quantity }}{{ productBundle.name }}{{ productBundle.taxRate | number_format }}%{{ productBundle.sumPriceToPayAggregation | money(true, order.currencyIsoCode) }}
{{ bundleditem.quantity }}{{ bundleditem.name }}{{ bundleditem.taxRate | number_format }}%{{ bundleditem.sumPriceToPayAggregation | money(true, order.currencyIsoCode) }}
{{ linenumber }}{{ expense.name }}{{ expense.taxRate | number_format }}%{{ expense.sumPrice | money(true, order.currencyIsoCode) }}
{{ 'order_invoice.invoice_template.table.subtotal' | trans }}{{ order.totals.subtotal | money(true, order.currencyIsoCode) }}
{{ 'order_invoice.invoice_template.table.discount' | trans }}{{ order.totals.discountTotal | money(true, order.currencyIsoCode) }}
{{ 'order_invoice.invoice_template.table.tax.included' | trans({ '%tax_rate%': rate | number_format }) }}{{ (itemSumByTaxes[rate] - tax) | money(true, order.currencyIsoCode) }}{{ 'order_invoice.invoice_template.table.tax.name' | trans }}{{ tax | money(true, order.currencyIsoCode) }}
{{ 'order_invoice.invoice_template.table.total.net' | trans }}{{ (order.totals.grandTotal - order.totals.taxTotal.amount) | money(true, order.currencyIsoCode) }}
{{ 'order_invoice.invoice_template.table.grandtotal' | trans }}{{ order.totals.grandTotal | money(true, order.currencyIsoCode) }}
+ + +{% endraw %} +``` + + +{% info_block warningBox "Verification" %} + +You will be able to verify the invoice template configuration in a later step. + +{% endinfo_block %} + + +### 4) Add translations + + +{% info_block errorBox %} + +An `oms.state.` prefixed translation key is a combination of the `OmsConfig::getFallbackDisplayNamePrefix()` and a normalized state machine name. If you have different OMS state-machine states or a fallback display name prefix, adjust the corresponding translations. + +{% endinfo_block %} + + +{% info_block infoBox "Normalized state machine names" %} + +By default, in state machine names, the following applies: + +- Spaces are replaced with dashes. +- All the words are decapitalized. + +{% endinfo_block %} + +1. Append glossary according to your configuration: +
src/Pyz/Zed/Checkout/CheckoutDependencyProvider.php + +**src/data/import/glossary.csv** +```csv +sales.error.customer_order_not_found,Customer Order not found.,en_US +sales.error.customer_order_not_found,Die Bestellung wurde nicht gefunden.,de_DE +sales.error.order_cannot_be_canceled_due_to_wrong_item_state,Order cannot be canceled due to wrong item state.,en_US +sales.error.order_cannot_be_canceled_due_to_wrong_item_state,Die Bestellung kann wegen dem falschen Artikelstatus nicht storniert werden.,de_DE +oms.state.new,New,en_US +oms.state.new,Neu,de_DE +oms.state.payment-pending,Payment pending,en_US +oms.state.payment-pending,Ausstehende Zahlung,de_DE +oms.state.invalid,Ivalid,en_US +oms.state.invalid,Ungültig,de_DE +oms.state.canceled,Canceled,en_US +oms.state.canceled,Abgebrochen,de_DE +oms.state.paid,Paid,en_US +oms.state.paid,Bezahlt,de_DE +oms.state.confirmed,Confirmed,en_US +oms.state.confirmed,Bestätigt,de_DE +oms.state.waiting,Waiting,en_US +oms.state.waiting,Warten,de_DE +oms.state.exported,Exported,en_US +oms.state.exported,Exportiert,de_DE +oms.state.shipped,Shipped,en_US +oms.state.shipped,Versandt,de_DE +oms.state.delivered,Delivered,en_US +oms.state.delivered,Geliefert,de_DE +quote_request.status.closed,Closed,en_US +quote_request.status.closed,Geschlossen,de_DE +mail.order_invoice.subject,"Invoice: %invoiceReference%",en_US +mail.order_invoice.subject,"Rechnung: %invoiceReference%",de_DE +order_custom_reference.reference_saved,Custom order reference was successfully saved.,en_US +order_custom_reference.reference_saved,Ihre Bestellreferenz wurde erfolgreich gespeichert.,de_DE +order_custom_reference.reference_not_saved,Custom order reference has not been changed.,en_US +order_custom_reference.reference_not_saved,Ihre Bestellreferenz wurde nicht geändert.,de_DE +order_custom_reference.validation.error.message_invalid_length,Custom order reference length is invalid.,en_US +order_custom_reference.validation.error.message_invalid_length,Die Länge der Bestellreferenz ist ungültig.,de_DE +order_custom_reference.title,Custom Order Reference,en_US +order_custom_reference.title,Ihre Bestellreferenz,de_DE +order_custom_reference.form.placeholder,Add custom order reference,en_US +order_custom_reference.form.placeholder,Ihre Bestellreferenz hinzufügen,de_DE +order_custom_reference.save,Save,en_US +order_custom_reference.save,Speichern,de_DE +``` +
+ + 1. Import data: + +```bash +console data:import:glossary +``` + +{% info_block warningBox "Verification" %} + +Ensure that in the database, the configured data has been added to the `spy_glossary` table. + +{% endinfo_block %} + +### 5) Set up behavior + +Set up the following behaviors. + +#### Set up Order Item Display Name + +| PLUGIN | SPECIFICATION | PREREQUISITES | NAMESPACE | +|---------------------------------------------------|------------------------------------------------|---------------|----------------------------------------------| +| CurrencyIsoCodeOrderItemExpanderPlugin | Expands order items with currency codes (ISO). | | Spryker\Zed\Sales\Communication\Plugin\Sales | +| StateHistoryOrderItemExpanderPlugin | Expands order items with history states. | | Spryker\Zed\Oms\Communication\Plugin\Sales | +| ItemStateOrderItemExpanderPlugin | Expands order items with its item states. | | Spryker\Zed\Oms\Communication\Plugin\Sales | +| OrderAggregatedItemStateSearchOrderExpanderPlugin | Expands orders with aggregated item states. | | Spryker\Zed\Oms\Communication\Plugin\Sales | + + +
src/Pyz/Zed/Sales/SalesDependencyProvider.php + +```php + + */ + protected function getOrderItemExpanderPlugins(): array + { + return [ + new CurrencyIsoCodeOrderItemExpanderPlugin(), + new StateHistoryOrderItemExpanderPlugin(), + new ItemStateOrderItemExpanderPlugin(), + ]; + } + + /** + * @return list<\Spryker\Zed\SalesExtension\Dependency\Plugin\SearchOrderExpanderPluginInterface> + */ + protected function getSearchOrderExpanderPlugins(): array + { + return [ + new OrderAggregatedItemStateSearchOrderExpanderPlugin() + ]; + } +} +``` +
+ +{% info_block warningBox "Verification" %} + +- Make sure that every order item from the `SalesFacade::getOrderItems()` result contains the following: + - Currency ISO code + - State history code + - Item state data +- Make sure that every order from the `SalesFacade::getCustomerOrders()` result contains aggregated item state data. + +{% endinfo_block %} + +### Set up order cancellation behavior + +| PLUGIN | SPECIFICATION | PREREQUISITES | NAMESPACE | +|----------------------------------------|-----------------------------------------------------|---------------|----------------------------------------------| +| IsCancellableOrderExpanderPlugin | Checks if each order item has the cancellable flag. | | Spryker\Zed\Sales\Communication\Plugin\Sales | +| IsCancellableSearchOrderExpanderPlugin | Checks if each order item has the cancellable flag. | | Spryker\Zed\Oms\Communication\Plugin\Sales | + + +
src/Pyz/Zed/Sales/SalesDependencyProvider.php + +```php + + */ + protected function getSearchOrderExpanderPlugins(): array + { + return [ + new IsCancellableSearchOrderExpanderPlugin(), + ]; + } + + /** + * @return list<\Spryker\Zed\SalesExtension\Dependency\Plugin\OrderExpanderPluginInterface> + */ + protected function getOrderHydrationPlugins(): array + { + return [ + new IsCancellableOrderExpanderPlugin(), + ]; + } +} +``` +
+ +{% info_block warningBox "Verification" %} + +Ensure that, on the following pages, each order contains the `isCancellable` flag: + +- The Storefront: + - *Order History* + - *Overview* +- The Back Office: + - *Overview of Orders* + +{% endinfo_block %} + +### Set up order invoice generation behavior + +Set up the following order invoice generation behaviors. + +#### Set up order invoice mail type + +Set up the following plugin: + +| PLUGIN | SPECIFICATION | PREREQUISITES | NAMESPACE | +|----------------------------|---------------------------------------------------------|---------------|----------------------------------------------------| +| OrderInvoiceMailTypePlugin | Email type that prepares an invoice email for an order. | | Spryker\Zed\SalesInvoice\Communication\Plugin\Mail | + + +
src/Pyz/Zed/Mail/MailDependencyProvider.php + +```php +extend(static::MAIL_TYPE_COLLECTION, function (MailTypeCollectionAddInterface $mailCollection) { + $mailCollection + ->add(new OrderInvoiceMailTypePlugin()); + + return $mailCollection; + }); + + return $container; + } +} +``` +
+ + +#### Set up an order invoice OMS command + +Set up the following plugin: + +| PLUGIN | SPECIFICATION | PREREQUISITES | NAMESPACE | +|-----------------------------------|----------------------------------------------------------------------------|---------------|---------------------------------------------------| +| GenerateOrderInvoiceCommandPlugin | A command in the OMS state machine that generates an invoice for an order. | | Spryker\Zed\SalesInvoice\Communication\Plugin\Oms | + + +
src/Pyz/Zed/Oms/OmsDependencyProvider.php + +```php +extend(static::COMMAND_PLUGINS, function (CommandCollectionInterface $commandCollection) { + $commandCollection->add(new GenerateOrderInvoiceCommandPlugin(), 'Invoice/Generate'); + return $commandCollection; + }); + + return $container; + } +} +``` +
+ +#### Set up an order invoice OMS command + +1. Set up the following plugin: + +| PLUGIN | SPECIFICATION | PREREQUISITES | NAMESPACE | +|-------------------------|---------------------------------------------------------------------|---------------|------------------------------------------------| +| OrderInvoiceSendConsole | A console command that sends not-yet-sent order invoices via email. | | Spryker\Zed\SalesInvoice\Communication\Console | + +**src/Pyz/Zed/Oms/OmsDependencyProvider.php** + +```php + + */ + protected function getConsoleCommands(Container $container): array + { + return [ + new OrderInvoiceSendConsole(), + ]; + } +} +``` + +2. Adjust the scheduler project configuration: + +**config/Zed/cronjobs/jenkins.php** + +```php +/* Order invoice */ +$jobs[] = [ + 'name' => 'order-invoice-send', + 'command' => '$PHP_BIN vendor/bin/console order:invoice:send', + 'schedule' => '*/5 * * * *', + 'enable' => true, + 'stores' => $allStores, +]; +``` + +3. Apply the scheduler configuration update: + +```bash +vendor/bin/console scheduler:suspend +vendor/bin/console scheduler:setup +vendor/bin/console scheduler:resume +``` + +{% info_block warningBox "Verification" %} + +Make sure that you've set up the invoice-related configuration: +1. Move at least one item in an order to the `invoice generated` state. +2. Make sure that, according to your `DummyInvoice01.xml` and `SalesInvoiceConfig::getOrderInvoiceTemplatePath()` configuration, the correct order invoice template has been assigned to the order (`spy_sales_order_invoice`). + +Then, place an order with an invoice and make sure that you receive an invoice within the time configured in the scheduler. + +{% endinfo_block %} + +### Set up a custom order reference workflow + +Enable the following behaviors by registering the plugins: + +| PLUGIN | SPECIFICATION | PREREQUISITES | NAMESPACE | +|---------------------------------------------------------------|-------------------------------------------------------------------------------------------|---------------|-------------------------------------------------------------| +| OrderCustomReferenceOrderPostSavePlugin | After an order is saved, persists `orderCustomReference` in the `spy_sales_order` schema. | | Spryker\Zed\OrderCustomReference\Communication\Plugin\Sales | +| OrderCustomReferenceQuoteFieldsAllowedForSavingProviderPlugin | Returns the `QuoteTransfer` fields related to a custom order reference. | | Spryker\Zed\OrderCustomReference\Communication\Plugin\Quote | + +**src/Pyz/Zed/Sales/SalesDependencyProvider.php** + +```php + + */ + protected function getOrderPostSavePlugins() + { + return [ + new OrderCustomReferenceOrderPostSavePlugin(), + ]; + } +} +``` + +**src/Pyz/Zed/Quote/QuoteDependencyProvider.php** + +```php + + */ + protected function getQuoteFieldsAllowedForSavingProviderPlugins(): array + { + return [ + new OrderCustomReferenceQuoteFieldsAllowedForSavingProviderPlugin(), + ]; + } +} +``` + +{% info_block warningBox "Verification" %} + +Log in and make sure that, at `zed.mysprykershop.com/sales/detail`, you can see the *Custom Order Reference* section with the **Edit Reference** button in the order details. + +{% endinfo_block %} + +### Set up order-saving plugins + +Set up the following plugins: + +| PLUGIN | SPECIFICATION | PREREQUISITES | NAMESPACE | +|-------------------------------|--------------------------------------------------|---------------|----------------------------------------------------| +| OrderSaverPlugin | Saves an order. | | Spryker\Zed\Sales\Communication\Plugin\Checkout | +| OrderTotalsSaverPlugin | Saves order totals. | | Spryker\Zed\Sales\Communication\Plugin\Checkout | +| SalesOrderShipmentSaverPlugin | Saves an order shipment. Adds shipment expenses. | | Spryker\Zed\Shipment\Communication\Plugin\Checkout | +| OrderItemsSaverPlugin | Saves order items. | | Spryker\Zed\Sales\Communication\Plugin\Checkout | + + +**src/Pyz/Zed/Checkout/CheckoutDependencyProvider.php** + +```php + + */ + protected function getCheckoutOrderSavers(Container $container) + { + return [ + new OrderSaverPlugin(), + new OrderTotalsSaverPlugin(), + new SalesOrderShipmentSavePlugin(), + new OrderItemsSaverPlugin(), + ]; + } +} +``` + +{% info_block warningBox "Verification" %} + +Make sure that, on the following Storefront pages, even if the `display` property is not set in the process definition, the item states are displayed correctly: + +- *Customer overview* +- *Order history* +- *Order details* +- *Returns* +- *Return details* + +{% endinfo_block %} + +## Install feature frontend + +Follow the steps below to install the Order Management feature frontend. + +### Prerequisites + +To start the feature integration, overview and install the necessary features. + +| NAME | VERSION | +|-----------------------------|------------------| +| Spryker Core | {{page.version}} | +| Cart | {{page.version}} | +| Checkout | {{page.version}} | +| Customer Account Management | {{page.version}} | + +### 1) Install the required modules using Composer + +```bash +composer require spryker-feature/order-management: "{{page.version}}" --update-with-dependencies +``` + +{% info_block warningBox "Verification" %} + +Make sure that the following modules have been installed: + +| MODULE | EXPECTED DIRECTORY | +|----------------------------|---------------------------------------------------| +| OrderCustomReferenceWidget | vendor/spryker-shop/order-custom-reference-widget | + +{% endinfo_block %} + +### 2) Add translations + +1. Append the glossary according to your configuration: + +``` +order_cancel_widget.cancel_order,Cancel Order,en_US +order_cancel_widget.cancel_order,Bestellung stornieren,de_DE +order_cancel_widget.order.cancelled,Order was canceled successfully.,en_US +order_cancel_widget.order.cancelled,Die Bestellung wurde erfolgreich storniert.,de_DE +``` + +2. Import data: + +```bash +console data:import:glossary +``` + +{% info_block warningBox "Verification" %} + +Ensure that in the database, the configured data has been added to the `spy_glossary` table. + +{% endinfo_block %} + +### 3) Enable controllers + +Register the following route provider on the Storefront: + +| PROVIDER | NAMESPACE | +|--------------------------------------|--------------------------------------------------| +| OrderCancelWidgetRouteProviderPlugin | SprykerShop\Yves\OrderCancelWidget\Plugin\Router | + +**src/Pyz/Yves/Router/RouterDependencyProvider.php** + +```php + + */ + protected function getRouteProvider(): array + { + return [ + new OrderCancelWidgetRouteProviderPlugin(), + ]; + } +} +``` + + +{% info_block warningBox "Verification" %} + +Ensure that the `yves.mysprykershop.com/order/cancel` route is available for POST requests. + +{% endinfo_block %} + +### 4) Set up behavior + +Set up the following behaviors. + +#### Set up an order cancellation behavior + +Set up the following plugin: + +| PLUGIN | SPECIFICATION | PREREQUISITES | NAMESPACE | +|-------------------------|----------------------------------------------|---------------|-------------------------------------------| +| OrderCancelButtonWidget | Displays the **Cancel** button on the Storefront. | | SprykerShop\Yves\OrderCancelWidget\Widget | + +**src/Pyz/Yves/ShopApplication/ShopApplicationDependencyProvider.php** + +```php + + */ + protected function getGlobalWidgets(): array + { + return [ + OrderCancelButtonWidget::class, + ]; + } +} +``` + +{% info_block warningBox "Verification" %} + +Ensure the following: + +- The `OrderCancelButtonWidget` widget has been registered. +- On the *Order Details* page on the Storefront, the **Cancel** button is displayed. +- In the *item state* table column on the *Customer Overview* and *Order History* pages on the Storefront, you can see the aggregated order item states. +- On the *Return Page* on the Storefront, aggregated return item states are displayed. +- On the *Order Detail* and *Return Detail* pages on the Storefront, item states are displayed. + +{% endinfo_block %} + +### 5) Enable a route provider plugin + +Register the route provider in the Yves application: + +| PROVIDER | NAMESPACE | +|-----------------------------------------------|-----------------------------------------------------------| +| OrderCustomReferenceWidgetRouteProviderPlugin | SprykerShop\Yves\OrderCustomReferenceWidget\Plugin\Router | + +**src/Pyz/Yves/Router/RouterDependencyProvider.php** + +```php + + */ + protected function getRouteProvider(): array + { + return [ + new OrderCustomReferenceWidgetRouteProviderPlugin(), + ]; + } +} +``` + +### 5) Set up widgets + +1. Register the following plugin to enable widgets: + +| PLUGIN | DESCRIPTION | PREREQUISITES | NAMESPACE | +|----------------------------|-------------------------------------------------------------|---------------|----------------------------------------------------| +| OrderCustomReferenceWidget | Edits and shows a custom order reference on the Storefront. | | SprykerShop\Yves\OrderCustomReferenceWidget\Widget | + +**src/Pyz/Yves/ShopApplication/ShopApplicationDependencyProvider.php** + +```php + + */ + protected function getGlobalWidgets(): array + { + return [ + OrderCustomReferenceWidget::class, + ]; + } +} +``` + +2. Enable Javascript and CSS changes: + +```bash +console frontend:yves:build +``` + +{% info_block warningBox "Verification" %} + +To make sure that you've registered the widget, log in as a customer on the Storefront and check that the **Custom order reference** form is present on the order view page. + +{% endinfo_block %} + +## Related features + +Integrate the following related features: + +| FEATURE | REQUIRED FOR THE CURRENT FEATURE | INTEGRATION GUIDE | +|--------------------------------------------------------------------|----------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| Comments + Order Management feature integration | | [Comments + Order Management feature integration](/docs/pbc/all/cart-and-checkout/{{page.version}}/base-shop/install-and-upgrade/install-features/install-the-comments-order-management-feature.html) | +| Glue API: Order Management feature integration | | [Glue API: Order Management feature integration](/docs/scos/dev/feature-integration-guides/{{page.version}}/glue-api/glue-api-order-management-feature-integration.html) | +| Company Account + Order Management feature integration | | [Company Account + Order Management feature integration](/docs/scos/dev/feature-integration-guides/{{page.version}}/company-account-order-management-feature-integration.html) | +| Product + Order Management feature integration | | [Product + Order Management feature integration](/docs/pbc/all/product-information-management/{{page.version}}/base-shop/install-and-upgrade/install-features/install-the-product-order-management-feature.html) | +| Customer Account Management + Order Management feature integration | | [Customer Account Management + Order Management feature integration](/docs/scos/dev/feature-integration-guides/{{page.version}}/customer-account-management-order-management-feature-integration.html) | +| Packaging Units feature integration | | [Packaging Units feature integration](/docs/pbc/all/product-information-management/{{page.version}}/base-shop/install-and-upgrade/install-features/install-the-packaging-units-feature.html) | +| Product + Order Management feature integration | | [Product + Order Management feature integration](/docs/pbc/all/product-information-management/{{page.version}}/base-shop/install-and-upgrade/install-features/install-the-product-order-management-feature.html) | +| Product Options + Order Management feature integration | | [Product Options + Order Management feature integration](/docs/pbc/all/product-information-management/{{page.version}}/base-shop/install-and-upgrade/install-features/install-the-product-options-order-management-feature.html) | diff --git a/_includes/pbc/all/install-features/202400.0/install-the-packaging-units-feature.md b/_includes/pbc/all/install-features/202400.0/install-the-packaging-units-feature.md new file mode 100644 index 00000000000..c0e3e1bf130 --- /dev/null +++ b/_includes/pbc/all/install-features/202400.0/install-the-packaging-units-feature.md @@ -0,0 +1,1138 @@ + + + +This document describes how to integrate the [Packaging Units](/docs/pbc/all/product-information-management/{{site.version}}/base-shop/feature-overviews/packaging-units-feature-overview.html) feature into a Spryker project. + +## Install feature core + +Follow the steps to install the Packaging Units feature core. + +### Prerequisites + +Install the required features: + +| NAME | VERSION | INTEGRATION GUIDE | +|---|---|---| +| Spryker Core | {{page.version}} | [Spryker Core feature integration](/docs/pbc/all/miscellaneous/{{site.version}}/install-and-upgrade/install-features/install-the-spryker-core-feature.html)| +| Order Management | {{site.version}} | [Order Management feature integration](/docs/scos/dev/feature-integration-guides/{{site.version}}/order-management-feature-integration.html) +| Inventory Management | {{site.version}} | [Inventory Management feature integration](docs/scos/dev/feature-integration-guides/{{site.version}}/install-the-inventory-management-feature.md) | +| Product | {{site.version}} | [Product feature integration](/docs/scos/dev/feature-integration-guides/{{site.version}}/product-feature-integration.html) | +| Measurement Units | {{page.version}} | [Install the Measurement Units feature](/docs/pbc/all/product-information-management/{{site.version}}/base-shop/install-and-upgrade/install-features/install-the-measurement-units-feature.html) | + +### 1) Install the required modules using Composer + +```bash +composer require spryker-feature/packaging-units:"{{page.version}}" --update-with-dependencies` +``` + +{% info_block warningBox "Verification" %} + +Make sure that the following modules have been installed: + +| MODULE | EXPECTED DIRECTORY | +|----------------------------------|----------------------------------------------------| +| ProductPackagingUnit | vendor/spryker/product-packaging-unit | +| ProductPackagingUnitDataImport | vendor/spryker/product-packaging-unit-data-import | +| ProductPackagingUnitStorage | vendor/spryker/product-packaging-unit-storage | +| ProductPackagingUnitsBackendApi | vendor/spryker/product-packaging-units-backend-api | + +{% endinfo_block %} + +### 2) Set up configuration + +Adjust synchronization queue pools in `src/Pyz/Zed/ProductPackagingUnitStorage/ProductPackagingUnitStorageConfig.php`: + +```php +Entity.spy_product_packaging_unit.update
Entity.spy_product_packaging_unit.delete | +| spy_product_packaging_unit_type | Entity.spy_product_packaging_unit_type.create
Entity.spy_product_packaging_unit_type.update
Entity.spy_product_packaging_unit_type.delete | + + +**src/Pyz/Zed/ProductPackagingUnit/Persistence/Propel/Schema/spy_product_packaging_unit.schema.xml** + +```xml + + + + + + + +
+ + + + + +
+
+``` + +2. Set up synchronization queue pools so non-multi-store entities (not store-specific entities) can be synchronized among stores: + +**src/Pyz/Zed/ProductPackagingUnitStorage/Persistence/Propel/Schema/spy_product_packaging_unit_storage.schema.xml** + +```xml + + + + + + + +
+ +
+``` + +3. Apply the database changes and generate entity and transfer changes: + +```bash +console propel:install +console transfer:generate +``` + +{% info_block warningBox "Verification" %} + +Make sure that the following changes have been applied by checking your database: + +| DATABASE ENTITY | TYPE | EVENT | +|----------------------------------------|--------|---------| +| spy_product_packaging_unit | table | created | +| spy_product_packaging_unit_type | table | created | +| spy_product_abstract_packaging_storage | table | created | +| spy_sales_order_item.amount | column | created | +| spy_sales_order_item.amount_sku | column | created | + +Make sure that the following changes in transfer objects have been applied: + +| TRANSFER | TYPE | EVENT | PATH | +|----------------------------------------------------------|----------|---------|----------------------------------------------------------------------------------------| +| ProductPackagingUnitTransfer | class | created | src/Generated/Shared/Transfer/ProductPackagingUnitTransfer | +| ProductPackagingUnitAmountTransfer | class | created | src/Generated/Shared/Transfer/ProductPackagingUnitAmountTransfer | +| ProductPackagingUnitStorageTransfer | class | created | src/Generated/Shared/Transfer/ProductPackagingUnitStorageTransfer | +| ProductConcretePackagingStorageTransfer | class | created | src/Generated/Shared/Transfer/ProductConcretePackagingStorageTransfer | +| ProductPackagingUnitTypeTransfer | class | created | src/Generated/Shared/Transfer/ProductPackagingUnitType | +| ProductPackagingUnitTypeTranslationTransfer | class | created | src/Generated/Shared/Transfer/ProductPackagingUnitTypeTranslation | +| ProductConcreteAvailabilityTransfer | class | created | src/Generated/Shared/Transfer/ProductConcreteAvailabilityTransfer | +| OmsStateTransfer | class | created | src/Generated/Shared/Transfer/OmsStateTransfer | +| OmsStateCollectionTransfer | class | created | src/Generated/Shared/Transfer/OmsStateCollectionTransfer | +| OmsProcessTransfer | class | created | src/Generated/Shared/Transfer/OmsProcessTransfer | +| SalesOrderItemStateAggregationTransfer | class | created | src/Generated/Shared/Transfer/SalesOrderItemStateAggregationTransfer | +| CartChangeTransfer | class | created | src/Generated/Shared/Transfer/CartChangeTransfer | +| CartPreCheckResponseTransfer | class | created | src/Generated/Shared/Transfer/CartPreCheckResponseTransfer | +| QuoteTransfer | class | created | src/Generated/Shared/Transfer/QuoteTransfer | +| PersistentCartChangeTransfer | class | created | src/Generated/Shared/Transfer/PersistentCartChangeTransfer | +| ProductConcreteTransfer | class | created | src/Generated/Shared/Transfer/ProductConcreteTransfer | +| MessageTransfer | class | created | src/Generated/Shared/Transfer/MessageTransfer | +| CheckoutResponseTransfer | class | created | src/Generated/Shared/Transfer/CheckoutResponseTransfer | +| CheckoutErrorTransfer | class | created | src/Generated/Shared/Transfer/CheckoutErrorTransfer | +| StoreTransfer | class | created | src/Generated/Shared/Transfer/StoreTransfer | +| OrderTransfer | class | created | src/Generated/Shared/Transfer/OrderTransfer | +| ProductMeasurementBaseUnitTransfer | class | created | src/Generated/Shared/Transfer/ProductMeasurementBaseUnitTransfer | +| ItemCollectionTransfer | class | created | src/Generated/Shared/Transfer/ItemCollectionTransfer | +| ProductOptionTransfer | class | created | src/Generated/Shared/Transfer/ProductOptionTransfer | +| LocaleTransfer | class | created | src/Generated/Shared/Transfer/LocaleTransfer | +| TranslationTransfer | class | created | src/Generated/Shared/Transfer/TranslationTransfer | +| ReservationRequestTransfer | class | created | src/Generated/Shared/Transfer/ReservationRequestTransfer | +| PickingListCollectionTransfer | class | created | src/Generated/Shared/Transfer/PickingListCollectionTransfer | +| OrderItemsBackendApiAttributesTransfer | class | created | src/Generated/Shared/Transfer/OrderItemsBackendApiAttributesTransfer | +| ProductMeasurementSalesUnitsBackendApiAttributesTransfer | class | created | src/Generated/Shared/Transfer/ProductMeasurementSalesUnitsBackendApiAttributesTransfer | +| ProductMeasurementUnitsBackendApiAttributesTransfer | class | created | src/Generated/Shared/Transfer/ProductMeasurementUnitsBackendApiAttributesTransfer | +| PickingListItemTransfer | class | created | src/Generated/Shared/Transfer/PickingListItemTransfer | +| PickingListItemsBackendApiAttributesTransfer | class | created | src/Generated/Shared/Transfer/PickingListItemsBackendApiAttributesTransfer | +| ProductMeasurementUnitTransfer | class | created | src/Generated/Shared/Transfer/ProductMeasurementUnitTransfer | +| ProductMeasurementSalesUnitTransfer | class | created | src/Generated/Shared/Transfer/ProductMeasurementSalesUnitTransfer | +| SpyProductPackagingUnitEntityTransfer | class | created | src/Generated/Shared/Transfer/SpyProductPackagingUnitEntityTransfer | +| SpyProductPackagingUnitTypeEntityTransfer | class | created | src/Generated/Shared/Transfer/SpyProductPackagingUnitTypeEntityTransfer | +| SpyProductPackagingUnitStorageEntityTransfer | class | created | src/Generated/Shared/Transfer/SpyProductPackagingUnitStorageEntityTransfer | +| SpySalesOrderItemEntityTransfer.amount | property | created | src/Generated/Shared/Transfer/SpySalesOrderItemEntityTransfer | +| SpySalesOrderItemEntityTransfer.amountSku | property | created | src/Generated/Shared/Transfer/SpySalesOrderItemEntityTransfer | +| ItemTransfer.amount | property | created | src/Generated/Shared/Transfer/ItemTransfer | +| ItemTransfer.amountLeadProduct | property | created | src/Generated/Shared/Transfer/ItemTransfer | + +Make sure that the changes have been implemented successfully. To do it, trigger the following methods and make sure that the preceding events have been triggered: + +| PATH | METHOD NAME | +|---------------------------------------------------------------------------------------------|------------------------------------------------------------------------------| +| src/Orm/Zed/ProductPackagingUnit/Persistence/Base/SpyProductPackagingUnit.php | prepareSaveEventName()
addSaveEventToMemory()
addDeleteEventToMemory() | +| src/Orm/Zed/ProductPackagingUnit/Persistence/Base/SpyProductPackagingUnitType.php | prepareSaveEventName()
addSaveEventToMemory()
addDeleteEventToMemory() | +| src/Orm/Zed/ProductPackagingUnitStorage/Persistence/Base/SpyProductPackagingUnitStorage.php | prepareSaveEventName()
addSaveEventToMemory()
addDeleteEventToMemory() | +| src/Orm/Zed/ProductPackagingUnit/Persistence/Base/SpyProductPackagingUnitType.php | sendToQueue() | + + +{% endinfo_block %} + +### 4) Add translations + +1. Append the glossary according to your language configuration: + +**src/data/import/glossary.csv** + +```yaml +cart.pre.check.availability.failed.lead.product,Products inside the item 'sku' are not available at the moment.,en_US +cart.pre.check.availability.failed.lead.product,Produkte im Artikel 'sku' sind momentan nicht verfügbar.,de_DE +product.unavailable,Product '%sku%' is not available at the moment,en_US +product.unavailable,Das Produkt '%sku%' ist momentan nicht verfügbar,de_DE +cart.pre.check.amount.min.failed,Die minimale Mengenanforderung für Produkt SKU '%sku%' ist nicht erreicht.,de_DE +cart.pre.check.amount.min.failed,Minimum amount requirements for product SKU '%sku%' are not fulfilled.,en_US +cart.pre.check.amount.max.failed,Die maximale Mengenanforderung für Produkt SKU '%sku%' ist überschritten.,de_DE +cart.pre.check.amount.max.failed,Maximum amount for product SKU '%sku%' is exceeded.,en_US +cart.pre.check.amount.interval.failed,Die Anzahl für Produkt SKU '%sku%' liegt nicht innerhalb des vorgegebenen Intervals.,de_DE +cart.pre.check.amount.interval.failed,Amount interval requirements for product SKU '%sku%' are not fulfilled.,en_US +cart.pre.check.amount.is_not_variable.failed,Standardbetrag für Produkt SKU '%sku%' ist überschritten.,de_DE +cart.pre.check.amount.is_not_variable.failed,Default amount requirements for product SKU '%sku%' are not fulfilled.,en_US +cart.item.packaging_unit.not_found,Packaging unit not found for product with SKU '%sku%'.,en_US +cart.item.packaging_unit.not_found,Verpackungseinheit für Produkt mit SKU '% sku%' nicht gefunden.,de_DE +``` + +{% info_block infoBox "Info" %} + +All packaging unit types need to have glossary entities for the configured locales. + +{% endinfo_block %} + +Infrastructural record's glossary keys: + +**src/data/import/glossary.csv** + +```yaml +packaging_unit_type.item.name,Item,en_US +packaging_unit_type.item.name,Stück,de_DE +``` + +Demo data glossary keys: + +**src/data/import/glossary.csv** + +```yaml +packaging_unit_type.ring_500.name,"Ring (500m)",en_US +packaging_unit_type.ring_500.name,"Ring (500m)",de_DE +packaging_unit_type.box.name,Box,en_US +packaging_unit_type.box.name,Box,de_DE +packaging_unit_type.palette.name,Palette,en_US +packaging_unit_type.palette.name,Palette,de_DE +packaging_unit_type.giftbox.name,Giftbox,en_US +packaging_unit_type.giftbox.name,Geschenkbox,de_DE +packaging_unit_type.valentines_special.name,"Valentine's special",en_US +packaging_unit_type.valentines_special.name,Valentinstag Geschenkbox,de_DE +packaging_unit_type.pack_20.name,Pack 20,en_US +packaging_unit_type.pack_20.name,Pack 20,de_DE +packaging_unit_type.pack_500.name,Pack 500,en_US +packaging_unit_type.pack_500.name,Pack 500,de_DE +packaging_unit_type.pack_100.name,Pack 100,en_US +packaging_unit_type.pack_100.name,Pack 100,de_DE +packaging_unit_type.pack_mixed.name,Mixed Screws boxes,en_US +packaging_unit_type.pack_mixed.name,Gemischte Schraubenkästen,de_DE +``` + +2. Import data: + +```bash +console data:import glossary +``` + +{% info_block warningBox "Verification" %} + +Make sure that the configured data in the database has been added to the `spy_glossary` table. + +{% endinfo_block %} + + +### 5) Configure export to Redis + +This step publishes tables on change (create, edit, delete) to `spy_product_packaging_unit_storage` and synchronizes the data to Storage. + +#### Set up event listeners + +| PLUGIN | SPECIFICATION | PREREQUISITES | NAMESPACE | +|--------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------|---------------|-------------------------------------------------------------------------------| +| ProductPackagingUnitStorageEventSubscriber | Registers listeners that are responsible for publishing product abstract packaging unit storage entity changes when a related entity change event occurs. | | Spryker\Zed\ProductPackagingUnitStorage\Communication\Plugin\Event\Subscriber | + +**src/Pyz/Zed/Event/EventDependencyProvider.php** + +```php +add(new ProductPackagingUnitStorageEventSubscriber()); + + return $eventSubscriberCollection; + } +} +``` + +#### Set up publish feature + +| PLUGIN | SPECIFICATION | PREREQUISITES | NAMESPACE | +|-----------------------------------------------|--------------------------------------------------------------------|---------------|--------------------------------------------------------------------| +| ProductPackagingUnitSynchronizationDataPlugin | Registers a publisher for manually triggering the publish command. | | Spryker\Zed\ProductPackagingUnitStorage\Communication\Plugin\Event | + +**src/Pyz/Zed/Event/EventBehaviorDependencyProvider.php** + +```php + + */ + protected function getEventTriggerResourcePlugins(): array + { + return [ + new ProductPackagingUnitEventResourceBulkRepositoryPlugin(), + ]; + } +} +``` + +#### Set up sync feature + +| PLUGIN | SPECIFICATION | PREREQUISITES | NAMESPACE | +|-----------------------------------------------|--------------------------------------------------------------------|---------------|------------------------------------------------------------------------------| +| ProductPackagingUnitSynchronizationDataPlugin | Allows synchronizing the whole storage table content into Storage. | | Spryker\Zed\ProductPackagingUnitStorage\Communication\Plugin\Synchronization | + +**src/Pyz/Zed/Synchronization/SynchronizationDependencyProvider.php** + +```php + + */ + protected function getSynchronizationDataPlugins(): array + { + return [ + new ProductPackagingUnitSynchronizationDataBulkPlugin(), + ]; + } +} +``` + +### 6) Add infrastructural data + +1. Add the following data. + +| PLUGIN | SPECIFICATION | PREREQUISITES | NAMESPACE | +|-----------------------------------------|---------------------------------------------------------------|---------------|-----------------------------------------------------------------| +| ProductPackagingUnitTypeInstallerPlugin | Installs the configured infrastructural packaging unit types. | | Spryker\Zed\ProductPackagingUnit\Communication\Plugin\Installer | + +**src/Pyz/Zed/Installer/InstallerDependencyProvider.php** + +```php + + */ + public function getInstallerPlugins() + { + return [ + new ProductPackagingUnitTypeInstallerPlugin(), + ]; + } +} +``` + +2. Execute the registered installer plugins and install infrastructural data: + +```bash +console setup:init-db +``` + +{% info_block warningBox "Verification" %} + +Make sure that the configured infrastructural packaging unit types of the database are added to the `spy_product_packaging_unit_type` table. + +{% endinfo_block %} + +### 7) Import product packaging unit types + +1. Prepare your data according to your requirements using our demo data: + +**vendor/spryker/spryker/Bundles/ProductPackagingUnitDataImport/data/import/product_packaging_unit_type.csv** + +```yaml +name +packaging_unit_type.ring_500.name +packaging_unit_type.box.name +packaging_unit_type.palette.name +packaging_unit_type.giftbox.name +packaging_unit_type.valentines_special.name +packaging_unit_type.pack_mixed.name +packaging_unit_type.pack_20.name +packaging_unit_type.pack_100.name +packaging_unit_type.pack_500.name +``` + +| COLUMN | REQUIRED | DATA TYPE | DATA EXAMPLE | DATA EXPLANATION | +|--------|-----------|-----------|-----------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------| +| name | mandatory | string | packaging_unit_type.ring_500.name | Glossary key that will be used to display a packaging unit type. Each name needs a glossary key definition for all configured locales. | + +2. Register the following plugin to enable data import: + +| PLUGIN | SPECIFICATION | PREREQUISITES | NAMESPACE | +|------------------------------------------|-----------------------------------------------------|---------------|----------------------------------------------------------------------------| +| ProductPackagingUnitTypeDataImportPlugin | Imports packaging unit type data into the database. | | Spryker\Zed\ProductPackagingUnitDataImport\Communication\Plugin\DataImport | + +**src/Pyz/Zed/DataImport/DataImportDependencyProvider.php** + +```php + + */ + protected function getDataImporterPlugins(): array + { + return [ + new ProductPackagingUnitTypeDataImportPlugin(), + ]; + } +} +``` + +3. Import data: + +```bash +console data:import product-packaging-unit-type +``` + +{% info_block warningBox "Verification" %} + +Make sure that in the database the configured data has been added to the `spy_product_packaging_unit_type` table. + +{% endinfo_block %} + +#### Import product packaging units + +1. Prepare your data according to your requirements using our demo data: + +**vendor/spryker/spryker/Bundles/ProductPackagingUnitDataImport/data/import/product_packaging_unit.csv** + +```yaml +concrete_sku,lead_product_sku,packaging_unit_type_name,default_amount,is_amount_variable,amount_min,amount_max,amount_interval +218_1233,218_123,packaging_unit_type.pack_mixed.name,5,1,3,5,2 +218_1234,218_123,packaging_unit_type.box.name,100,1,100,1000,10 +218_1230,218_123,packaging_unit_type.pack_20.name,20,0,0,0,0 +218_1231,218_123,packaging_unit_type.pack_100.name,100,0,0,0,0 +218_1232,218_123,packaging_unit_type.pack_500.name,500,0,0,0,0 +217_1231,217_123,packaging_unit_type.ring_500.name,1,0,,, +215_124,215_123,packaging_unit_type.ring_500.name,1,0,,, +``` + +| COLUMN | REQUIRED | DATA TYPE | DATA EXAMPLE | DATA EXPLANATION | +|--------------------------|-----------|------------------|-----------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| concrete_sku | mandatory | string | 218_123 | Concrete product SKU of packaging unit. | +| lead_product_sku | mandatory | string | 1 | Lead product concrete SKU. | +| packaging_unit_type_name | mandatory | string | packaging_unit_type.ring_500.name | Type a name of the current concrete product. | +| default_amount | optional | positive integer | 5 | | +| is_amount_variable | mandatory | bool integer | 1 | | +| amount_min | optional | positive integer | 3 | | +| amount_max | optional | positive integer | 5 | | +| amount_interval | optional | positive integer | 2 | Min = 3; Max = 10; Interval = 2
Choosable: 3, 5, 7, 9 | + + +2. Register the following plugin to enable data import: + +| PLUGIN | SPECIFICATION | PREREQUISITES | NAMESPACE | +|--------------------------------------|-----------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------| +| ProductPackagingUnitDataImportPlugin | Imports packaging unit type data into the database. | | Spryker\Zed\ProductPackagingUnitDataImport\Communication\Plugin\DataImport | + +**src/Pyz/Zed/DataImport/DataImportDependencyProvider.php** + +```php + + */ + protected function getDataImporterPlugins(): array + { + return [ + new ProductPackagingUnitDataImportPlugin(), + ]; + } +} +``` + +3. Import data: + +```bash +console data:import product-packaging-unit +``` + +{% info_block warningBox "Verification" %} + +Make sure that the configured data in the database has been added to the `spy_product_packaging_unit` and `spy_product_packaging_unit_type` tables. + +{% endinfo_block %} + +### 7) Set up behavior + +Set up the following behaviors. + +#### Set up checkout workflow + +Enable the following behaviors by registering the plugins: + +| PLUGIN | SPECIFICATION | PREREQUISITES | NAMESPACE | +|----------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------| +| AmountAvailabilityCartPreCheckPlugin | Validates if the given amount is available according to stock configuration during the cart change. | Expects the `amount` field to be set in `ItemTransfers` with packaging units. | Spryker\Zed\ProductPackagingUnit\Communication\Plugin\Cart | +| AmountGroupKeyItemExpanderPlugin | Expands a group key with the amount and its sales unit to granulate the item grouping in the cart for packaging unit items. | Expects the `amount` and `amountSalesUnit` fields to be set in `ItemTransfers` with packaging units. | Spryker\Zed\ProductPackagingUnit\Communication\Plugin\Cart | +| AmountRestrictionCartPreCheckPlugin | Validates the amount restrictions when Item has restrictions. | Expects the `amount` and `amountSalesUnit` fields to be set in `ItemTransfer` with packaging units. | Spryker\Zed\ProductPackagingUnit\Communication\Plugin\Cart | +| AmountSalesUnitItemExpanderPlugin | Sets the `amountSalesUnit` field for `ItemTransfers` with packaging units. | Expects the `amount` and `amountSalesUnit.IdProductMeasurementSalesUnit` to be set in `ItemTransfers` with packaging units. | Spryker\Zed\ProductPackagingUnit\Communication\Plugin\Cart | +| AmountSalesUnitValuePostSavePlugin | Sets a normalized amount sales unit value field. | Expects the `amount` and `amountSalesUnit` fields to be set in `ItemTransfer` with packaging units. | Spryker\Zed\ProductPackagingUnit\Communication\Plugin\Cart | +| CustomAmountPriceItemExpanderPlugin | Updates unit prices for variable amounted packaging units. | Expects the `amount` and `productPackagingUnit` fields to be set in `ItemTransfers` with packaging units. | Spryker\Zed\ProductPackagingUnit\Communication\Plugin\Cart | +| ProductPackagingUnitCartAddItemStrategyPlugin | Merges the `quantity` and `amount` fields changes into the cart for `ItemTransfers` with packaging units on the cart add action. | Expects the amount field to be set in `ItemTransfers` with packaging units. | Spryker\Zed\ProductPackagingUnit\Communication\Plugin\Cart | +| ProductPackagingUnitCartRemoveItemStrategyPlugin | Merges the `quantity` and `amount` fields changes into the cart for `ItemTransfers` with packaging units on the cart removal action. | Expects the amount field to be set in `ItemTransfers` with packaging units. | Spryker\Zed\ProductPackagingUnit\Communication\Plugin\Cart | +| ProductPackagingUnitItemExpanderPlugin | Sets the `amountLeadProduct` and `productPackagingUnit` fields in the `ItemTransfer` properties. | Expects the `amount` field to be set in `ItemTransfer` properties with packaging units. | Spryker\Zed\ProductPackagingUnit\Communication\Plugin\Cart | +| ProductPackagingUnitCartPreCheckPlugin | Checks if packaging units are found for items in `CartChangeTransfer`. | Expects the `amount` field to be set in the `ItemTransfer` properties with packaging units. | Spryker\Zed\ProductPackagingUnit\Communication\Plugin\Cart | +| AmountAvailabilityCheckoutPreConditionPlugin | Validates if the given amount is available according to the stock configuration during checkout. | Expects the `amount` and `amountLeadProduct` fields to be set in `ItemTransfers` with packaging units. | Spryker\Zed\ProductPackagingUnit\Communication\Plugin\Checkout | +| PackagingUnitSplittableItemTransformerStrategyPlugin | Splitting order item if product packaging unit item is splittable. | | Spryker\Zed\ProductPackagingUnit\Communication\Plugin\Checkout | +| ProductPackagingUnitCartAddItemStrategyPlugin | Merges the `quantity` and `amount` fields changes into the cart for `ItemTransfers` with packaging units on the persistent cart add action. | Expects the `amount` field to be set in `ItemTransfers` with packaging units. | Spryker\Zed\ProductPackagingUnit\Communication\Plugin\PersistentCart | +| LeadProductReservationPostSaveTerminationAwareStrategyPlugin | Updates the lead product's reservation for the provided product packaging unit SKU. | | Spryker\Zed\ProductPackagingUnit\Communication\Plugin\Reservation | +| AmountSalesUnitOrderItemExpanderPreSavePlugin | Sets the amount in the measurement-related fields in the Order item for saving. | Expects the `amountSalesUnit` field to be set in `ItemTransfers` with packaging units. | Spryker\Zed\ProductPackagingUnit\Communication\Plugin\SalesExtension | +| ProductPackagingUnitOrderItemExpanderPreSavePlugin | Sets the `amount` and `amountSku` fields in the Order item for saving. | Expects `amountLeadProduct` to be set in `ItemTransfers` with packaging units. | Spryker\Zed\ProductPackagingUnit\Communication\Plugin\SalesExtension | +| LeadProductStockUpdateHandlerPlugin | Updates availability and reservation of a lead product for a given product packaging unit for stock update handler. | | Spryker\Zed\ProductPackagingUnit\Communication\Plugin\Stock | +| ProductPackagingUnitAmountCartChangeRequestExpanderPlugin | Sets the `amount` and `amountSalesUnit.IdProductMeasurementSalesUnit` fields in `ItemTransfers` with packaging units for cart change. | Expects a request to contain the to-be-used information. | Spryker\Client\ProductPackagingUnit\Plugin\CartExtension | +| ProductPackagingUnitAmountPersistentCartChangeExpanderPlugin | Sets the `amount` and `amountSalesUnit.IdProductMeasurementSalesUnit` fields in `ItemTransfers` with packaging units for persistent cart change. | Expects a request to contain the to-be-used information. | Spryker\Client\ProductPackagingUnit\Plugin\PersistentCartExtension | +| ProductPackagingUnitOmsReservationAggregationPlugin | Aggregates reservations for the provided SKU both with or without packaging unit. | | Spryker\Zed\ProductPackagingUnit\Communication\Plugin\Oms | +| ProductPackagingUnitProductAbstractAddToCartPlugin | Filters out products that have packaging units available. | | Spryker\Zed\ProductPackagingUnit\Communication\Plugin\ProductPageSearch | +| AmountLeadProductOrderItemExpanderPlugin | Expands order items with additional packaging unit amount lead product. | | Spryker\Zed\ProductPackagingUnit\Communication\Plugin\Sales | +| AmountSalesUnitOrderItemExpanderPlugin | Expands order items with additional packaging unit sales unit. | | Spryker\Zed\ProductPackagingUnit\Communication\Plugin\Sales | +| ProductPackagingUnitPickingListCollectionExpanderPlugin | Expands `PickingListCollectionTransfer.pickingList.pickingListItem.orderItem` transfer objects with `amountSalesUnit` property. | | Spryker\Zed\ProductPackagingUnit\Communication\Plugin\PickingList | +| ProductPackagingUnitPickingListItemsBackendApiAttributesMapperPlugin | Maps amount sales unit from `PickingListItemTransfer.orderItem.amountSalesUnit` to `PickingListItemsBackendApiAttributesTransfer.orderItem.amountSalesUnit` transfer property. | Expects the `uuid` and `orderItem.amountSalesUnit.productMeasurementUnit` fields to be set in `PickingListItemTransfer`. Expects the `uuid` field to be set in `PickingListItemsBackendApiAttributes` as well. | Spryker\Glue\ProductPackagingUnitsBackendApi\Plugin\PickingListsBackendApi | | + +
+src/Pyz/Client/Cart/CartDependencyProvider.php + +```php + + */ + protected function getExpanderPlugins(Container $container): array + { + return [ + new ProductPackagingUnitItemExpanderPlugin(), + new AmountGroupKeyItemExpanderPlugin(), + new AmountSalesUnitItemExpanderPlugin(), + new CustomAmountPriceItemExpanderPlugin(), + ]; + } + + /** + * @param \Spryker\Zed\Kernel\Container $container + * + * @return list<\Spryker\Zed\CartExtension\Dependency\Plugin\CartOperationStrategyPluginInterface> + */ + protected function getCartRemoveItemStrategyPlugins(Container $container): array + { + return [ + new ProductPackagingUnitCartRemoveItemStrategyPlugin(), + ]; + } + + /** + * @param \Spryker\Zed\Kernel\Container $container + * + * @return list<\Spryker\Zed\CartExtension\Dependency\Plugin\CartPreCheckPluginInterface> + */ + protected function getCartPreCheckPlugins(Container $container) + { + return [ + new AmountAvailabilityCartPreCheckPlugin(), + new AmountRestrictionCartPreCheckPlugin(), + new ProductPackagingUnitCartPreCheckPlugin(), + ]; + } + + /** + * @param \Spryker\Zed\Kernel\Container $container + * + * @return list<\Spryker\Zed\Cart\Dependency\PostSavePluginInterface> + */ + protected function getPostSavePlugins(Container $container) + { + return [ + new AmountSalesUnitValuePostSavePlugin(), + ]; + } + + /** + * @param \Spryker\Zed\Kernel\Container $container + * + * @return list<\Spryker\Zed\CartExtension\Dependency\Plugin\CartOperationStrategyPluginInterface> + */ + protected function getCartAddItemStrategyPlugins(Container $container): array + { + return [ + new ProductPackagingUnitCartAddItemStrategyPlugin(), + ]; + } +} +``` +
+ +**src/Pyz/Zed/Checkout/CheckoutDependencyProvider.php** + +```php + + */ + protected function getCheckoutPreConditions(Container $container) + { + return [ + new AmountAvailabilityCheckoutPreConditionPlugin(), + ]; + } +} +``` + +**src/Pyz/Zed/PersistentCart/PersistentCartDependencyProvider.php** + +```php + + */ + protected function getCartAddItemStrategyPlugins(Container $container): array + { + return [ + new ProductPackagingUnitCartAddItemStrategyPlugin(), + ]; + } +} +``` + +**src/Pyz/Zed/Oms/OmsDependencyProvider.php** + +```php + + */ + protected function getReservationPostSaveTerminationAwareStrategyPlugins(): array + { + return [ + new LeadProductReservationPostSaveTerminationAwareStrategyPlugin(), + ]; + } + + /** + * @return list<\Spryker\Zed\OmsExtension\Dependency\Plugin\OmsReservationAggregationPluginInterface> + */ + protected function getOmsReservationAggregationPlugins(): array + { + return [ + new ProductPackagingUnitOmsReservationAggregationPlugin(), + ]; + } +} +``` + +
+src/Pyz/Zed/Sales/SalesDependencyProvider.php + +```php + + */ + protected function getOrderItemExpanderPreSavePlugins(): array + { + return [ + new ProductPackagingUnitOrderItemExpanderPreSavePlugin(), + new AmountSalesUnitOrderItemExpanderPreSavePlugin(), + ]; + } + + /** + * @return list<\Spryker\Zed\SalesExtension\Dependency\Plugin\OrderItemExpanderPluginInterface> + */ + protected function getOrderItemExpanderPlugins(): array + { + return [ + new AmountLeadProductOrderItemExpanderPlugin(), + new AmountSalesUnitOrderItemExpanderPlugin(), + ]; + } + + /** + * @return list<\Spryker\Zed\SalesExtension\Dependency\Plugin\ItemTransformerStrategyPluginInterface> + */ + public function getItemTransformerStrategyPlugins(): array + { + return [ + new PackagingUnitSplittableItemTransformerStrategyPlugin(), + ]; + } +} +``` +
+ +**src/Pyz/Zed/Stock/StockDependencyProvider.php** + +```php + + */ + protected function getStockUpdateHandlerPlugins(Container $container): array + { + return [ + new LeadProductStockUpdateHandlerPlugin(), + ]; + } +} +``` + +**src/Pyz/Client/Cart/CartDependencyProvider.php** + +```php + + */ + protected function getAddItemsRequestExpanderPlugins(): array + { + return [ + new ProductPackagingUnitAmountCartChangeRequestExpanderPlugin(), + ]; + } +} +``` + +**src/Pyz/Client/PersistentCart/PersistentCartDependencyProvider.php** + +```php + + */ + protected function getChangeRequestExtendPlugins(): array + { + return [ + new ProductPackagingUnitAmountPersistentCartChangeExpanderPlugin(), #ProductPackagingUnit + ]; + } +} +``` + +**src/Pyz/Zed/PickingList/PickingListDependencyProvider.php** + +```php + + */ + protected function getPickingListCollectionExpanderPlugins(): array + { + return [ + new ProductPackagingUnitPickingListCollectionExpanderPlugin(), + ]; + } +} +``` + +**src/Pyz/Glue/PickingListsBackendApi/PickingListsBackendApiDependencyProvider.php** + +```php + + */ + protected function getPickingListItemsBackendApiAttributesMapperPlugins(): array + { + return [ + new ProductPackagingUnitPickingListItemsBackendApiAttributesMapperPlugin(), + ]; + } +} +``` + +{% info_block warningBox "Verification" %} + +Add an item with packaging units to cart and check if the following statements are true: + +* A packaging unit can be found for an item. +* The `amount`, `amountSalesUnit`, `amountLeadProduct` and `ProductPackagingUnit` fields in the `ItemTransfer` properties get fully populated. +* The amount restriction works as expected. +* Availability is validated respectfully according to your lead product's and packaging unit's configuration. +* Item grouping in the cart works as expected. +* Variable amount changes affect unit prices in the `ItemTransfer` properties. +* The quantity and amount are merged correctly when the group key matches. + +Go through the checkout workflow, make an order and check if the following statements are true: +* Check if the stock is modified respectfully according to your lead product's and packaging unit's configuration. +* Check if the following fields in the `spy_sales_order_item` table are saved: + * `amount` + * `amount_sku` + * `amount_measurement_unit_name` + * `amount_measurement_unit_code` + * `amount_measurement_unit_precision` + * `amount_measurement_unit_conversion` + * `amount_base_measurement_unit_name` + +Go to the Zed UI Sales overview, check the order, and verify the following: +- The correct sales unit is displayed. +- The correct amount is displayed per sales order item. + +Make sure the following: +* Abstract products that have packaging units available don’t have `add_to_cart_sku` field in tje Elasticsearch document. +* Every order item from `SalesFacade::getOrderItems()` results contains packaging units data: `ItemTransfer.amountLeadProduct` and `ItemTransfer.amountSalesUnit` are set for the order items that have packaging units. +* The results of picking lists from `PickingListFacade::getPickingListCollection()` contain packaging units data: `PickingListCollectionTransfer.pickingList.pickingListItem.orderItem.amountSalesUnit` are set for the order items that have packaging units. + +{% endinfo_block %} + + +## Install feature frontend + +Follow the steps below to install the {Feature Name} feature frontend. + +### Prerequisites + +Install the required features: + +| NAME | VERSION | INTEGRATION GUIDE | +|---|---|---| +| Spryker Core | {{page.version}} | [Spryker Core feature integration](/docs/pbc/all/miscellaneous/{{page.version}}/install-and-upgrade/install-features/install-the-spryker-core-feature.html)| +| Measurement Units | {{page.version}} | [Install the Measurement Units feature](/docs/pbc/all/product-information-management/{{site.version}}/base-shop/install-and-upgrade/install-features/install-the-measurement-units-feature.html) | +| Non-splittable Products | {{page.version}} | + +### 1) Install the required modules using Composer + +```bash +composer require spryker-feature/packaging-units: "{{page.version}}" --update-with-dependencies +``` + +{% info_block warningBox "Verification" %} + +Make sure that the following modules have been installed: + +| MODULE | EXPECTED DIRECTORY | +|----------------------------|---------------------------------------------------| +| ProductPackagingUnitWidget | vendor/spryker-shop/product-packaging-unit-widget | + +{% endinfo_block %} + +### 2) Add translations + +1. Append the glossary according to your configuration: + +**src/data/import/glossary.csv** + +```yaml +packaging-units.recommendation.amount-min-violation,Minimum amount requirements for product are not fulfilled,en_US +packaging-units.recommendation.amount-min-violation,Mindestmengenanforderungen für das Produkt sind nicht erfüllt,de_DE +packaging-units.recommendation.amount-max-violation,Maximum amount requirements for product are not fulfilled,en_US +packaging-units.recommendation.amount-max-violation,Maximale Mengenanforderungen für das Produkt sind nicht erfüllt,de_DE +packaging-units.recommendation.amount-interval-violation,Amount interval requirements for product are not fulfilled,en_US +packaging-units.recommendation.amount-interval-violation,Mengenintervallanforderungen für das Produkt sind nicht erfüllt,de_DE +packaging_units.recommendation.suggestion,Would you like to add:,en_US +packaging_units.recommendation.suggestion,Möchten Sie hinzufügen:,de_DE +packaging_units.recommendation.between-units-info,The amount you have chosen is in between 2 base units,en_US +packaging_units.recommendation.between-units-info,Ihre gewählte Anzahl liegt zwischen 2 basis Einheiten,de_DE +packaging_units.cart.quantity,Quantity,en_US +packaging_units.cart.quantity,Anzahl,de_DE +packaging_units.cart.amount,Amount,en_US +packaging_units.cart.amount,Betrag,de_DE +packaging_units.cart.item,Items,en_US +packaging_units.cart.item,Artikel,de_DE +page.detail.add-to-cart,In den Warenkorb,de_DE +page.detail.add-to-cart,Add to Cart,en_US +product.measurement.sales_unit,Sales Unit,en_US +product.measurement.sales_unit,Maßeinheit,de_DE +cart.item_quantity,Anzahl,de_DE +cart.item_quantity,Quantity,en_US +measurement_units.new-price,New price,en_US +measurement_units.new-price,Neuer Preis,de_DE +measurement_units.recommendation.between-units-info,The quantity you have chosen is in between 2 base units,en_US +measurement_units.recommendation.between-units-info,Ihre gewählte Anzahl liegt zwischen 2 basis Einheiten,de_DE +measurement_units.recommendation.min-violation,Minimum quantity requirements for product are not fulfilled,en_US +measurement_units.recommendation.min-violation,Minimale Mengenanforderungen für das Produkt sind nicht erfüllt,de_DE +measurement_units.recommendation.max-violation,Maximum quantity requirements for product are not fulfilled,en_US +measurement_units.recommendation.max-violation,Maximale Mengenanforderungen für das Produkt sind nicht erfüllt,de_DE +measurement_units.recommendation.suggestion,Would you like to add,en_US +measurement_units.recommendation.suggestion,Was würden Sie gerne hinzufügen? ,de_DE +``` + +2. Import data: + +```bash +console data:import glossary +``` + +{% info_block warningBox "Verification" %} + +Make sure that the configured data in the database has been added to the `spy_glossary` table. + +{% endinfo_block %} + +### 3) Set up widgets + +1. Enable the following global widgets: + +| WIDGET | DESCRIPTION | NAMESPACE | +|----------------------------|-------------------------------------------------------------|----------------------------------------------------| +| ProductPackagingUnitWidget | Displays product packaging options for quantity and amount. | SprykerShop\Yves\ProductPackagingUnitWidget\Widget | + +**src/Pyz/Yves/ShopApplication/ShopApplicationDependencyProvider.php** + +```php + + */ + protected function getGlobalWidgets(): array + { + return [ + ProductPackagingUnitWidget::class, + ]; + } +} +``` + +`ProductPackagingUnitWidget` uses Javascript for some functionality: + +| Functionality | Path | +|---|---| +| Controls base unit => sales unit calculationsApplies product quantity and amount restrictions on sales unit levelOffers recommendation when invalid quantity or amount is selectedMaintains stock-based quantity, amount and sales unit information for posting | `vendor/spryker-shop/product-packaging-unit-widget/src/SprykerShop/Yves/ProductPackagingUnitWidget/Theme/default/components/molecules/packaging-unit-quantity-selector/packaging-unit-quantity-selector.ts` | + + +2. Enable Javascript and CSS changes: + +```bash +console frontend:yves:build +``` +{% info_block warningBox "Verification" %} + +Check if Check if the `amount` field meets the following criteria: + +- It appears on the Product Detail page for items with packaging units. +- It is displayed correctly with measurement unit information on the Cart page. +- It is displayed correctly with measurement unit information on the Checkout Summary page. +- It is displayed correctly with measurement unit information on the previous Orders page. + +{% endinfo_block %} + +### 4) Set up behavior + +Enable the following behaviors by registering the plugins: + +| PLUGIN | DESCRIPTION | PREREQUISITES | NAMESPACE | +|---|---|---|---| +| QuickOrderItemDefaultPackagingUnitExpanderPlugin | Expands `ItemTransfer` with packaging unit data if available using product the abstract ID and product concrete ID | | SprykerShop\Yves\ProductPackagingUnitWidget\Plugin\QuickOrder | + +**src/Pyz/Yves/QuickOrderPage/QuickOrderPageDependencyProvider.php** + +```php + + */ + protected function getQuickOrderItemTransferExpanderPlugins(): array + { + return [ + new QuickOrderItemDefaultPackagingUnitExpanderPlugin(), + ]; + } +} +``` diff --git a/_includes/pbc/all/install-features/202400.0/install-the-product-offer-service-points-feature.md b/_includes/pbc/all/install-features/202400.0/install-the-product-offer-service-points-feature.md index 7997f5020f2..623e1336223 100644 --- a/_includes/pbc/all/install-features/202400.0/install-the-product-offer-service-points-feature.md +++ b/_includes/pbc/all/install-features/202400.0/install-the-product-offer-service-points-feature.md @@ -84,38 +84,34 @@ Make sure that propel entities have been generated successfully by checking thei Make sure that the following changes have been applied in transfer objects: -| TRANSFER | TYPE | EVENT | PATH | -|----------------------------------------|-------|---------|------------------------------------------------------------------------------| -| ServicePoint | class | created | src/Generated/Shared/Transfer/ServicePointTransfer | -| ServicePointCollection | class | created | src/Generated/Shared/Transfer/ServicePointCollectionTransfer | -| ServicePointCriteria | class | created | src/Generated/Shared/Transfer/ServicePointCriteriaTransfer | -| ServicePointConditions | class | created | src/Generated/Shared/Transfer/ServicePointConditionsTransfer | -| ApiServicePointAddressesAttributes | class | created | src/Generated/Shared/Transfer/ApiServicePointAddressesAttributesTransfer | -| StoreRelation | class | created | src/Generated/Shared/Transfer/StoreRelationTransfer | -| Store | class | created | src/Generated/Shared/Transfer/StoreTransfer | -| Sort | class | created | src/Generated/Shared/Transfer/SortTransfer | -| Pagination | class | created | src/Generated/Shared/Transfer/PaginationTransfer | -| DataImporterConfiguration | class | created | src/Generated/Shared/Transfer/DataImporterConfigurationTransfer | -| DataImporterReport | class | created | src/Generated/Shared/Transfer/DataImporterReportTransfer | -| ServicePointStorage | class | created | src/Generated/Shared/Transfer/ServicePointStorageTransfer | -| ProductOfferService | class | created | src/Generated/Shared/Transfer/ProductOfferServiceTransfer | -| ProductOfferServices | class | created | src/Generated/Shared/Transfer/ProductOfferServicesTransfer | -| ProductOfferServiceCollection | class | created | src/Generated/Shared/Transfer/ProductOfferServiceCollectionTransfer | -| ProductOfferServiceCollectionRequest | class | created | src/Generated/Shared/Transfer/ProductOfferServiceCollectionRequestTransfer | -| ProductOfferServiceCollectionResponse | class | created | src/Generated/Shared/Transfer/ProductOfferServiceCollectionResponseTransfer | -| ProductOfferServiceCollectionResponse | class | created | src/Generated/Shared/Transfer/ProductOfferServiceCollectionResponseTransfer | -| ProductOfferServiceCriteria | class | created | src/Generated/Shared/Transfer/ProductOfferServiceCriteriaTransfer | -| ProductOfferServiceConditions | class | created | src/Generated/Shared/Transfer/ProductOfferServiceConditionsTransfer | -| IterableProductOfferServicesCriteria | class | created | src/Generated/Shared/Transfer/IterableProductOfferServicesCriteriaTransfer | -| IterableProductOfferServicesConditions | class | created | src/Generated/Shared/Transfer/IterableProductOfferServicesConditionsTransfer | -| ProductOfferServiceStorage | class | created | src/Generated/Shared/Transfer/ProductOfferServiceStorageTransfer | -| ProductOfferServiceStorageCollection | class | created | src/Generated/Shared/Transfer/ProductOfferServiceStorageCollectionTransfer | -| ServiceStorageCollection | class | created | src/Generated/Shared/Transfer/ServiceStorageCollectionTransfer | -| ServicePointStorageCollection | class | created | src/Generated/Shared/Transfer/ServicePointStorageCollectionTransfer | -| ServicePointStorageCriteria | class | created | src/Generated/Shared/Transfer/ServicePointStorageCriteriaTransfer | -| ServicePointStorageConditions | class | created | src/Generated/Shared/Transfer/ServicePointStorageConditionsTransfer | -| SynchronizationData | class | created | src/Generated/Shared/Transfer/SynchronizationDataTransfer | -| Filter | class | created | src/Generated/Shared/Transfer/FilterTransfer | +| TRANSFER | TYPE | EVENT | PATH | +|-------------------------------------------|-------|---------|---------------------------------------------------------------------------------| +| ServicePoint | class | created | src/Generated/Shared/Transfer/ServicePointTransfer | +| ServicePointCollection | class | created | src/Generated/Shared/Transfer/ServicePointCollectionTransfer | +| StoreRelation | class | created | src/Generated/Shared/Transfer/StoreRelationTransfer | +| Store | class | created | src/Generated/Shared/Transfer/StoreTransfer | +| Sort | class | created | src/Generated/Shared/Transfer/SortTransfer | +| Pagination | class | created | src/Generated/Shared/Transfer/PaginationTransfer | +| DataImporterConfiguration | class | created | src/Generated/Shared/Transfer/DataImporterConfigurationTransfer | +| DataImporterReport | class | created | src/Generated/Shared/Transfer/DataImporterReportTransfer | +| ServicePointStorage | class | created | src/Generated/Shared/Transfer/ServicePointStorageTransfer | +| ProductOfferService | class | created | src/Generated/Shared/Transfer/ProductOfferServiceTransfer | +| ProductOfferServices | class | created | src/Generated/Shared/Transfer/ProductOfferServicesTransfer | +| ProductOfferServiceCollection | class | created | src/Generated/Shared/Transfer/ProductOfferServiceCollectionTransfer | +| ProductOfferServiceCollectionRequest | class | created | src/Generated/Shared/Transfer/ProductOfferServiceCollectionRequestTransfer | +| ProductOfferServiceCollectionResponse | class | created | src/Generated/Shared/Transfer/ProductOfferServiceCollectionResponseTransfer | +| ProductOfferServiceCollectionResponse | class | created | src/Generated/Shared/Transfer/ProductOfferServiceCollectionResponseTransfer | +| ProductOfferServiceCriteria | class | created | src/Generated/Shared/Transfer/ProductOfferServiceCriteriaTransfer | +| ProductOfferServiceConditions | class | created | src/Generated/Shared/Transfer/ProductOfferServiceConditionsTransfer | +| IterableProductOfferServicesCriteria | class | created | src/Generated/Shared/Transfer/IterableProductOfferServicesCriteriaTransfer | +| IterableProductOfferServicesConditions | class | created | src/Generated/Shared/Transfer/IterableProductOfferServicesConditionsTransfer | +| ProductOfferServiceStorage | class | created | src/Generated/Shared/Transfer/ProductOfferServiceStorageTransfer | +| ProductOfferServiceStorageCollection | class | created | src/Generated/Shared/Transfer/ProductOfferServiceStorageCollectionTransfer | +| ServicePointStorageCollection | class | created | src/Generated/Shared/Transfer/ServicePointStorageCollectionTransfer | +| ServicePointStorageCriteria | class | created | src/Generated/Shared/Transfer/ServicePointStorageCriteriaTransfer | +| ServicePointStorageConditions | class | created | src/Generated/Shared/Transfer/ServicePointStorageConditionsTransfer | +| SynchronizationData | class | created | src/Generated/Shared/Transfer/SynchronizationDataTransfer | +| Filter | class | created | src/Generated/Shared/Transfer/FilterTransfer | {% endinfo_block %} diff --git a/_includes/pbc/all/install-features/202400.0/install-the-push-notification-feature.md b/_includes/pbc/all/install-features/202400.0/install-the-push-notification-feature.md index 118ec1d01d9..d66417e36a9 100644 --- a/_includes/pbc/all/install-features/202400.0/install-the-push-notification-feature.md +++ b/_includes/pbc/all/install-features/202400.0/install-the-push-notification-feature.md @@ -82,14 +82,14 @@ Make sure that the following changes have been triggered in transfer objects: | PushNotificationCollection | class | created | src/Generated/Shared/Transfer/PushNotificationCollectionTransfer | | PushNotificationCriteria | class | created | src/Generated/Shared/Transfer/PushNotificationCriteriaTransfer | | PushNotificationConditions | class | created | src/Generated/Shared/Transfer/PushNotificationConditionsTransfer | -| ApiPushNotificationSubscriptionsAttributes | class | created | src/Generated/Shared/Transfer/ApiPushNotificationSubscriptionsAttributesTransfer | -| ApiPushNotificationGroupsAttributes | class | created | src/Generated/Shared/Transfer/ApiPushNotificationGroupsAttributesTransfer | -| GlueRequest | class | created | src/Generated/Shared/Transfer/GlueRequest | -| GlueResourceMethodCollection | class | created | src/Generated/Shared/Transfer/GlueResourceMethodCollection | -| Sort | class | created | src/Generated/Shared/Transfer/Sort | -| Pagination | class | created | src/Generated/Shared/Transfer/Pagination | -| ApiPushNotificationProvidersAttributes | class | created | src/Generated/Shared/Transfer/ApiPushNotificationProvidersAttributes | -| PushNotificationProviderCollectionDeleteCriteria | class | created | src/Generated/Shared/Transfer/ApiPushNotificationGroupsAttributesTransfer | +| PushNotificationSubscriptionsBackendApiAttributes | class | created | src/Generated/Shared/Transfer/PushNotificationSubscriptionsBackendApiAttributesTransfer | +| PushNotificationGroupsBackendApiAttributes | class | created | src/Generated/Shared/Transfer/PushNotificationGroupsBackendApiAttributesTransfer | +| GlueRequest | class | created | src/Generated/Shared/Transfer/GlueRequestTransfer | +| GlueResourceMethodCollection | class | created | src/Generated/Shared/Transfer/GlueResourceMethodCollectionTransfer | +| Sort | class | created | src/Generated/Shared/Transfer/SortTransfer | +| Pagination | class | created | src/Generated/Shared/Transfer/PaginationTransfer | +| ApiPushNotificationProvidersAttributes | class | created | src/Generated/Shared/Transfer/ApiPushNotificationProvidersAttributesTransfer | +| PushNotificationProviderCollectionDeleteCriteria | class | created | src/Generated/Shared/Transfer/PushNotificationProviderCollectionDeleteCriteriaTransfer | {% endinfo_block %} diff --git a/_includes/pbc/all/install-features/202400.0/install-the-service-points-feature.md b/_includes/pbc/all/install-features/202400.0/install-the-service-points-feature.md index 9228b000ca4..35024c8d114 100644 --- a/_includes/pbc/all/install-features/202400.0/install-the-service-points-feature.md +++ b/_includes/pbc/all/install-features/202400.0/install-the-service-points-feature.md @@ -140,84 +140,75 @@ Make sure that propel entities have been generated successfully by checking thei Make sure that the following changes have been applied in transfer objects: -| TRANSFER | TYPE | EVENT | PATH | -|---------------------------------------|-------|---------|-----------------------------------------------------------------------------| -| ServicePoint | class | created | src/Generated/Shared/Transfer/ServicePointTransfer | -| ServicePointCollection | class | created | src/Generated/Shared/Transfer/ServicePointCollectionTransfer | -| ServicePointCollectionRequest | class | created | src/Generated/Shared/Transfer/ServicePointCollectionRequestTransfer | -| ServicePointCollectionResponse | class | created | src/Generated/Shared/Transfer/ServicePointCollectionResponseTransfer | -| ServicePointCriteria | class | created | src/Generated/Shared/Transfer/ServicePointCriteriaTransfer | -| ServicePointConditions | class | created | src/Generated/Shared/Transfer/ServicePointConditionsTransfer | -| ApiServicePointsAttributes | class | created | src/Generated/Shared/Transfer/ApiServicePointsAttributesTransfer | -| ApiServiceTypesAttributes | class | created | src/Generated/Shared/Transfer/ApiServiceTypesAttributesTransfer | -| ApiServicesAttributes | class | created | src/Generated/Shared/Transfer/ApiServicesAttributesTransfer | -| ApiServicesRequestAttributes | class | created | src/Generated/Shared/Transfer/ApiServicesRequestAttributesTransfer | -| ApiServicePointAddressesAttributes | class | created | src/Generated/Shared/Transfer/ApiServicePointAddressesAttributesTransfer | -| StoreRelation | class | created | src/Generated/Shared/Transfer/StoreRelationTransfer | -| Store | class | created | src/Generated/Shared/Transfer/StoreTransfer | -| Error | class | created | src/Generated/Shared/Transfer/ErrorTransfer | -| Sort | class | created | src/Generated/Shared/Transfer/SortTransfer | -| Pagination | class | created | src/Generated/Shared/Transfer/PaginationTransfer | -| ErrorCollection | class | created | src/Generated/Shared/Transfer/ErrorCollectionTransfer | -| DataImporterConfiguration | class | created | src/Generated/Shared/Transfer/DataImporterConfigurationTransfer | -| DataImporterReport | class | created | src/Generated/Shared/Transfer/DataImporterReportTransfer | -| CountryCriteria | class | created | src/Generated/Shared/Transfer/CountryCriteriaTransfer | -| CountryConditions | class | created | src/Generated/Shared/Transfer/CountryConditionsTransfer | -| Country | class | created | src/Generated/Shared/Transfer/CountryTransfer | -| CountryCollection | class | created | src/Generated/Shared/Transfer/CountryCollectionTransfer | -| Region | class | created | src/Generated/Shared/Transfer/RegionTransfer | -| ServicePointAddressCollection | class | created | src/Generated/Shared/Transfer/ServicePointAddressCollectionTransfer | -| ServicePointAddressCollectionRequest | class | created | src/Generated/Shared/Transfer/ServicePointAddressCollectionRequestTransfer | -| ServicePointAddressCollectionResponse | class | created | src/Generated/Shared/Transfer/ServicePointAddressCollectionResponseTransfer | -| ServicePointAddressCriteria | class | created | src/Generated/Shared/Transfer/ServicePointAddressCriteriaTransfer | -| ServicePointAddressConditions | class | created | src/Generated/Shared/Transfer/ServicePointAddressConditionsTransfer | -| ServicePointAddress | class | created | src/Generated/Shared/Transfer/ServicePointAddressTransfer | -| GlueRelationship | class | created | src/Generated/Shared/Transfer/GlueRelationshipTransfer | -| ServicePointSearchCollection | class | created | src/Generated/Shared/Transfer/ServicePointSearchCollectionTransfer | -| ServicePointSearch | class | created | src/Generated/Shared/Transfer/ServicePointSearchTransfer | -| ServicePointSearchRequest | class | created | src/Generated/Shared/Transfer/ServicePointSearchRequestTransfer | -| ServiceCollectionRequest | class | created | src/Generated/Shared/Transfer/ServiceCollectionRequestTransfer | -| ServiceCollectionResponse | class | created | src/Generated/Shared/Transfer/ServiceCollectionResponseTransfer | -| ServiceCollection | class | created | src/Generated/Shared/Transfer/ServiceCollectionTransfer | -| ServiceConditions | class | created | src/Generated/Shared/Transfer/ServiceConditionsTransfer | -| ServiceCriteria | class | created | src/Generated/Shared/Transfer/ServiceCriteriaTransfer | -| Service | class | created | src/Generated/Shared/Transfer/ServiceTransfer | -| ServiceTypeCollectionRequest | class | created | src/Generated/Shared/Transfer/ServiceTypeCollectionRequestTransfer | -| ServiceTypeCollectionResponse | class | created | src/Generated/Shared/Transfer/ServiceTypeCollectionResponseTransfer | -| ServiceTypeCollection | class | created | src/Generated/Shared/Transfer/ServiceTypeCollectionTransfer | -| ServiceTypeConditions | class | created | src/Generated/Shared/Transfer/ServiceTypeConditionsTransfer | -| ServiceTypeCriteria | class | created | src/Generated/Shared/Transfer/ServiceTypeCriteriaTransfer | -| ServiceType | class | created | src/Generated/Shared/Transfer/ServiceTypeTransfer | -| ServicePointStorage | class | created | src/Generated/Shared/Transfer/ServicePointStorageTransfer | -| ServicePointAddressStorage | class | created | src/Generated/Shared/Transfer/ServicePointAddressStorageTransfer | -| ServiceStorage | class | created | src/Generated/Shared/Transfer/ServiceStorageTransfer | -| CountryStorage | class | created | src/Generated/Shared/Transfer/CountryStorageTransfer | -| RegionStorage | class | created | src/Generated/Shared/Transfer/RegionStorageTransfer | -| ServicePointStorageCollection | class | created | src/Generated/Shared/Transfer/ServicePointStorageCollectionTransfer | -| ServicePointStorageCriteria | class | created | src/Generated/Shared/Transfer/ServicePointStorageCriteriaTransfer | -| ServicePointStorageConditions | class | created | src/Generated/Shared/Transfer/ServicePointStorageConditionsTransfer | -| ServiceTypeStorage | class | created | src/Generated/Shared/Transfer/ServiceTypeStorageTransfer | -| ServiceTypeStorageCollection | class | created | src/Generated/Shared/Transfer/ServiceTypeStorageCollectionTransfer | -| ServiceTypeStorageCriteria | class | created | src/Generated/Shared/Transfer/ServiceTypeStorageCriteriaTransfer | -| ServiceTypeStorageConditions | class | created | src/Generated/Shared/Transfer/ServiceTypeStorageConditionsTransfer | -| SynchronizationData | class | created | src/Generated/Shared/Transfer/SynchronizationDataTransfer | -| Filter | class | created | src/Generated/Shared/Transfer/FilterTransfer | -| SalesOrderItemServicePoint | class | created | src/Generated/Shared/Transfer/SalesOrderItemServicePointTransfer | -| Item | class | created | src/Generated/Shared/Transfer/ItemTransfer | -| SalesOrderItemServicePointCriteria | class | created | src/Generated/Shared/Transfer/SalesOrderItemServicePointCriteria | -| SalesOrderItemServicePointConditions | class | created | src/Generated/Shared/Transfer/SalesOrderItemServicePointConditions | -| SalesOrderItemServicePointCollection | class | created | src/Generated/Shared/Transfer/SalesOrderItemServicePointCollection | -| Quote | class | created | src/Generated/Shared/Transfer/QuoteTransfer | -| SaveOrder | class | created | src/Generated/Shared/Transfer/SaveOrderTransfer | -| ShipmentGroup | class | created | src/Generated/Shared/Transfer/ShipmentGroupTransfer | -| RestServicePointsAttributes | class | created | src/Generated/Shared/Transfer/RestServicePointsAttributesTransfer | -| RestServicePointAddressesAttributes | class | created | src/Generated/Shared/Transfer/RestServicePointAddressesAttributesTransfer | -| ServiceTypeResourceCriteria | class | created | src/Generated/Shared/Transfer/ServiceTypeResourceCriteriaTransfer | -| ServiceTypeResourceConditions | class | created | src/Generated/Shared/Transfer/ServiceTypeResourceConditionsTransfer | -| ServiceTypeResourceCollection | class | created | src/Generated/Shared/Transfer/ServiceTypeResourceCollectionTransfer | -| RestServiceTypesAttributes | class | created | src/Generated/Shared/Transfer/RestServiceTypesAttributesTransfer | -| RestErrorMessage | class | created | src/Generated/Shared/Transfer/RestErrorMessageTransfer | -| GlueResource | class | created | src/Generated/Shared/Transfer/GlueResourceTransfer | +| TRANSFER | TYPE | EVENT | PATH | +|-------------------------------------------|-------|---------|---------------------------------------------------------------------------------| +| ServicePoint | class | created | src/Generated/Shared/Transfer/ServicePointTransfer | +| ServicePointCollection | class | created | src/Generated/Shared/Transfer/ServicePointCollectionTransfer | +| ServicePointCollectionRequest | class | created | src/Generated/Shared/Transfer/ServicePointCollectionRequestTransfer | +| ServicePointCollectionResponse | class | created | src/Generated/Shared/Transfer/ServicePointCollectionResponseTransfer | +| ServicePointCriteria | class | created | src/Generated/Shared/Transfer/ServicePointCriteriaTransfer | +| ServicePointConditions | class | created | src/Generated/Shared/Transfer/ServicePointConditionsTransfer | +| ServicePointsBackendApiAttributes | class | created | src/Generated/Shared/Transfer/ServicePointsBackendApiAttributesTransfer | +| ServiceTypesBackendApiAttributes | class | created | src/Generated/Shared/Transfer/ServiceTypesBackendApiAttributesTransfer | +| ServicesBackendApiAttributes | class | created | src/Generated/Shared/Transfer/ServicesBackendApiAttributesTransfer | +| ServicesRequestBackendApiAttributes | class | created | src/Generated/Shared/Transfer/ServicesRequestBackendApiAttributesTransfer | +| ServicePointAddressesBackendApiAttributes | class | created | src/Generated/Shared/Transfer/ServicePointAddressesBackendApiAttributesTransfer | +| StoreRelation | class | created | src/Generated/Shared/Transfer/StoreRelationTransfer | +| Store | class | created | src/Generated/Shared/Transfer/StoreTransfer | +| Error | class | created | src/Generated/Shared/Transfer/ErrorTransfer | +| Sort | class | created | src/Generated/Shared/Transfer/SortTransfer | +| Pagination | class | created | src/Generated/Shared/Transfer/PaginationTransfer | +| ErrorCollection | class | created | src/Generated/Shared/Transfer/ErrorCollectionTransfer | +| DataImporterConfiguration | class | created | src/Generated/Shared/Transfer/DataImporterConfigurationTransfer | +| DataImporterReport | class | created | src/Generated/Shared/Transfer/DataImporterReportTransfer | +| CountryCriteria | class | created | src/Generated/Shared/Transfer/CountryCriteriaTransfer | +| CountryConditions | class | created | src/Generated/Shared/Transfer/CountryConditionsTransfer | +| Country | class | created | src/Generated/Shared/Transfer/CountryTransfer | +| CountryCollection | class | created | src/Generated/Shared/Transfer/CountryCollectionTransfer | +| Region | class | created | src/Generated/Shared/Transfer/RegionTransfer | +| ServicePointAddressCollection | class | created | src/Generated/Shared/Transfer/ServicePointAddressCollectionTransfer | +| ServicePointAddressCollectionRequest | class | created | src/Generated/Shared/Transfer/ServicePointAddressCollectionRequestTransfer | +| ServicePointAddressCollectionResponse | class | created | src/Generated/Shared/Transfer/ServicePointAddressCollectionResponseTransfer | +| ServicePointAddressCriteria | class | created | src/Generated/Shared/Transfer/ServicePointAddressCriteriaTransfer | +| ServicePointAddressConditions | class | created | src/Generated/Shared/Transfer/ServicePointAddressConditionsTransfer | +| ServicePointAddress | class | created | src/Generated/Shared/Transfer/ServicePointAddressTransfer | +| GlueRelationship | class | created | src/Generated/Shared/Transfer/GlueRelationshipTransfer | +| ServicePointSearchCollection | class | created | src/Generated/Shared/Transfer/ServicePointSearchCollectionTransfer | +| ServicePointSearch | class | created | src/Generated/Shared/Transfer/ServicePointSearchTransfer | +| ServicePointSearchRequest | class | created | src/Generated/Shared/Transfer/ServicePointSearchRequestTransfer | +| ServiceCollectionRequest | class | created | src/Generated/Shared/Transfer/ServiceCollectionRequestTransfer | +| ServiceCollectionResponse | class | created | src/Generated/Shared/Transfer/ServiceCollectionResponseTransfer | +| ServiceCollection | class | created | src/Generated/Shared/Transfer/ServiceCollectionTransfer | +| ServiceConditions | class | created | src/Generated/Shared/Transfer/ServiceConditionsTransfer | +| ServiceCriteria | class | created | src/Generated/Shared/Transfer/ServiceCriteriaTransfer | +| Service | class | created | src/Generated/Shared/Transfer/ServiceTransfer | +| ServiceTypeCollectionRequest | class | created | src/Generated/Shared/Transfer/ServiceTypeCollectionRequestTransfer | +| ServiceTypeCollectionResponse | class | created | src/Generated/Shared/Transfer/ServiceTypeCollectionResponseTransfer | +| ServiceTypeCollection | class | created | src/Generated/Shared/Transfer/ServiceTypeCollectionTransfer | +| ServiceTypeConditions | class | created | src/Generated/Shared/Transfer/ServiceTypeConditionsTransfer | +| ServiceTypeCriteria | class | created | src/Generated/Shared/Transfer/ServiceTypeCriteriaTransfer | +| ServiceType | class | created | src/Generated/Shared/Transfer/ServiceTypeTransfer | +| ServicePointStorage | class | created | src/Generated/Shared/Transfer/ServicePointStorageTransfer | +| ServicePointAddressStorage | class | created | src/Generated/Shared/Transfer/ServicePointAddressStorageTransfer | +| ServiceStorage | class | created | src/Generated/Shared/Transfer/ServiceStorageTransfer | +| CountryStorage | class | created | src/Generated/Shared/Transfer/CountryStorageTransfer | +| RegionStorage | class | created | src/Generated/Shared/Transfer/RegionStorageTransfer | +| ServicePointStorageCollection | class | created | src/Generated/Shared/Transfer/ServicePointStorageCollectionTransfer | +| ServicePointStorageCriteria | class | created | src/Generated/Shared/Transfer/ServicePointStorageCriteriaTransfer | +| ServicePointStorageConditions | class | created | src/Generated/Shared/Transfer/ServicePointStorageConditionsTransfer | +| SynchronizationData | class | created | src/Generated/Shared/Transfer/SynchronizationDataTransfer | +| Filter | class | created | src/Generated/Shared/Transfer/FilterTransfer | +| SalesOrderItemServicePoint | class | created | src/Generated/Shared/Transfer/FilterTransfer | +| Item | class | created | src/Generated/Shared/Transfer/FilterTransfer | +| SalesOrderItemServicePointCriteria | class | created | src/Generated/Shared/Transfer/SalesOrderItemServicePointCriteria | +| SalesOrderItemServicePointConditions | class | created | src/Generated/Shared/Transfer/SalesOrderItemServicePointConditions | +| SalesOrderItemServicePointCollection | class | created | src/Generated/Shared/Transfer/SalesOrderItemServicePointCollection | +| Quote | class | created | src/Generated/Shared/Transfer/QuoteTransfer | +| SaveOrder | class | created | src/Generated/Shared/Transfer/SaveOrderTransfer | +| ShipmentGroup | class | created | src/Generated/Shared/Transfer/ShipmentGroupTransfer | +| RestServicePointsAttributes | class | created | src/Generated/Shared/Transfer/RestServicePointsAttributesTransfer | +| RestServicePointAddressesAttributes | class | created | src/Generated/Shared/Transfer/RestServicePointAddressesAttributesTransfer | +| RestErrorMessage | class | created | src/Generated/Shared/Transfer/RestErrorMessageTransfer | {% endinfo_block %} diff --git a/_includes/pbc/all/install-features/202400.0/install-the-warehouse-user-management-feature.md b/_includes/pbc/all/install-features/202400.0/install-the-warehouse-user-management-feature.md index 8e8cfc00379..0d2152f98c6 100644 --- a/_includes/pbc/all/install-features/202400.0/install-the-warehouse-user-management-feature.md +++ b/_includes/pbc/all/install-features/202400.0/install-the-warehouse-user-management-feature.md @@ -65,8 +65,8 @@ Make sure that the following changes have been triggered in transfer objects: | WarehouseUserAssignmentCollectionRequest | class | created | src/Generated/Shared/Transfer/WarehouseUserAssignmentCollectionRequest | | WarehouseUserAssignmentCollectionResponse | class | created | src/Generated/Shared/Transfer/WarehouseUserAssignmentCollectionResponse | | WarehouseUserAssignmentCollectionDeleteCriteria | class | created | src/Generated/Shared/Transfer/WarehouseUserAssignmentCollectionDeleteCriteria | -| ApiWarehouseUserAssignmentsAttributes | class | created | src/Generated/Shared/Transfer/ApiWarehouseUserAssignmentsAttributesTransfer | -| ApiWarehousesAttributes | class | created | src/Generated/Shared/Transfer/ApiWarehousesAttributes | +| WarehouseUserAssignmentsBackendApiAttributes | class | created | src/Generated/Shared/Transfer/WarehouseUserAssignmentsBackendApiAttributes | +| WarehousesBackendApiAttributes | class | created | src/Generated/Shared/Transfer/WarehousesBackendApiAttributes | | UserCollection | class | created | src/Generated/Shared/Transfer/UserCollection | | UserConditions | class | created | src/Generated/Shared/Transfer/UserConditions | | User.uuid | property | created | src/Generated/Shared/Transfer/User |