openbill-ruby 0.1.7 → 0.1.8

Sign up to get free protection for your applications and to get access to all the features.
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