yaka 0.0.1 → 1.0.0

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
  SHA256:
3
- metadata.gz: 36c144585b7419aad297e628678093039ee6b896bc48ba43c155928574988079
4
- data.tar.gz: b9088bdef6e24e0a2ab2c38784f722bf64c25d0d31d903c3c7bda6b468285cc6
3
+ metadata.gz: 974f7ba0a3bdd56aaddef4625ee7e57be4235fd09cb310b489b19c21bb59dd20
4
+ data.tar.gz: 2be2cf7054857aac7575a794ec8b99e4eb822f31362beca6c6e629775d5d38e7
5
5
  SHA512:
6
- metadata.gz: 8375c0979cc280b0d2b722846e9e1f2fc20918e7b8c341c9230c72bf5640fc790ed0b4b64acf64a14db0e74a3c107bb0293543a996ba9867da25faed6dc33b63
7
- data.tar.gz: 3097195b9e4054ef88c4a84c1fca9cce5132e2e7b732714d43e96173a1b1e3804fd58f15191cfe644e9c05691641aea2b87b9a309eaf318e335dd57b2189e0f3
6
+ metadata.gz: 861fd5d7f14efb25be050277d31a03c6b268f3cf66b79cf18a079bfb2eb56481b2b0497b71148a1cca5a928680730c0010ee7cba227483c50965d73bf367184a
7
+ data.tar.gz: b9f0ec56e9d7ff01168043f8301984a923ca5bf5e84fcedb10660fa571b1a9097ac77458eb6ec13388dc8ff3f2b78254849b38fbb4c6ce9091ee8a273bfbb7d5
data/CHANGELOG.md CHANGED
@@ -1,3 +1,8 @@
1
+ # 1.0.0
2
+ Breaking changes
3
+ * Simplified class model
4
+ * Added wrapper for card payments
5
+ * Added Check for Yandex IP(for callback)
1
6
 
2
7
  # 0.0.1
3
8
  Initial release
data/Gemfile.lock CHANGED
@@ -1,9 +1,9 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- yaka (0.0.1)
4
+ yaka (1.0.0)
5
5
  dry-configurable
6
- faker
6
+ dry-struct
7
7
  faraday
8
8
  oj
9
9
  pry
@@ -11,26 +11,54 @@ PATH
11
11
  GEM
12
12
  remote: https://rubygems.org/
13
13
  specs:
14
+ addressable (2.6.0)
15
+ public_suffix (>= 2.0.2, < 4.0)
14
16
  coderay (1.1.2)
15
17
  concurrent-ruby (1.1.5)
18
+ crack (0.4.3)
19
+ safe_yaml (~> 1.0.0)
16
20
  diff-lcs (1.3)
17
21
  dry-configurable (0.8.3)
18
22
  concurrent-ruby (~> 1.0)
19
23
  dry-core (~> 0.4, >= 0.4.7)
24
+ dry-container (0.7.0)
25
+ concurrent-ruby (~> 1.0)
26
+ dry-configurable (~> 0.1, >= 0.1.3)
20
27
  dry-core (0.4.7)
21
28
  concurrent-ruby (~> 1.0)
29
+ dry-equalizer (0.2.2)
30
+ dry-inflector (0.1.2)
31
+ dry-logic (1.0.0)
32
+ concurrent-ruby (~> 1.0)
33
+ dry-core (~> 0.2)
34
+ dry-equalizer (~> 0.2)
35
+ dry-struct (1.0.0)
36
+ dry-core (~> 0.4, >= 0.4.3)
37
+ dry-equalizer (~> 0.2)
38
+ dry-types (~> 1.0)
39
+ ice_nine (~> 0.11)
40
+ dry-types (1.0.0)
41
+ concurrent-ruby (~> 1.0)
42
+ dry-container (~> 0.3)
43
+ dry-core (~> 0.4, >= 0.4.4)
44
+ dry-equalizer (~> 0.2, >= 0.2.2)
45
+ dry-inflector (~> 0.1, >= 0.1.2)
46
+ dry-logic (~> 1.0)
22
47
  faker (1.9.3)
