lib/genesis_ruby/api/requests/financial/cards/authorize3d.rb



# frozen_string_literal: true

require 'genesis_ruby/api/requests/base/financials/credit_card'

module GenesisRuby
  module Api
    module Requests
      module Financial
        module Cards
          # Authorize 3D transactions, credit card based, can be synchronous or asynchronous based on the workflow and
          # the additional parameters for card holder authentication
          class Authorize3d < Requests::Base::Financials::CreditCard

            include Mixins::Requests::AddressInfoAttributes
            include Mixins::Requests::DigitalAssetTypeAttributes
            include Mixins::Requests::DocumentAttributes
            include Mixins::Requests::Financial::AsyncAttributes
            include Mixins::Requests::Financial::Business::BusinessAttributes
            include Mixins::Requests::Financial::Cards::FxRateAttributes
            include Mixins::Requests::Financial::Cards::InstallmentAttributes
            include Mixins::Requests::Financial::Cards::MpiAttributes
            include Mixins::Requests::Financial::Cards::Recurring::ManagedRecurringAttributes
            include Mixins::Requests::Financial::Cards::Recurring::RecurringCategoryAttributes
            include Mixins::Requests::Financial::Cards::Recurring::RecurringTypeAttributes
            include Mixins::Requests::Financial::CryptoAttributes
            include Mixins::Requests::Financial::DynamicDescriptorAttributes
            include Mixins::Requests::Financial::FundingAttributes
            include Mixins::Requests::Financial::GamingAttributes
            include Mixins::Requests::Financial::MotoAttributes
            include Mixins::Requests::Financial::NotificationAttributes
            include Mixins::Requests::Financial::PreauthorizationAttributes
            include Mixins::Requests::Financial::RiskAttributes
            include Mixins::Requests::Financial::ScaAttributes
            include Mixins::Requests::Financial::Threeds::Version2::CommonAttributes
            include Mixins::Requests::Financial::TravelData::TravelAttributes

            protected

            # Authorize 3D Transaction Type
            def transaction_type
              GenesisRuby::Api::Constants::Transactions::AUTHORIZE_3D
            end

            # Request Field validations
            def init_field_validations
              super

              field_values.merge! managed_recurring_field_values,
                                  recurring_type_initial_field_values_validation_structure, threeds_field_validations,
                                  funding_attributes_field_validations

              field_value_dependencies.merge! required_tokenization_fields_conditional, required_cc_fields_conditional,
                                              required_recurring_managed_type_field_conditional,
                                              threeds_field_conditional_validations, mpi_attributes_field_dependencies
            end

            # Special validations upon document building
            def check_requirements
              validate_threeds_card_holder_dates
              # MPI Directory Server ID is optional when Scheme Tokenized with MPI Protocol Version 2
              field_value_dependencies.delete :mpi_protocol_version if scheme_tokenized

              super
            end

            # Authorize 3D transaction request parameters
            def payment_transaction_structure # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
              super.merge(
                notification_url:           notification_url,
                return_success_url:         return_success_url,
                return_failure_url:         return_failure_url,
                gaming:                     gaming,
                moto:                       moto,
                preauthorization:           preauthorization,
                crypto:                     crypto,
                customer_email:             customer_email,
                customer_phone:             customer_phone,
                document_id:                document_id,
                fx_rate_id:                 fx_rate_id,
                billing_address:            billing_address_parameters_structure,
                shipping_address:           shipping_address_parameters_structure,
                mpi_params:                 mpi_attributes_structure,
                risk_params:                risk_parameters_structure,
                dynamic_descriptor_params:  dynamic_descriptor_structure,
                business_attributes:        business_attributes_structure,
                recurring_type:             recurring_type,
                recurring_category:         recurring_category,
                sca_params:                 sca_attributes_structure,
                threeds_v2_params:          threeds_v2_common_attributes_structure,
                managed_recurring:          managed_recurring_attributes_structure,
                travel:                     travel_data_attributes_structure,
                funding:                    funding_attributes_structure,
                installment_plan_id:        installment_plan_id,
                installment_plan_reference: installment_plan_reference,
                digital_asset_type:         digital_asset_type
              )
            end

          end
        end
      end
    end
  end
end