openbill-ruby 0.1.7 → 0.1.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1e596b1c45d1e6de254938e905bbf454058bf7df
4
- data.tar.gz: 9b6bfc5f5e89ac5c1479e3f3de6e4aba3ecc1619
3
+ metadata.gz: a75471ea494c07660f3d35539b4ea8cb609dc5cb
4
+ data.tar.gz: 64f789bd6587756d24d06eb07fd3953d58a82238
5
5
  SHA512:
6
- metadata.gz: 2a27ab2112aed4d8f0fbf228d5570cacdb7d1ea71eee4e9927e90e07b90f0dc4e9e4deea520b0dcdaf6dd46552df1abdbb609632051023d2f3817f8890294e55
7
- data.tar.gz: 023a1cf6968b662d6337aff8aa0a2b97077a01b9d31601b5b9f5d2a7324af27a4b6396a033c8130a2e92f43f6765ea256e9184cc2bc360b875eb9080cd8c318c
6
+ metadata.gz: 50da8cc7f4b6a391317b3e25275ee97c26f97f4fb78b68c00db17f77c77003399a83b5a661096926c667c3863697bfe02169f1f047261ca07bd31cef102a2165
7
+ data.tar.gz: d3ca24a7c5494219153f6ddf90c2a51043521411dbd5ed1858da8b5c5597ab934d4f9a3134577246a73f2c9b9dabdc40ce8ebe2f819b3d5104d765ec7f67606d
data/README.md CHANGED
@@ -25,67 +25,78 @@ Add database configurartion to `./config/initializers/openbill.rb`
25
25
  ### Создание системных счетов
26
26
 
27
27
  ```ruby
28
- Openbill.config.database =
29
- ActiveRecord::Base.connection.instance_variable_get('@config');
30
-
28
+ Openbill.configure do |config|
29
+ config.default_currency = 'RUB'
30
+ config.database = ActiveRecord::Base.connection.instance_variable_get('@config')
31
+ end
31
32
 
32
33
  SystemRegistry = Openbill::Registry.new Openbill.current do |registry|
33
34
  registry.define :payments, 'Счет с которого поступает оплата'
34
- registry.define :subscriptions, 'Абонентская плата'
35
+ registry.define :subscriptions, 'Абонентская плата с клиентских счетов'
35
36
  end
36
37
  ```
37
38
 
38
39
  Таким образом в системом реестре появляется два счета `SystemRegistry[:payments]` и `SystemRegistry[:subscriptions]`
39
40
 
40
- ### Поддержка биллинга со стороны клиента (автоматическое создание клиентского счета):
41
+ ### Поддержка биллингово счета в клиентской модели:
41
42
 
42
43
  ```ruby
43
- module AccountBilling
44
+ module OpenbillAccountSupport
44
45
  extend ActiveSupport::Concern
45
46
 
46
47
  included do
47
48
  after_commit :attach_billing, on: :create
48
49
  end
49
50
 
50
- delegate :amount, to: :billing_account
51
-
52
- def billing_account
51
+ def openbill_account
53
52
  Openbill.current.account([:accounts, id])
54
53
  end
55
54
  end
56
55
  ```
57
56
 
58
- Добавляем concern в модель ответсвенную за счет (например в User)
57
+ Добавляем этот `concern` в модель ответсвенную за счет (например в `User`)
58
+
59
+ ### Операции
59
60
 
61
+ Обычно со стороны пиложения необходимо производить несколько типовыхв операций:
60
62
 
61
- ### Прием оплаты.
63
+ 1. Зачисление оплаты на счет клиента.
64
+ 2. Списание со счета клиента (напримре ежемесячной оплаты).
65
+ 3. Просмотр состояния счета клиента.
62
66
 
63
- Оплата проводится транзакцией между системным счетом `payments` и счетом клиента.
67
+ #### 1. Зачисление оплаты на счет клиента.
68
+
69
+ Оплата проводится транзакцией между системным счетом `:payments` и индивидуальным счетом клиента.
64
70
 
65
71
  ```ruby
66
72
  Openbill.current.make_transaction(
67
73
  // Счет списания
68
- from_account_id: Billing.payment.id,
74
+ from: SystemRegistry[:payments],
69
75
 
70
76
  // Счет зачисление
71
- to_account_id: user.billing_account.id,
77
+ to: user.opennill_account,
72
78
 
73
- // Уникальный идентификатор транзакции
74
- uri: Openbill.current.generate_uri(:transactions, 123),
79
+ // Уникальный идентификатор транзакции. Идентификтор должен содержать
80
+ // ключи исключающие случайное повторное проведение данной транзакции.
81
+ // Обычно сюда включают номер транзакции из платежного шлюза
82
+ key: 'N123132131',
75
83
 
76
84
  // Сумма транзакции. Валюта должна совпадать с обоими счетами
77
- amount: Money(123, 'RUB'),
85
+ amount: Money.new(123, 'RUB'),
78
86
 
79
- // Не обязательное текстовое описание транзакции
87
+ // Не обязательное текстовое описание транзакции. Например детали из платежного шлюза.
80
88
  details: 'Оплата такая-то',
81
89
 
82
- // hash с данными транзакции для структурированного поиска в дальнейшем
83
- meta: { key: 'value' } // не обязательно
90
+ // Необязательнай hash с данными транзакции для структурированного поиска в дальнейшем
91
+ meta: { gateway: :cloudpayments }
84
92
  )
85
93
  ```
86
94
 
87
95
  ## Development
88
96
 
97
+
98
+ > bundle exec rake db:migrate:down VERSION=20160320150928
99
+
89
100
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
90
101
 
91
102
  To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
@@ -3,6 +3,8 @@ module Openbill
3
3
  SYSTEM_NS = :system
4
4
  AccountNotFound = Class.new StandardError
5
5
 
6
+ attr_reader :accounts
7
+
6
8
  def initialize(service, system_ns = SYSTEM_NS)
7
9
  fail("Must be a Openbill::Service #{service}") unless service.is_a? Openbill::Service
8
10
  @service = service
@@ -10,19 +12,16 @@ module Openbill
10
12
  @accounts = {}
11
13
  yield self
12
14
  @accounts.freeze
13
- return @accounts
14
- rescue
15
- @system_ns = nil
16
15
  end
17
16
 
18
17
  # Находит, или создает аккаунт с указанным именем
19
18
  #
20
- def define(name, options)
21
- @accounts[name] = service.account([system_ns, name], options)
19
+ def define(name, details)
20
+ accounts[name] = service.account([system_ns, name], details: details)
22
21
  end
23
22
 
24
23
  def [](name)
25
- @account[name]
24
+ accounts[name]
26
25
  end
27
26
 
28
27
  def find(name)
@@ -22,9 +22,22 @@ module Openbill
22
22
  #
23
23
  # @param options - опции применяемые для создания аккаунта (см create_account)
24
24
  #
25
- def account(uri, options = {})
25
+ def account(uri, currency: nil, details: nil, meta: {})
26
26
  uri = prepare_uri uri
27
- get_account_by_uri(uri) || create_account(uri, options)
27
+ account = get_account_by_uri(uri)
28
+ currency ||= config.default_currency
29
+
30
+ if account.present?
31
+ fail "Account currency is wrong #{account.amount_currency} <> #{currency}" unless account.amount_currency == currency
32
+ # TODO update details and meta
33
+ return account
34
+ end
35
+
36
+ create_account(uri, currency: currency, details: details, meta: meta)
37
+ end
38
+
39
+ def get_account_by_id(id)
40
+ Openbill::Account[id: id]
28
41
  end
29
42
 
30
43
  def get_account_by_uri(uri)
@@ -43,13 +56,16 @@ module Openbill
43
56
  end
44
57
 
45
58
  # @param uri - уникальный uri транзакции
46
- def make_transaction(from_account_id:, to_account_id:, amount:, uri:, details: nil, meta: {})
47
- amount = prepare_amount amoount
59
+ def make_transaction(from:, to:, amount:, uri:, details: , meta: {})
60
+ account_from = get_account_id from
61
+ account_to = get_account_id to
62
+
63
+ amount = prepare_amount amount, account_from.amount_currency
48
64
  uri = prepare_uri uri
49
65
 
50
66
  Openbill::Transaction.create(
51
- from_account_id: from_account_id,
52
- to_account_id: to_account_id,
67
+ from_account_id: account_from.id,
68
+ to_account_id: account_to.id,
53
69
  amount_cents: amount.cents,
54
70
  amount_currency: amount.currency,
55
71
  uri: uri,
@@ -64,10 +80,30 @@ module Openbill
64
80
 
65
81
  delegate :logger, to: Rails
66
82
 
67
- def prepare_amount(amount)
68
- return amount if amount.is_a? Money
69
- return Money.new(amount, config.default_currency) if amount.is_a? Fixnum
70
- raise "amount parameter (#{amount}) must be a Money or a Fixnum"
83
+ def get_account_id(account)
84
+ case account
85
+ when Fixnum
86
+ get_account_by_uri(account)
87
+ when String, Array
88
+ get_account_by_uri(account)
89
+ when Openbill::Account
90
+ account
91
+ else
92
+ fail "Unknown type of account #{account}. Must be Fixnum, String, Array or Openbill::Account"
93
+ end
94
+ end
95
+
96
+ def prepare_amount(amount, account_currency)
97
+ if amount.is_a? Money
98
+ unless amount.currency == account_currency
99
+ fail "Amount currency is wrong #{amount.currency}<>#{account_currency}"
100
+ end
101
+ return amount
102
+ end
103
+
104
+ raise "amount parameter (#{amount}) must be a Money or a Fixnum" unless amount.is_a? Fixnum
105
+
106
+ Money.new(amount, account_currency)
71
107
  end
72
108
 
73
109
  def prepare_uri(uri)
@@ -1,3 +1,3 @@
1
1
  module Openbill
2
- VERSION = '0.1.7'
2
+ VERSION = '0.1.8'
3
3
  end
@@ -7,14 +7,15 @@ BEGIN
7
7
  IF current_query() like 'insert into OPENBILL_TRANSACTIONS%' THEN
8
8
  RETURN NEW;
9
9
  ELSE
10
- RAISE EXCEPTION 'Cannot update directly update amount_cents and timestamps of account';
10
+ RAISE EXCEPTION 'Cannot directly update amount_cents and timestamps of account with query (#%)', current_query();
11
11
  END IF;
12
12
  END
13
13
 
14
14
  $disable_update_account$ LANGUAGE plpgsql;
15
15
 
16
- CREATE TRIGGER disable_update_account
17
- BEFORE UPDATE ON OPENBILL_ACCOUNTS FOR EACH ROW EXECUTE PROCEDURE disable_update_account();
16
+ -- временно отключаем, так как она не правильно срабатывает на операциях типа INSERT INTO "openbill_transactions"
17
+ -- CREATE TRIGGER disable_update_account
18
+ -- BEFORE UPDATE ON OPENBILL_ACCOUNTS FOR EACH ROW EXECUTE PROCEDURE disable_update_account();
18
19
 
19
20
  CREATE OR REPLACE FUNCTION disable_delete_account() RETURNS TRIGGER AS $disable_delete_account$
20
21
  BEGIN
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: openbill-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.7
4
+ version: 0.1.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Danil Pismenny