From 91723aa48e420b5858db24c7760d801664cc29f2 Mon Sep 17 00:00:00 2001 From: Stewart Lynch Date: Wed, 17 Aug 2016 11:20:25 -0700 Subject: [PATCH 1/2] Refactors letter examples to be just a create letters from csv example --- .gitignore | 4 + examples/README.md | 4 +- .../input.csv | 0 .../letter.html} | 0 examples/create_letters_from_csv/letter.py | 91 ++++++++++++++ .../letter.py | 118 ------------------ 6 files changed, 97 insertions(+), 120 deletions(-) rename examples/{verify_and_create_letters_from_csv => create_letters_from_csv}/input.csv (100%) rename examples/{verify_and_create_letters_from_csv/letter_template.html => create_letters_from_csv/letter.html} (100%) create mode 100644 examples/create_letters_from_csv/letter.py delete mode 100644 examples/verify_and_create_letters_from_csv/letter.py diff --git a/.gitignore b/.gitignore index 432bec5..6bc2f5b 100644 --- a/.gitignore +++ b/.gitignore @@ -37,3 +37,7 @@ nosetests.xml # Sphinx documentation docs/_build/ + +#Generated Files +examples/*/success.csv +examples/*/errors.csv diff --git a/examples/README.md b/examples/README.md index a348ccf..fcbb22f 100644 --- a/examples/README.md +++ b/examples/README.md @@ -12,12 +12,12 @@ cd examples/ ### Create letters from CSV -An example showing how to validate and clean addresses from a CSV spreadsheet full of shipping addresses using Lob's [Address Verification API](https://lob.com/verification/address) and then using the cleaned, valid addresses to dynamically create sample billing letters with variable data using Lob's [Letter API](https://lob.com/services/letters). +An example showing how to dynamically create sample billing letters with variable data using Lob's [Letter API](https://lob.com/services/letters). In order to run the program enter: ``` -cd verify_and_create_letters_from_csv/ +cd create_letters_from_csv/ python letter.py input.csv ``` diff --git a/examples/verify_and_create_letters_from_csv/input.csv b/examples/create_letters_from_csv/input.csv similarity index 100% rename from examples/verify_and_create_letters_from_csv/input.csv rename to examples/create_letters_from_csv/input.csv diff --git a/examples/verify_and_create_letters_from_csv/letter_template.html b/examples/create_letters_from_csv/letter.html similarity index 100% rename from examples/verify_and_create_letters_from_csv/letter_template.html rename to examples/create_letters_from_csv/letter.html diff --git a/examples/create_letters_from_csv/letter.py b/examples/create_letters_from_csv/letter.py new file mode 100644 index 0000000..28111a6 --- /dev/null +++ b/examples/create_letters_from_csv/letter.py @@ -0,0 +1,91 @@ +# Usage +# python letter.py input.csv +import sys,os +sys.path.insert(0, os.path.abspath(__file__+'../../../..')) + +import lob +import csv +import datetime + +lob.api_key = 'test_fc26575412e92e22a926bc96c857f375f8b' + +skipFirstLine = True + +# Column indices in CSV +name = 0 +amount = 1 +address_line1 = 2 +address_line2 = 3 +address_city = 4 +address_state = 5 +address_zip = 6 +country = 'US' + +try: + sys.argv[1] +except IndexError: + print "Please provide an input CSV file as an argument." + sys.exit() + +# Open input files +inputFile = open(sys.argv[1], 'rU') +csvInput = csv.reader(inputFile) + +# Create output files +errors = open(os.path.dirname(os.path.abspath(__file__)) + '/errors.csv', 'w') +success = open(os.path.dirname(os.path.abspath(__file__)) + '/success.csv', 'w') + +# Loop through input CSV rows +for idx, row in enumerate(csvInput): + if skipFirstLine and idx == 0: + continue + + # Create letter for verified addresses + try: + createdLetter = lob.Letter.create( + description = 'Bill for ' + row[name], + metadata = { + 'campaign': 'billing_statements', + 'csv': inputFile.name + }, + to_address = { + 'name': row[name], + 'address_line1': row[address_line1], + 'address_line2': row[address_line2], + 'address_city': row[address_city], + 'address_zip': row[address_zip], + 'address_state': row[address_state], + }, + from_address = { + 'name': 'Your Name/Company', + 'address_line1': '123 Test Avenue', + 'address_city': 'San Francisco', + 'address_state': 'CA', + 'address_zip': '94107', + }, + file = open(os.path.dirname(os.path.abspath(__file__)) + '/letter.html', 'r').read(), + data = { + 'date': datetime.datetime.now().strftime("%m/%d/%Y"), + 'name': row[name], + 'amountDue': row[amount] + }, + color = True + ) + except Exception, e: + print "Error: " + str(e) + " in " + str(row) + else: + outputRow = createdLetter.id + "," + outputRow += createdLetter.url + "," + outputRow += row[name] + "," + outputRow += row[amount] + "," + outputRow += (createdLetter.to_address.address_line1 if createdLetter.to_address.address_line1 != None else " ") + "," + outputRow += (createdLetter.to_address.address_line2 if createdLetter.to_address.address_line2 != None else " ") + "," + outputRow += (createdLetter.to_address.address_city if createdLetter.to_address.address_city != None else " ") + "," + outputRow += (createdLetter.to_address.address_state if createdLetter.to_address.address_state != None else " ") + "," + outputRow += (createdLetter.to_address.address_zip if createdLetter.to_address.address_zip != None else " ") + "\n" + success.write(outputRow) + + +errors.close() +success.close() +print "\n" diff --git a/examples/verify_and_create_letters_from_csv/letter.py b/examples/verify_and_create_letters_from_csv/letter.py deleted file mode 100644 index 16f4cd5..0000000 --- a/examples/verify_and_create_letters_from_csv/letter.py +++ /dev/null @@ -1,118 +0,0 @@ -# Usage -# python verify.py input.csv -import sys,os -sys.path.insert(0, os.path.abspath(__file__+'../../../..')) - -import lob -import csv -import datetime - -lob.api_key = 'test_fc26575412e92e22a926bc96c857f375f8b' - -skipFirstLine = True - -# Column indices in CSV -name = 0 -amount = 1 -address1 = 2; -address2 = 3; -city = 4; -state = 5; -postcode = 6; -country = 'US' - -try: - sys.argv[1] -except IndexError: - print "Please provide an input CSV file as an argument." - sys.exit() - -# Open input files -inputFile = open(sys.argv[1], 'rU') -csvInput = csv.reader(inputFile) - -# Create output files -errors = open(os.path.dirname(os.path.abspath(__file__)) + '/errors.csv', 'w') -verified = open(os.path.dirname(os.path.abspath(__file__)) + '/verified.csv', 'w') -success = open(os.path.dirname(os.path.abspath(__file__)) + '/success.csv', 'w') - -# Loop through input CSV rows -for idx, row in enumerate(csvInput): - if skipFirstLine and idx == 0: - continue - - # Sanity check - sys.stdout.write('.') - sys.stdout.flush() - - # Verify addresses - try: - verifiedAddress = lob.Verification.create( - address_line1 = row[address1], - address_line2 = row[address2], - address_city = row[city], - address_state = row[state], - address_zip = row[postcode], - address_country = country - ) - except Exception, e: - outputRow = ",".join(row) + "," + str(e)+ "\n" - errors.write(outputRow) - else: - outputRow = row[name] + "," - outputRow += row[amount] + "," - outputRow += verifiedAddress.address.address_line1 + "," - outputRow += verifiedAddress.address.address_line2 + "," - outputRow += verifiedAddress.address.address_city + "," - outputRow += verifiedAddress.address.address_state + "," - outputRow += verifiedAddress.address.address_zip + "\n" - verified.write(outputRow) - - # Create letter for verified addresses - try: - createdLetter = lob.Letter.create( - description = 'Bill for ' + row[name], - metadata = { - 'campaign': 'billing_statements' - }, - to_address = { - 'name': row[name], - 'address_line1': verifiedAddress.address.address_line1, - 'address_city': verifiedAddress.address.address_city, - 'address_zip': verifiedAddress.address.address_zip, - 'address_state': verifiedAddress.address.address_state, - }, - from_address = { - 'name': 'Your Name/Company', - 'address_line1': '123 Test Avenue', - 'address_city': 'San Francisco', - 'address_state': 'CA', - 'address_zip': '94107', - }, - file = open(os.path.dirname(os.path.abspath(__file__)) + '/letter_template.html', 'r').read(), - data = { - 'date': datetime.datetime.now().strftime("%m/%d/%Y"), - 'name': row[name], - 'amountDue': row[amount] - }, - color = True - ) - except Exception, e: - print "Error: " + str(e) + " in " + str(row) - else: - outputRow = createdLetter.id + "," - outputRow += createdLetter.url + "," - outputRow += row[name] + "," - outputRow += row[amount] + "," - outputRow += (createdLetter.to_address.address_line1 if createdLetter.to_address.address_line1 != None else " ") + "," - outputRow += (createdLetter.to_address.address_line2 if createdLetter.to_address.address_line2 != None else " ") + "," - outputRow += (createdLetter.to_address.address_city if createdLetter.to_address.address_city != None else " ") + "," - outputRow += (createdLetter.to_address.address_state if createdLetter.to_address.address_state != None else " ") + "," - outputRow += (createdLetter.to_address.address_zip if createdLetter.to_address.address_zip != None else " ") + "\n" - success.write(outputRow) - - -errors.close() -verified.close() -success.close() -print "\n" From 0404db4b102804b19c738883fc2dba2368bdb078 Mon Sep 17 00:00:00 2001 From: Stewart Lynch Date: Wed, 17 Aug 2016 11:22:10 -0700 Subject: [PATCH 2/2] Adds create check from example --- examples/README.md | 11 +++ examples/create_checks_from_csv/check.html | 59 +++++++++++ examples/create_checks_from_csv/check.py | 108 +++++++++++++++++++++ examples/create_checks_from_csv/input.csv | 8 ++ 4 files changed, 186 insertions(+) create mode 100644 examples/create_checks_from_csv/check.html create mode 100644 examples/create_checks_from_csv/check.py create mode 100644 examples/create_checks_from_csv/input.csv diff --git a/examples/README.md b/examples/README.md index fcbb22f..3b10946 100644 --- a/examples/README.md +++ b/examples/README.md @@ -32,6 +32,17 @@ cd create_postcards_from_csv/ python create_postcards_from_csv.py input.csv ``` +### Create checks from CSV + +An example showing how to dynamically create checks from a CSV with variable data using Lob's [Postcard API](https://lob.com/services/postcards). + +In order to run the program enter: + +``` +cd create_check_from_csv/ +python check.py input.csv +``` + ### Verify addresses from CSV An example showing how to validate and cleanse a CSV spreadsheet full of shipping addresses using Lob's [Address Verification API](https://lob.com/verification/address). diff --git a/examples/create_checks_from_csv/check.html b/examples/create_checks_from_csv/check.html new file mode 100644 index 0000000..1ada082 --- /dev/null +++ b/examples/create_checks_from_csv/check.html @@ -0,0 +1,59 @@ + + + + + Lob.com Sample Check + + + + +
+
+