23
48
  i18n (>= 0.7)
24
49
  faraday (0.15.4)
25
50
  multipart-post (>= 1.2, < 3)
51
+ hashdiff (0.4.0)
26
52
  i18n (1.6.0)
27
53
  concurrent-ruby (~> 1.0)
54
+ ice_nine (0.11.2)
28
55
  method_source (0.9.2)
29
56
  multipart-post (2.1.1)
30
57
  oj (3.7.12)
31
58
  pry (0.12.2)
32
59
  coderay (~> 1.1.0)
33
60
  method_source (~> 0.9.0)
61
+ public_suffix (3.1.0)
34
62
  rake (10.5.0)
35
63
  rspec (3.8.0)
36
64
  rspec-core (~> 3.8.0)
@@ -45,14 +73,21 @@ GEM
45
73
  diff-lcs (>= 1.2.0, < 2.0)
46
74
  rspec-support (~> 3.8.0)
47
75
  rspec-support (3.8.0)
76
+ safe_yaml (1.0.5)
77
+ webmock (3.5.1)
78
+ addressable (>= 2.3.6)
79
+ crack (>= 0.3.2)
80
+ hashdiff
48
81
 
49
82
  PLATFORMS
50
83
  ruby
51
84
 
52
85
  DEPENDENCIES
53
86
  bundler (~> 1.17)
87
+ faker
54
88
  rake (~> 10.0)
55
89
  rspec (~> 3.0)
90
+ webmock
56
91
  yaka!
57
92
 
58
93
  BUNDLED WITH
data/README.md CHANGED
@@ -20,7 +20,61 @@ Or install it yourself as:
20
20
 
21
21
  ## Usage
22
22
 
23
- TODO: Write usage instructions here
23
+ 1. Attach gem for your project
24
+ 2. Create initializer for your project that will set `shop_id` and `private_key`.
25
+ ```ruby
26
+ # yaka.rb
27
+
28
+ Yaka.config.shop_id = ENV['YANDEX_SHOP_ID']
29
+ Yaka.config.private_key = ENV['YANDEX_PRIVATE_KEY']
30
+ ```
31
+ 3. Create payment at client side:
32
+ ```html
33
+ <script src="https://static.yandex.net/checkout/js/v1/"></script>
34
+ <script src="https://static.yandex.net/checkout/ui/v1/"></script>
35
+ <button class="btn" onclick="$checkout.open()">Pay 100</button>
36
+ <script>
37
+ const $checkout = YandexCheckoutUI(<%= Yaka.config.shop_id %>, {amount: 100});
38
+ $checkout.on('yc_success', function(response) {
39
+ $.ajax({
40
+ url: "/route_for_yandex_kassa",
41
+ type: 'POST',
42
+ dataType: "json",
43
+ contentType: "application/json; charset=utf-8",
44
+ data: JSON.stringify({
45
+ redirect_url: 'https://example.com',
46
+ token: response.data.response.paymentToken,
47
+ amount: 100,
48
+ json_data: {ololo: 4}
49
+ })
50
+ }).then(x => {
51
+ if (x.status === "succeeded") {
52
+ $checkout.chargeSuccessful();
53
+ } else {
54
+ if (x.status === "pending") {
55
+ window.location = x.confirmation.confirmation_url;
56
+ } else {
57
+ $checkout.chargeFailful();
58
+ }
59
+ }
60
+ }
61
+ );
62
+ });
63
+ ```
64
+ 4. Create payment at backend side:
65
+
66
+ Token is received from front-end(`token` from the code above).
67
+ ```ruby
68
+ payment = Yaka::Payment.new(amount: params[:amount], description: "Пополнение счета через карту", payment_token: params[:token], metadata: params[:json_data], client_ip: request.remote_ip, confirmation: { type: "redirect", return_url: params[:redirect_url]})
69
+ response = Yaka.publish_payment(payment, SecureRandom.uuid)
70
+ ```
71
+ If payment is successful - you will receive status `succeeded`.
72
+ If pending - in `confirmation.confirmation_url` you will have a 3ds confirmation URL. Use it!
73
+
74
+ 5. Then you will receive a callback about payment attempt(callback is configured at yandex site).
75
+
76
+ You can use `Yaka.yandex_ip?(ip)` to check remote ip of received request to avoid scams and cheatings.
77
+
24
78
 
