README.md in docdata-0.0.1 vs README.md in docdata-0.0.2

- old
+ new

@@ -1,9 +1,15 @@ -# DocData +# Docdata +[![Build Status](https://secure.travis-ci.org/henkm/docdata.png)](http://travis-ci.org/henkm/docdata) +[![Gem Version](https://badge.fury.io/rb/docdata.svg)](http://badge.fury.io/rb/docdata) +[![Code Climate](https://codeclimate.com/github/henkm/docdata/badges/gpa.svg)](https://codeclimate.com/github/henkm/docdata) +[![Coverage Status](https://coveralls.io/repos/henkm/docdata/badge.png?branch=master)](https://coveralls.io/r/henkm/docdata) -DocData is a Ruby binder for DocData payments. Current status: in progress, not stable. +Docdata is a Ruby binder for Docdata Payments. Current status: **in progress, not stable**. +This gem relies on the awesom Savon gem to communicate with Docdata Payments' SOAP API. + ## Installation Add this line to your application's Gemfile: gem 'docdata' @@ -14,16 +20,176 @@ Or install it yourself as: $ gem install docdata -## Usage +## Workflow +Each transaction consists of 2 - optionally 3 - parts: -TODO: Write usage instructions here +- `Docdata::Shopper` (details about the shopper: name, email, etc.) +- `Docdata::Payment` (details about the payment: currency, gross amount, etc.) +- `Docdata::LineItem` (optionally list the products of this payment) **currently not working!** + +The general workflow is as follows: + +1. Set up a `Docdata::Shopper` object with the details of your shopper: `@shopper = Docdata::Shopper.new` +2. Set up a `Docdata::Payment` object with the details of your order: `@payment = Docdata::Payment.new(shopper: @shopper)` +3. Call the `create` method (`@payment.create`) +4. On success, store the payment key and use `@payment.redirect_url` to redirect the consumer to the transaction page. +5. When the consumer gets back to your application, use the `Docdata::Payment.find("PA1M3NTK3Y").status.paid` to check if the order was paid for. + +## Parameters +All the payment details that Docdata Payments requires, are - obviously - also required to make payments via this gem. + +#### Docdata::Shopper: +| Name | Type | Required | Defaults to | +|-----------|------------|---------|----| +| id | String (ID for own reference) | Yes | | +| first_name | String | Yes | First Name | +| last_name | String | Yes | Last Name | +| street | String | Yes | Main Street | +| house_number | String | Yes | 123 | +| postal_code | String | Yes | 2244 | +| city | String | Yes | City | +| country_code | String (ISO country code) | Yes | NL | +| language_code | String (ISO language code) | Yes | nl | +| email | String | Yes | random@example.com | + +#### Docdata::Payment: +| Name | Type | Required | +|-----------|------------|---------| +| amount | Integer (amount in cents) | Yes | +| currency | String (ISO currency code) | Yes | +| order_reference | String (your own unique reference) | Yes | +| profile | String (name of your Docdata Payment profile)| Yes | +| shopper | Docdata::Shopper | Yes | +| line_items | Array (of Docdata::LineItem objects) | No | +| bank_id | String | No | +| prefered_payment_method | String | No | +| key | String (is availabel after successful 'create' action) | No (readonly) + + +## Default values +A quick warning about the default values for the Shopper object: **For some payment methods, Docdata Payments needs the actual information in order for the payment to take place.** + +If you use `GIROPAY`, `SEPA` and `AFTERPAY` this is the case. (Maybe also in other payment methods, please let me know!) + +## Example usage in Rails application +The example below assumes you have your application set up with a Order model, which contains the information needed for this transaction (amount, name, etc.). +```ruby +# orders_controller.rb +def start_transaction + # find the order from your database + @order = Order.find(params[:id]) + + # initialize a shopper, use details from your order + shopper = Docdata::Shopper.new(first_name: @order.first_name, last_name: @order.last_name) + + # set up a payment + @payment = Docdata::Payment.new( + amount: @order.total, + currency: @order.currency, + shopper: shopper, + profile: "My Default Profile", + order_reference: "order ##{@order.id}" + ) + + # create the payment via the docdata api and collect the result + result = @payment.create + + if result.success? + # Set the transaction key for future reference + @order.update_column :docdata_key, result.key + # redirect the user to the docdata payment page + redirect_to @payment.redirect_url + else + # TODO: Display the error and warn the user that something went wrong. + end +end +``` + +## Ideal + +For transactions in the Netherlands, iDeal is the most common option. To redirect a user directly to the bank page (skipping the Docdata web menu page), you can ask your user to choose a bank from any of the banks listed in the `Docdata::Ideal.banks` method. + +In `Docdata::Payment` you can set `bank_id` to any value. If you do, the redirect URI will redirect your user directly to the bank page. + +Example code: +```ruby +# orders_controller.rb +def ideal_checkout + @order = Order.find(params[:order_id]) + @banks = Docdata::Ideal.banks +end + +def start_ideal_transaction + @order = Order.find(params[:order_id]) + + # initialize a shopper, use details from your order + shopper = Docdata::Shopper.new(first_name: @order.first_name, last_name: @order.last_name) + + # set up a payment + @payment = Docdata::Payment.new( + amount: @order.total, + currency: @order.currency, + shopper: shopper, + profile: "My Default Profile", + order_reference: "order ##{@order.id}", + bank_id: params[:bank_id], + default_act: true # redirect directly to the bank, skipping the Docdata web menu + ) + + # create the payment via the docdata api and collect the result + result = @payment.create + + if result.success? + # Set the transaction key for future reference + @order.update_column :docdata_key, result.key + # redirect the user to the bank page + redirect_to @payment.redirect_url + else + # TODO: Display the error and warn the user that something went wrong. + end +end +``` + +View template (ideal_checkout.html.erb): + +```erb +<h2>Choose your bank</h2> +<%= form_tag start_ideal_transaction_path, method: :post, target: "_blank" do %> +<%= select_tag "bank_id", options_from_collection_for_select(@banks, "id", "name") %> +<%= hidden_field_tag :order_id, @order.id %> +<%= submit_tag "Proceed to checkout" %> +<% end %> +``` + +## Tips and samples + +#### Redirect directly to bank page (skip Docdata web menu) +When making a new `Docdata::Payment`, use the `default_act` parameter to redirect consumers directly to the acquirers website. Example: + +```ruby + @payment = Docdata::Payment.new( + amount: @order.total, + currency: @order.currency, + shopper: shopper, + profile: "My Default Profile", + order_reference: "order ##{@order.id}", + bank_id: params[:bank_id], + default_act: true # redirect directly to the bank, skipping the Docdata web menu + ) +``` + +#### Retrieve a list of iDeal banks to show +`Docata::Ideal.banks` returns an Array. + ## Contributing 1. Fork it 2. Create your feature branch (`git checkout -b my-new-feature`) -3. Commit your changes (`git commit -am 'Add some feature'`) -4. Push to the branch (`git push origin my-new-feature`) -5. Create new Pull Request +3. Make changes, document them and add tests (rspec) +4. Run the entire test suite and make sure all tests pass +5. Commit your changes (`git commit -am 'Add some feature'`) +6. Push to the branch (`git push origin my-new-feature`) +7. Create new Pull Request