substancelab/rconomic

View on GitHub
lib/economic/proxies/debtor_proxy.rb

Summary

Maintainability
A
0 mins
Test Coverage
# frozen_string_literal: true

require "economic/proxies/entity_proxy"
require "economic/proxies/actions/find_by_ci_number"
require "economic/proxies/actions/find_by_handle_with_number"
require "economic/proxies/actions/find_by_number"
require "economic/proxies/actions/find_by_telephone_and_fax_number"

module Economic
  class DebtorProxy < EntityProxy
    include FindByCiNumber
    include FindByHandleWithNumber
    include FindByNumber
    include FindByTelephoneAndFaxNumber

    # Returns the next available debtor number
    def next_available_number
      request :get_next_available_number
    end

    def get_current_invoices(debtor_handle)
      response = fetch_response(:get_current_invoices, debtor_handle)
      build_entities_from_response(
        Economic::CurrentInvoice,
        response[:current_invoice_handle]
      )
    end

    def get_debtor_contacts(debtor_handle)
      response = fetch_response(:get_debtor_contacts, debtor_handle)
      build_entities_from_response(
        Economic::DebtorContact,
        response[:debtor_contact_handle]
      )
    end

    def get_invoices(debtor_handle)
      response = fetch_response(:get_invoices, debtor_handle)
      build_entities_from_response(
        Economic::Invoice,
        response[:invoice_handle]
      )
    end

    # Returns handle for orders for debtor.
    def get_orders(debtor_handle)
      response = fetch_response(:get_orders, debtor_handle)
      build_entities_from_response(
        Economic::Order,
        response[:order_handle]
      )
    end

    private

    def build_entities_from_response(entity_class, handles)
      return nil if handles.nil?
      [handles].flatten.map do |handle|
        entity = entity_class.new(:session => session)
        entity.partial = true
        entity.persisted = true
        entity.handle = handle
        entity = add_id_to_entity(entity, handle[:id].to_i)
        entity
      end
    end

    def add_id_to_entity(entity, id)
      if entity.respond_to?(:number=)
        entity.number = id
      else
        entity.id = id
      end

      entity
    end

    def fetch_response(operation, debtor_handle)
      request(
        operation,
        "debtorHandle" => {"Number" => debtor_handle.number}
      )
    end
  end
end