{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Prerequisites:\n",
    "#!pip install requests\n",
    "#!pip install python-dotenv"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "from api import BigApi\n",
    "BigApi.init(\".admin.env\")\n",
    "BigApi.adminLogin()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "from enum import Enum\n",
    "\n",
    "schemas = BigApi.adminGet(\"/admin/shop/schemas\")\n",
    "BigOrderAction = Enum(\"BigOrderAction\", dict([(v, k) for k, v in schemas[\"BigOrderAction\"].items()]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import json\n",
    "\n",
    "# Contains array of blocked email addresses\n",
    "f = open(\"./blockedEmails.json\")\n",
    "blockedEmails = json.load(f)[\"blockedEmails\"]\n",
    "\n",
    "blockedTags = [\n",
    "    \"leap-era\",\n",
    "    \"competitor\",\n",
    "    \"staff\",\n",
    "    \"early-access\"\n",
    "]\n",
    "\n",
    "allowedTag = \"q3-shipment\"\n",
    "\n",
    "ipdOrders = []\n",
    "totalShopifyOrders = 0\n",
    "\n",
    "skipBecauseEmailBlocked = 0\n",
    "skipBecauseIPD = 0\n",
    "skipBecauseNotQ3 = 0\n",
    "skipBecauseBlockedTag = 0\n",
    "skipBecauseNotUS = 0\n",
    "\n",
    "skippedBecauseOrderAlreadyExists = 0\n",
    "skippedBecauseNoBeyond = 0\n",
    "skippedBecauseFailsCriteria = 0\n",
    "orderIsGoodToConvert = 0\n",
    "\n",
    "def canShopifyOrderBeConverted(shopifyOrder):\n",
    "    global skipBecauseEmailBlocked\n",
    "    global skipBecauseIPD\n",
    "    global skipBecauseNotQ3\n",
    "    global skipBecauseBlockedTag\n",
    "    global skipBecauseNotUS\n",
    "    global ipdOrders\n",
    "\n",
    "    # 1. If the shopify order email is on the block list, then bail out.\n",
    "    if shopifyOrder[\"email\"] in blockedEmails:\n",
    "        skipBecauseEmailBlocked += 1\n",
    "        return False\n",
    "\n",
    "    # 2. tags\n",
    "    tags = []\n",
    "    if \"tags\" in shopifyOrder:\n",
    "        tags += [t.strip() for t in shopifyOrder[\"tags\"].split(\",\")]\n",
    "    if \"customer\" in shopifyOrder:\n",
    "        tags += [t.strip() for t in shopifyOrder[\"customer\"][\"tags\"].split(\",\")]\n",
    "\n",
    "    # 3. If tags does not contain allowedTag, then bail out.\n",
    "    if allowedTag not in tags:\n",
    "        skipBecauseNotQ3 += 1\n",
    "        return False\n",
    "\n",
    "    # 4. If tags contains anything on the blockedTags list, then bail out.\n",
    "    for tag in tags:\n",
    "        if tag in blockedTags:\n",
    "            skipBecauseBlockedTag += 1\n",
    "            return False\n",
    "\n",
    "    # 5. Customer must be US only in shipping region\n",
    "    if shopifyOrder[\"shipping_address\"][\"country_code\"] != \"US\":\n",
    "        skipBecauseNotUS += 1\n",
    "        return False\n",
    "\n",
    "    # 6. If the shopify order contains a line_item with IPD property, then bail out.\n",
    "    for lineItem in shopifyOrder[\"line_items\"]:\n",
    "        if \"properties\" in lineItem:\n",
    "            for prop in lineItem[\"properties\"]:\n",
    "                if prop[\"name\"] == \"IPD\":\n",
    "                    ipdOrders.append(shopifyOrder[\"name\"])\n",
    "                    skipBecauseIPD += 1\n",
    "                    return False\n",
    "\n",
    "    return True\n",
    "\n",
    "# If the shopify order does not contain at least one line item with \"product_id\" = 7693929054425, then return false\n",
    "def containsBeyondItem(shopifyOrder):\n",
    "    for lineItem in shopifyOrder[\"line_items\"]:\n",
    "        if lineItem[\"product_id\"] == 7693929054425:\n",
    "            return True\n",
    "    return False\n",
    "\n",
    "def getNextTranch(limit = 150, cursorId = None):\n",
    "    global totalShopifyOrders\n",
    "    global skippedBecauseOrderAlreadyExists\n",
    "    global skippedBecauseFailsCriteria\n",
    "    global skippedBecauseNoBeyond\n",
    "    global orderIsGoodToConvert\n",
    "\n",
    "    url = f\"/admin/shop/shopify_orders?limit={limit}\"\n",
    "    if cursorId:\n",
    "        url += f\"&cursor={cursorId}\"\n",
    "\n",
    "    result = BigApi.adminGet(url)\n",
    "\n",
    "    if \"nextCursor\" in result:\n",
    "        cursorId = result[\"nextCursor\"]\n",
    "    else:\n",
    "        cursorId = None\n",
    "\n",
    "    totalShopifyOrders += len(result[\"orders\"])\n",
    "\n",
    "    for order in result[\"orders\"]:\n",
    "        # check if bigOrder exists in order\n",
    "        if order.get(\"bigOrder\"):\n",
    "            skippedBecauseOrderAlreadyExists += 1\n",
    "            continue\n",
    "        if canShopifyOrderBeConverted(order['shopifyOrder']) == False:\n",
    "            skippedBecauseFailsCriteria += 1\n",
    "            continue\n",
    "        if containsBeyondItem(order['shopifyOrder']) == False:\n",
    "            skippedBecauseNoBeyond += 1\n",
    "            continue\n",
    "        orderIsGoodToConvert += 1\n",
    "    return cursorId\n",
    "\n",
    "orders = []\n",
    "cursorId = None\n",
    "\n",
    "while(True):\n",
    "    cursorId = getNextTranch(150, cursorId)\n",
    "    if cursorId == None:\n",
    "        break\n",
    "\n",
    "print(\"Total Shopify Orders:\")\n",
    "print(totalShopifyOrders)\n",
    "\n",
    "print(\"Skipping orders because email is blocked:\")\n",
    "print(skipBecauseEmailBlocked)\n",
    "\n",
    "print(\"Skipping orders because IPD:\")\n",
    "print(skipBecauseIPD)\n",
    "\n",
    "print(\"Skipping orders because not Q3:\")\n",
    "print(skipBecauseNotQ3)\n",
    "\n",
    "print(\"Skipping orders because blocked tag:\")\n",
    "print(skipBecauseBlockedTag)\n",
    "\n",
    "print(\"Skipping orders because not US:\")\n",
    "print(skipBecauseNotUS)\n",
    "\n",
    "print(\"(Total orders skipped because failed criteria:)\")\n",
    "print(skippedBecauseFailsCriteria)\n",
    "\n",
    "print(\"Skipping orders because they have already been converted to Big Orders:\")\n",
    "print(skippedBecauseOrderAlreadyExists)\n",
    "\n",
    "print(\"Skipping orders because missing beyond items:\")\n",
    "print(skippedBecauseNoBeyond)\n",
    "\n",
    "print(\"Remaining orders that can be converted:\")\n",
    "print(orderIsGoodToConvert)\n",
    "\n",
    "print(\"IPD Orders:\")\n",
    "print(ipdOrders)\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.11"
  },
  "orig_nbformat": 4
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
