@speakr/speakr-module-services
Version:
SPEAKR Shared Service Module
125 lines (114 loc) • 3.86 kB
JavaScript
;
const db = require('../../db');
const _ = require('underscore');
module.exports = {
publicData,
sumCampaigns,
sumReferrals,
forSingleInvoicePublicData,
getOnlyLatestLineItemsSingleInvoice,
getOnlyLatestLineItemsFromArrayOfInvoices
};
function publicData(options) {
let json = options.line_items.rows.map(line_item => { return {
id_hash: line_item.id_hash,
status: line_item.status,
amount: `$${parseFloat(line_item.amount).toFixed(2)}`,
created_at: line_item.created_at,
network: line_item.network
} });
options.line_items = json;
return Promise.resolve(options);
}
function sumReferrals(options) {
let total = options.line_items.reduce((memo, line_item) => {
if (line_item.type == 'referral') {
memo += parseFloat(line_item.amount);
}
return memo;
}, 0);
return Promise.resolve(total);
}
function sumCampaigns(options) {
let total = options.line_items.reduce((memo, line_item) => {
if (line_item.type != 'referral') {
memo += parseFloat(line_item.amount);
}
return memo;
}, 0.00);
return Promise.resolve(total);
}
function forSingleInvoicePublicData(options) {
const items = options.lineItems.map(li => li.dataValues ? li.dataValues : li)
options.lineItems = items.map(l => {
return {
id_hash: l.id_hash,
payable_id: l.payable_id,
status: l.status,
amount: l.amount,
type: l.type,
link: l.type === 'creative' ? l.creative.permalink : null,
description: l.description ? l.description : null,
deleted_at: l.deleted_at ? l.deleted_at : null,
note: l.note ? l.note : null,
discount: l.discount ? true : false,
created_at: l.created_at,
campaign: (l.type === 'creative' || l.type === 'campaign cost')
? (l.type === 'creative'
? l.creative.initiative.campaign.title
: l.campaign.title)
: null,
campaign_id: (l.type === 'creative' || l.type === 'campaign cost')
? (l.type === 'creative'
? l.creative.initiative.campaign.id
: l.campaign.id)
: null,
platform: l.type === 'creative' ? l.creative.platform.name : null,
brand: l.type === 'campaign cost' ? (l.campaign.brand ? l.campaign.brand.name : null) : null,
platform_handle: l.type === 'creative' ? l.creative.account.current_username : null,
creative: l.type === 'creative' ? l.creative : null,
referred: l.type === 'referral' ? l.referred : null
}
});
return Promise.resolve(options);
}
function getOnlyLatestLineItemsSingleInvoice(options) {
return new Promise((resolve, reject) => {
const items = options.lineItems.map(li => li.dataValues ? li.dataValues : li)
.map(item => {
item.sortByTime = new Date(item.updated_at).getTime();
return item;
});
const groupedItems = _.groupBy(items, (item) => item.id_hash);
const keyz = Object.keys(groupedItems);
const sortedItems = keyz.map(key => {
const arr = _.sortBy(groupedItems[key], (item) => -item.sortByTime);
const latest = arr[0];
return latest;
});
options.lineItems = sortedItems;
return resolve(options);
});
}
function getOnlyLatestLineItemsFromArrayOfInvoices(options) {
return new Promise((resolve, reject) => {
options.invoices.rows = options.invoices.rows.map(inv => inv.dataValues ? inv.dataValues : inv)
.map(invoice => {
const items = invoice.line_items.map(li => li.dataValues ? li.dataValues : li)
.map(item => {
item.sortByTime = new Date(item.updated_at).getTime();
return item;
});
const groupedItems = _.groupBy(items, (item) => item.id_hash);
const keyz = Object.keys(groupedItems);
const sortedItems = keyz.map(key => {
const arr = _.sortBy(groupedItems[key], (item) => -item.sortByTime);
const latest = arr[0];
return latest;
});
invoice.line_items = sortedItems;
return invoice;
})
return resolve(options);
});
}