genesis_ruby 0.1.6 → 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.
Files changed (64) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +26 -0
  3. data/Gemfile.lock +42 -38
  4. data/README.md +305 -3
  5. data/VERSION +1 -1
  6. data/lib/genesis_ruby/api/constants/transactions/parameters/mobile/apple_pay/payment_subtypes.rb +29 -0
  7. data/lib/genesis_ruby/api/constants/transactions/parameters/mobile/google_pay/payment_subtypes.rb +29 -0
  8. data/lib/genesis_ruby/api/constants/transactions/parameters/mpi_protocol_sub_versions.rb +43 -0
  9. data/lib/genesis_ruby/api/constants/transactions/parameters/online_banking/bank_code_currencies.rb +128 -0
  10. data/lib/genesis_ruby/api/constants/transactions/parameters/online_banking/bank_codes.rb +600 -0
  11. data/lib/genesis_ruby/api/constants/transactions/parameters/online_banking/payment_types.rb +36 -0
  12. data/lib/genesis_ruby/api/constants/transactions/parameters/travel_data/ancillary_charges_types.rb +43 -0
  13. data/lib/genesis_ruby/api/constants/transactions.rb +1 -5
  14. data/lib/genesis_ruby/api/mixins/requests/attribute_validation.rb +138 -4
  15. data/lib/genesis_ruby/api/mixins/requests/birth_date_attributes.rb +22 -0
  16. data/lib/genesis_ruby/api/mixins/requests/customer_address/customer_info_attributes.rb +1 -1
  17. data/lib/genesis_ruby/api/mixins/requests/financial/cards/credit_card_attributes.rb +7 -0
  18. data/lib/genesis_ruby/api/mixins/requests/financial/cards/mpi_attributes.rb +14 -4
  19. data/lib/genesis_ruby/api/mixins/requests/financial/cards/recurring/managed_recurring_attributes.rb +23 -20
  20. data/lib/genesis_ruby/api/mixins/requests/financial/cards/recurring/managed_recurring_indian_card_attributes.rb +19 -39
  21. data/lib/genesis_ruby/api/mixins/requests/financial/cards/recurring/recurring_type_attributes.rb +15 -9
  22. data/lib/genesis_ruby/api/mixins/requests/financial/cards/tokenization_attributes.rb +9 -0
  23. data/lib/genesis_ruby/api/mixins/requests/financial/mobile/apple_pay_token_attributes.rb +51 -0
  24. data/lib/genesis_ruby/api/mixins/requests/financial/mobile/google_pay_token_attributes.rb +50 -0
  25. data/lib/genesis_ruby/api/mixins/requests/financial/online_banking_payments/virtual_payment_address_attributes.rb +27 -0
  26. data/lib/genesis_ruby/api/mixins/requests/financial/threeds/version2/browser.rb +11 -22
  27. data/lib/genesis_ruby/api/mixins/requests/financial/threeds/version2/card_holder_account.rb +81 -49
  28. data/lib/genesis_ruby/api/mixins/requests/financial/threeds/version2/common_attributes.rb +23 -0
  29. data/lib/genesis_ruby/api/mixins/requests/financial/threeds/version2/control.rb +13 -26
  30. data/lib/genesis_ruby/api/mixins/requests/financial/threeds/version2/merchant_risk.rb +21 -58
  31. data/lib/genesis_ruby/api/mixins/requests/financial/threeds/version2/purchase.rb +8 -11
  32. data/lib/genesis_ruby/api/mixins/requests/financial/threeds/version2/sdk.rb +10 -10
  33. data/lib/genesis_ruby/api/mixins/requests/financial/threeds/version2/wpf_attributes.rb +9 -0
  34. data/lib/genesis_ruby/api/mixins/requests/financial/travel_data/airline_itinerary_attributes.rb +166 -0
  35. data/lib/genesis_ruby/api/mixins/requests/financial/travel_data/car_rental_attributes.rb +119 -0
  36. data/lib/genesis_ruby/api/mixins/requests/financial/travel_data/hotel_rental_attributes.rb +77 -0
  37. data/lib/genesis_ruby/api/mixins/requests/financial/travel_data/reference_ticket_attributes.rb +75 -0
  38. data/lib/genesis_ruby/api/mixins/requests/financial/travel_data/travel_attributes.rb +34 -0
  39. data/lib/genesis_ruby/api/request.rb +4 -2
  40. data/lib/genesis_ruby/api/requests/base/financials/credit_card.rb +6 -4
  41. data/lib/genesis_ruby/api/requests/base/reference.rb +3 -2
  42. data/lib/genesis_ruby/api/requests/financial/capture.rb +3 -1
  43. data/lib/genesis_ruby/api/requests/financial/cards/authorize.rb +13 -3
  44. data/lib/genesis_ruby/api/requests/financial/cards/authorize3d.rb +22 -11
  45. data/lib/genesis_ruby/api/requests/financial/cards/sale.rb +13 -3
  46. data/lib/genesis_ruby/api/requests/financial/cards/sale3d.rb +22 -11
  47. data/lib/genesis_ruby/api/requests/financial/cards/threeds/v2/method_continue.rb +2 -2
  48. data/lib/genesis_ruby/api/requests/financial/mobile/apple_pay.rb +91 -0
  49. data/lib/genesis_ruby/api/requests/financial/mobile/google_pay.rb +108 -0
  50. data/lib/genesis_ruby/api/requests/financial/online_banking_payments/online_banking/pay_in.rb +157 -0
  51. data/lib/genesis_ruby/api/requests/financial/void.rb +2 -2
  52. data/lib/genesis_ruby/api/requests/non_financial/reconcile/date_range.rb +2 -2
  53. data/lib/genesis_ruby/api/requests/wpf/create.rb +11 -15
  54. data/lib/genesis_ruby/api/requests/wpf/reconcile.rb +2 -2
  55. data/lib/genesis_ruby/builders/xml.rb +6 -0
  56. data/lib/genesis_ruby/utils/common.rb +26 -0
  57. data/lib/genesis_ruby/utils/transactions/financial_types.rb +1 -1
  58. data/lib/genesis_ruby/utils/transactions/references/refundable_types.rb +1 -1
  59. data/lib/genesis_ruby/utils/transactions/travel_data/airline_itinerary/base.rb +33 -0
  60. data/lib/genesis_ruby/utils/transactions/travel_data/airline_itinerary/leg.rb +97 -0
  61. data/lib/genesis_ruby/utils/transactions/travel_data/airline_itinerary/tax.rb +42 -0
  62. data/lib/genesis_ruby/utils/transactions/wpf_types.rb +1 -1
  63. data/lib/genesis_ruby/version.rb +1 -1
  64. metadata +24 -2
