UNPKG

@gameroom/cli

Version:

A command line tool for Gameroom

116 lines (114 loc) 5.99 kB
const cosmetic = require('cosmetic'), { join } = require('path'), { enums: { sale_status }, models: { Address, Container, Image, Line, Payment, Price, Product, Sale, Store, Unit, Unit_Extended } } = require('@gameroom/kit'), { componentString, getAll, grGreen, timeout, writeCSVFile } = require('../../helpers'), { Shopify } = require('../../models'), { config, conversions, google_product_categories, spinner } = require('../../refs'), LIMIT = 500, SHOPIFY_LIMIT = 250 module.exports = async ({ verbose }) => { // catch all errors that arent 429 (too many requests) or 404 (not found) try { config.exit_gracefully = true const dev = process.env.NODE_ENV === 'development' const SHOPIFY_STORE_URL = dev ? process.env.SHOPIFY_DEV_STORE_URL : process.env.SHOPIFY_STORE_URL if (!SHOPIFY_STORE_URL) throw new Error('missing shopify env keys') spinner.info(`pulling from ${cosmetic.green(SHOPIFY_STORE_URL)} @ ${new Date().toLocaleString()}`) // stores spinner.text = `getting ${grGreen('stores')}` const stores = await Store.getAll() spinner.info(`got ${stores.length} ${grGreen('stores')}`) // store addresses spinner.text = `getting ${grGreen('addresses')}` const address_filters = [] for (const store of stores) address_filters.push({ key: 'addressable_id', value: store.id }) const addresses = await Address.getAll({ filter: { or: address_filters } }) spinner.info(`got ${addresses.length} ${grGreen('addresses')}`) // containers spinner.text = `getting ${grGreen('containers')}` const containers = await Container.getAll() spinner.info(`got ${containers.length} ${grGreen('containers')}`) // shopify locations spinner.text = `getting ${cosmetic.green('locations')}` const locations = await Shopify.Location.get() spinner.info(`got ${locations.length} ${cosmetic.green('locations')}`) // Shopify orders >> Gameroom sales let done = false, order_count = 0, sales = 0, lines = 0, offset = 0, taxes = 0, updated = 0, payments = 0 // get shopify orders, create a sale, lines, payment, and update units while (!done) { spinner.text = `${order_count} ${cosmetic.green('orders')}, ${sales} ${grGreen('sales')}, ${lines} ${grGreen('lines')}, ${taxes} ${grGreen('taxes')}, ${payments} ${grGreen('payments')}, ${updated} ${grGreen('units')} updated` const orders = await Shopify.Order.get({ limit: SHOPIFY_LIMIT, since_id: config.last_shopify_order || null }) if (verbose) spinner.info(`got ${orders.length} ${cosmetic.green('orders')}`) if (orders.length < SHOPIFY_LIMIT) done = true // for each order for (const order of orders) { if (config.should_exit) break // create sale const sale = await Sale.create({ info: `shopify order number: ${order.order_number}`, status: sale_status.ordered }) if (verbose) spinner.succeed(`created ${grGreen('sale')}: ${sale.id}`) sales++ // for each order line_item for (const line_item of order.line_items) { spinner.text = `${order_count} ${cosmetic.green('orders')}, ${sales} ${grGreen('sales')}, ${lines} ${grGreen('lines')}, ${taxes} ${grGreen('taxes')}, ${payments} ${grGreen('payments')}, ${updated} ${grGreen('units')} updated` // if line item has no shopify product id continue if (!line_item.product_id) { spinner.warn(`shopify missing ${cosmetic.green('product_id')} for ${cosmetic.green('order')}: ${order.order_number}`) continue } // get shopify product const product = await Shopify.Product.getWithId(line_item.product_id) if (!product) continue // get unit let unit try { unit = await Unit.find(product.handle) } catch(err) {/*Not found*/} if (!unit) continue // update unit const quantity = unit.quantity - line_item.quantity const updates = { id: unit.id, quantity } if (quantity <= 0) { // updates.advertised = false // updates.offered = false updates.shopified = false } await Unit.update(updates) if (verbose) spinner.succeed(`updated ${grGreen('unit')}: ${unit.id}`) updated++ // create line const line = await Line.create({ amount: Math.floor(parseFloat(line_item.price) * 100), name: line_item.name, quantity: line_item.quantity, sale_id: sale.id, saleable_id: unit.id, saleable_type: 'Unit', info: `shopify product id: ${line_item.id}` }) if (verbose) spinner.succeed(`created ${grGreen('line')}: ${line.id}`) lines++ } // create tax line const tax_amount = Math.floor(parseFloat(order.total_tax) * 100) if (tax_amount) { const tax = await Line.create({ name: 'Tax', quantity: 1, sale_id: sale.id, tax: tax_amount, info: `shopify order tax` }) taxes++ } // create payment const payment_amount = Math.floor(parseFloat(order.subtotal_price) * 100) const payment = await Payment.create({ amount: payment_amount, gateway: 'online', reference: `shopify_${order.id}#${order.order_number}`, sale_id: sale.id }) if (verbose) spinner.succeed(`created ${grGreen('payment')}: ${payment.id}`) payments++ // done if (verbose) spinner.succeed(`completed ${cosmetic.green('order')}: ${order.id} #${order.order_number}`) config.last_shopify_order = order.id order_count++ } } spinner.succeed(`${order_count} ${cosmetic.green('orders')}, ${updated} ${grGreen('units')} updated`) spinner.succeed(`completed pull from ${cosmetic.green('shopify')} @ ${new Date().toLocaleString()}`).stop() } catch(err) { spinner.fail(`error pulling from ${cosmetic.green('shopify')}: ${err}`).stop() } }