local Luan = require "luan:Luan.luan" local error = Luan.error local pairs = Luan.pairs or error() local stringify = Luan.stringify or error() local Table = require "luan:Table.luan" local table_copy = Table.copy or error() local Parsers = require "luan:Parsers.luan" local json_parse = Parsers.json_parse or error() local json_string = Parsers.json_string or error() local Time = require "luan:Time.luan" local parse_time = Time.parse or error() local Order = require "site:/lib/Order.luan" local Math = require "luan:Math.luan" local floor = Math.floor or error() local Hj = require "site:/lib/shippers/Hj.luan" local Shared = require "site:/lib/Shared.luan" local is_production = not not Shared.is_production local time_format = Shared.time_format or error() local Logging = require "luan:logging/Logging.luan" local logger = Logging.logger "After" local day = Time.period{days=1} local function days_between(date1,date2) if date1 == nil then return "" end return floor( (date2 - date1)/day ) end local After = {} function After.create_orders(request,rtn_orders) local orders = request.orders request = table_copy(request) for key, response in pairs(rtn_orders) do if response.okay then local request_order = orders[key] request.orders = { [key] = request_order } local order = Order.new{ target = request.target shipper = request_order.shipper order_id = response.orderId request = json_string(request) label = response.label cost_rmb = response.costRmb } order.save() end end end After.create_returns = After.create_orders local function first_value(tbl) local key, value = pairs(tbl)() return value end local rmb_to_usd = 0.15 function After.get_tracking(request,rtn_orders) local orders = request.orders for key, response in pairs(rtn_orders) do if not response.okay then continue end local request_order = orders[key] local order_id = request_order.orderId or error() local shipper = request_order.shipper or error() local order = Order.get(shipper,order_id) if order == nil then continue end if order.status=="warning" then response.warning = order.warning or error() end if response.usps ~= order.usps then order = order.set("usps",response.usps) end local shipped = response.shippedTime if shipped == nil then continue end shipped = parse_time(time_format,shipped) if response.delivered and order.delivered==nil then if not is_production or (request.target=="production" and is_production) then local cost_rmb = order.cost_rmb if cost_rmb==nil and shipper=="HJ" then local result = Hj.get_cost({ orderId = order_id }) cost_rmb = result.costRmb or error() end local cost_usd = floor( cost_rmb * rmb_to_usd * 100 + 0.5 ) / 100 local orig_req = json_parse(order.request) orig_req = first_value(orig_req.orders) Shared.call_mixpanel{ event = "delivered" properties = { distinct_id = order_id shipper = shipper days_since_shipped = days_between(order.shipped,Time.now()) cost_usd = cost_usd item_quantity = #orig_req.items } } end order = order.set("delivered","TRUE") end if response.delivered and order.status==nil then order.delete() elseif shipped ~= order.shipped then order = order.set("shipped",shipped) end end end return After