UNPKG

@speakr/speakr-module-services

Version:
151 lines (130 loc) • 5.57 kB
'use strict'; const db = require('../../db'); const moment = require('moment'); module.exports = { singleInvoicePublicData, invoiceArrayPublicData, influencerAnnualPublicData }; function influencerAnnualPublicData(options) { let dates = Array.from(new Array(12),(val,index)=>index+1).reduce((memo, value, index) => { let due_at = moment().subtract(9 - index, 'month').startOf('month').format('YYYY-MM-DD'); memo[due_at] = {date: due_at, value: 0.00}; return memo; }, {}); let campaignByMonth = options.invoices.reduce((memo, invoice) => { let due_at = moment(invoice.due_at).startOf('month').format('YYYY-MM-DD'); let value = memo[due_at] ? parseFloat(memo[due_at].value + invoice.campaign_total).toFixed(2) : 0.00; memo[due_at] = {date: due_at, value: value}; return memo; }, dates); let campaignTotal = options.invoices.reduce((memo, invoice) => { memo += invoice.campaign_total; return memo; }, 0.00); dates = Array.from(new Array(12),(val,index)=>index+1).reduce((memo, value, index) => { let due_at = moment().subtract(9 - index, 'month').startOf('month').format('YYYY-MM-DD'); memo[due_at] = {date: due_at, value: 0.00}; return memo; }, {}); let referralByMonth = options.invoices.reduce((memo, invoice) => { let due_at = moment(invoice.due_at).startOf('month').format('YYYY-MM-DD'); let value = memo[due_at] ? parseFloat(memo[due_at].value + invoice.referral_total).toFixed(2) : 0.00; memo[due_at] = {date: due_at, value: value}; return memo; }, dates); let referralTotal = options.invoices.reduce((memo, invoice) => { memo += invoice.referral_total; return memo; }, 0.00); options.invoices = { campaign: {byMonth: Object.keys(campaignByMonth).map(key => campaignByMonth[key]), total: campaignTotal.toFixed(2)}, referral: {byMonth: Object.keys(referralByMonth).map(key => referralByMonth[key]), total: referralTotal.toFixed(2)} }; return Promise.resolve(options); } function singleInvoicePublicData(options) { const invoice = options.invoices; const lineItems = options.lineItems ? options.lineItems : options.invoice.lineItems; return { id_hash: invoice.id_hash, influencer_id: invoice.influencer_id, requested_at: invoice.requested_at ? invoice.requested_at : null, paid_at: invoice.paid_at ? invoice.paid_at : null, due_at: invoice.due_at, created_at: invoice.created_at, created_by: invoice.created_by, status: invoice.status, network: invoice.network, network_id: invoice.network_id, network_id_hash: invoice.network.id_hash, campaign_cost: _campaignCost(lineItems), creative_value: _creativeValue(lineItems), referral_cost: _referralCost(lineItems), other_value: _otherValue(lineItems), total_cost: _totalCost(lineItems), paypal_email: invoice.influencer ? invoice.influencer.paypal_email : null, email: invoice.influencer ? invoice.influencer.email : null, paypal_transaction_id: invoice.paypal_transaction_id, title: invoice.title ? invoice.title : null, accounts: invoice.influencer ? invoice.influencer.accounts : null, ipn: options.ipn, lineItems: lineItems } } function invoiceArrayPublicData(options) { const invoiceHolder = options.invoices; delete options.invoices; const totalCount = invoiceHolder.count; options.invoices = {}; options.invoices.totalCount = totalCount; options.invoices.records = invoiceHolder.rows .map(inv => inv.dataValues ? inv.dataValues : inv) .map(invoice => { const lineItems = invoice.line_items; return { id_hash: invoice.id_hash, influencer_id: invoice.influencer_id, requested_at: invoice.requested_at ? invoice.requested_at : null, paid_at: invoice.paid_at ? invoice.paid_at : null, due_at: invoice.due_at, created_at: invoice.created_at, created_by: invoice.created_by, status: invoice.status, network: invoice.network, network_id: invoice.network_id, network_id_hash: invoice.network.id_hash, campaign_cost: _campaignCost(lineItems), creative_value: _creativeValue(lineItems), referral_cost: _referralCost(lineItems), other_value: _otherValue(lineItems), total_cost: _totalCost(lineItems), paypal_email: invoice.influencer ? invoice.influencer.paypal_email : null, email: invoice.influencer ? invoice.influencer.email : null, paypal_transaction_id: invoice.paypal_transaction_id, title: invoice.title ? invoice.title : null, accounts: invoice.influencer ? invoice.influencer.accounts : null, lineItems: lineItems } }); return Promise.resolve(options) } function _campaignCost(line_items) { const others = line_items.filter((item) => item.type === 'campaign cost'); return parseFloat(others.reduce((sum, cur) => Number(sum) + Number(cur.amount), 0)).toFixed(2); } function _creativeValue(line_items) { const creatives = line_items.filter((item) => item.type === 'creative'); return parseFloat(creatives.reduce((sum, cur) => Number(sum) + Number(cur.amount), 0)).toFixed(2); } function _referralCost(line_items) { const referrals = line_items.filter((item) => item.type === 'referral'); return parseFloat(referrals.reduce((sum, cur) => Number(sum) + Number(cur.amount), 0)).toFixed(2); } function _otherValue(line_items) { const others = line_items.filter((item) => item.type === 'other'); return parseFloat(others.reduce((sum, cur) => Number(sum) + Number(cur.amount), 0)).toFixed(2); } function _totalCost(line_items) { return parseFloat(line_items.reduce((sum, cur) => Number(sum) + Number(cur.amount), 0)).toFixed(2); }