25
79
  ## Development
26
80
 
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Yaka
4
+ module Types
5
+ include Dry::Types.module
6
+ end
7
+
8
+ class BasicStruct < Dry::Struct
9
+
10
+ def self.primitive
11
+ Types::Hash
12
+ end
13
+
14
+ transform_types do |type|
15
+ if type.default?
16
+ type.constructor do |value|
17
+ value.nil? ? Dry::Types::Undefined : value
18
+ end
19
+ else
20
+ type
21
+ end
22
+ end
23
+
24
+ transform_keys(&:to_sym)
25
+
26
+ def to_json(_args = {})
27
+ attributes.to_json
28
+ end
29
+ end
30
+ end
@@ -2,25 +2,34 @@
2
2
 
3
3
  module Yaka
4
4
  module ClassMethods
5
- HOST_URL = 'https://payment.yandex.net'
6
- PAYMENTS_URL = '/api/v3/payments'
7
-
8
- def publish_payment(payment, token = nil)
9
- raise Yaka::Error, 'Only payment should be sent to API' unless payment.is_a?(Yaka::Payment)
5
+ def publish_payment(data, token = nil)
6
+ payment = data.is_a?(Yaka::Payment) ? data : Yaka::Payment.new(data)
10
7
 
11
8
  data = payment.to_json
12
9
 
13
- conn = Faraday.new(url: HOST_URL) # create a new Connection with base URL
10
+ conn = Faraday.new(url: Yaka::HOST_URL) # create a new Connection with base URL
14
11
  conn.basic_auth(Yaka.config.shop_id, Yaka.config.private_key) # set the Authentication header
15
12
 
16
13
  @result = conn.post do |req|
17
- req.url PAYMENTS_URL
14
+ req.url Yaka::PAYMENTS_URL
18
15
  req.headers['Content-Type'] = 'application/json'
19
16
  req.headers['Idempotence-Key'] = token
20
17
  req.body = data
21
18
  end
22
19
 
23
- JSON.parse(@result.body)
20
+ Yaka::PaymentResponse.new(JSON.parse(@result.body))
21
+ end
22
+
23
+ def yandex_ip?(ip)
24
+ addr = IPAddr.new(ip)
25
+
26
+ if addr.ipv4?
27
+ Yaka::ALLOWED_YANDEX_V4_MASKS.any? { |mask, length| addr.mask(length) == mask }
28
+ elsif addr.ipv6?
29
+ Yaka::ALLOWED_YANDEX_V6_MASKS.any? { |mask, length| addr.mask(length) == mask }
30
+ else
31
+ raise Yaka::Error, 'Invalid request ip address'
32
+ end
24
33
  end
25
34
  end
26
35
  end