@@ -0,0 +1,119 @@
1
+ module GenesisRuby
2
+ module Api
3
+ module Mixins
4
+ module Requests
5
+ module Financial
6
+ module TravelData
7
+ # Car Rental attributes
8
+ module CarRentalAttributes
9
+
10
+ attr_reader :travel_car_rental_purchase_identifier, :travel_car_rental_class_id,
11
+ :travel_car_rental_renter_name, :travel_car_rental_return_city,
12
+ :travel_car_rental_return_state, :travel_car_rental_return_country,
13
+ :travel_car_rental_renter_return_location_id, :travel_car_rental_customer_code,
14
+ :travel_car_rental_extra_charges, :travel_car_rental_no_show_indicator
15
+
16
+ # Travel Data Purchase Identifier
17
+ def travel_car_rental_purchase_identifier=(value)
18
+ limited_string attribute: __method__, value: value, max: 9
19
+ end
20
+
21
+ # Travel Data Class id
22
+ def travel_car_rental_class_id=(value)
23
+ allowed_options attribute: __method__,
24
+ value: value.to_i,
25
+ allow_empty: true,
26
+ allowed: [*1..30].push(9999)
27
+ end
28
+
29
+ # Travel Data PickUp Date
30
+ def travel_car_rental_pickup_date
31
+ @travel_car_rental_pickup_date&.strftime GenesisRuby::Api::Constants::DateTimeFormats::
32
+ DD_MM_YYYY_L_HYPHENS
33
+ end
34
+
35
+ # Travel Data PickUp Date
36
+ def travel_car_rental_pickup_date=(value)
37
+ parse_date attribute: __method__, value: value, allow_empty: true
38
+ end
39
+
40
+ # Travel Data Renter Name
41
+ def travel_car_rental_renter_name=(value)
42
+ limited_string attribute: __method__, value: value, max: 20
43
+ end
44
+
45
+ # Travel Data Return City
46
+ def travel_car_rental_return_city=(value)
47
+ limited_string attribute: __method__, value: value, max: 18
48
+ end
49
+
50
+ # Travel Data Return State
51
+ def travel_car_rental_return_state=(value)
52
+ limited_string attribute: __method__, value: value, max: 3
53
+ end
54
+
55
+ # Travel Data Return Country
56
+ def travel_car_rental_return_country=(value)
57
+ limited_string attribute: __method__, value: value, max: 3
58
+ end
59
+
60
+ # Travel Data Return Date
61
+ def travel_car_rental_return_date
62
+ @travel_car_rental_return_date&.strftime GenesisRuby::Api::Constants::DateTimeFormats::
63
+ DD_MM_YYYY_L_HYPHENS
64
+ end
65
+
66
+ # Travel Data Return Date
67
+ def travel_car_rental_return_date=(value)
68
+ parse_date attribute: __method__, value: value, allow_empty: true
69
+ end
70
+
71
+ # Travel Data Renter Return Location id
72
+ def travel_car_rental_renter_return_location_id=(value)
73
+ limited_string attribute: __method__, value: value, max: 10
74
+ end
75
+
76
+ # Travel Data Customer Code
77
+ def travel_car_rental_customer_code=(value)
78
+ limited_string attribute: __method__, value: value, max: 17
79
+ end
80
+
81
+ # Travel Data Extra Charges
82
+ def travel_car_rental_extra_charges=(value)
83
+ allowed_options attribute: __method__, value: value.to_i, allow_empty: true, allowed: [*1..5]
84
+ end
85
+
86
+ # Travel Data No Show Indicator
87
+ def travel_car_rental_no_show_indicator=(value)
88
+ allowed_options attribute: __method__, value: value.to_i, allow_empty: true, allowed: [0, 1]
89
+ end
90
+
91
+ protected
92
+
93
+ # Travel Data Car Rental Attributes Structure
94
+ def car_rental_attributes_structure # rubocop:disable Metrics/MethodLength
95
+ {
96
+ car_rental: {
97
+ purchase_identifier: travel_car_rental_purchase_identifier,
98
+ class_id: travel_car_rental_class_id,
99
+ pickup_date: travel_car_rental_pickup_date,
100
+ renter_name: travel_car_rental_renter_name,
101
+ return_city: travel_car_rental_return_city,
102
+ return_state: travel_car_rental_return_state,
103
+ return_country: travel_car_rental_return_country,
104
+ return_date: travel_car_rental_return_date,
105
+ renter_return_location_id: travel_car_rental_renter_return_location_id,
106
+ customer_code: travel_car_rental_customer_code,
107
+ extra_charges: travel_car_rental_extra_charges,
108
+ no_show_indicator: travel_car_rental_no_show_indicator
109
+ }
110
+ }
111
+ end
112
+
113
+ end
114
+ end
115
+ end
116
+ end
117
+ end
118
+ end
119
+ end
@@ -0,0 +1,77 @@
1
+ module GenesisRuby
2
+ module Api
3
+ module Mixins
4
+ module Requests
5
+ module Financial
6
+ module TravelData
7
+ # Hotel Rental Attributes
8
+ module HotelRentalAttributes
9
+
10
+ attr_reader :travel_hotel_rental_purchase_identifier, :travel_hotel_rental_customer_code,
11
+ :travel_hotel_rental_extra_charges, :travel_hotel_rental_no_show_indicator
12
+
13
+ # Hotel Rental Purchase Identifier
14
+ def travel_hotel_rental_purchase_identifier=(value)
15
+ limited_string attribute: __method__, value: value, max: 10
16
+ end
17
+
18
+ # Travel Data Arrival date
19
+ def travel_hotel_rental_arrival_date
20
+ @travel_hotel_rental_arrival_date&.strftime GenesisRuby::Api::Constants::DateTimeFormats::
21
+ DD_MM_YYYY_L_HYPHENS
22
+ end
23
+
24
+ # Travel Data Arrival Date
25
+ def travel_hotel_rental_arrival_date=(value)
26
+ parse_date attribute: __method__, value: value, allow_empty: true
27
+ end
28
+
29
+ # Travel Data Departure date
30
+ def travel_hotel_rental_departure_date
31
+ @travel_hotel_rental_departure_date&.strftime GenesisRuby::Api::Constants::DateTimeFormats::
32
+ DD_MM_YYYY_L_HYPHENS
33
+ end
34
+
35
+ # Travel Data Departure Date
36
+ def travel_hotel_rental_departure_date=(value)
37
+ parse_date attribute: __method__, value: value, allow_empty: true
38
+ end
39
+
40
+ # Travel Data Customer Code
41
+ def travel_hotel_rental_customer_code=(value)
42
+ limited_string attribute: __method__, value: value, max: 17
43
+ end
44
+
45
+ # Travel Data Extra Charges
46
+ def travel_hotel_rental_extra_charges=(value)
47
+ allowed_options attribute: __method__, value: value, allow_empty: true, allowed: [*2..7]
48
+ end
49
+
50
+ # Travel Data No Show Indicator
51
+ def travel_hotel_rental_no_show_indicator=(value)
52
+ allowed_options attribute: __method__, value: value, allow_empty: true, allowed: [0, 1]
53
+ end
54
+
55
+ protected
56
+
57
+ # Hotel Rental attributes structure
58
+ def hotel_rental_attributes_structure
59
+ {
60
+ hotel_rental: {
61
+ purchase_identifier: travel_hotel_rental_purchase_identifier,
62
+ arrival_date: travel_hotel_rental_arrival_date,
63
+ departure_date: travel_hotel_rental_departure_date,
64
+ customer_code: travel_hotel_rental_customer_code,
65
+ extra_charges: travel_hotel_rental_extra_charges,
66
+ no_show_indicator: travel_hotel_rental_no_show_indicator
67
+ }
68
+ }
69
+ end
70
+
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,75 @@
1
+ require 'genesis_ruby/api/constants/transactions/parameters/travel_data/ancillary_charges_types'
2
+
3
+ module GenesisRuby
4
+ module Api
5
+ module Mixins
6
+ module Requests
7
+ module Financial
8
+ module TravelData
9
+ # Ancillary Charges
10
+ module ReferenceTicketAttributes
11
+
12
+ attr_reader :travel_ac_ticket_reference_id, :travel_ac_type, :travel_ac_ticket_document_number,
13
+ :travel_ac_issued_with_ticket_number, :travel_ac_sub_type
14
+
15
+ # Ancillary Charges ticker reference id
16
+ def travel_ac_ticket_reference_id=(value)
17
+ limited_string attribute: __method__, value: value, max: 32
18
+ end
19
+
20
+ # Ancillary Charges Type
21
+ def travel_ac_type=(value)
22
+ allowed_options attribute: __method__,
23
+ value: value.to_s.upcase,
24
+ allowed: GenesisRuby::Api::Constants::Transactions::Parameters::TravelData::
25
+ AncillaryChargesTypes.all,
26
+ allow_empty: true
27
+ end
28
+
29
+ # Ancillary Charges Ticket document number
30
+ def travel_ac_ticket_document_number=(value)
31
+ limited_string attribute: __method__, value: value, max: 15
32
+ end
33
+
34
+ # Ancillary Charges issued with ticket number
35
+ def travel_ac_issued_with_ticket_number=(value)
36
+ limited_string attribute: __method__, value: value, max: 15
37
+ end
38
+
39
+ # Ancillary Charges Sub Type
40
+ def travel_ac_sub_type=(value)
41
+ allowed_options attribute: __method__,
42
+ value: value.to_s.upcase,
43
+ allowed: GenesisRuby::Api::Constants::Transactions::Parameters::TravelData::
44
+ AncillaryChargesTypes.all,
45
+ allow_empty: true
46
+ end
47
+
48
+ protected
49
+
50
+ # Reference Ticket attributes structure
51
+ def reference_ticket_attributes_structure
52
+ {
53
+ ticket_reference_id: travel_ac_ticket_reference_id,
54
+ ticket_document_number: travel_ac_ticket_document_number,
55
+ issued_with_ticket_number: travel_ac_issued_with_ticket_number
56
+ }
57
+ end
58
+
59
+ # Ancillary Charges attributes structure
60
+ def charges_attributes_structure
61
+ {
62
+ charge: {
63
+ type: travel_ac_type,
64
+ sub_type: travel_ac_sub_type
65
+ }
66
+ }
67
+ end
68
+
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,34 @@
1
+ module GenesisRuby
2
+ module Api
3
+ module Mixins
4
+ module Requests
5
+ module Financial
6
+ module TravelData
7
+ # Travel Data Attributes
8
+ module TravelAttributes
9
+
10
+ include TravelData::AirlineItineraryAttributes
11
+ include TravelData::CarRentalAttributes
12
+ include TravelData::HotelRentalAttributes
13
+ include TravelData::ReferenceTicketAttributes
14
+
15
+ protected
16
+
17
+ # Travel Data attributes structure
18
+ def travel_data_attributes_structure
19
+ {
20
+ ticket: airline_attributes_structure.merge(reference_ticket_attributes_structure),
21
+ legs: legs_structure,
22
+ taxes: taxes_structure,
23
+ rentals: car_rental_attributes_structure.merge(hotel_rental_attributes_structure),
24
+ charges: charges_attributes_structure
25
+ }
26
+ end
27
+
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -27,7 +27,7 @@ module GenesisRuby
27
27
  @api_config = GenesisRuby::Utils::Options::ApiConfig.new
