Leverage http://SuiteSync.io/ to apply Stripe payments to NetSuite invoices asynchronously
# Michael Bianco <mike@suitesync.io> | |
# Description: Example of using SuiteSync's auto-match functionality to apply payments | |
# to NetSuite invoices. | |
# Usage: | |
# | |
# export STRIPE_KEY=sk_test NETSUITE_EMAIL=user@company.com NETSUITE_PASSWORD=password NETSUITE_ACCOUNT= | |
# gem install stripe netsuite | |
# ruby stripe_auto_match_payment_to_invoice.rb | |
# | |
require 'stripe' | |
require 'netsuite' | |
Stripe.api_key = ENV['STRIPE_KEY'] | |
NetSuite.configure do | |
reset! | |
# NOTE that API versions > 2015_1 require a more complicated authentication setup | |
api_version '2015_1' | |
read_timeout 60 * 3 | |
silent ENV['NETSUITE_SILENT'].nil? || ENV['NETSUITE_SILENT'] == 'true' | |
email ENV['NETSUITE_EMAIL'] | |
password ENV['NETSUITE_PASSWORD'] | |
account ENV['NETSUITE_ACCOUNT'] | |
soap_header({ | |
'platformMsgs:preferences' => { | |
'platformMsgs:ignoreReadOnlyFields' => true, | |
} | |
}) | |
end | |
# Static NS references | |
ns_item_id = 384208 | |
ns_customer_id = 383315 | |
# Create Stripe Charge | |
customer = Stripe::Customer.create({ | |
description: "Auto-match Payment #{Date.today.to_s}", | |
# NOTE the Stripe customer must be linked to the same customer as the NetSuite invoice | |
metadata: { | |
netsuite_customer_id: ns_customer_id | |
} | |
}) | |
card_token = Stripe::Token.create( | |
:card => { | |
:number => '4242424242424242', | |
:exp_month => 8, | |
:exp_year => (Date.today>>24).year, | |
:cvc => "314" | |
} | |
) | |
customer.sources.create(card: card_token.id) | |
# NOTE this charge is brought over to NetSuite immediately as an unapplied CustomerPayment | |
stripe_charge = Stripe::Charge.create( | |
currency: 'usd', | |
amount: 100_00, | |
customer: customer.id, | |
# NOTE metadata can be used to pass custom information over to the NetSuite CustomerPayment | |
# https://dashboard.suitesync.io/docs/field-customization | |
# metadata: { | |
# netsuite_custom_payment_information: 'custom ID' | |
# } | |
) | |
# Create NetSuite Invoice | |
ns_invoice = NetSuite::Records::Invoice.new( | |
entity: { internal_id: ns_customer_id }, | |
item_list: { item: [ | |
{ | |
item: { internal_id: ns_item_id }, | |
quantity: 1, | |
rate: 100.0 | |
} | |
] } | |
) | |
ns_invoice.add | |
# SuiteSync will pull this charge over to NetSuite and automatically match it to the open invoice previously created | |
loop do | |
stripe_charge.refresh | |
if ns_payment_id = stripe_charge.metadata['netsuite_customer_payment_id'] | |
puts "Found CustomerPayment: #{ns_payment_id}" | |
break | |
end | |
puts "Waiting for CustomerPayment..." | |
sleep(2) | |
end | |
loop do | |
stripe_charge.refresh | |
if ns_invoice_id = stripe_charge.metadata['netsuite_invoice_id'] | |
puts "Found Invoice: #{ns_invoice_id}" | |
break | |
end | |
puts "Waiting for Invoice application..." | |
sleep(2) | |
end | |
ns_invoice.refresh | |
# the payment has been created, and then fully applied to the invoice | |
# the NetSuite Invoice's status is now "Paid In Full" | |
puts "Invoice Status: #{ns_invoice.status}" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment