Class: Customer::SyncWithTaxjar

Inherits:
BaseService show all
Defined in:
app/services/customer/sync_with_taxjar.rb

Overview

Service object: sync with taxjar.

Defined Under Namespace

Classes: Result

Instance Attribute Summary

Attributes inherited from BaseService

#options

Instance Method Summary collapse

Methods inherited from BaseService

#log_debug, #log_error, #log_info, #log_warning, #logger, #process, #tagged_logger

Constructor Details

#initialize(customer, options = {}) ⇒ SyncWithTaxjar

Returns a new instance of SyncWithTaxjar.



11
12
13
14
15
16
# File 'app/services/customer/sync_with_taxjar.rb', line 11

def initialize(customer, options = {})
  @customer = customer
  @options = options
  @logger = options[:logger] || Rails.logger
  @client = Api::Taxjar.client
end

Instance Method Details

#createObject



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'app/services/customer/sync_with_taxjar.rb', line 36

def create
  if existing_record?
    @logger.info "Record already exists on Taxjar for customer #{taxjar_id}"
    Result.new(
      success: false,
      message: "Record already exists on Taxjar for customer #{taxjar_id}"
    )
  else
    new_record = @client.create_customer(details)
    Result.new(
      success: true,
      exempt_regions: new_record.exempt_regions
    )
  end
end

#deleteObject



75
76
77
78
79
80
81
82
83
84
85
86
87
88
# File 'app/services/customer/sync_with_taxjar.rb', line 75

def delete
  @client.show_customer(taxjar_id)
  @client.delete_customer(taxjar_id)
  Result.new(
    success: true,
    message: "Record on Taxjar for customer #{taxjar_id} successfully deleted"
  )
rescue Api::Taxjar::Error::NotFound
  @logger.info "Record not found on Taxjar for customer #{taxjar_id}"
  Result.new(
    success: false,
    message: "Record not found on Taxjar for customer #{taxjar_id}"
  )
end

#detailsObject



90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
# File 'app/services/customer/sync_with_taxjar.rb', line 90

def details
  res = {
    customer_id: taxjar_id,
    exemption_type: 'wholesale',
    name: @customer.name,
    exempt_regions: @customer.tax_exemptions.effective_on(effective_date).map { |te| { state: te.state_code, country: te.state.country.iso } }
  }
  # only send the billing address if it's US or Canada, as TaxJar will reject it otherwise
  if %w[USA CAN].include?(@customer.billing_address&.country_iso3)
    res[:country] = @customer.billing_address.country.iso
    res[:state] = @customer.billing_address.state_code
    res[:zip] = @customer.billing_address.zip
    res[:city] = @customer.billing_address.city
    res[:street] = @customer.billing_address.street1
  end
  res
end

#effective_dateObject



18
19
20
# File 'app/services/customer/sync_with_taxjar.rb', line 18

def effective_date
  @options[:effective_date] || Date.current
end

#existing_record?Boolean

Returns:

  • (Boolean)


52
53
54
55
56
# File 'app/services/customer/sync_with_taxjar.rb', line 52

def existing_record?
  # check it already exists
  existing_records = @client.list_customers
  existing_records.include?(taxjar_id)
end

#syncObject



26
27
28
29
30
31
32
33
34
# File 'app/services/customer/sync_with_taxjar.rb', line 26

def sync
  Retryable.retryable(tries: 3, sleep: 0.5, on: [Api::Taxjar::Error]) do |_attempt_number, _exception|
    if existing_record?
      update
    else
      create
    end
  end
end

#taxjar_idObject



22
23
24
# File 'app/services/customer/sync_with_taxjar.rb', line 22

def taxjar_id
  @customer.id.to_s
end

#updateObject



58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'app/services/customer/sync_with_taxjar.rb', line 58

def update
  @client.show_customer(taxjar_id)

  updated_record = @client.update_customer(details)

  Result.new(
    success: true,
    exempt_regions: updated_record.exempt_regions
  )
rescue Api::Taxjar::Error::NotFound
  @logger.info "Record not found on Taxjar for customer #{taxjar_id}"
  Result.new(
    success: false,
    message: "Record not found on Taxjar for customer #{taxjar_id}"
  )
end