28
28
 
29
29
  init_configuration
30
- init_required_fields
30
+ init_field_validations
31
31
  end
32
32
 
33
33
  # Generate the Request Document based on the builder_interface
@@ -50,7 +50,7 @@ module GenesisRuby
50
50
  attr_accessor :tree_structure
51
51
 
52
52
  # Required fields for the request
53
- def init_required_fields; end
53
+ def init_field_validations; end
54
54
 
55
55
  # Request Configuration
56
56
  def init_configuration; end
@@ -146,6 +146,8 @@ module GenesisRuby
146
146
 
147
147
  # Transform amount to minor currency format
148
148
  def transform_amount(amount, currency)
149
+ return amount if amount.nil? || !GenesisRuby::Api::Constants::Currencies::Iso4217.valid?(currency)
150
+
149
151
  GenesisRuby::Utils::MoneyFormat.amount_to_exponent amount, currency
150
152
  end
151
153
 
@@ -11,12 +11,14 @@ module GenesisRuby
11
11
  include Mixins::Requests::Financial::Cards::TokenizationAttributes
12
12
  include Mixins::Requests::Financial::PaymentAttributes
13
13
 
14
- def init_required_fields
15
- self.required_fields = %i[transaction_id amount currency]
16
- end
17
-
18
14
  protected
19
15
 
16
+ # Request Field validations
17
+ def init_field_validations
18
+ required_fields.push *%i[transaction_id amount currency]
19
+ field_values.merge! currency: Api::Constants::Currencies::Iso4217.all.map(&:upcase)
20
+ end
21
+
20
22
  # Credit Card attributes
21
23
  def payment_transaction_structure
22
24
  payment_attributes_structure.merge(
@@ -10,8 +10,9 @@ module GenesisRuby
10
10
 
11
11
  protected
12
12
 
13
- def init_required_fields
14
- self.required_fields = %i[transaction_id reference_id amount currency]
13
+ def init_field_validations
14
+ required_fields.push *%i[transaction_id reference_id amount currency]
15
+ field_values.merge! currency: Api::Constants::Currencies::Iso4217.all.map(&:upcase)
15
16
  end
16
17
 
17
18
  # Reference transaction request structure
@@ -6,6 +6,7 @@ module GenesisRuby
6
6
  class Capture < Requests::Base::Reference
7
7
 
8
8
  include Mixins::Requests::Financial::Business::BusinessAttributes
9
+ include Mixins::Requests::Financial::TravelData::TravelAttributes
9
10
 
10
11
  protected
11
12
 
@@ -18,7 +19,8 @@ module GenesisRuby
18
19
  def reference_transaction_structure
19
20
  {
20
21
  reference_id: reference_id,
21
- business_attributes: business_attributes_structure
22
+ business_attributes: business_attributes_structure,
23
+ travel: travel_data_attributes_structure
22
24
  }
23
25
  end
24
26
 
@@ -23,6 +23,7 @@ module GenesisRuby
23
23
  include Mixins::Requests::Financial::ReferenceAttributes
24
24
  include Mixins::Requests::Financial::RiskAttributes
25
25
  include Mixins::Requests::Financial::ScaAttributes
26
+ include Mixins::Requests::Financial::TravelData::TravelAttributes
26
27
 
27
28
  protected
28
29
 
@@ -31,8 +32,16 @@ module GenesisRuby
31
32
  GenesisRuby::Api::Constants::Transactions::AUTHORIZE
32
33
  end
33
34
 
34
- def init_required_fields
35
- return super unless recurring_type == Constants::Transactions::Parameters::Recurring::Types::SUBSEQUENT
35
+ # Request Field validations
36
+ def init_field_validations
37
+ super
38
+
39
+ field_values.merge! managed_recurring_field_values, recurring_type_field_values_validation_structure
40
+
41
+ field_value_dependencies.merge! required_tokenization_fields_conditional, required_cc_fields_conditional,
42
+ required_recurring_managed_type_field_conditional
43
+
44
+ return unless recurring_type == Constants::Transactions::Parameters::Recurring::Types::SUBSEQUENT
36
45
 
37
46
  self.required_fields = recurring_type_subsequent_required_request_attributes
38
47
  end
@@ -55,7 +64,8 @@ module GenesisRuby
55
64
  recurring_type: recurring_type,
56
65
  recurring_category: recurring_category,
57
66
  sca_params: sca_attributes_structure,
58
- managed_recurring: managed_recurring_attributes_structure
67
+ managed_recurring: managed_recurring_attributes_structure,
68
+ travel: travel_data_attributes_structure
59
69
  )
60
70
  end
61
71
 
@@ -26,16 +26,7 @@ module GenesisRuby
26
26
  include Mixins::Requests::Financial::RiskAttributes
27
27
  include Mixins::Requests::Financial::ScaAttributes
28
28
  include Mixins::Requests::Financial::Threeds::Version2::CommonAttributes
29
-
30
- # Specifies the recurring type of transaction
31
- def recurring_type=(value)
32
- allowed_values = [
33
- GenesisRuby::Api::Constants::Transactions::Parameters::Recurring::Types::INITIAL,
34
- GenesisRuby::Api::Constants::Transactions::Parameters::Recurring::Types::MANAGED
35
- ]
36
-
37
- allowed_options attribute: __method__, allowed: allowed_values, value: value, allow_empty: true
38
- end
29
+ include Mixins::Requests::Financial::TravelData::TravelAttributes
39
30
 
40
31
  protected
41
32
 
@@ -44,6 +35,25 @@ module GenesisRuby
44
35
  GenesisRuby::Api::Constants::Transactions::AUTHORIZE_3D
45
36
  end
46
37
 
38
+ # Request Field validations
39
+ def init_field_validations
40
+ super
41
+
42
+ field_values.merge! managed_recurring_field_values,
43
+ recurring_type_initial_field_values_validation_structure, threeds_field_validations
44
+
45
+ field_value_dependencies.merge! required_tokenization_fields_conditional, required_cc_fields_conditional,
46
+ required_recurring_managed_type_field_conditional,
47
+ threeds_field_conditional_validations
48
+ end
49
+
50
+ # Special validations upon document building
51
+ def check_requirements
52
+ validate_threeds_card_holder_dates
53
+
54
+ super
55
+ end
56
+
47
57
  # Authorize 3D transaction request parameters