data/lib/yaka/payment.rb CHANGED
@@ -1,23 +1,36 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Yaka
4
- class Payment < SerializableObject
5
-
6
- REQUIRED_FIELDS = %i[amount confirmation capture].freeze
7
- OPTIONAL_FIELDS = %i[description receipt payment_token metadata].freeze
8
-
9
- attr_accessor(*REQUIRED_FIELDS)
10
- attr_accessor(*OPTIONAL_FIELDS)
11
-
12
- def initialize(amount:, client_ip: nil, description: nil, metadata: nil, receipt: nil, payment_token: nil, confirmation: { type: "redirect", return_url: Yaka.config.redirect_url}, capture: true)
13
- @amount = amount
14
- @receipt = receipt
15
- @description = description
16
- @payment_token = payment_token
17
- @confirmation = confirmation
18
- @capture = capture
19
- @metadata = metadata
20
- @client_ip = client_ip
4
+ class Payment < BasicStruct
5
+ # This class is used for sending payments to Yandex Kassa.
6
+ attribute :amount, BasicStruct do
7
+ attribute :value, Types::String
8
+ attribute :currency, Types::String
9
+ end
10
+ attribute :confirmation, BasicStruct do
11
+ attribute :type, Types::String.default('redirect')
12
+ attribute :return_url, Types::Strict::String
13
+ end
14
+ attribute :capture, Types::Bool.default(true)
15
+ attribute :description, Types::Strict::String
16
+ attribute :receipt, BasicStruct.meta(omittable: true) do
17
+ attribute :items, Types::Array.of(BasicStruct).default([]) do
18
+ attribute :description, Types::String
19
+ attribute :amount, BasicStruct.meta(omittable: true) do
20
+ attribute :value, Types::String.meta(omittable: true)
21
+ attribute :currency, Types::String.meta(omittable: true)
22
+ end
23
+ attribute :quantity, Types::Integer
24
+ attribute :vat_code, Types::String
25
+ attribute :payment_mode, Types::Strict::String.meta(omittable: true)
26
+ attribute :payment_subject, Types::String.meta(omittable: true)
27
+ end
28
+ attribute :phone, Types::String.meta(omittable: true)
29
+ attribute :email, Types::String.meta(omittable: true)
30
+ attribute :tax_system_code, Types::String.meta(omittable: true)
21
31
  end
32
+ attribute :payment_token, Types::String
33
+ attribute :metadata, Types::Hash
34
+ attribute :client_ip, Types::String
22
35
  end
23
36
  end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Yaka
4
+ class PaymentResponse < BasicStruct
5
+ # This class is used to wrap response from Yandex Kassa about necessary actions to complete/process if it's required
6
+
7
+ attribute :id, Types::String
8
+ attribute :status, Types::String
9
+ attribute :paid, Types::Bool
10
+ attribute :amount, BasicStruct do
11
+ attribute :value, Types::String
12
+ attribute :currency, Types::String
13
+ end
14
+ attribute :authorization_details, BasicStruct do
15
+ attribute :rrn, Types::String
16
+ attribute :auth_code, Types::String
17
+ end
18
+ attribute :captured_at, Types::DateTime
19
+ attribute :created_at, Types::DateTime
20
+ attribute :description, Types::String
21
+ attribute :metadata, Types::Hash
22
+ attribute :payment_method, BasicStruct do
23
+ attribute :id, Types::String
24
+ attribute :type, Types::String
25
+ attribute :saved, Types::String
26
+ attribute :title, Types::String
27
+ attribute :card, BasicStruct do
28
+ attribute :first6, Types::String
29
+ attribute :last4, Types::String
30
+ attribute :expiry_month, Types::String
31
+ attribute :expiry_year, Types::String
32
+ attribute :card_type, Types::String
33
+ end
34
+ end
35
+ attribute :recipient, BasicStruct do
36
+ attribute :account_id, Types::String
37
+ attribute :gateway_id, Types::String
38
+ end
39
+ attribute :refundable, Types::Bool
40
+ attribute :refunded_amount, BasicStruct do
41
+ attribute :value, Types::String
42
+ attribute :currency, Types::String
43
+ end
44
+ attribute :test, Types::Bool
45
+ end
46
+ end
data/lib/yaka/version.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Yaka
2
- VERSION = "0.0.1"
4
+ VERSION = '1.0.0'
3
5
  end
data/lib/yaka.rb CHANGED
@@ -1,16 +1,35 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'dry-configurable'
4
+ require 'dry-struct'
5
+ require 'ipaddr'
6
+ require 'date'
7
+
4
8
  require 'yaka/version'
5
- require 'yaka/serializable_object'
6
- require 'yaka/amount'
9
+ require 'yaka/basic_struct'
7
10
  require 'yaka/class_methods'
8
11
  require 'yaka/payment'
9
- require 'yaka/receipt'
10
- require 'yaka/receipt_item'
12
+ require 'yaka/payment_response'
13
+
11
14
  require 'faraday'
12
15
 
13
16
  module Yaka
