{
  "createdAt": "2025-10-22T08:50:19.845Z",
  "updatedAt": "2025-10-26T08:23:56.000Z",
  "id": "9l6gg6HzfpfV9bIj",
  "name": "Orders",
  "active": true,
  "isArchived": false,
  "nodes": [
    {
      "parameters": {
        "path": "api/orders",
        "responseMode": "responseNode",
        "options": {
          "responseHeaders": {
            "entries": [
              {
                "name": "Content-Type",
                "value": "application/json"
              }
            ]
          }
        }
      },
      "name": "Orders List Webhook",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2.1,
      "position": [
        -96,
        -16
      ],
      "id": "2e52da24-31a6-4845-b0ef-7d4f59d4e4cb"
    },
    {
      "parameters": {
        "operation": "executeQuery",
        "query": "SELECT \n  o.order_id,\n  o.vendor_id,\n  o.order_date,\n  o.total_cost,\n  o.delivery_date,\n  o.status,\n  v.vendor_name,\n  v.contact_email,\n  v.phone_number,\n  v.vendor_icon_content,\n  v.vendor_icon_type,\n  v.vendor_icon_name,\n  COUNT(DISTINCT op.component_id) as item_count,\n  COALESCE(SUM(op.quantity_ordered * op.unit_cost), 0) as total_value\nFROM orders o\nLEFT JOIN vendors v ON v.vendor_id = o.vendor_id\nLEFT JOIN order_parts op ON op.order_id = o.order_id\nGROUP BY \n  o.order_id, \n  o.vendor_id, \n  o.order_date, \n  o.total_cost, \n  o.delivery_date, \n  o.status, \n  v.vendor_name, \n  v.contact_email,\n  v.phone_number,\n  v.vendor_icon_content,\n  v.vendor_icon_type,\n  v.vendor_icon_name\nORDER BY o.order_date DESC;\n",
        "options": {}
      },
      "name": "Get Orders Query",
      "type": "n8n-nodes-base.postgres",
      "typeVersion": 2.6,
      "position": [
        128,
        -16
      ],
      "id": "8a3e664b-4dfb-4506-8bbd-675a72bddfaf",
      "credentials": {
        "postgres": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "path": "api/orders/detail",
        "responseMode": "responseNode",
        "options": {
          "responseHeaders": {
            "entries": [
              {
                "name": "Content-Type",
                "value": "application/json"
              }
            ]
          }
        }
      },
      "name": "Order Detail Webhook",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2.1,
      "position": [
        -96,
        208
      ],
      "id": "3579911e-8f50-49e0-a1bd-287097524911"
    },
    {
      "parameters": {
        "jsCode": "return [{ json: { order_id: $json.query.order_id } }];"
      },
      "name": "Extract Order ID",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        128,
        208
      ],
      "id": "0913143b-3d4e-4a2b-8de4-8d193bcbb5dc"
    },
    {
      "parameters": {
        "operation": "executeQuery",
        "query": "SELECT \n  o.order_id,\n  o.vendor_id,\n  o.order_date,\n  o.total_cost,\n  o.delivery_date,\n  o.status,\n  v.vendor_name,\n  v.contact_email,\n  v.phone_number,\n  v.vendor_icon_content,\n  v.vendor_icon_type,\n  v.vendor_icon_name,\n  (\n    SELECT json_agg(\n          json_build_object(\n            'order_part_id', op.order_part_id,\n            'component_id', op.component_id,\n            'component_name', c.name,\n            'file_name', \n              'http://192.168.0.7:5678/webhook/image?filename=component_' || op.component_id || '.' || COALESCE(c.image_type, 'jpeg'),\n            'category_name', cat.category_name,\n            'quantity_ordered', op.quantity_ordered,\n            'unit_cost', op.unit_cost,\n            'url', op.url,\n            'total', op.quantity_ordered * op.unit_cost\n          )\n        )\n    FROM order_parts op\n    LEFT JOIN components c ON c.component_id = op.component_id\n    LEFT JOIN categories cat ON cat.category_id = c.category_id\n    WHERE op.order_id = o.order_id\n  ) AS order_items\nFROM orders o\nLEFT JOIN vendors v ON v.vendor_id = o.vendor_id\nWHERE o.order_id = {{ $json.order_id }};",
        "options": {}
      },
      "name": "Get Order Detail Query",
      "type": "n8n-nodes-base.postgres",
      "typeVersion": 2.6,
      "position": [
        352,
        208
      ],
      "id": "d77a1554-5d5f-4056-89d9-8cdafbbb5039",
      "credentials": {
        "postgres": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "respondWith": "allIncomingItems",
        "options": {}
      },
      "name": "Respond1",
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.4,
      "position": [
        800,
        208
      ],
      "id": "c8aa440f-40e5-48e5-a442-669785be1419"
    },
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "api/orders/create",
        "responseMode": "responseNode",
        "options": {
          "responseHeaders": {
            "entries": [
              {
                "name": "Content-Type",
                "value": "application/json"
              }
            ]
          }
        }
      },
      "name": "Create Order Webhook",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2.1,
      "position": [
        -96,
        -240
      ],
      "id": "bf1ef991-6de7-4ec4-999c-0084b9a32299"
    },
    {
      "parameters": {
        "jsCode": "const body = $json.body;\nconst totalCost = body.items.reduce((sum, item) => sum + (item.quantity * item.unit_cost), 0);\n\nreturn [{\n  json: {\n    vendor_id: body.vendor_id,\n    order_date: body.order_date,\n    total_cost: totalCost,\n    status: 'Pending',\n    items: body.items\n  }\n}];"
      },
      "name": "Prepare Order Data",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        128,
        -240
      ],
      "id": "d8322b35-7194-4347-82fd-ccccbd2f7edb"
    },
    {
      "parameters": {
        "operation": "executeQuery",
        "query": "INSERT INTO orders (vendor_id, order_date, total_cost, status)\nVALUES ({{ $json.vendor_id }}, '{{ $json.order_date }}', {{ $json.total_cost }}, '{{ $json.status }}')\nRETURNING order_id, vendor_id, order_date, total_cost, status;",
        "options": {}
      },
      "name": "Insert Order",
      "type": "n8n-nodes-base.postgres",
      "typeVersion": 2.6,
      "position": [
        352,
        -240
      ],
      "id": "e5e5cbb6-2b8a-4164-a621-ba58f0cad202",
      "credentials": {
        "postgres": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "jsCode": "const orderId = $input.first().json.order_id;\nconst items = $('Prepare Order Data').first().json.items;\n\nreturn items.map(item => ({\n  json: {\n    order_id: orderId,\n    component_id: item.component_id,\n    quantity_ordered: item.quantity,\n    unit_cost: item.unit_cost,\n    url: item.url || ''\n  }\n}));"
      },
      "name": "Prepare Order Parts",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        576,
        -240
      ],
      "id": "c3ba2324-ce12-473e-a891-8bab84e42a47"
    },
    {
      "parameters": {
        "operation": "executeQuery",
        "query": "INSERT INTO order_parts (order_id, component_id, quantity_ordered, unit_cost, url)\nVALUES ({{ $json.order_id }}, {{ $json.component_id }}, {{ $json.quantity_ordered }}, {{ $json.unit_cost }}, '{{ $json.url }}');",
        "options": {}
      },
      "name": "Insert Order Parts",
      "type": "n8n-nodes-base.postgres",
      "typeVersion": 2.6,
      "position": [
        800,
        -240
      ],
      "id": "720eba00-8625-46b2-bafa-349709397a2e",
      "credentials": {
        "postgres": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "jsCode": "const orderId = $('Insert Order').first().json.order_id;\nreturn [{ json: { success: true, message: 'Order created successfully', order_id: orderId } }];"
      },
      "name": "Format Response",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        1024,
        -240
      ],
      "id": "5b54b763-0e02-4ac0-b4e9-7f6fddcdb807"
    },
    {
      "parameters": {
        "respondWith": "allIncomingItems",
        "options": {}
      },
      "name": "Respond2",
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.4,
      "position": [
        1248,
        -240
      ],
      "id": "3e90a4cc-1f67-4325-92be-ded008878c01"
    },
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "api/orders/delete",
        "responseMode": "responseNode",
        "options": {
          "responseHeaders": {
            "entries": [
              {
                "name": "Content-Type",
                "value": "application/json"
              }
            ]
          }
        }
      },
      "name": "Delete Order Webhook",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2.1,
      "position": [
        -96,
        432
      ],
      "id": "d7a7cda9-2f85-481e-93ee-b65bead4e011"
    },
    {
      "parameters": {
        "operation": "executeQuery",
        "query": "DELETE FROM order_parts WHERE order_id = {{ $json.order_id }};",
        "options": {}
      },
      "name": "Delete Order Parts",
      "type": "n8n-nodes-base.postgres",
      "typeVersion": 2.6,
      "position": [
        352,
        432
      ],
      "id": "da00122b-f27c-4a71-8fd3-a6b5786016cb",
      "credentials": {
        "postgres": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "operation": "executeQuery",
        "query": "DELETE FROM orders WHERE order_id = {{$('Extract Order ID1').item.json.order_id }};",
        "options": {}
      },
      "name": "Delete Order",
      "type": "n8n-nodes-base.postgres",
      "typeVersion": 2.6,
      "position": [
        576,
        432
      ],
      "id": "fee2885a-5f9d-42a6-9dfb-c668c5129a7f",
      "credentials": {
        "postgres": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "jsCode": "return [{ json: { success: true, message: 'Order deleted successfully' } }];"
      },
      "name": "Format Delete Response",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        800,
        432
      ],
      "id": "1b238be4-1703-45b0-9905-8ab93422527f"
    },
    {
      "parameters": {
        "jsCode": "return [{ json: { order_id: $json.body.order_id } }];"
      },
      "name": "Extract Order ID1",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        128,
        432
      ],
      "id": "036fc5ef-bb35-495b-9b0d-82eb9b2445b5"
    },
    {
      "parameters": {
        "respondWith": "allIncomingItems",
        "options": {}
      },
      "name": "Respond3",
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.4,
      "position": [
        1024,
        432
      ],
      "id": "85a2bcda-a48e-405d-84ee-7cad7a1ab0c6"
    },
    {
      "parameters": {
        "path": "api/orders/metadata",
        "responseMode": "responseNode",
        "options": {
          "responseHeaders": {
            "entries": [
              {
                "name": "Content-Type",
                "value": "application/json"
              },
              {
                "name": "Access-Control-Allow-Origin",
                "value": "*"
              }
            ]
          }
        }
      },
      "name": "Orders Metadata Webhook",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2.1,
      "position": [
        -96,
        656
      ],
      "id": "114236b6-0c0d-455e-bdf4-3818e0eb8b7b"
    },
    {
      "parameters": {
        "operation": "executeQuery",
        "query": "SELECT \n  (SELECT COUNT(*) FROM orders) as total_orders,\n  (SELECT COUNT(*) FROM orders WHERE status = 'Pending') as pending_orders,\n  (SELECT COUNT(*) FROM orders WHERE status = 'Delivered') as delivered_orders,\n  (SELECT COALESCE(SUM(total_cost), 0) FROM orders) as total_spent;",
        "options": {}
      },
      "name": "Get Stats Metadata",
      "type": "n8n-nodes-base.postgres",
      "typeVersion": 2.6,
      "position": [
        128,
        656
      ],
      "id": "26b02ac1-8afe-4279-bdd5-863c58bcb16b",
      "credentials": {
        "postgres": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "respondWith": "allIncomingItems",
        "options": {}
      },
      "name": "Respond to Webhook",
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.4,
      "position": [
        576,
        656
      ],
      "id": "6b443d92-fb4f-4f35-aeb8-e0c7679db46f"
    },
    {
      "parameters": {
        "jsCode": "const metadata =$input.first().json;\nconst response = {\n  success: true,\n  metadata: {\n    totalOrders: parseInt(metadata.total_orders || 0),\n    pendingOrders: parseInt(metadata.pending_orders || 0),\n    deliveredOrders: parseInt(metadata.delivered_orders || 0),\n    totalSpent: parseFloat(metadata.total_spent || 0)\n  }\n};\n\nreturn [{ json: response }];"
      },
      "name": "Format Response1",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        352,
        656
      ],
      "id": "0787c8be-c33e-484a-86ea-b1c88e54bba2"
    },
    {
      "parameters": {
        "jsCode": "const keysToRemove = ['vendor_icon_content', 'vendor_icon_type'];\n\nreturn $input.all().map(item => {\n  const json = {...item.json};\n  keysToRemove.forEach(k => delete json[k]);\n  \n  // Optionally recalculate or add the filename from existing properties\n  json.filename = `http://192.168.0.7:5678/webhook/image?filename=vendor_${item.json.vendor_id}.${item.json.vendor_icon_type || 'jpeg'}`;\n\n  return { json };\n});"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        352,
        -16
      ],
      "id": "bbb9f34e-2394-4d20-8a16-f7992c30380f",
      "name": "Remove Image Info"
    },
    {
      "parameters": {
        "respondWith": "allIncomingItems",
        "options": {}
      },
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.4,
      "position": [
        576,
        -16
      ],
      "id": "dfd02fa7-ac50-4ad3-9b3a-3b07dd2d18bf",
      "name": "Respond to Webhook1"
    },
    {
      "parameters": {
        "jsCode": "const keysToRemove = ['vendor_icon_content', 'vendor_icon_type'];\n\nreturn $input.all().map(item => {\n  const json = {...item.json};\n  keysToRemove.forEach(k => delete json[k]);\n  \n  // Optionally recalculate or add the filename from existing properties\n  json.filename = `http://192.168.0.7:5678/webhook/image?filename=vendor_${item.json.vendor_id}.${item.json.vendor_icon_type || 'jpeg'}`;\n\n  return { json };\n});"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        576,
        208
      ],
      "id": "4adf8e26-a8b2-4202-a771-34b2ffb1cc61",
      "name": "Remove Image Info1"
    }
  ],
  "connections": {
    "Orders List Webhook": {
      "main": [
        [
          {
            "node": "Get Orders Query",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Orders Query": {
      "main": [
        [
          {
            "node": "Remove Image Info",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Order Detail Webhook": {
      "main": [
        [
          {
            "node": "Extract Order ID",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract Order ID": {
      "main": [
        [
          {
            "node": "Get Order Detail Query",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Order Detail Query": {
      "main": [
        [
          {
            "node": "Remove Image Info1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create Order Webhook": {
      "main": [
        [
          {
            "node": "Prepare Order Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prepare Order Data": {
      "main": [
        [
          {
            "node": "Insert Order",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Insert Order": {
      "main": [
        [
          {
            "node": "Prepare Order Parts",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prepare Order Parts": {
      "main": [
        [
          {
            "node": "Insert Order Parts",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Insert Order Parts": {
      "main": [
        [
          {
            "node": "Format Response",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Format Response": {
      "main": [
        [
          {
            "node": "Respond2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Delete Order Webhook": {
      "main": [
        [
          {
            "node": "Extract Order ID1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Delete Order Parts": {
      "main": [
        [
          {
            "node": "Delete Order",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Delete Order": {
      "main": [
        [
          {
            "node": "Format Delete Response",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Format Delete Response": {
      "main": [
        [
          {
            "node": "Respond3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract Order ID1": {
      "main": [
        [
          {
            "node": "Delete Order Parts",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Orders Metadata Webhook": {
      "main": [
        [
          {
            "node": "Get Stats Metadata",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Stats Metadata": {
      "main": [
        [
          {
            "node": "Format Response1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Format Response1": {
      "main": [
        [
          {
            "node": "Respond to Webhook",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Remove Image Info": {
      "main": [
        [
          {
            "node": "Respond to Webhook1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Remove Image Info1": {
      "main": [
        [
          {
            "node": "Respond1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "settings": {
    "executionOrder": "v1"
  },
  "staticData": null,
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "versionId": "95e46765-b8a5-446a-a40f-0d859ca3fa7d",
  "triggerCount": 5,
  "tags": [],
  "shared": [
    {
      "createdAt": "2025-10-22T08:50:19.851Z",
      "updatedAt": "2025-10-22T08:50:19.851Z",
      "role": "workflow:owner",
      "workflowId": "9l6gg6HzfpfV9bIj",
      "projectId": "0tBJbgcFWwxEMKPn",
      "project": {
        "createdAt": "2025-10-05T16:55:31.619Z",
        "updatedAt": "2025-10-05T16:55:58.616Z",
        "id": "0tBJbgcFWwxEMKPn",
        "name": "Bikash Panda <oksbwn@gmail.com>",
        "type": "personal",
        "icon": null,
        "description": null
      }
    }
  ]
}