forked from lightward/mechanic-tasks
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathauto-approve-return-requests.json
53 lines (53 loc) · 9.22 KB
/
auto-approve-return-requests.json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
{
"docs": "Use this task to auto-approve return requests, typically made by customers using self-serve from their account. Choose to limit the auto-approval to orders with any of a set of tags, products with any of a set of tags, or specific product categories or types. Optionally, configure email recipients to be notified when any auto-approval occurs.\n\nMore info on Shopify self-serve returns [here](https://help.shopify.com/en/manual/orders/refunds-returns/self-serve-returns).\n\n**Important:**\n- Adding multiple limit conditions means the return request must meet ALL of the conditions in order to be auto-approved.\n- More specifically, if any product conditions are configured, then ALL products on the return must meet those conditions.\n- Return requests that are auto-approved **cannot** later be used to exchange items.\n- Approval of return requests **cannot** be reverted; instead, the return request may be cancelled if needed.",
"halt_action_run_sequence_on_error": false,
"name": "Auto-approve return requests",
"online_store_javascript": null,
"options": {
"limit_to_orders_with_any_of_these_tags__array": null,
"limit_to_products_with_any_of_these_tags__array": null,
"limit_to_these_product_categories_or_types__array": null,
"notification_email_recipients__array": null
},
"order_status_javascript": null,
"perform_action_runs_in_sequence": false,
"preview_event_definitions": [
{
"description": "Return approve request",
"event_attributes": {
"topic": "mechanic/actions/perform",
"data": {
"type": "shopify",
"run": {
"ok": true,
"result": {
"data": {
"returnApproveRequest": {
"return": {
"name": "#PREVIEW-R1",
"status": "OPEN",
"order": {
"legacyResourceId": "1234567890",
"customer": {
"displayName": "Jean Deaux"
}
}
}
}
}
}
}
}
}
}
],
"script": "{% assign limit_order_tags = options.limit_to_orders_with_any_of_these_tags__array %}\n{% assign limit_product_tags = options.limit_to_products_with_any_of_these_tags__array %}\n{% assign limit_product_categories_or_types = options.limit_to_these_product_categories_or_types__array %}\n{% assign notification_email_recipients = options.notification_email_recipients__array %}\n\n{% if event.topic == \"shopify/returns/request\" %}\n {% comment %}\n -- get additional return and product data not available in the webhook\n {% endcomment %}\n\n {% capture query %}\n query {\n return(id: {{ return.admin_graphql_api_id | json }}) {\n id\n name\n status\n order {\n name\n tags\n }\n returnLineItems(first: 100) {\n nodes {\n fulfillmentLineItem {\n lineItem {\n product {\n category {\n name\n }\n productType\n tags\n }\n }\n }\n }\n }\n }\n }\n {% endcapture %}\n\n {% assign result = query | shopify %}\n\n {% if event.preview %}\n {% capture result_json %}\n {\n \"data\": {\n \"return\": {\n \"id\": \"gid://shopify/Return/1234567890\",\n \"name\": \"#PREVIEW-R1\",\n \"status\": \"REQUESTED\",\n \"order\": {\n \"name\": \"#PREVIEW\",\n \"tags\": {{ limit_order_tags.first | json }}\n },\n \"returnLineItems\": {\n \"nodes\": [\n {\n \"fulfillmentLineItem\": {\n \"lineItem\": {\n \"product\": {\n \"category\": {\n \"name\": {{ limit_product_categories_or_types.first | json }}\n },\n \"productType\": {{ limit_product_categories_or_types.first | json }},\n \"tags\": {{ limit_product_tags.first | json }}\n }\n }\n }\n }\n ]\n }\n }\n }\n }\n {% endcapture %}\n\n {% assign result = result_json | parse_json %}\n {% endif %}\n\n {% assign return = result.data.return %}\n {% assign order = return.order %}\n {% assign return_products\n = return.returnLineItems.nodes\n | map: \"fulfillmentLineItem\"\n | map: \"lineItem\"\n | map: \"product\"\n %}\n\n {% if return.status != \"REQUESTED\" %}\n {% log \"This return request does not have a status of 'REQUESTED' and likely has already been acted on; skipping.\" %}\n {% break %}\n {% endif %}\n\n {% comment %}\n -- assume the return request will be approved unless it doesn't meet any configured tag, category, or type limits\n {% endcomment %}\n\n {% assign return_qualifies = true %}\n\n {% if limit_order_tags != blank %}\n {% comment %}\n -- make sure the order has one of the configured tags\n {% endcomment %}\n\n {% assign has_qualifying_order_tag = nil %}\n\n {% for limit_order_tag in limit_order_tags %}\n {% if order.tags contains limit_order_tag %}\n {% assign has_qualifying_order_tag = true %}\n {% break %}\n {% endif %}\n {% endfor %}\n\n {% unless has_qualifying_order_tag %}\n {% assign return_qualifies = false %}\n {% endunless %}\n {% endif %}\n\n {% if limit_product_tags != blank %}\n {% comment %}\n -- make sure each returned product has one of the configured tags\n {% endcomment %}\n\n {% assign all_products_qualify = true %}\n\n {% for product in return_products %}\n {% assign product_qualifies = nil %}\n\n {% for limit_product_tag in limit_product_tags %}\n {% if product.tags contains limit_product_tag %}\n {% assign product_qualifies = true %}\n {% break %}\n {% endif %}\n {% endfor %}\n\n {% unless product_qualifies %}\n {% assign all_products_qualify = false %}\n {% break %}\n {% endunless %}\n {% endfor %}\n\n {% unless all_products_qualify %}\n {% assign return_qualifies = false %}\n {% endunless %}\n {% endif %}\n\n {% if limit_product_categories_or_types != blank %}\n {% comment %}\n -- make sure each returned product is one of the configured categories or types\n {% endcomment %}\n\n {% assign all_products_qualify = true %}\n\n {% for product in return_products %}\n {% assign product_qualifies = nil %}\n\n {% for limit_product_category_or_type in limit_product_categories_or_types %}\n {% if product.productType == limit_product_category_or_type or product.category.name == limit_product_category_or_type %}\n {% assign product_qualifies = true %}\n {% break %}\n {% endif %}\n {% endfor %}\n\n {% unless product_qualifies %}\n {% assign all_products_qualify = false %}\n {% break %}\n {% endunless %}\n {% endfor %}\n\n {% unless all_products_qualify %}\n {% assign return_qualifies = false %}\n {% endunless %}\n {% endif %}\n\n {% if return_qualifies %}\n {% action \"shopify\" %}\n mutation {\n returnApproveRequest(input: {id: {{ return.id | json }}}) {\n return {\n id\n name\n status\n order {\n legacyResourceId\n customer {\n displayName\n }\n }\n }\n userErrors {\n code\n field\n message\n }\n }\n }\n {% endaction %}\n {% endif %}\n\n{% elsif event.topic == \"mechanic/actions/perform\" %}\n {% unless action.type == \"shopify\" and action.run.ok and notification_email_recipients != blank %}\n {% break %}\n {% endunless %}\n\n {% comment %}\n -- if any notification recipients are configured, send them an email when a return request is auto-approved\n {% endcomment %}\n\n {% assign return = action.run.result.data.returnApproveRequest.return %}\n\n {%- capture email_subject -%}\n Return request {{ return.name }} was auto-approved\n {%- endcapture -%}\n\n {%- capture email_body -%}\n Return request {{ return.name }}, made by {{ return.order.customer.displayName }}, was auto-approved.\n\n Review the return details and take further action on the <a href=\"{{ shop.admin_url }}orders/{{ return.order.legacyResourceId }}\">order admin page</a>.\n\n Thanks,\n - Mechanic, for {{ shop.name }}\n {%- endcapture -%}\n\n {% action \"email\" %}\n {\n \"to\": {{ notification_email_recipients | json }},\n \"subject\": {{ email_subject | json }},\n \"body\": {{ email_body | newline_to_br | json }},\n \"reply_to\": {{ shop.customer_email | json }},\n \"from_display_name\": {{ shop.name | json }}\n }\n {% endaction %}\n{% endif %}\n",
"subscriptions": [
"shopify/returns/request",
"mechanic/actions/perform"
],
"subscriptions_template": "shopify/returns/request\nmechanic/actions/perform",
"tags": [
"Returns"
]
}