17
+ HOST_URL = 'https://payment.yandex.net'
18
+ PAYMENTS_URL = '/api/v3/payments'
19
+ ALLOWED_YANDEX_V4_MASKS = {
20
+ '185.71.76.0' => 27,
21
+ '185.71.77.0' => 27,
22
+ '77.75.153.0' => 25,
23
+ '77.75.154.128' => 25
24
+ }.freeze
25
+
26
+ ALLOWED_YANDEX_V6_MASKS = {
27
+ '2a02:5180:0:1509::' => 64,
28
+ '2a02:5180:0:2655::' => 64,
29
+ '2a02:5180:0:1533::' => 64,
30
+ '2a02:5180:0:2669::' => 64
31
+ }.freeze
32
+
14
33
  class Error < StandardError; end
15
34
 
16
35
  extend Dry::Configurable
@@ -19,7 +38,5 @@ module Yaka
19
38
 
20
39
  setting :private_key, 'ololo'
21
40
 
22
- setting :redirect_url, 'example.com/callbacks'
23
-
24
41
  extend ClassMethods
25
42
  end
data/yaka.gemspec CHANGED
@@ -39,9 +39,11 @@ Gem::Specification.new do |spec|
39
39
  spec.add_development_dependency "bundler", "~> 1.17"
40
40
  spec.add_development_dependency "rake", "~> 10.0"
41
41
  spec.add_development_dependency "rspec", "~> 3.0"
42
+ spec.add_development_dependency "webmock"
42
43
  spec.add_dependency "pry"
43
44
  spec.add_dependency 'dry-configurable'
45
+ spec.add_dependency 'dry-struct'
44
46
  spec.add_dependency 'oj'
45
47
  spec.add_dependency 'faraday'
46
- spec.add_dependency 'faker'
48
+ spec.add_development_dependency 'faker'
47
49
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: yaka
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Igor Pavlov
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-06-03 00:00:00.000000000 Z
11
+ date: 2019-06-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: webmock
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: pry
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -80,6 +94,20 @@ dependencies:
80
94
  - - ">="
81
95
  - !ruby/object:Gem::Version
82
96
  version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: dry-struct
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
83
111
  - !ruby/object:Gem::Dependency
84
112
  name: oj
85
113
  requirement: !ruby/object:Gem::Requirement
@@ -115,7 +143,7 @@ dependencies:
115
143
  - - ">="
116
144
  - !ruby/object:Gem::Version
117
145
  version: '0'
118
- type: :runtime
146
+ type: :development
119
147
  prerelease: false
120
148
  version_requirements: !ruby/object:Gem::Requirement
121
149
  requirements:
@@ -143,12 +171,10 @@ files:
143
171
  - bin/console
144
172
  - bin/setup
145
173
  - lib/yaka.rb
146
- - lib/yaka/amount.rb
174
+ - lib/yaka/basic_struct.rb
147
175
  - lib/yaka/class_methods.rb
148
176
  - lib/yaka/payment.rb
149
- - lib/yaka/receipt.rb
150
- - lib/yaka/receipt_item.rb
151
- - lib/yaka/serializable_object.rb
177
+ - lib/yaka/payment_response.rb
152
178
  - lib/yaka/version.rb
153
179
  - yaka.gemspec
154
180
  homepage: https://github.com/beastia/yaka
