podemos-info/participa2

View on GitHub
decidim-module-crowdfundings/app/services/decidim/crowdfundings/payments_proxy.rb

Summary

Maintainability
A
0 mins
Test Coverage
# frozen_string_literal: true

module Decidim
  module Crowdfundings
    class PaymentsProxy
      def initialize(person_proxy = nil, user_request: nil)
        @person_proxy = person_proxy
        @user_request = user_request
      end

      def person_proxy=(person_proxy)
        @person_proxy = person_proxy
        remove_instance_variable :@person_annual_total if defined? @person_annual_total
        @payment_methods = @person_campaign_total = @contribution_error = nil
      end

      delegate :user, :has_person?, to: :person_proxy, allow_nil: true

      # no person required methods

      def campaign_total(campaign)
        @campaign_total ||= Hash.new do |h, key|
          h[key] = census_payments_api.if_valid(census_payments_api.orders_total(campaign_code: key))
        end
        @campaign_total[campaign.reference]
      end

      def payment_method(payment_method_id)
        census_payments_api.if_valid(census_payments_api.payment_method(payment_method_id))
      end

      # person required methods

      def create_order(**params)
        census_payments_api.create_order(qualified_id, **params)
      end

      def payment_methods
        @payment_methods ||= census_payments_api.if_valid(census_payments_api.payment_methods(qualified_id))
      end

      def person_campaign_total(campaign)
        @person_campaign_total ||= Hash.new do |h, key|
          h[key] = census_payments_api.if_valid(census_payments_api.orders_total(person_id: qualified_id, campaign_code: key))
        end
        @person_campaign_total[campaign.reference]
      end

      def under_annual_limit?(add_amount: 0)
        person_annual_total + add_amount < Decidim::Crowdfundings.maximum_annual_contribution_amount if person_annual_total
      end

      def contribution_error
        @contribution_error ||= begin
          if person_proxy&.has_person? && under_annual_limit? == false
            :maximum_annual_exceeded
          elsif census_payments_api.service_status == false
            :service_unavailable
          else
            false
          end
        end
      end

      private

      attr_reader :person_proxy, :user_request

      def person_annual_total
        return @person_annual_total if defined? @person_annual_total

        @person_annual_total ||= census_payments_api.if_valid(
          census_payments_api.orders_total(person_id: qualified_id, from_date: Time.zone.now.beginning_of_year, until_date: Time.zone.now.end_of_year)
        )
      end

      def census_payments_api
        @census_payments_api ||= ::Census::API::Payments.new(user_request)
      end

      def qualified_id
        raise "Person ID not available" unless person_proxy&.has_person?

        "#{person_proxy.person_id}@census"
      end
    end
  end
end