UNPKG

@speakr/speakr-module-services

Version:
117 lines (102 loc) 3.32 kB
'use strict'; const speakr = require('@speakr/speakr-module-services'); const db = speakr.db; const env = require('../../env'); const MassPay = require('node-paypal-masspayments'); const Paypal = require('paypal-nvp-api'); const ipn = require('paypal-ipn'); const moment = require('moment-timezone'); const _ = require('underscore'); process.env.PAYPAL_ENV = process.env.NODE_ENV; const mp = new MassPay(env.MASSPAY); const paypal = Paypal(env.PAYPAL); module.exports = { credit, getPaypalBalance, verify }; function getPaypalBalance(){ return new Promise((resolve, reject) => { return paypal.request('GetBalance', {}).then((result) => { resolve(result); }).catch((err) => { reject(err); }); }) } function verify(notification) { console.log(notification); return new Promise((resolve, reject) => { if (Object.keys(notification).length == 0) { reject('Please, provide correct IPN notification.'); } else { return ipn.verify(notification, {'allow_sandbox': true}, function callback(err, msg) { if (err) { console.error(err); reject(err); } else { console.log(msg); let index = 1; while (notification[`masspay_txn_id_${index}`] != null) { let status = notification[`status_${index}`] == 'Completed' ? 'paid' : 'processing'; let paidAt = moment(notification.payment_date, 'HH:mm:ss MMM DD, YYYY z').format(); let id = parseInt(notification[`unique_id_${index}`]); let transactionId = notification[`masspay_txn_id_${index}`]; db.invoices.update({ paypal_transaction_id: transactionId, status: status, paid_at: paidAt }, {where: {id: id }}); index += 1; } resolve(notification); } }); } }); } function credit(invoices) { // get filter out the old line items that exist due to editing invoices = invoices.map(invoice => { invoice = invoice.dataValues ? invoice.dataValues : invoice; invoice.line_items = invoice.line_items.map(li => li.dataValues ? li.dataValues: li); invoice.line_items = _getOnlyCurrentLineItems(invoice.line_items); return invoice; }); let batch = new MassPay.PaymentBatch(invoices.map((invoice) => ({ "email": invoice.influencer.paypal_email, "amount": _totalCost(invoice.line_items), "uniqueId": invoice.id, "note": `Speakr just sent you ${_totalCost(invoice.line_items)}. Rock on!` }))); return new Promise((resolve, reject) => mp.pay(batch, function(err, results) { if (err) { console.log('ERROR', err); reject(err.L_LONGMESSAGE0); } else { console.log('SUCCESS', results); if (results.ACK == 'Success') { resolve(invoices); } else { reject(results.L_LONGMESSAGE0); } }} )); } function _totalCost(line_items) { return parseFloat(line_items.reduce((sum, cur) => Number(sum) + Number(cur.amount), 0)).toFixed(2); } function _getOnlyCurrentLineItems(line_items) { const items = 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); return keyz.map(key => { const arr = _.sortBy(groupedItems[key], (item) => -item.sortByTime); const latest = arr.reverse()[0]; return latest; }); }