48
58
  def payment_transaction_structure # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
49
59
  super.merge(
@@ -67,7 +77,8 @@ module GenesisRuby
67
77
  recurring_category: recurring_category,
68
78
  sca_params: sca_attributes_structure,
69
79
  threeds_v2_params: threeds_v2_common_attributes_structure,
70
- managed_recurring: managed_recurring_attributes_structure
80
+ managed_recurring: managed_recurring_attributes_structure,
81
+ travel: travel_data_attributes_structure
71
82
  )
72
83
  end
73
84
 
@@ -22,6 +22,7 @@ module GenesisRuby
22
22
  include Mixins::Requests::Financial::ReferenceAttributes
23
23
  include Mixins::Requests::Financial::RiskAttributes
24
24
  include Mixins::Requests::Financial::ScaAttributes
25
+ include Mixins::Requests::Financial::TravelData::TravelAttributes
25
26
 
26
27
  protected
27
28
 
@@ -30,8 +31,16 @@ module GenesisRuby
30
31
  GenesisRuby::Api::Constants::Transactions::SALE
31
32
  end
32
33
 
33
- def init_required_fields
34
- return super unless recurring_type == Constants::Transactions::Parameters::Recurring::Types::SUBSEQUENT
34
+ # Request Field validations
35
+ def init_field_validations
36
+ super
37
+
38
+ field_values.merge! managed_recurring_field_values, recurring_type_field_values_validation_structure
39
+
40
+ field_value_dependencies.merge! required_tokenization_fields_conditional, required_cc_fields_conditional,
41
+ required_recurring_managed_type_field_conditional
42
+
43
+ return unless recurring_type == Constants::Transactions::Parameters::Recurring::Types::SUBSEQUENT
35
44
 
