Class: CloverSandboxSimulator::Services::Clover::TenderService

Inherits:
BaseService
  • Object
show all
Defined in:
lib/clover_sandbox_simulator/services/clover/tender_service.rb

Overview

Manages Clover payment tenders (Cash, Gift Card, etc.)

Constant Summary collapse

SANDBOX_SAFE_TENDERS =

Tenders that work reliably in Clover sandbox NOTE: Credit Card and Debit Card are BROKEN in sandbox - do not use!

%w[
  com.clover.tender.cash
  com.clover.tender.check
  com.clover.tender.external_gift_card
  com.clover.tender.external_payment
].freeze

Instance Attribute Summary

Attributes inherited from BaseService

#config, #logger

Instance Method Summary collapse

Methods inherited from BaseService

#initialize

Constructor Details

This class inherits a constructor from CloverSandboxSimulator::Services::BaseService

Instance Method Details

#cash_tenderObject

Get cash tender



55
56
57
# File 'lib/clover_sandbox_simulator/services/clover/tender_service.rb', line 55

def cash_tender
  find_tender_by_label("Cash") || get_safe_tenders.first
end

#create_tender(label:, label_key: nil, enabled: true, opens_cash_drawer: false) ⇒ Object

Create a custom tender



60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/clover_sandbox_simulator/services/clover/tender_service.rb', line 60

def create_tender(label:, label_key: nil, enabled: true, opens_cash_drawer: false)
  logger.info "Creating tender: #{label}"

  payload = {
    "label" => label,
    "labelKey" => label_key || "com.clover.tender.#{label.downcase.gsub(/\s+/, '_')}",
    "enabled" => enabled,
    "opensCashDrawer" => opens_cash_drawer
  }

  request(:post, endpoint("tenders"), payload: payload)
end

#find_tender_by_label(label) ⇒ Object

Get a specific tender by label



49
50
51
52
# File 'lib/clover_sandbox_simulator/services/clover/tender_service.rb', line 49

def find_tender_by_label(label)
  tenders = get_tenders
  tenders.find { |t| t["label"]&.downcase == label.downcase }
end

#get_safe_tendersObject

Get sandbox-safe tenders (excludes credit/debit cards)



30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/clover_sandbox_simulator/services/clover/tender_service.rb', line 30

def get_safe_tenders
  tenders = get_tenders

  safe = tenders.reject do |tender|
    label = tender["label"]&.downcase || ""
    label_key = tender["labelKey"]&.downcase || ""

    # Exclude credit and debit cards - they're broken in sandbox
    label.include?("credit") ||
      label.include?("debit") ||
      label_key.include?("credit") ||
      label_key.include?("debit")
  end

  logger.info "Found #{safe.size} sandbox-safe tenders"
  safe
end

#get_tendersObject

Fetch all tenders



18
19
20
21
22
23
24
25
26
27
# File 'lib/clover_sandbox_simulator/services/clover/tender_service.rb', line 18

def get_tenders
  logger.info "Fetching tenders..."
  response = request(:get, endpoint("tenders"))
  elements = response&.dig("elements") || []

  # Filter to enabled tenders only
  enabled = elements.select { |t| t["enabled"] == true }
  logger.info "Found #{enabled.size} enabled tenders"
  enabled
end

#select_split_tenders(num_splits: nil) ⇒ Object

Select random safe tenders for split payment Returns array of tender IDs with split percentages



75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
# File 'lib/clover_sandbox_simulator/services/clover/tender_service.rb', line 75

def select_split_tenders(num_splits: nil)
  tenders = get_safe_tenders
  return [] if tenders.empty?

  # Determine number of splits (1-3)
  num_splits ||= rand(1..3)
  num_splits = [num_splits, tenders.size].min

  # Select random tenders
  selected = tenders.sample(num_splits)

  # Generate random split percentages that sum to 100
  percentages = generate_split_percentages(num_splits)

  selected.zip(percentages).map do |tender, percentage|
    { tender: tender, percentage: percentage }
  end
end