openbill-ruby 0.1.8 → 0.1.9
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/lib/openbill/registry.rb +5 -5
- data/lib/openbill/service.rb +25 -33
- data/lib/openbill/version.rb +1 -1
- data/sql/0_db.sql +5 -4
- 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: e426ce6297d3b3dc2b8d70e86fd26ca82e28ae51
|
4
|
+
data.tar.gz: 6688d100ecfac9d3a86718595185a1e0674f065c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 31f1bfbf3c1ebf97dba300457baffce74ec3657b4cc1634222569ffa476255f2922d0ac9c7189ff97ad3cc89e766a06e512cc8aef4af7bfb56c279bef4b0ff54
|
7
|
+
data.tar.gz: d9d9e8bc664a21e19836658176b1ab536780695b3c684f7ab2f77bc385b2f594ffc3edfa20d8516bc164a05b43d646fa2453020eb56ebadcabd646f5d0e6d329
|
data/lib/openbill/registry.rb
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
module Openbill
|
2
2
|
class Registry
|
3
|
-
|
3
|
+
DEFAULT_CATEGORY = :common
|
4
4
|
AccountNotFound = Class.new StandardError
|
5
5
|
|
6
6
|
attr_reader :accounts
|
7
7
|
|
8
|
-
def initialize(service,
|
8
|
+
def initialize(service, category = DEFAULT_CATEGORY)
|
9
9
|
fail("Must be a Openbill::Service #{service}") unless service.is_a? Openbill::Service
|
10
10
|
@service = service
|
11
|
-
@
|
11
|
+
@category = category
|
12
12
|
@accounts = {}
|
13
13
|
yield self
|
14
14
|
@accounts.freeze
|
@@ -17,7 +17,7 @@ module Openbill
|
|
17
17
|
# Находит, или создает аккаунт с указанным именем
|
18
18
|
#
|
19
19
|
def define(name, details)
|
20
|
-
accounts[name] = service.account([
|
20
|
+
accounts[name] = service.account([category, name], details: details)
|
21
21
|
end
|
22
22
|
|
23
23
|
def [](name)
|
@@ -30,6 +30,6 @@ module Openbill
|
|
30
30
|
|
31
31
|
private
|
32
32
|
|
33
|
-
attr_reader :service, :
|
33
|
+
attr_reader :service, :category
|
34
34
|
end
|
35
35
|
end
|
data/lib/openbill/service.rb
CHANGED
@@ -1,30 +1,20 @@
|
|
1
1
|
require 'sequel'
|
2
|
-
require 'uri'
|
3
2
|
require 'money'
|
4
3
|
|
5
4
|
module Openbill
|
6
5
|
|
7
6
|
class Service
|
8
|
-
PROTO = 'obp'.freeze
|
9
|
-
HOST = 'local'.freeze
|
10
|
-
|
11
7
|
def initialize(config)
|
12
8
|
@config = config
|
13
9
|
@database = Openbill::Database.new config.database
|
14
10
|
end
|
15
11
|
|
16
|
-
|
17
|
-
"#{PROTO}://#{HOST}/#{resource}/#{id}"
|
18
|
-
end
|
19
|
-
|
20
|
-
# @param uri - uri аккаунта в виде строки: "odp://local/resource/id"
|
21
|
-
# или в виде массива [resource, id]
|
12
|
+
# @param ident - ident аккаунта в виде: [:category, :key]
|
22
13
|
#
|
23
14
|
# @param options - опции применяемые для создания аккаунта (см create_account)
|
24
15
|
#
|
25
|
-
def account(
|
26
|
-
|
27
|
-
account = get_account_by_uri(uri)
|
16
|
+
def account(ident, currency: nil, details: nil, meta: {})
|
17
|
+
account = get_account(ident)
|
28
18
|
currency ||= config.default_currency
|
29
19
|
|
30
20
|
if account.present?
|
@@ -33,42 +23,44 @@ module Openbill
|
|
33
23
|
return account
|
34
24
|
end
|
35
25
|
|
36
|
-
create_account(
|
26
|
+
create_account(ident, currency: currency, details: details, meta: meta)
|
37
27
|
end
|
38
28
|
|
39
29
|
def get_account_by_id(id)
|
40
30
|
Openbill::Account[id: id]
|
41
31
|
end
|
42
32
|
|
43
|
-
|
44
|
-
|
45
|
-
|
33
|
+
# @param ident - ident аккаунта в виде: [:category, :key]
|
34
|
+
def get_account(ident)
|
35
|
+
category, key = prepare_ident ident
|
36
|
+
Openbill::Account[category: category, key: key]
|
46
37
|
end
|
47
38
|
|
48
|
-
def create_account(
|
49
|
-
|
39
|
+
def create_account(ident, currency: nil, details: nil, meta: {})
|
40
|
+
category, key = prepare_ident ident
|
50
41
|
Openbill::Account.create(
|
51
|
-
|
42
|
+
category: category,
|
43
|
+
key: key,
|
52
44
|
details: details,
|
53
45
|
meta: meta,
|
54
46
|
amount_currency: currency || config.default_currency
|
55
47
|
)
|
56
48
|
end
|
57
49
|
|
58
|
-
# @param
|
59
|
-
|
50
|
+
# @param key - уникальный текстовый ключ транзакции
|
51
|
+
#
|
52
|
+
def make_transaction(from:, to:, amount:, key:, details: , meta: {})
|
60
53
|
account_from = get_account_id from
|
61
54
|
account_to = get_account_id to
|
62
55
|
|
63
56
|
amount = prepare_amount amount, account_from.amount_currency
|
64
|
-
uri = prepare_uri uri
|
65
57
|
|
66
58
|
Openbill::Transaction.create(
|
67
59
|
from_account_id: account_from.id,
|
68
60
|
to_account_id: account_to.id,
|
69
61
|
amount_cents: amount.cents,
|
70
62
|
amount_currency: amount.currency,
|
71
|
-
|
63
|
+
key: key,
|
72
64
|
details: details,
|
73
65
|
meta: meta
|
74
66
|
)
|
@@ -83,16 +75,21 @@ module Openbill
|
|
83
75
|
def get_account_id(account)
|
84
76
|
case account
|
85
77
|
when Fixnum
|
86
|
-
|
87
|
-
when
|
88
|
-
|
78
|
+
get_account_by_id(account)
|
79
|
+
when Array
|
80
|
+
get_account(account)
|
89
81
|
when Openbill::Account
|
90
82
|
account
|
91
83
|
else
|
92
|
-
fail "Unknown type of account #{account}. Must be Fixnum,
|
84
|
+
fail "Unknown type of account #{account}. Must be Fixnum, Array or Openbill::Account"
|
93
85
|
end
|
94
86
|
end
|
95
87
|
|
88
|
+
def prepare_ident(ident)
|
89
|
+
fail "ident has wrong size" unless ident.count == 2
|
90
|
+
return ident.first.to_s, ident.second.to_s
|
91
|
+
end
|
92
|
+
|
96
93
|
def prepare_amount(amount, account_currency)
|
97
94
|
if amount.is_a? Money
|
98
95
|
unless amount.currency == account_currency
|
@@ -105,10 +102,5 @@ module Openbill
|
|
105
102
|
|
106
103
|
Money.new(amount, account_currency)
|
107
104
|
end
|
108
|
-
|
109
|
-
def prepare_uri(uri)
|
110
|
-
uri = generate_uri uri.first, uri.second if uri.is_a? Array
|
111
|
-
URI(uri).to_s # Парсим и валидируем заодно
|
112
|
-
end
|
113
105
|
end
|
114
106
|
end
|
data/lib/openbill/version.rb
CHANGED
data/sql/0_db.sql
CHANGED
@@ -5,7 +5,8 @@ CREATE EXTENSION IF NOT EXISTS hstore WITH SCHEMA public;
|
|
5
5
|
|
6
6
|
CREATE TABLE OPENBILL_ACCOUNTS (
|
7
7
|
id BIGSERIAL PRIMARY KEY,
|
8
|
-
|
8
|
+
category character varying(256) not null default 'common',
|
9
|
+
key character varying(256) not null,
|
9
10
|
amount_cents numeric not null default 0,
|
10
11
|
amount_currency char(3) not null default 'USD',
|
11
12
|
details text,
|
@@ -18,7 +19,7 @@ CREATE TABLE OPENBILL_ACCOUNTS (
|
|
18
19
|
);
|
19
20
|
|
20
21
|
CREATE UNIQUE INDEX index_accounts_on_id ON OPENBILL_ACCOUNTS USING btree (id);
|
21
|
-
CREATE UNIQUE INDEX
|
22
|
+
CREATE UNIQUE INDEX index_accounts_on_key ON OPENBILL_ACCOUNTS USING btree (category, key);
|
22
23
|
CREATE INDEX index_accounts_on_meta ON OPENBILL_ACCOUNTS USING gin (meta);
|
23
24
|
CREATE INDEX index_accounts_on_created_at ON OPENBILL_ACCOUNTS USING btree (created_at);
|
24
25
|
|
@@ -30,14 +31,14 @@ CREATE TABLE OPENBILL_TRANSACTIONS (
|
|
30
31
|
to_account_id integer not null,
|
31
32
|
amount_cents numeric not null CONSTRAINT positive CHECK (amount_cents>0),
|
32
33
|
amount_currency char(3) not null,
|
33
|
-
|
34
|
+
key character varying(256) not null,
|
34
35
|
details text not null,
|
35
36
|
meta hstore not null default ''::hstore,
|
36
37
|
foreign key (from_account_id) REFERENCES OPENBILL_ACCOUNTS (id) ON DELETE RESTRICT ON UPDATE RESTRICT,
|
37
38
|
foreign key (to_account_id) REFERENCES OPENBILL_ACCOUNTS (id)
|
38
39
|
);
|
39
40
|
|
40
|
-
CREATE UNIQUE INDEX
|
41
|
+
CREATE UNIQUE INDEX index_transactions_on_key ON OPENBILL_TRANSACTIONS USING btree (key);
|
41
42
|
CREATE INDEX index_transactions_on_meta ON OPENBILL_TRANSACTIONS USING gin (meta);
|
42
43
|
CREATE INDEX index_transactions_on_created_at ON OPENBILL_TRANSACTIONS USING btree (created_at);
|
43
44
|
|