data/lib/yaka/amount.rb DELETED
@@ -1,15 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Yaka
4
- class Amount < SerializableObject
5
- REQUIRED_FIELDS = %i[value currency].freeze
6
- OPTIONAL_FIELDS = %i[].freeze
7
-
8
- attr_accessor(*REQUIRED_FIELDS)
9
-
10
- def initialize(value:, currency: 'RUB')
11
- @value = value
12
- @currency = currency
13
- end
14
- end
15
- end
data/lib/yaka/receipt.rb DELETED
@@ -1,27 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Yaka
4
- class Receipt < SerializableObject
5
- # Tax system codes
6
- # 1: Общая система налогообложения
7
- # 2: Упрощенная (УСН, доходы)
8
- # 3: Упрощенная (УСН, доходы минус расходы)
9
- # 4: Единый налог на вмененный доход (ЕНВД)
10
- # 5: Единый сельскохозяйственный налог (ЕСН)
11
- # 6: Патентная система налогообложения
12
-
13
- REQUIRED_FIELDS = %i[items].freeze
14
- OPTIONAL_FIELDS = %i[phone email tax_system_code].freeze
15
-
16
- attr_accessor(*REQUIRED_FIELDS)
17
- attr_accessor(*OPTIONAL_FIELDS)
18
-
19
- def initialize(items: [], phone: nil, email: nil, tax_system_code: nil)
20
- @items = items
21
- @phone = phone
22
- @email = email
23
- @tax_system_code = tax_system_code
24
- raise Yaka::Error, 'Invalid input parameters: phone or email should be present' if @phone.nil? && @email.nil?
25
- end
26
- end
27
- end
@@ -1,66 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Yaka
4
- class ReceiptItem < SerializableObject
5
- # Vat codes
6
- #
7
- # 1: Без НДС
8
- # 2: НДС по ставке 0%
9
- # 3: НДС по ставке 10%
10
- # 4: НДС чека по ставке 20%
11
- # 5: НДС чека по расчетной ставке 10/110
12
- # 6: НДС чека по расчетной ставке 20/120
13
- #
14
- # Payment subjects
15
- # commodity: Товар
16
- # excise: Подакцизный товар
17
- # job: Работа
18
- # service: Услуга
19
- # gambling_bet: Ставка в азартной игре
20
- # gambling_prize: Выигрыш в азартной игре
21
- # lottery: Лотерейный билет
22
- # lottery_prize: Выигрыш в лотерею
23
- # intellectual_activity: Результаты интеллектуальной деятельности
24
- # payment: Платеж
25
- # agent_commission: Агентское вознаграждение
26
- # property_right: Имущественные права
27
- # non_operating_gain: Внереализационный доход
28
- # insurance_premium: Страховой сбор
29
- # sales_tax: Торговый сбор
30
- # resort_fee: Курортный сбор
31
- # composite: Несколько вариантов
32
- # another: Другое
33
- #
34
- # Payment mode
35
- # full_prepayment: Полная предоплата
36
- # partial_prepayment: Частичная предоплата
37
- # advance: Аванс
38
- # full_payment: Полный расчет
39
- # partial_payment: Частичный расчет и кредит
40
- # credit: Кредит
41
- # credit_payment: Выплата по кредиту
42
- REQUIRED_FIELDS = %i[description amount quantity vat_code].freeze
43
- OPTIONAL_FIELDS = %i[payment_subject payment_mode].freeze
44
-
45
- attr_accessor(*REQUIRED_FIELDS)
46
- attr_accessor(*OPTIONAL_FIELDS)
47
-
48
- def initialize(description:, amount:, quantity:, vat_code:, payment_subject: nil, payment_mode: nil)
49
- @description = description
50
- @amount = amount
51
- @quantity = quantity
52
- @vat_code = vat_code
53
- @payment_subject = payment_subject
54
- @payment_mode = payment_mode
55
- end
56
-
57
- def to_json(*_args)
58
- {
59
- description: @description,
60
- amount: @amount,
61
- quantity: @quantity,
62
- vat_code: @vat_code
63
- }.to_json
64
- end
65
- end
66
- end
@@ -1,19 +0,0 @@
1
- module Yaka
2
- class SerializableObject
3
- def to_json(*_args)
4
- required_fields = self.class.const_get(:REQUIRED_FIELDS)
5
- initial = required_fields.each_with_object({}) do |field_name, result|
6
- result[field_name] = public_send(field_name)
7
- end
8
-
9
- optional_fields = self.class.const_get(:OPTIONAL_FIELDS)
10
-
11
- optional_fields.each do |field_name|
12
- value = public_send(field_name)
13
- initial[field_name] = value unless value.nil?
14
- end
15
-
16
- initial.to_json
17
- end
18
- end
19
- end