class Listo::Invoicing

Public Class Methods

cancel(id) click to toggle source
# File lib/listo/invoicing.rb, line 50
def cancel(id)
  params = {
    passcode: client.pkey_passphrase,
    certificate_der: cert.to_der64,
    private_key_der: pkey.base64,
  }

  response = client.connection.post("invoicing/cancel/invoice/#{id}/", params).body

  success_codes = [
    201, # returned after the cancellation request
    202 # returned after a cancellation request for an already requested cancellation invoice
  ]

  if success_codes.exclude? response.dig('code')
    raise Listo::Error::CancelError, response.dig('message')
  end

  response
end
certify_xml(xml, original_chain, data) click to toggle source
# File lib/listo/invoicing.rb, line 30
def certify_xml(xml, original_chain, data)
  params = {
    xml:             xml,
    certificate_num: certificate_num,
    certificate:     certificate,
    signature:       signature(original_chain),
    data:            data,
  }

  response = client.connection.post('invoicing/certify_xml', params).body

  # warning: listo reponds stamp errors with HTTP 200
  if response.dig('status') == 'error'
    raise Listo::Error::StampError, response.dig('error_description')
  end

  response
end
export_json(params = []) click to toggle source
# File lib/listo/invoicing.rb, line 22
def export_json(params = [])
  client.connection.get('invoices/export_json', params)
end
generate_xml(params = []) click to toggle source
# File lib/listo/invoicing.rb, line 26
def generate_xml(params = [])
  client.connection.post('invoicing/generate_xml', params).body
end
pay(id, params = []) click to toggle source
# File lib/listo/invoicing.rb, line 11
def pay(id, params = [])
  client.connection.post do |request|
    request.url "invoices/#{id}/payments/"
    request.body = params
  end.body
end

Private Class Methods

certificate() click to toggle source
# File lib/listo/invoicing.rb, line 77
def certificate
  cert.to_der64.delete("\n")
end
certificate_num() click to toggle source
# File lib/listo/invoicing.rb, line 81
def certificate_num
  cert.serial.to_s(2)
end
client() click to toggle source
# File lib/listo/invoicing.rb, line 73
def client
  Listo::Client.current
end
signature(original_chain) click to toggle source
# File lib/listo/invoicing.rb, line 85
def signature(original_chain)
  original_chain.gsub!("|#{'0' * 20}|", "|#{certificate_num}|")
  signature = pkey.sign(OpenSSL::Digest::SHA256.new, original_chain)

  Base64.encode64(signature).delete("\n")
end