From 277de454fa75afa37a77282322156c02841fc4fc Mon Sep 17 00:00:00 2001 From: Andreas von Studnitz Date: Wed, 17 Apr 2024 09:45:43 +0000 Subject: [PATCH] Add suggestions for related modules (Common Events and Admin UI) --- README.md | 37 +++++++++++++++++++++++++++++++++++++ composer.json | 4 ++++ docs/admin_ui_form.png | Bin 0 -> 30070 bytes 3 files changed, 41 insertions(+) create mode 100644 docs/admin_ui_form.png diff --git a/README.md b/README.md index ff95cad..1e6131a 100644 --- a/README.md +++ b/README.md @@ -245,3 +245,40 @@ Search all events with the order increment id starting with `CK` and status succ To turn off asynchronous event indexing visit Admin > Stores > Settings > Configuration > Advanced > System > Async Events and disable `Enable Asynchronous Events Indexing`. + +## Related Modules + +### Common Events + +[Mage-OS Common Asynchronous Events](https://github.com/mage-os/mageos-common-async-events) includes several +default events for this module: + +| Event identifier | Description | +|--------------------------|------------------------------------------------| +| customer.created | Whenever a customer is created | +| customer.updated | Whenever a customer is saved, except it's new | +| customer.address.created | Whenever a customer address is created | +| customer.address.updated | Whenever a customer address is saved, except it's new | +| sales.order.created | When a new order is created | +| sales.order.updated | When the state of an existing order is changed | +| sales.order.paid | When an order is fully paid | +| sales.order.shipped | When an order is fully shipped | +| sales.order.holded | When an order is set "on hold" | +| sales.order.unholded | When an order is released from "on hold" | +| sales.order.cancelled | When an order is cancelled | +| sales.shipment.created | When a new shipment is created | +| sales.invoice.created | When a new invoice is created | +| sales.invoice.paid | When an invoice is paid | +| sales.creditmemo.created | When a new creditmemo is created | + +These events work out of the box and can be used within subcribers. +The module can also be used as a template on how to implement custom events. + +### Admin UI + +[Mage-OS Asynchronous Events Admin Ui](https://github.com/mage-os/mageos-async-events-admin-ui) provides +a simple interface to create subscribers for this module in the Magento Admin area instead of via REST API. +It only supports HTTP subscribers at the moment. + +![Admin UI Form](docs/admin_ui_form.png) + diff --git a/composer.json b/composer.json index 70d2e31..6a056b8 100644 --- a/composer.json +++ b/composer.json @@ -27,6 +27,10 @@ "MageOS\\AsyncEvents\\": "" } }, + "suggest": { + "mage-os/mageos-common-async-events": "Adds default events for the async events module, like sales.order.created, sales.invoice.paid or customer.address.updated", + "mage-os/mageos-async-events-admin-ui": "Adds a basic admin UI for the async events module which can be used to create subscribers instead of using the REST API" + }, "scripts": { "post-install-cmd": [ "([ $COMPOSER_DEV_MODE -eq 0 ] || vendor/bin/phpcs --config-set installed_paths ../../magento/magento-coding-standard/)" diff --git a/docs/admin_ui_form.png b/docs/admin_ui_form.png new file mode 100644 index 0000000000000000000000000000000000000000..9e30d35afe27e6671665a1ccf14899674584e54b GIT binary patch literal 30070 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 SuLTjH-ZMq@C#CW)-~JDvg!h{O literal 0 HcmV?d00001