36
45
  self.required_fields = recurring_type_subsequent_required_request_attributes
37
46
  end
@@ -54,7 +63,8 @@ module GenesisRuby
54
63
  recurring_type: recurring_type,
55
64
  recurring_category: recurring_category,
56
65
  sca_params: sca_attributes_structure,
57
- managed_recurring: managed_recurring_attributes_structure
66
+ managed_recurring: managed_recurring_attributes_structure,
67
+ travel: travel_data_attributes_structure
58
68
  )
59
69
  end
60
70
 
@@ -25,16 +25,7 @@ module GenesisRuby
25
25
  include Mixins::Requests::Financial::RiskAttributes
26
26
  include Mixins::Requests::Financial::ScaAttributes
27
27
  include Mixins::Requests::Financial::Threeds::Version2::CommonAttributes
28
-
29
- # Specifies the recurring type of transaction
30
- def recurring_type=(value)
31
- allowed_values = [
32
- GenesisRuby::Api::Constants::Transactions::Parameters::Recurring::Types::INITIAL,
33
- GenesisRuby::Api::Constants::Transactions::Parameters::Recurring::Types::MANAGED
34
- ]
35
-
36
- allowed_options attribute: __method__, allowed: allowed_values, value: value, allow_empty: true
37
- end
28
+ include Mixins::Requests::Financial::TravelData::TravelAttributes
38
29
 
39
30
  protected
40
31
 
@@ -43,6 +34,25 @@ module GenesisRuby
43
34
  GenesisRuby::Api::Constants::Transactions::SALE_3D
44
35
  end
45
36
 
37
+ # Request Field validations
38
+ def init_field_validations
39
+ super
40
+
41
+ field_values.merge! managed_recurring_field_values,
42
+ recurring_type_initial_field_values_validation_structure, threeds_field_validations
43
+
44
+ field_value_dependencies.merge! required_tokenization_fields_conditional, required_cc_fields_conditional,
45
+ required_recurring_managed_type_field_conditional,
46
+ threeds_field_conditional_validations
47
+ end
48
+
49
+ # Special validations upon document building
50
+ def check_requirements
51
+ validate_threeds_card_holder_dates
52
+
53
+ super
54
+ end
55
+
46
56
  # Sale 3D transaction request parameters
47
57
  def payment_transaction_structure # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
48
58
  super.merge(
@@ -66,7 +76,8 @@ module GenesisRuby
66
76
  recurring_category: recurring_category,
67
77
  sca_params: sca_attributes_structure,
68
78
  threeds_v2_params: threeds_v2_common_attributes_structure,
69
- managed_recurring: managed_recurring_attributes_structure
79
+ managed_recurring: managed_recurring_attributes_structure,
80
+ travel: travel_data_attributes_structure
70
81
  )
