@speakr/speakr-module-services
Version:
SPEAKR Shared Service Module
151 lines (130 loc) • 5.57 kB
JavaScript
;
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);
}