Invoicing Gem - Sales & Payments In Your App

Loading...

Flash Player 9 (or above) is needed to view presentations.
We have detected that you do not have it on your computer. To install it, go here.

0 comments

Post a comment

    Post a comment
    Embed Video
    Edit your comment Cancel

    2 Favorites

    Invoicing Gem - Sales & Payments In Your App - Presentation Transcript

    1. Sales & payments in your app Martin Kleppmann http://go-test.it http://yes-no-cancel.co.uk http://twitter.com/martinkl
    2. Automated Cross-Browser Functional Testing “Selenium in the cloud”
    3. http://go-test.it
    4. SaaS
    5. Revenue model
    6. You should be making one of these
    7. We need more of these
    8. We need more of these £
    9. Your £1m business e.g. £42/mon × 12 mon × 2,000 customers
    10. Your £1m business e.g. £42/mon × 12 mon × 2,000 customers Automation!
    11. B2B
    12. Ruby Invoicing Framework So… youʼve spent many nights developing your awesome application. Itʼs coming together nicely, and youʼve showed it to your friends, who got very excited about it too. In fact, people love your app so much that they are willing to pay you money to use it. Great news! Keeping it simple, you start taking payments trough PayPal or even accept cheques through the post. Later you maybe integrate with the API of a more flexible credit card handling provider. Money is coming in – even better news! The problems become apparent when you try to turn your app into a business. Suddenly everything becomes a lot more complicated. You need to start thinking about ugly things like tax and you need to pay an accountant to sort out the paperwork for you. You need to start bookkeeping, a prospect which gives you the shivers. Maybe some of your customers are awkward, accepting billing only in their own currency or requiring a special tax status. Itʼs all a bit of a mess, and as you grudgingly start ploughing through the Wikipedia page on “credits and debits”, you wish that you could just get the money and leave it at that. The missing link between your app and the money Enter the Ruby Invoicing Framework RubyGem, or invoicing gem for short. Itʼs a collection
    13. Ruby Invoicing Framework ic in g/ /invo m So… youʼve spent many nights developing your awesome application. Itʼs coming together co nicely, and youʼve showed it to your friends, who got very excited about it too. In fact, u b. people love your app so much that they are willing to pay you money to use it. Great news! t.gith Keeping it simple, you start taking payments trough PayPal or even accept cheques p through the post. Later you maybe integrate with the API of a more flexible credit card //e handling provider. Money is coming in – even better news! tt p: The problems become apparent when you try to turn your app into a business. Suddenly h everything becomes a lot more complicated. You need to start thinking about ugly things like tax and you need to pay an accountant to sort out the paperwork for you. You need to start bookkeeping, a prospect which gives you the shivers. Maybe some of your customers are awkward, accepting billing only in their own currency or requiring a special tax status. Itʼs all a bit of a mess, and as you grudgingly start ploughing through the Wikipedia page on “credits and debits”, you wish that you could just get the money and leave it at that. The missing link between your app and the money Enter the Ruby Invoicing Framework RubyGem, or invoicing gem for short. Itʼs a collection
    14. Richard Messenger, http://www.flickr.com/photos/richardmessenger/2626927255/
    15. Production use
    16. A solid foundation for building commercial web apps
    17. I’m not an accountant
    18. Jargon
    19. Jargon (as far as we can avoid it)
    20. Installing $ gem install invoicing invoicing_generator $ script/generate invoicing_ledger billing --currency=GBP $ rake db:migrate
    21. Model classes module Billing class Invoice < LedgerItem acts_as_invoice end class CreditNote < LedgerItem acts_as_credit_note end class Payment < LedgerItem acts_as_payment end end
    22. Ledger items
    23. Ledger items • Invoice: “you owe us money”
    24. Ledger items • Invoice: “you owe us money” • Credit Note: “oops, billed you too much”
    25. Ledger items • Invoice: “you owe us money” • Credit Note: “oops, billed you too much” • Payment: “thanks for the cash”
    26. acts_as_ledger_item module Billing class LedgerItem < ActiveRecord::Base acts_as_ledger_item has_many :line_items, :class_name => 'Billing::LineItem' belongs_to :sender, :class_name => 'Company' belongs_to :recipient, :class_name => 'Company' end end
    27. Fine, but so what?
    28. http://www.flickr.com/photos/26614375@N00/381941029/
    29. Avoid writing boring code
    30. Displaying an invoice class BillingController < ApplicationController def document @document = Billing::LedgerItem.find(params[:id]) respond_to do |format| format.html { render :text => @document.render_html, :layout => true } format.xml { render :xml => @document.render_ubl } end end end
    31. Displaying an invoice class BillingController < ApplicationController def document @document = Billing::LedgerItem.find(params[:id]) respond_to do |format| format.html { render :text => @document.render_html, :layout => true } format.xml { render :xml => @document.render_ubl } end end end
    32. Best practices
    33. Your investors will want to see your accounts
    34. What accountants need to know • Exact dates and periods of invoices & payments • Reconciling bank statements • Details of VAT & other tax
    35. http://www.flickr.com/photos/8704943@N07/3491779722/
    36. Dates & periods create_table "ledger_items" do |t| t.string "type" t.integer "sender_id" t.integer "recipient_id" t.string "currency", :default => "GBP", :null => false t.decimal "total_amount", :precision => 20, :scale => 4 t.decimal "tax_amount", :precision => 20, :scale => 4 t.string "status", :limit => 20 t.string "description" t.datetime "issue_date" t.datetime "period_start" t.datetime "period_end" t.datetime "created_at" t.datetime "updated_at" end
    37. Dates & periods create_table "ledger_items" do |t| t.string "type" t.integer "sender_id" t.integer "recipient_id" t.string "currency", :default => "GBP", :null => false t.decimal "total_amount", :precision => 20, :scale => 4 t.decimal "tax_amount", :precision => 20, :scale => 4 t.string "status", :limit => 20 t.string "description" t.datetime "issue_date" t.datetime "period_start" t.datetime "period_end" t.datetime "created_at" t.datetime "updated_at" end
    38. Invoice (“bill”) ≠ Payment (“receipt”)
    39. Invoice ≠ Payment Your Sales Account Customer Account Your Bank Account
    40. Invoice ≠ Payment Your Sales Account – Invoice + Customer Account Your Bank Account
    41. Invoice ≠ Payment Your Sales Account – Invoice + Customer Account – Payment + Your Bank Account
    42. Account statement No. Date Description Amount 100 2009-06-01 Subscription for June £115.00 101 2009-06-24 Referral fee – thanks for inviting 3 friends –£10.00 102 2009-06-30 Credit card payment including PAYG credit –£200.00 Current account balance (GBP) –£75.00 Charges not yet invoiced Description Amount Pay As You Go charges so far this month £23.45
    43. Account statement Invoice No. Date Description Credit Note Amount 100 2009-06-01 Subscription for June Payment £115.00 101 2009-06-24 Referral fee – thanks for inviting 3 friends –£10.00 102 2009-06-30 Credit card payment including PAYG credit –£200.00 Current account balance (GBP) –£75.00 Invoice Charges not yet invoiced (with status=open) Description Amount Pay As You Go charges so far this month £23.45
    44. Account statement class BillingController < ApplicationController def statement scope = Billing::LedgerItem. exclude_empty_invoices. sent_or_received_by(params[:id]). sorted(:issue_date) @in_effect = scope.in_effect.all @open_or_pending = scope.open_or_pending.all @summary = Billing::LedgerItem.account_summary( params[:id]) end end
    45. Thomas Hawk, http://www.flickr.com/photos/thomashawk/2317826708/
    46. VAT
    47. Your Sales Account VAT Account Customer Account Your Bank Account
    48. Your Sales Account VAT Account – – Invoice + Customer Account Your Bank Account
    49. Your Sales Account VAT Account – – Invoice + Customer Account – Payment + Your Bank Account
    50. Your Sales Account VAT Account – – + Invoice + VAT Customer Account Return – Payment + – Your Bank Account
    51. Urgh. (And we’ve not even started talking about EU VAT regulations yet.)
    52. VAT made easy create_table "ledger_items" do |t| t.string "type" t.integer "sender_id" t.integer "recipient_id" t.string "currency", :default => "GBP", :null => false t.decimal "total_amount", :precision => 20, :scale => 4 t.decimal "tax_amount", :precision => 20, :scale => 4 t.string "status", :limit => 20 t.string "description" t.datetime "issue_date" t.datetime "period_start" t.datetime "period_end" t.datetime "created_at" t.datetime "updated_at" end
    53. VAT made easy create_table "ledger_items" do |t| t.string "type" t.integer "sender_id" t.integer "recipient_id" t.string "currency", :default => "GBP", :null => false t.decimal "total_amount", :precision => 20, :scale => 4 t.decimal "tax_amount", :precision => 20, :scale => 4 t.string "status", :limit => 20 t.string "description" t.datetime "issue_date" t.datetime "period_start" t.datetime "period_end" t.datetime "created_at" t.datetime "updated_at" end
    54. VAT made easy create_table "ledger_items" do |t| t.string "type" t.integer "sender_id" t.integer "recipient_id" t.string "currency", :default => "GBP", :null => false t.decimal "total_amount", :precision => 20, :scale => 4 t.decimal "tax_amount", :precision => 20, :scale => 4 t.string "status", :limit => 20 ☺ t.string "description" t.datetime "issue_date" t.datetime "period_start" t.datetime "period_end" t.datetime "created_at" t.datetime "updated_at" end
    55. VAT made easy # New in invoicing gem version 0.3 class MyProduct < ActiveRecord::Base acts_as_taxable :price, :tax_logic => Invoicing::Countries::UK::VAT.new end p = MyProduct.new :price => 10 p.price_with_tax_info # => "£11.50 (inc. VAT)" p.price_taxed = 23.00 p.price.to_s # => "20.0"
    56. Paolo Màrgari, http://www.flickr.com/photos/paolomargari/3050305454/
    57. Overview of your customers
    58. Sales and purchases ledger Sale Purchase Name Currency Sales Purchases Balance receipts payments A. N. Other GBP £400.00 £0.00 £400.00 £0.00 £0.00 Some Customer GBP £0.00 £395.00 £0.00 £250.00 –£145.00 Some Customer USD $2,782.31 $0.00 $2,160.61 $0.00 $621.70 Widgets Ltd GBP £229.63 £12.00 £300.00 £0.00 £82.37
    59. Sales/purchase ledger @summaries = Billing::LedgerItem.account_summaries(params[:id]) @summaries.each_pair do |id, by_currency| by_currency.each_pair do |currency, data| puts "Sales: #{data.sales_formatted}" puts "Purchases: #{data.purchases_formatted}" # ... end end
    60. What else?
    61. Martin Kleppmann, http://www.flickr.com/photos/martinkleppmann/3131198770/
    62. ¥1,300 Martin Kleppmann, http://www.flickr.com/photos/martinkleppmann/3131198770/
    63. Currency formatting
    64. Currency formatting inv = Billing::MyInvoice.new :currency => 'JPY' nov = Billing::LineItem.new( :description => 'November charge', :net_amount => 10, :tax_point => '2008-11-30') inv.line_items << nov; inv.save! nov.amount_formatted # => "¥10" inv.currency = 'GBP' nov.amount_formatted
    65. Nothing is constant
    66. VAT change 1/12/09 dec = Billing::LineItem.new( :description => 'December charge', :net_amount => 10, :tax_point => '2008-12-01') inv.line_items << dec nov.amount_taxed_formatted # => "£11.75" dec.amount_taxed_formatted # => "£11.50"
    67. Johnny Vulkan, http://www.flickr.com/photos/26614375@N00/381941029/
    68. Integrating with payment gateways http://activemerchant.org
    69. Open standards
    70. Displaying an invoice class BillingController < ApplicationController def document @document = Billing::LedgerItem.find(params[:id]) respond_to do |format| format.html { render :text => @document.render_html, :layout => true } format.xml { render :xml => @document.render_ubl } end end end
    71. Displaying an invoice class BillingController < ApplicationController def document @document = Billing::LedgerItem.find(params[:id]) respond_to do |format| format.html { render :text => @document.render_html, :layout => true } format.xml { render :xml => @document.render_ubl } end end end
    72. Displaying an invoice class BillingController < ApplicationController def document @document = Billing::LedgerItem.find(params[:id]) UBL? WTF? respond_to do |format| format.html { render :text => @document.render_html, :layout => true } format.xml { render :xml => @document.render_ubl } end end end
    73. UBL = “Universal Business Language” OASIS Open Standard
    74. UBL: If you’re working with invoices and purchase orders and that kind of stuff (and who isn’t?) [...] Look no further. @timbray: “Don’t Invent XML Languages” http://tr.im/NoNewXML
    75. UBL Example (1/3) <ubl:Invoice xmlns:ubl="..." xmlns:cbc="..." xmlns:cac="..."> <cbc:ID>1</cbc:ID> <cbc:IssueDate>2008-06-30</cbc:IssueDate> <cac:InvoicePeriod> <cbc:StartDate>2008-06-01</cbc:StartDate> <cbc:EndDate>2008-07-01</cbc:EndDate> </cac:InvoicePeriod> <cac:AccountingSupplierParty> ... </cac:AccountingSupplierParty> <cac:AccountingCustomerParty> ... </cac:AccountingCustomerParty> ...
    76. UBL Example (2/3) <cac:TaxTotal> <cbc:TaxAmount currencyID="GBP"> 15.00 </cbc:TaxAmount> </cac:TaxTotal> <cac:LegalMonetaryTotal> <cbc:TaxExclusiveAmount currencyID="GBP"> 100.00 </cbc:TaxExclusiveAmount> <cbc:PayableAmount currencyID="GBP"> 115.00 </cbc:PayableAmount> </cac:LegalMonetaryTotal>
    77. UBL Example (3/3) <cac:InvoiceLine> <cbc:ID>42</cbc:ID> <cbc:LineExtensionAmount currencyID="GBP"> 100.00 </cbc:LineExtensionAmount> <cac:Item> <cbc:Description> Subscription for my fantastic app </cbc:Description> </cac:Item> </cac:InvoiceLine> </ubl:Invoice>
    78. Designing XML Languages is hard. It’s boring, political, time- consuming, unglamorous, irritating work. @timbray: “Don’t Invent XML Languages” http://tr.im/NoNewXML
    79. Interoperability
    80. OAccounts Sage Invoicing gem MYOB Payment provider KashFlow Shopping cart Xero Custom reporting
    81. OAccounts Sage Invoicing gem MYOB Payment provider OAccounts KashFlow Shopping cart Xero Custom reporting
    82. OAccounts = UBL + XBRL-GL + REST + Conventions + Documentation + Collaboration + Open source implementation
    83. OAccounts = UBL + XBRL-GL ts. REST+ or g/ + Conventionsco un + ://o ac ht tp Documentation + Collaboration + Open source implementation
    84. Image credits Screenshots of: http://basecamphq.com/signup, http://freshbooks.com/pricing.php, http://fogcreek.com/FogBugz/, http://github.com/plans, http://lessaccounting.com/pricing, http://freeagentcentral.com/pricing, http://huddle.net/huddle-price-plans/, http://twitter.com/bensummers/status/1199722134, http://oneis.co.uk/, http://bidforwine.co.uk Building site: Richard Messenger, http://www.flickr.com/photos/richardmessenger/2626927255/ Tim Bray: http://en.wikipedia.org/wiki/File:Tim_Bray.jpg Pile of money: Johnny Vulkan, http://www.flickr.com/photos/26614375@N00/381941029/ Astronomical clock: magro_kr, http://www.flickr.com/photos/8704943@N07/3491779722/ Tax Service: Thomas Hawk, http://www.flickr.com/photos/thomashawk/2317826708/ Man in a shop: Paolo Màrgari, http://www.flickr.com/photos/paolomargari/3050305454/ Hands full of money: Marshall Astor, http://www.flickr.com/photos/lifeontheedge/2672465894/
    85. Thank you! Martin Kleppmann http://go-test.it http://yes-no-cancel.co.uk http://twitter.com/martinkl

    + martinkleppmannmartinkleppmann, 4 months ago

    custom

    513 views, 2 favs, 2 embeds more stats

    Presentation given by Martin Kleppmann at Rails Und more

    More info about this document

    CC Attribution-ShareAlike LicenseCC Attribution-ShareAlike License

    Go to text version

    • Total Views 513
      • 449 on SlideShare
      • 64 from embeds
    • Comments 0
    • Favorites 2
    • Downloads 18
    Most viewed embeds
    • 62 views on http://www.yes-no-cancel.co.uk
    • 2 views on http://localhost

    more

    All embeds
    • 62 views on http://www.yes-no-cancel.co.uk
    • 2 views on http://localhost

    less

    Flagged as inappropriate Flag as inappropriate
    Flag as inappropriate

    Select your reason for flagging this presentation as inappropriate. If needed, use the feedback form to let us know more details.

    Cancel
    File a copyright complaint
    Having problems? Go to our helpdesk?

    Categories