internetee/registry

View on GitHub
lib/tasks/eis_billing_import_data.rake

Summary

Maintainability
Test Coverage
BASE_URL = ENV['eis_billing_system_base_url'] || 'https://st-billing.infra.tld.ee'
INITIATOR = 'registry'.freeze

namespace :eis_billing do
  desc 'One time task to export invoice data to billing system'
  task export_invoices: :environment do
    parsed_data = []
    status = 'unpaid'

    Invoice.all.each do |invoice|
      if invoice.cancelled?
        status = 'cancelled'
      else
        status = invoice.paid? ? 'paid' : 'unpaid'
      end

      transaction_time = invoice.receipt_date if invoice.paid?

      parsed_data << {
        invoice_number: invoice.number,
        initiator: 'registry',
        transaction_amount: invoice.total,
        status: status,
        in_directo: invoice.in_directo,
        e_invoice_sent_at: invoice.e_invoice_sent_at,
        transaction_time: transaction_time
      }
    end

    base_request(url: import_invoice_data_url, json_obj: parsed_data)
  end

  desc 'One time task to export reference number of registrars to billing system'
  task export_references: :environment do
    parsed_data = []
    Registrar.all.each do |registrar|
      parsed_data << {
        reference_number: registrar.reference_no,
        initiator: 'registry',
        registrar_name: registrar.name
      }
    end

    base_request(url: import_reference_data_url, json_obj: parsed_data)
  end
end

def import_reference_data_url
  "#{BASE_URL}/api/v1/import_data/reference_data"
end

def import_invoice_data_url
  "#{BASE_URL}/api/v1/import_data/invoice_data"
end

def base_request(url:, json_obj:)
  uri = URI(url)
  http = Net::HTTP.new(uri.host, uri.port)

  unless Rails.env.development?
    http.use_ssl = true
    http.verify_mode = OpenSSL::SSL::VERIFY_NONE
  end

  http.post(url, json_obj.to_json, headers)
end

def generate_token
  JWT.encode(payload, billing_secret)
end

def payload
  { initiator: INITIATOR }
end

def headers
  {
    'Authorization' => "Bearer #{generate_token}",
    'Content-Type' => 'application/json',
  }
end

def self.billing_secret
  ENV['billing_secret']
end