71
82
  end
72
83
 
@@ -104,8 +104,8 @@ module GenesisRuby
104
104
  init_api_gateway_configuration request_path: 'threeds/threeds_method/:unique_id', include_token: false
105
105
  end
106
106
 
107
- def init_required_fields
108
- self.required_fields = %i[amount transaction_timestamp]
107
+ def init_field_validations
108
+ required_fields.push *%i[amount transaction_timestamp]
109
109
  end
110
110
 
111
111
  # Build correct endpoint url during runtime
@@ -0,0 +1,91 @@
1
+ require 'genesis_ruby/api/constants/transactions/parameters/mobile/apple_pay/payment_subtypes'
2
+
3
+ module GenesisRuby
4
+ module Api
5
+ module Requests
6
+ module Financial
7
+ module Mobile
8
+ # Apple Pay transaction request
9
+ class ApplePay < Requests::Base::Financial
10
+
11
+ include Mixins::Requests::AddressInfoAttributes
12
+ include Mixins::Requests::BirthDateAttributes
13
+ include Mixins::Requests::DocumentAttributes
14
+ include Mixins::Requests::Financial::Business::BusinessAttributes
15
+ include Mixins::Requests::Financial::CryptoAttributes
16
+ include Mixins::Requests::Financial::DynamicDescriptorAttributes
17
+ include Mixins::Requests::Financial::Mobile::ApplePayTokenAttributes
18
+ include Mixins::Requests::Financial::PaymentAttributes
19
+
20
+ attr_accessor :payment_subtype
21
+
22
+ # Define Payment Token from a JSON string
23
+ def json_token=(value)
24
+ json_object = Utils::Common.parse_json_string value
25
+
26
+ map_apple_pay_token_attributes json_object
27
+ end
28
+
29
+ protected
30
+
31
+ # Apple Pay transaction request type
32
+ def transaction_type
33
+ Api::Constants::Transactions::APPLE_PAY
34
+ end
35
+
36
+ def init_field_validations
37
+ required_fields.push *%i[transaction_id payment_subtype token_version token_data token_signature
38
+ token_ephemeral_public_key token_public_key_hash token_transaction_id token_display_name token_network
39
+ token_type token_transaction_identifier amount currency]
40
+
41
+ field_values.merge! currency: Api::Constants::Currencies::Iso4217.all.map(&:upcase),
42
+ payment_subtype: Api::Constants::Transactions::Parameters::Mobile::ApplePay::
43
+ PaymentSubtypes.all
44
+ end
45
+
46
+ # Apple Pay payment transaction structure
47
+ def payment_transaction_structure # rubocop:disable Metrics/MethodLength
48
+ payment_attributes_structure.merge(
49
+ {
50
+ payment_subtype: payment_subtype,
51
+ payment_token: payment_token_structure,
52
+ customer_email: customer_email,
53
+ customer_phone: customer_phone,
54
+ birth_date: birth_date,
55
+ billing_address: billing_address_parameters_structure,
56
+ shipping_address: shipping_address_parameters_structure,
57
+ document_id: document_id,
58
+ crypto: crypto,
59
+ business_attributes: business_attributes_structure,
60
+ dynamic_descriptor_params: dynamic_descriptor_structure
61
+ }
62
+ )
63
+ end
64
+
65
+ private
66
+
67
+ # Map the Apple Pay Token attributes from the given Hash object
68
+ def map_apple_pay_token_attributes(json_object)
69
+ return nil unless json_object.is_a? Hash
70
+
71
+ json_object.each do |token_key, token_value|
72
+ if token_value.is_a? Hash
73
+ map_apple_pay_token_attributes token_value
74
+
75
+ next
76
+ end
77
+
78
+ token_method = "token_#{GenesisRuby::Utils::Common.camel_to_snake_case(token_key)}="
79
+
80
+ __send__ token_method, token_value if respond_to? token_method
81
+ end
82
+
83
+ nil
84
+ end
85
+
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end
91
+ end