{
  "name": "ezGPT - Top Orders",
  "active": false,
  "nodes": [
    {
      "id": "manual-trigger",
      "name": "Manual Trigger",
      "type": "n8n-nodes-base.manualTrigger",
      "typeVersion": 1,
      "position": [
        240,
        300
      ],
      "parameters": {}
    },
    {
      "id": "sample-orders",
      "name": "Sample Orders",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        450,
        300
      ],
      "parameters": {
        "mode": "runOnceForAllItems",
        "jsCode": "const orders = [\n  {\n    \"order_id\": \"O3\",\n    \"order_rank\": 3,\n    \"client\": \"Гамма\",\n    \"amount_minor\": 120000\n  },\n  {\n    \"order_id\": \"O1\",\n    \"order_rank\": 1,\n    \"client\": \"Альфа\",\n    \"amount_minor\": 150000\n  },\n  {\n    \"order_id\": \"O5\",\n    \"order_rank\": 5,\n    \"client\": \"Эпсилон\",\n    \"amount_minor\": 50000\n  },\n  {\n    \"order_id\": \"O4\",\n    \"order_rank\": 4,\n    \"client\": \"Дельта\",\n    \"amount_minor\": 0\n  },\n  {\n    \"order_id\": \"O2\",\n    \"order_rank\": 2,\n    \"client\": \"Бета\",\n    \"amount_minor\": 150000\n  }\n];\nif (!orders.length) throw new Error('orders_empty');\nreturn orders.map(json => ({ json }));"
      }
    },
    {
      "id": "validate-orders",
      "name": "Validate Orders",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        660,
        300
      ],
      "parameters": {
        "mode": "runOnceForAllItems",
        "jsCode": "const items = $input.all();\nconst ids = new Set();\nconst ranks = new Set();\nfor (const { json: row } of items) {\n  if (typeof row.order_id !== 'string' || !row.order_id.trim() || ids.has(row.order_id)) {\n    throw new Error('order_id_missing_or_duplicate');\n  }\n  if (!Number.isSafeInteger(row.order_rank) || row.order_rank < 1 || ranks.has(row.order_rank)) {\n    throw new Error('order_rank_invalid_or_duplicate');\n  }\n  if (!Number.isSafeInteger(row.amount_minor) || row.amount_minor < 0) {\n    throw new Error('amount_minor_invalid');\n  }\n  if (typeof row.client !== 'string' || !row.client.trim()) {\n    throw new Error('client_required');\n  }\n  ids.add(row.order_id);\n  ranks.add(row.order_rank);\n}\nreturn items;"
      }
    },
    {
      "id": "sort-orders",
      "name": "Sort Orders",
      "type": "n8n-nodes-base.sort",
      "typeVersion": 1,
      "position": [
        870,
        300
      ],
      "parameters": {
        "type": "simple",
        "sortFieldsUi": {
          "sortField": [
            {
              "fieldName": "amount_minor",
              "order": "descending"
            },
            {
              "fieldName": "order_rank",
              "order": "ascending"
            }
          ]
        },
        "options": {
          "disableDotNotation": false
        }
      }
    },
    {
      "id": "limit-orders",
      "name": "Limit Orders",
      "type": "n8n-nodes-base.limit",
      "typeVersion": 1,
      "position": [
        1080,
        300
      ],
      "parameters": {
        "maxItems": 3,
        "keep": "firstItems"
      }
    },
    {
      "id": "top-summary",
      "name": "Top Summary",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        1300,
        300
      ],
      "parameters": {
        "mode": "runOnceForAllItems",
        "jsCode": "const source = $('Validate Orders').all();\nconst selected = $input.all().map(item => item.json);\nlet total = 0;\nfor (const row of selected) {\n  total += row.amount_minor;\n  if (!Number.isSafeInteger(total)) throw new Error('selected_total_out_of_range');\n}\nreturn [{ json: {\n  input_count: source.length,\n  selected_count: selected.length,\n  excluded_count: source.length - selected.length,\n  selected_ids: selected.map(row => row.order_id),\n  amounts_minor: selected.map(row => row.amount_minor),\n  selected_amount_minor: total,\n  selected_amount_rub: total / 100,\n  action_performed: false,\n} }];"
      }
    }
  ],
  "connections": {
    "Manual Trigger": {
      "main": [
        [
          {
            "node": "Sample Orders",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Sample Orders": {
      "main": [
        [
          {
            "node": "Validate Orders",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Validate Orders": {
      "main": [
        [
          {
            "node": "Sort Orders",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Sort Orders": {
      "main": [
        [
          {
            "node": "Limit Orders",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Limit Orders": {
      "main": [
        [
          {
            "node": "Top Summary",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "settings": {
    "executionOrder": "v1",
    "saveDataSuccessExecution": "all",
    "saveDataErrorExecution": "all"
  },
  "pinData": {}
}