Demo check for {{name}}

+
+ + + diff --git a/examples/create_checks_from_csv/check.py b/examples/create_checks_from_csv/check.py new file mode 100644 index 0000000..2591fd7 --- /dev/null +++ b/examples/create_checks_from_csv/check.py @@ -0,0 +1,108 @@ +# Usage +# python check.py input.csv +import sys,os +sys.path.insert(0, os.path.abspath(__file__+'../../../..')) + +import lob +import csv + +lob.api_key = 'test_fc26575412e92e22a926bc96c857f375f8b' # TODO Replace with your API key + +skipFirstLine = True + +# Column indices in CSV +name = 0 +amount = 1 +address_line1 = 2 +address_line2 = 3 +address_city = 4 +address_state = 5 +address_zip = 6 +country = 'US' + +try: + sys.argv[1] +except IndexError: + print "Please provide an input CSV file as an argument." + sys.exit() + +# Open input files +inputFile = open(sys.argv[1], 'rU') +csvInput = csv.reader(inputFile) + +# Create output files +errors = open(os.path.dirname(os.path.abspath(__file__)) + '/errors.csv', 'w') +success = open(os.path.dirname(os.path.abspath(__file__)) + '/success.csv', 'w') + +# Creating a Bank Account using the previously created account_address + +bankAccount = lob.BankAccount.create( + description = 'Example bank account', + routing_number = '122100024', + account_number = '0123456478', + account_type = 'company', + signatory = 'John Doe' +) + +# Verifying a Bank Account with the microdeposit amounts + +example_bank_account = lob.BankAccount.verify( + id = bankAccount.id, + amounts = [23, 77] +) + +# Loop through input CSV rows +for idx, row in enumerate(csvInput): + if skipFirstLine and idx == 0: + continue + + # Create letter for verified addresses + try: + createdCheck = lob.Check.create( + description = 'Check for ' + row[name], + metadata = { + 'campaign': 'Bill pay', + 'csv': inputFile.name + }, + to_address = { + 'name': row[name], + 'address_line1': row[address_line1], + 'address_line2': row[address_line2], + 'address_city': row[address_city], + 'address_zip': row[address_zip], + 'address_state': row[address_state], + }, + from_address = { + 'name': 'Your Name/Company', + 'address_line1': '123 Test Avenue', + 'address_city': 'San Francisco', + 'address_state': 'CA', + 'address_zip': '94107', + }, + bank_account = bankAccount, + amount = row[amount], + memo = 'Service payment', + check_bottom = open(os.path.dirname(os.path.abspath(__file__)) + '/check.html', 'r').read(), + data = { + 'name': row[name], + }, + logo = 'https://s3-us-west-2.amazonaws.com/lob-assets/lob_check_logo.png' + ) + except Exception, e: + print "Error: " + str(e) + " in " + str(row) + else: + outputRow = createdCheck.id + "," + outputRow += createdCheck.url + "," + outputRow += row[name] + "," + outputRow += row[amount] + "," + outputRow += (createdCheck.to_address.address_line1 if createdCheck.to_address.address_line1 != None else " ") + "," + outputRow += (createdCheck.to_address.address_line2 if createdCheck.to_address.address_line2 != None else " ") + "," + outputRow += (createdCheck.to_address.address_city if createdCheck.to_address.address_city != None else " ") + "," + outputRow += (createdCheck.to_address.address_state if createdCheck.to_address.address_state != None else " ") + "," + outputRow += (createdCheck.to_address.address_zip if createdCheck.to_address.address_zip != None else " ") + "\n" + success.write(outputRow) + + +errors.close() +success.close() +print "\n" diff --git a/examples/create_checks_from_csv/input.csv b/examples/create_checks_from_csv/input.csv new file mode 100644 index 0000000..d029607 --- /dev/null +++ b/examples/create_checks_from_csv/input.csv @@ -0,0 +1,8 @@ +name, amount,address1,address2,city,state,postcode +Kelly Jones,185.54,185 Berry St,,San Francisco,CA,94107 +Margaret Smith,387.45,6575 W Rialto,,fresno,CA,93723 +Jess Smith,19.87,537 Fillmore Street, Apt #2,San Francicso,ca,94117 +Michael Thruman,347.21,1625 Post St,,San Francisco,CA,94115 +Gerald Merritt,278.40,333 Post St,,San Francisco,CA,94108 +Linda Anderson,425.40,655 Fake Address,Fake Apartment,Not a City,CA,06475-1246 +John Travolta,175.84,111 NotAnAddress,,San Francisco,CA,94107