281cb5ce3ed41d0954fd95b0658a8915741efccb9d4e8638edd0a172711eaa02:{"__metadata":{"version":0.1},"root":{"steps":[{"step_id":"1","step_position":[0,0],"config_field_values":[],"task_id":"shopify::admin::order_created","task_version":"0.1","task_type":"TRIGGER","description":null,"note":null,"name":null},{"step_id":"2","step_position":[0,200],"config_field_values":[{"config_field_id":"condition","value":"{\"uuid\":\"01M45R1SGHFVERH9EVCMXVY1J2\",\"lhs\":{\"uuid\":\"01M45R1SGH8BTC2RJ8FWDR4ZKT\",\"parent_uuid\":\"01M45R1SGHFVERH9EVCMXVY1J2\",\"array_path\":{\"uuid\":\"01M45R1SGHPZF7AN3GNN3S2ZMA\",\"parent_uuid\":\"01M45R1SGH8BTC2RJ8FWDR4ZKT\",\"value\":\"order.lineItems\",\"comparison_value_type\":\"EnvironmentValue\",\"full_environment_path\":\"order.lineItems\"},\"array_item_key\":{\"uuid\":\"01M45R1SGHRTB8KZ179V7CV6KC\",\"parent_uuid\":\"01M45R1SGH8BTC2RJ8FWDR4ZKT\",\"value\":\"lineItems_item\",\"comparison_value_type\":\"EnvironmentValue\"},\"operation\":{\"uuid\":\"01M45R1SGHRED1HQFZ4HCF61G4\",\"parent_uuid\":\"01M45R1SGH8BTC2RJ8FWDR4ZKT\",\"lhs\":{\"uuid\":\"01M45R1SGHH38FG2QGX2BE4D7J\",\"parent_uuid\":\"01M45R1SGHRED1HQFZ4HCF61G4\",\"value\":\"lineItems_item.product.id\",\"comparison_value_type\":\"EnvironmentValue\",\"full_environment_path\":\"order.lineItems.product.id\"},\"rhs\":{\"uuid\":\"01M45R1SGHWQP28GQVN8WEW7FY\",\"parent_uuid\":\"01M45R1SGHRED1HQFZ4HCF61G4\",\"value\":\"gid://shopify/Product/0000000000\",\"comparison_value_type\":\"LiteralValue\"},\"value_type\":\"EnvironmentScalarDefinition:ID\",\"operator\":\"==\",\"operation_type\":\"Comparison\"},\"operator\":\"ANY\",\"operation_type\":\"ArrayExpression\"},\"operator\":\"AND\",\"operation_type\":\"LogicalExpression\"}"}],"task_id":"shopify::flow::condition","task_version":"0.1","task_type":"CONDITION","description":null,"note":null,"name":null},{"step_id":"3","step_position":[0,380],"config_field_values":[{"config_field_id":"input","value":"query {\n  order {\n    lineItems {\n      quantity\n      product {\n        id\n      }\n      customAttributes {\n        key\n        value\n      }\n    }\n    fulfillmentOrders {\n      assignedLocation {\n        location {\n          id\n        }\n      }\n    }\n  }\n}"},{"config_field_id":"script","value":"// TODO: replace with the real \"Empty box\" product GID (must match the Condition step)\nconst EMPTY_BOX_PRODUCT_ID = 'gid://shopify/Product/0000000000';\n// TODO: replace with the exact line item property name (starts with \"_\")\nconst PROPERTY_NAME = '_variant_ids';\n\n// Flow cannot loop over a comma-separated string, so this step splits the\n// property into a list of {variantId, delta} that the For each step iterates.\nexport default function main(input) {\n  const adjustments = [];\n  for (const li of input.order.lineItems) {\n    if (!li.product || li.product.id !== EMPTY_BOX_PRODUCT_ID) continue;\n    const attr = (li.customAttributes || []).find(a => a.key === PROPERTY_NAME);\n    if (!attr || !attr.value) continue;\n    for (const raw of attr.value.split(',')) {\n      // Accept numeric IDs or full GIDs\n      const id = raw.trim().replace('gid://shopify/ProductVariant/', '');\n      if (!/^\\d+$/.test(id)) continue;\n      adjustments.push({ variantId: id, delta: -li.quantity });\n    }\n  }\n  const fo = (input.order.fulfillmentOrders || []).find(f => f.assignedLocation && f.assignedLocation.location);\n  return {\n    adjustments,\n    locationId: fo ? fo.assignedLocation.location.id : ''\n  };\n}"},{"config_field_id":"output_schema","value":"type Adjustment {\n  \"Numeric variant ID\"\n  variantId: String!\n  \"Negative quantity to subtract\"\n  delta: Int!\n}\n\ntype Output {\n  \"Inventory adjustments to apply\"\n  adjustments: [Adjustment!]!\n  \"Location GID assigned to fulfill the order\"\n  locationId: String!\n}"}],"task_id":"shopify::flow::run_code","task_version":"0.1","task_type":"ACTION","description":null,"note":null,"name":"Run code"},{"step_id":"4","step_position":[0,500],"config_field_values":[{"config_field_id":"listpath","value":"runCode.adjustments"}],"task_id":"shopify::flow::foreach","task_version":"0.1","task_type":"FOREACH","description":null,"note":null,"name":null},{"step_id":"5","step_position":[0,660],"config_field_values":[{"config_field_id":"sort_by","value":"{\"sortKey\":\"ID\",\"order\":\"ASCENDING\"}"},{"config_field_id":"max_root_records","value":"1"},{"config_field_id":"query","value":"id:{{ adjustmentsForeachitem.variantId }}"}],"task_id":"shopify::flow::fetch::product_variants","task_version":"v1","task_type":"ACTION","description":null,"note":null,"name":"Get product variant data"},{"step_id":"6","step_position":[0,800],"config_field_values":[{"config_field_id":"api_call","value":"{\"name\":\"inventoryAdjustQuantities\",\"blob\":\"{\\n  \\\"input\\\": {\\n    \\\"reason\\\": \\\"correction\\\",\\n    \\\"name\\\": \\\"available\\\",\\n    \\\"changes\\\": [{% for v in getProductVariantData %}\\n      {\\n        \\\"delta\\\": {{ adjustmentsForeachitem.delta }},\\n        \\\"inventoryItemId\\\": \\\"{{ v.inventoryItem.id }}\\\",\\n        \\\"locationId\\\": \\\"{{ runCode.locationId }}\\\",\\n        \\\"changeFromQuantity\\\": null\\n      }{% endfor %}\\n    ]\\n  }\\n}\"}"}],"task_id":"shopify::admin::admin_api_operation","task_version":"0.1","task_type":"ACTION","description":null,"note":null,"name":"Send Admin API request"}],"links":[{"from_step_id":"1","from_port_id":"output","to_step_id":"2","to_port_id":"input"},{"from_step_id":"2","from_port_id":"true","to_step_id":"3","to_port_id":"input"},{"from_step_id":"3","from_port_id":"output","to_step_id":"4","to_port_id":"input"},{"from_step_id":"4","from_port_id":"loop_body","to_step_id":"5","to_port_id":"input"},{"from_step_id":"5","from_port_id":"output","to_step_id":"6","to_port_id":"input"}],"patched_fields":[],"variables":[],"note":null,"vertical_layout_enabled":true,"workflow_name":"Empty box subscription inventory"}}