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 +4 -4
- data/README.md +31 -20
- data/lib/openbill/registry.rb +5 -6
- data/lib/openbill/service.rb +46 -10
- data/lib/openbill/version.rb +1 -1
- data/sql/1_trigger_disable_delete_account.sql +4 -3
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a75471ea494c07660f3d35539b4ea8cb609dc5cb
|
4
|
+
data.tar.gz: 64f789bd6587756d24d06eb07fd3953d58a82238
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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.
|
29
|
-
|
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
|
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
|
-
|
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
|
-
|
67
|
+
#### 1. Зачисление оплаты на счет клиента.
|
68
|
+
|
69
|
+
Оплата проводится транзакцией между системным счетом `:payments` и индивидуальным счетом клиента.
|
64
70
|
|
65
71
|
```ruby
|
66
72
|
Openbill.current.make_transaction(
|
67
73
|
// Счет списания
|
68
|
-
|
74
|
+
from: SystemRegistry[:payments],
|
69
75
|
|
70
76
|
// Счет зачисление
|
71
|
-
|
77
|
+
to: user.opennill_account,
|
72
78
|
|
73
|
-
// Уникальный идентификатор
|
74
|
-
|
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: {
|
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).
|
data/lib/openbill/registry.rb
CHANGED
@@ -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,
|
21
|
-
|
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
|
-
|
24
|
+
accounts[name]
|
26
25
|
end
|
27
26
|
|
28
27
|
def find(name)
|
data/lib/openbill/service.rb
CHANGED
@@ -22,9 +22,22 @@ module Openbill
|
|
22
22
|
#
|
23
23
|
# @param options - опции применяемые для создания аккаунта (см create_account)
|
24
24
|
#
|
25
|
-
def account(uri,
|
25
|
+
def account(uri, currency: nil, details: nil, meta: {})
|
26
26
|
uri = prepare_uri uri
|
27
|
-
|
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(
|
47
|
-
|
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:
|
52
|
-
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
|
68
|
-
|
69
|
-
|
70
|
-
|
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)
|
data/lib/openbill/version.rb
CHANGED
@@ -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
|
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
|
-
|
17
|
-
|
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
|