@gameroom/cli
Version:
A command line tool for Gameroom
116 lines (114 loc) • 5.99 kB
JavaScript
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()
}
}