Last active
March 14, 2017 23:54
-
-
Save iloveitaly/8e3b2bb72e13c61536f953e081e91290 to your computer and use it in GitHub Desktop.
Leverage http://SuiteSync.io/ to apply Stripe payments to NetSuite invoices asynchronously
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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