jera_payment 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (110) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/Rakefile +2 -0
  4. data/app/controllers/jera_payment/callbacks_controller.rb +22 -0
  5. data/app/controllers/jera_payment/jera_payment_controller.rb +5 -0
  6. data/config/locale/jera_payment.pt-BR.yml +243 -0
  7. data/config/routes.rb +5 -0
  8. data/lib/generators/active_record/jera_payment_generator.rb +59 -0
  9. data/lib/generators/active_record/templates/create_jera_payment_charges.rb +36 -0
  10. data/lib/generators/active_record/templates/create_jera_payment_credit_cards.rb +20 -0
  11. data/lib/generators/active_record/templates/create_jera_payment_customers.rb +22 -0
  12. data/lib/generators/active_record/templates/create_jera_payment_households.rb +18 -0
  13. data/lib/generators/active_record/templates/create_jera_payment_invoices.rb +42 -0
  14. data/lib/generators/active_record/templates/create_jera_payment_plans.rb +18 -0
  15. data/lib/generators/active_record/templates/create_jera_payment_sub_accounts.rb +39 -0
  16. data/lib/generators/active_record/templates/create_jera_payment_subscriptions.rb +26 -0
  17. data/lib/generators/active_record/templates/create_jera_payment_transfers.rb +15 -0
  18. data/lib/generators/active_record/templates/create_jera_payment_withdrawals.rb +15 -0
  19. data/lib/generators/jera_payment/install_generator.rb +68 -0
  20. data/lib/generators/jera_payment/jera_payment_generator.rb +46 -0
  21. data/lib/generators/jera_payment/templates/jera_payment.rb +9 -0
  22. data/lib/jera_payment.rb +39 -0
  23. data/lib/jera_payment/api/iugu/base.rb +55 -0
  24. data/lib/jera_payment/api/iugu/charge.rb +12 -0
  25. data/lib/jera_payment/api/iugu/customer.rb +37 -0
  26. data/lib/jera_payment/api/iugu/household.rb +13 -0
  27. data/lib/jera_payment/api/iugu/invoice.rb +55 -0
  28. data/lib/jera_payment/api/iugu/payment_method.rb +39 -0
  29. data/lib/jera_payment/api/iugu/payment_token.rb +12 -0
  30. data/lib/jera_payment/api/iugu/plan.rb +42 -0
  31. data/lib/jera_payment/api/iugu/sub_account.rb +40 -0
  32. data/lib/jera_payment/api/iugu/subscription.rb +72 -0
  33. data/lib/jera_payment/api/iugu/transfer.rb +24 -0
  34. data/lib/jera_payment/api/iugu/withdrawal.rb +26 -0
  35. data/lib/jera_payment/application.rb +79 -0
  36. data/lib/jera_payment/engine.rb +5 -0
  37. data/lib/jera_payment/models/charge.rb +30 -0
  38. data/lib/jera_payment/models/concerns/household_methods.rb +33 -0
  39. data/lib/jera_payment/models/concerns/invoice_methods.rb +42 -0
  40. data/lib/jera_payment/models/concerns/resource_callbacks.rb +40 -0
  41. data/lib/jera_payment/models/concerns/sub_account_methods.rb +18 -0
  42. data/lib/jera_payment/models/concerns/subscription_methods.rb +34 -0
  43. data/lib/jera_payment/models/concerns/transfer_methods.rb +18 -0
  44. data/lib/jera_payment/models/concerns/withdrawal_methods.rb +18 -0
  45. data/lib/jera_payment/models/credit_card.rb +16 -0
  46. data/lib/jera_payment/models/customer.rb +14 -0
  47. data/lib/jera_payment/models/household.rb +51 -0
  48. data/lib/jera_payment/models/invoice.rb +49 -0
  49. data/lib/jera_payment/models/plan.rb +16 -0
  50. data/lib/jera_payment/models/sub_account.rb +53 -0
  51. data/lib/jera_payment/models/subscription.rb +29 -0
  52. data/lib/jera_payment/models/transfer.rb +20 -0
  53. data/lib/jera_payment/models/withdrawal.rb +24 -0
  54. data/lib/jera_payment/parsers/iugu/charge_parser.rb +39 -0
  55. data/lib/jera_payment/parsers/iugu/credit_card_parser.rb +31 -0
  56. data/lib/jera_payment/parsers/iugu/household_parser.rb +16 -0
  57. data/lib/jera_payment/parsers/iugu/invoice_parser.rb +31 -0
  58. data/lib/jera_payment/parsers/iugu/sub_account_parser.rb +26 -0
  59. data/lib/jera_payment/parsers/iugu/transfer_parser.rb +15 -0
  60. data/lib/jera_payment/services/iugu/base.rb +23 -0
  61. data/lib/jera_payment/services/iugu/charges/create.rb +30 -0
  62. data/lib/jera_payment/services/iugu/credit_cards/create.rb +40 -0
  63. data/lib/jera_payment/services/iugu/credit_cards/destroy.rb +23 -0
  64. data/lib/jera_payment/services/iugu/credit_cards/update.rb +19 -0
  65. data/lib/jera_payment/services/iugu/customers/create.rb +27 -0
  66. data/lib/jera_payment/services/iugu/customers/destroy.rb +22 -0
  67. data/lib/jera_payment/services/iugu/customers/update.rb +30 -0
  68. data/lib/jera_payment/services/iugu/handle_callbacks/invoice/base.rb +24 -0
  69. data/lib/jera_payment/services/iugu/handle_callbacks/invoice/created.rb +8 -0
  70. data/lib/jera_payment/services/iugu/handle_callbacks/invoice/due.rb +8 -0
  71. data/lib/jera_payment/services/iugu/handle_callbacks/invoice/dunning_action.rb +8 -0
  72. data/lib/jera_payment/services/iugu/handle_callbacks/invoice/installment_released.rb +8 -0
  73. data/lib/jera_payment/services/iugu/handle_callbacks/invoice/payment_failed.rb +8 -0
  74. data/lib/jera_payment/services/iugu/handle_callbacks/invoice/refund.rb +8 -0
  75. data/lib/jera_payment/services/iugu/handle_callbacks/invoice/released.rb +8 -0
  76. data/lib/jera_payment/services/iugu/handle_callbacks/invoice/status_changed.rb +8 -0
  77. data/lib/jera_payment/services/iugu/handle_callbacks/referrals/bank_verification.rb +39 -0
  78. data/lib/jera_payment/services/iugu/handle_callbacks/referrals/base.rb +16 -0
  79. data/lib/jera_payment/services/iugu/handle_callbacks/referrals/verification.rb +24 -0
  80. data/lib/jera_payment/services/iugu/handle_callbacks/subscription/activated.rb +12 -0
  81. data/lib/jera_payment/services/iugu/handle_callbacks/subscription/base.rb +18 -0
  82. data/lib/jera_payment/services/iugu/handle_callbacks/subscription/changed.rb +12 -0
  83. data/lib/jera_payment/services/iugu/handle_callbacks/subscription/created.rb +12 -0
  84. data/lib/jera_payment/services/iugu/handle_callbacks/subscription/expired.rb +12 -0
  85. data/lib/jera_payment/services/iugu/handle_callbacks/subscription/renewed.rb +12 -0
  86. data/lib/jera_payment/services/iugu/handle_callbacks/subscription/suspended.rb +8 -0
  87. data/lib/jera_payment/services/iugu/handle_callbacks/withdraw_request/base.rb +16 -0
  88. data/lib/jera_payment/services/iugu/handle_callbacks/withdraw_request/created.rb +8 -0
  89. data/lib/jera_payment/services/iugu/handle_callbacks/withdraw_request/status_changed.rb +20 -0
  90. data/lib/jera_payment/services/iugu/households/create.rb +19 -0
  91. data/lib/jera_payment/services/iugu/invoices/create.rb +31 -0
  92. data/lib/jera_payment/services/iugu/invoices/duplicate.rb +54 -0
  93. data/lib/jera_payment/services/iugu/invoices/send_email.rb +18 -0
  94. data/lib/jera_payment/services/iugu/invoices/update_status.rb +31 -0
  95. data/lib/jera_payment/services/iugu/plans/create.rb +26 -0
  96. data/lib/jera_payment/services/iugu/plans/destroy.rb +17 -0
  97. data/lib/jera_payment/services/iugu/plans/update.rb +18 -0
  98. data/lib/jera_payment/services/iugu/sub_accounts/create.rb +26 -0
  99. data/lib/jera_payment/services/iugu/sub_accounts/update.rb +19 -0
  100. data/lib/jera_payment/services/iugu/sub_accounts/verify.rb +38 -0
  101. data/lib/jera_payment/services/iugu/subscriptions/change_plan.rb +41 -0
  102. data/lib/jera_payment/services/iugu/subscriptions/create.rb +29 -0
  103. data/lib/jera_payment/services/iugu/subscriptions/destroy.rb +26 -0
  104. data/lib/jera_payment/services/iugu/subscriptions/update.rb +18 -0
  105. data/lib/jera_payment/services/iugu/subscriptions/update_credits.rb +37 -0
  106. data/lib/jera_payment/services/iugu/subscriptions/update_situation.rb +36 -0
  107. data/lib/jera_payment/services/iugu/transfers/create.rb +28 -0
  108. data/lib/jera_payment/services/iugu/withdrawals/create.rb +27 -0
  109. data/lib/jera_payment/version.rb +3 -0
  110. metadata +208 -0
