2019-11-22 09:38:08 -08:00
import {
IExecuteFunctions ,
} from 'n8n-core' ;
import {
IDataObject ,
INodeTypeDescription ,
INodeExecutionData ,
INodeType ,
} from 'n8n-workflow' ;
2019-11-23 16:36:47 -08:00
import {
payoutOpeations ,
payoutFields ,
} from './PaymentDescription' ;
import {
IPaymentBatch ,
ISenderBatchHeader ,
IItem , IAmount ,
RecipientType ,
RecipientWallet ,
} from './PaymentInteface' ;
import {
validateJSON ,
paypalApiRequest ,
2019-11-26 08:59:27 -08:00
paypalApiRequestAllItems
2019-11-23 16:36:47 -08:00
} from './GenericFunctions' ;
2019-11-22 09:38:08 -08:00
2019-11-23 16:36:47 -08:00
export class PayPal implements INodeType {
2019-11-22 09:38:08 -08:00
description : INodeTypeDescription = {
2019-11-23 16:36:47 -08:00
displayName : 'PayPal' ,
name : 'paypal' ,
2019-11-22 09:38:08 -08:00
icon : 'file:paypal.png' ,
group : [ 'output' ] ,
version : 1 ,
subtitle : '={{$parameter["operation"] + ": " + $parameter["resource"]}}' ,
2019-11-23 16:36:47 -08:00
description : 'Consume PayPal API' ,
2019-11-22 09:38:08 -08:00
defaults : {
2019-11-23 16:36:47 -08:00
name : 'PayPal' ,
2019-11-22 09:38:08 -08:00
color : '#356ae6' ,
} ,
inputs : [ 'main' ] ,
outputs : [ 'main' ] ,
credentials : [
{
name : 'paypalApi' ,
required : true ,
}
] ,
2019-11-23 16:36:47 -08:00
properties : [
{
displayName : 'Resource' ,
name : 'resource' ,
type : 'options' ,
options : [
{
name : 'Payout' ,
value : 'payout' ,
description : 'Use the Payouts API to make payments to multiple PayPal or Venmo recipients. The Payouts API is a fast, convenient way to send commissions, rebates, rewards, and general disbursements. You can send up to 15,000 payments per call. If you integrated the Payouts API before September 1, 2017, you receive transaction reports through Mass Payments Reporting.' ,
} ,
] ,
default : 'payout' ,
description : 'Resource to consume.' ,
} ,
. . . payoutOpeations ,
. . . payoutFields ,
] ,
2019-11-22 09:38:08 -08:00
} ;
async execute ( this : IExecuteFunctions ) : Promise < INodeExecutionData [ ] [ ] > {
2019-11-23 16:36:47 -08:00
const items = this . getInputData ( ) ;
const returnData : IDataObject [ ] = [ ] ;
const length = items . length as unknown as number ;
let responseData ;
2019-11-26 08:59:27 -08:00
let qs : IDataObject = { } ;
2019-11-23 16:36:47 -08:00
for ( let i = 0 ; i < length ; i ++ ) {
const resource = this . getNodeParameter ( 'resource' , 0 ) as string ;
const operation = this . getNodeParameter ( 'operation' , 0 ) as string ;
if ( resource === 'payout' ) {
if ( operation === 'create' ) {
const body : IPaymentBatch = { } ;
const header : ISenderBatchHeader = { } ;
const jsonActive = this . getNodeParameter ( 'jsonParameters' , i ) as boolean ;
const senderBatchId = this . getNodeParameter ( 'senderBatchId' , i ) as string ;
const additionalFields = this . getNodeParameter ( 'additionalFields' , i ) as IDataObject ;
header . sender_batch_id = senderBatchId ;
if ( additionalFields . emailSubject ) {
header . email_subject = additionalFields . emailSubject as string ;
}
if ( additionalFields . emailMessage ) {
header . email_message = additionalFields . emailMessage as string ;
}
if ( additionalFields . note ) {
header . note = additionalFields . note as string ;
}
body . sender_batch_header = header ;
if ( ! jsonActive ) {
const payoutItems : IItem [ ] = [ ] ;
const itemsValues = ( this . getNodeParameter ( 'itemsUi' , i ) as IDataObject ) . itemsValues as IDataObject [ ] ;
if ( itemsValues && itemsValues . length > 0 ) {
itemsValues . forEach ( o = > {
const payoutItem : IItem = { } ;
const amount : IAmount = { } ;
amount . currency = o . currency as string ;
2019-11-26 08:59:27 -08:00
amount . value = parseFloat ( o . amount as string ) ;
2019-11-23 16:36:47 -08:00
payoutItem . amount = amount ;
payoutItem . note = o . note as string || '' ;
2019-11-26 08:59:27 -08:00
payoutItem . receiver = o . receiverValue as string ;
2019-11-23 16:36:47 -08:00
payoutItem . recipient_type = o . recipientType as RecipientType ;
payoutItem . recipient_wallet = o . recipientWallet as RecipientWallet ;
payoutItem . sender_item_id = o . senderItemId as string || '' ;
payoutItems . push ( payoutItem ) ;
} ) ;
body . items = payoutItems ;
} else {
2019-11-26 08:59:27 -08:00
throw new Error ( 'You must have at least one item.' ) ;
2019-11-23 16:36:47 -08:00
}
} else {
const itemsJson = validateJSON ( this . getNodeParameter ( 'itemsJson' , i ) as string ) ;
body . items = itemsJson ;
}
try {
2019-11-26 08:59:27 -08:00
responseData = await paypalApiRequest . call ( this , '/payments/payouts' , 'POST' , body ) ;
} catch ( err ) {
throw new Error ( ` Paypal Error: ${ JSON . stringify ( err ) } ` ) ;
}
}
if ( operation === 'get' ) {
const payoutItemId = this . getNodeParameter ( 'payoutItemId' , i ) as string ;
try {
responseData = await paypalApiRequest . call ( this , ` /payments/payouts-item/ ${ payoutItemId } ` , 'GET' , { } , qs ) ;
} catch ( err ) {
throw new Error ( ` Paypal Error: ${ JSON . stringify ( err ) } ` ) ;
}
}
if ( operation === 'getAll' ) {
const payoutBatchId = this . getNodeParameter ( 'payoutBatchId' , i ) as string ;
const returnAll = this . getNodeParameter ( 'returnAll' , 0 ) as boolean ;
try {
if ( returnAll === true ) {
responseData = await paypalApiRequestAllItems . call ( this , 'items' , ` /payments/payouts/ ${ payoutBatchId } ` , 'GET' , { } , qs ) ;
} else {
qs . page_size = this . getNodeParameter ( 'limit' , i ) as number ;
responseData = await paypalApiRequest . call ( this , ` /payments/payouts/ ${ payoutBatchId } ` , 'GET' , { } , qs ) ;
responseData = responseData . items ;
}
} catch ( err ) {
throw new Error ( ` Paypal Error: ${ JSON . stringify ( err ) } ` ) ;
}
}
if ( operation === 'delete' ) {
const payoutItemId = this . getNodeParameter ( 'payoutItemId' , i ) as string ;
try {
responseData = await paypalApiRequest . call ( this , ` /payments/payouts-item/ ${ payoutItemId } /cancel ` , 'POST' , { } , qs ) ;
2019-11-23 16:36:47 -08:00
} catch ( err ) {
throw new Error ( ` Paypal Error: ${ JSON . stringify ( err ) } ` ) ;
}
}
}
if ( Array . isArray ( responseData ) ) {
returnData . push . apply ( returnData , responseData as IDataObject [ ] ) ;
} else {
returnData . push ( responseData as IDataObject ) ;
}
}
2019-11-26 08:59:27 -08:00
return [ this . helpers . returnJsonArray ( returnData ) ] ;
2019-11-22 09:38:08 -08:00
}
}