111 lines
3.2 KiB
JavaScript
111 lines
3.2 KiB
JavaScript
import Analytics from "analytics-node"
|
|
import axios from "axios"
|
|
import { BaseService } from "medusa-interfaces"
|
|
|
|
class SegmentService extends BaseService {
|
|
/**
|
|
* @param {Object} options - options defined in `medusa-config.js`
|
|
* e.g.
|
|
* {
|
|
* write_key: Segment write key given in Segment dashboard
|
|
* }
|
|
*/
|
|
constructor({totalsService}, options) {
|
|
super()
|
|
|
|
this.options_ = options
|
|
this.totalsService_ = totalsService
|
|
|
|
this.analytics_ = new Analytics(options.write_key)
|
|
}
|
|
|
|
/**
|
|
* Wrapper around segment's identify call
|
|
*/
|
|
identify(data) {
|
|
return this.analytics_.identify(data)
|
|
}
|
|
|
|
track(data) {
|
|
return this.analytics_.track(data)
|
|
}
|
|
|
|
async getReportingValue(fromCurrency, value) {
|
|
const date = "latest"
|
|
const toCurrency =
|
|
(this.options_.reporting_currency &&
|
|
this.options_.reporting_currency.toUpperCase()) ||
|
|
"EUR"
|
|
|
|
if (fromCurrency === toCurrency) return value.toFixed(2)
|
|
|
|
const exchangeRate = await axios
|
|
.get(`https://api.exchangeratesapi.io/${date}?symbols=${fromCurrency}&base=${toCurrency}`)
|
|
.then(({ data }) => {
|
|
return data.rates[fromCurrency]
|
|
})
|
|
|
|
return (value / exchangeRate).toFixed(2)
|
|
}
|
|
|
|
|
|
async buildOrder(order) {
|
|
console.log("build", order)
|
|
const subtotal = await this.totalsService_.getSubtotal(order)
|
|
const total = await this.totalsService_.getTotal(order)
|
|
const tax = await this.totalsService_.getTaxTotal(order)
|
|
const discount = await this.totalsService_.getDiscountTotal(order)
|
|
const shipping = await this.totalsService_.getShippingTotal(order)
|
|
const revenue = total - tax
|
|
|
|
let coupon
|
|
if (order.discounts && order.discounts.length) {
|
|
coupon = order.discounts[0].code
|
|
}
|
|
|
|
const orderData = {
|
|
checkout_id: order.cart_id,
|
|
order_id: order._id,
|
|
email: order.email,
|
|
reporting_total: await this.getReportingValue(order.currency_code, total),
|
|
reporting_subtotal: await this.getReportingValue(order.currency_code, subtotal),
|
|
reporting_revenue: await this.getReportingValue(order.currency_code, revenue),
|
|
reporting_shipping: await this.getReportingValue(order.currency_code, shipping),
|
|
reporting_tax: await this.getReportingValue(order.currency_code, tax),
|
|
reporting_discount: await this.getReportingValue(order.currency_code, discount),
|
|
total,
|
|
subtotal,
|
|
revenue,
|
|
shipping,
|
|
tax,
|
|
discount,
|
|
coupon,
|
|
currency: order.currency_code,
|
|
products: await Promise.all(
|
|
order.items.map(async item => {
|
|
let name = item.title
|
|
let variant = item.description
|
|
|
|
const unit_price = item.content.unit_price
|
|
const line_total = unit_price * item.content.quantity * item.quantity
|
|
const revenue = await this.getReportingValue(order.currency_code, line_total)
|
|
return {
|
|
name,
|
|
variant,
|
|
price: unit_price,
|
|
reporting_revenue: revenue,
|
|
product_id: `${item.content.product._id}`,
|
|
sku: item.content.variant.sku,
|
|
quantity: item.quantity,
|
|
}
|
|
})
|
|
),
|
|
}
|
|
|
|
|
|
return orderData
|
|
}
|
|
}
|
|
|
|
export default SegmentService
|