@@ -0,0 +1,20 @@
1
+ class JeraPayment::Transfer < ActiveRecord::Base
2
+ include JeraPayment::Concerns::ResourceCallbacks
3
+ include JeraPayment::Concerns::TransferMethods
4
+
5
+ attr_readonly :api_id, :sub_account_id, :receiver, :amount_cents, :amount_localized, :custom_variables
6
+
7
+ self.table_name = 'jera_payment_transfers'
8
+
9
+ belongs_to :sub_account, class_name: 'JeraPayment::SubAccount'
10
+ belongs_to :receiver, class_name: 'JeraPayment::SubAccount'
11
+
12
+ def custom_variables=(value)
13
+ write_attribute(:custom_variables, value&.to_json)
14
+ end
15
+
16
+ def custom_variables
17
+ ActiveSupport::JSON.decode(self[:custom_variables]).map{ |item| item.deep_symbolize_keys } if self[:custom_variables]
18
+ end
19
+
20
+ end
@@ -0,0 +1,24 @@
1
+ class JeraPayment::Withdrawal < ActiveRecord::Base
2
+ require 'enumerize'
3
+
4
+ include JeraPayment::Concerns::ResourceCallbacks
5
+ include JeraPayment::Concerns::WithdrawalMethods
6
+ extend Enumerize
7
+
8
+ attr_readonly :api_id, :sub_account, :amount, :custom_variables
9
+
10
+ self.table_name = 'jera_payment_withdrawals'
11
+
12
+ belongs_to :sub_account, class_name: 'JeraPayment::SubAccount'
13
+
14
+ enumerize :status, in: { pending: 0, processing: 1, rejected: 2, accepted: 3 }, predicates: true, scope: true, default: :pending
15
+
16
+ def custom_variables=(value)
17
+ write_attribute(:custom_variables, value&.to_json)
18
+ end
19
+
20
+ def custom_variables
21
+ ActiveSupport::JSON.decode(self[:custom_variables]).map{ |item| item.deep_symbolize_keys } if self[:custom_variables]
22
+ end
23
+
24
+ end
@@ -0,0 +1,39 @@
1
+ module JeraPayment
2
+ module Parsers
3
+ module Iugu
4
+ class ChargeParser
5
+ def self.charge_body(resource)
6
+ {
7
+ invoice_id: resource&.invoice&.api_id,
8
+ customer_payment_method_id: resource.customer_payment_method_api_id,
9
+ restrict_payment_method: resource.restrict_payment_method,
10
+ customer_id: resource.customer_api_id,
11
+ email: resource.email,
12
+ months: resource.months,
13
+ discount_cents: resource.discount_cents,
14
+ bank_slip_extra_days: resource.bank_slip_extra_days,
15
+ keep_dunning: resource.keep_dunning,
16
+ items: resource.items,
17
+ payer: {
18
+ cpf_cnpj: resource.cpf_cnpj,
19
+ name: resource.name,
20
+ phone_prefix: resource.phone_prefix,
21
+ phone: resource.phone,
22
+ email: resource.email,
23
+ address: {
24
+ zip_code: resource.zip_code,
25
+ street: resource.street,
26
+ number: resource.number,
27
+ neighborhood: resource.neighborhood,
28
+ city: resource.city,
29
+ state: resource.state,
30
+ country: resource.country,
31
+ complement: resource.complement
32
+ },
33
+ },
34
+ }
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,31 @@
1
+ module JeraPayment
2
+ module Parsers
3
+ module Iugu
4
+ class CreditCardParser
5
+ def self.parse_payment_token(resource)
6
+ {
7
+ account_id: resource&.customer&.sub_account&.present? ? resource&.customer&.sub_account&.account_id : JeraPayment.account_id,
8
+ method: 'credit_card',
9
+ test: resource.test,
10
+ data: {
11
+ number: resource.number,
12
+ verification_value: resource.cvv,
13
+ first_name: resource.first_name,
14
+ last_name: resource.last_name,
15
+ month: resource.month,
16
+ year: resource.year
17
+ }
18
+ }
19
+ end
20
+ def self.parse_payment_method(resource, credit_card_token_id)
21
+ {
22
+ token: credit_card_token_id,
23
+ description: resource.description,
24
+ set_as_default: true
25
+ }
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+
@@ -0,0 +1,16 @@
1
+ module JeraPayment
2
+ module Parsers
3
+ module Iugu
4
+ class HouseholdParser
5
+ def self.create_household(household)
6
+ {
7
+ agency: household.agency,
8
+ account: household.account,
9
+ account_type: household.account_type.checking? ? 'cc' : 'cp',
10
+ bank: household.bank_iugu_code
11
+ }
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,31 @@
1
+ module JeraPayment
2
+ module Parsers
3
+ module Iugu
4
+ class InvoiceParser
5
+ def self.invoice_creation(resource)
6
+ {
7
+ email: resource.email,
8
+ cc_emails: resource.cc_emails,
9
+ due_date: resource.due_date,
10
+ ensure_workday_due_date: resource.ensure_workday_due_date,
11
+ items: resource.items,
12
+ return_url: resource.return_url,
13
+ expired_url: resource.expired_url,
14
+ notification_url: resource.notification_url,
15
+ fines: resource.fines,
16
+ late_payment_fine: resource.late_payment_fine,
17
+ per_day_interest: resource.per_day_interest,
18
+ discount_cents: resource.discount_cents,
19
+ ignore_due_email: resource.ignore_due_email,
20
+ subscription_id: resource.subscription_api_id,
21
+ payable_with: resource.payable_with,
22
+ credits: resource.credits,
23
+ early_payment_discount: resource.early_payment_discount,
24
+ early_payment_discounts: resource.early_payment_discounts,
25
+ payer: resource.payer
26
+ }
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,26 @@
1
+ module JeraPayment
2
+ module Parsers
3
+ module Iugu
4
+ class SubAccountParser
5
+ def self.parse_account_configuration(resource)
6
+ {
7
+ comissions: resource.comissions,
8
+ auto_withdraw: resource.auto_withdraw,
9
+ fines: resource.fines,
10
+ per_day_interest: resource.per_day_interest,
11
+ late_payment_fine: resource.late_payment_fine,
12
+ auto_advance: resource.auto_advance,
13
+ auto_advance_type: resource.auto_advance_type,
14
+ auto_advance_option: resource.auto_advance_option,
15
+ bank_slip: resource.bank_slip,
16
+ credit_card: resource.credit_card,
17
+ payment_email_notification: resource.payment_email_notification,
18
+ payment_email_notification_receiver: resource.payment_email_notification_receiver,
19
+ early_payment_discount: resource.early_payment_discount,
20
+ early_payment_discounts: resource.early_payment_discounts
21
+ }
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,15 @@
1
+ module JeraPayment
2
+ module Parsers
3
+ module Iugu
4
+ class TransferParser
5
+ def self.parse_creation(resource)
6
+ {
7
+ receiver_id: resource.receiver.api_id,
8
+ amount_cents: resource.amount_cents,
9
+ custom_variables: resource.custom_variables
10
+ }
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,23 @@
1
+ module JeraPayment
2
+ module Services
3
+ module Iugu
4
+ class Base
5
+ def initialize(resource)
6
+ @resource = resource
7
+ @attributes = @resource.attributes
8
+ end
9
+
10
+ private
11
+ def add_error(errors)
12
+ if errors.is_a?(Hash)
13
+ errors.each{ |key, error| @resource.errors.messages.merge!( { "#{key}": error } ) }
14
+ elsif errors.is_a?(String)
15
+ @resource.errors.add(:base, errors)
16
+ elsif errors.is_a?(Array)
17
+ errors.each{ |error| @resource.errors.add(:base, error) }
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,30 @@
1
+ module JeraPayment
2
+ module Services
3
+ module Iugu
4
+ module Charges
5
+ class Create < JeraPayment::Services::Iugu::Base
6
+ def call
7
+ charge_body = JeraPayment::Parsers::Iugu::ChargeParser.charge_body(@resource)
8
+ charge_body.merge!({ method: @resource.method}) if @resource.method.present?
9
+ charge_body.merge!({ token: @resource.token}) if @resource.token.present?
10
+
11
+ iugu_charge = JeraPayment::Api::Iugu::Charge.create(charge_body, @resource&.sub_account&.api_token)
12
+
13
+ if iugu_charge[:errors].present?
14
+ add_error(iugu_charge[:errors])
15
+ else
16
+ set_api_attributes(iugu_charge)
17
+ end
18
+
19
+ @resource.errors.blank?
20
+ end
21
+
22
+ private
23
+ def set_api_attributes(attributes)
24
+ @resource.assign_attributes(attributes.slice(:url, :pdf, :identification))
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,40 @@
1
+ module JeraPayment
2
+ module Services
3
+ module Iugu
4
+ module CreditCards
5
+ class Create < JeraPayment::Services::Iugu::Base
6
+ def call
7
+ credit_card_token = create_credit_card_token
8
+
9
+ add_error(credit_card_token[:errors]) and return false if credit_card_token[:errors].present?
10
+
11
+ set_payment_token_attributes(credit_card_token)
12
+
13
+ link_credit_card_response = link_credit_card(credit_card_token[:id])
14
+
15
+ add_error(link_credit_card_response[:errors]) and return false if link_credit_card_response[:errors].present?
16
+
17
+ @resource.api_id = link_credit_card_response[:id]
18
+ end
19
+
20
+ private
21
+ def create_credit_card_token
22
+ JeraPayment::Api::Iugu::PaymentToken.create(JeraPayment::Parsers::Iugu::CreditCardParser.parse_payment_token(@resource),
23
+ @resource.customer&.sub_account&.api_token)
24
+ end
25
+
26
+ def set_payment_token_attributes(credit_card_token)
27
+ @resource.assign_attributes(brand: credit_card_token[:extra_info][:brand], number: credit_card_token[:extra_info][:display_number], cvv: nil)
28
+ end
29
+
30
+ def link_credit_card(credit_card_token_id)
31
+ eval("JeraPayment::Api::Iugu::PaymentMethod.create(@resource.customer.api_id,
32
+ JeraPayment::Parsers::Iugu::CreditCardParser.parse_payment_method(@resource, credit_card_token_id),
33
+ @resource.customer&.sub_account&.api_token)")
34
+ end
35
+
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,23 @@
1
+ module JeraPayment
2
+ module Services
3
+ module Iugu
4
+ module CreditCards
5
+ class Destroy < JeraPayment::Services::Iugu::Base
6
+ def call
7
+ iugu_delete = JeraPayment::Api::Iugu::PaymentMethod.destroy(@resource.customer.api_id, @resource.api_id,
8
+ @resource.customer&.sub_account&.api_token)
9
+
10
+ if iugu_delete[:errors].present?
11
+ add_error(iugu_delete[:errors])
12
+ else
13
+ @resource.destroy
14
+ end
15
+
16
+ @resource.errors.blank?
17
+ end
18
+
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,19 @@
1
+ module JeraPayment
2
+ module Services
3
+ module Iugu
4
+ module CreditCards
5
+ class Update < JeraPayment::Services::Iugu::Base
6
+ def call
7
+ iugu_credit_card = JeraPayment::Api::Iugu::PaymentMethod.update(@resource.customer.api_id, @resource.api_id, @resource.attributes,
8
+ @resource.customer&.sub_account&.api_token)
9
+
10
+ add_error(iugu_credit_card[:errors]) if iugu_credit_card[:errors].present?
11
+
12
+ @resource.errors.blank?
13
+ end
14
+
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,27 @@
1
+ module JeraPayment
2
+ module Services
3
+ module Iugu
4
+ module Customers
5
+ class Create < JeraPayment::Services::Iugu::Base
6
+ def call
7
+ iugu_customer = JeraPayment::Api::Iugu::Customer.create(@attributes, @resource&.sub_account&.api_token)
8
+
9
+ if iugu_customer[:errors].present?
10
+ add_error(iugu_customer[:errors])
11
+ else
12
+ set_api_attributes(iugu_customer)
13
+ end
14
+
15
+ @resource.errors.blank?
16
+ end
17
+
18
+ private
19
+ def set_api_attributes(attributes)
20
+ @resource.api_id = attributes[:id]
21
+ @resource.assign_attributes(attributes.slice(:email, :name, :phone, :cpf_cpnj, :city, :state, :street, :number, :zip_code))
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,22 @@
1
+ module JeraPayment
2
+ module Services
3
+ module Iugu
4
+ module Customers
5
+ class Destroy < JeraPayment::Services::Iugu::Base
6
+ def call
7
+ iugu_delete = JeraPayment::Api::Iugu::Customer.destroy(@resource.api_id, @resource&.sub_account&.api_token)
8
+
9
+ if iugu_delete[:errors].present?
10
+ add_error(iugu_delete[:errors])
11
+ else
12
+ @resource.destroy
13
+ end
14
+
15
+ @resource.errors.blank?
16
+ end
17
+
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,30 @@
1
+ module JeraPayment
2
+ module Services
3
+ module Iugu
4
+ module Customers
5
+ class Update < JeraPayment::Services::Iugu::Base
6
+ def call
7
+ iugu_customer = JeraPayment::Api::Iugu::Customer.update(
8
+ @resource.api_id,
9
+ @attributes,
10
+ @resource&.sub_account&.api_token
11
+ )
12
+
13
+ if iugu_customer[:errors].present?
14
+ add_error(iugu_customer[:errors])
15
+ else
16
+ set_api_attributes(iugu_customer)
17
+ end
18
+
19
+ @resource.errors.blank?
20
+ end
21
+
22
+ private
23
+ def set_api_attributes(attributes)
24
+ @resource.assign_attributes(attributes.slice(:email, :name, :phone, :cpf_cpnj))
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,24 @@
1
+ module Iugu
2
+ module HandleCallbacks
3
+ module Invoice
4
+ class Base
5
+ def initialize(params)
6
+ @params = params
7
+ end
8
+
9
+ def call
10
+ Rails.logger.info("======> #{@params}")
11
+
12
+ @invoice = ::JeraPayment::Invoice.find_by(api_id: @params["data"]["id"])
13
+
14
+ return 404 unless @invoice.present?
15
+
16
+ return 200 if @invoice.update(status: @params["data"]["status"])
17
+
18
+ return 500
19
+ end
20
+
21
+ end
22
+ end
23
+ end
24
+ end