ZeusWPI/FK-enrolment

View on GitHub
app/exports/isic_export.rb

Summary

Maintainability
A
3 hrs
Test Coverage
class IsicExport
  def initialize
    @client = Savon.client(
      wsdl: Rails.application.secrets.isic_api_wsdl,
      convert_request_keys_to: :none
    )
    @defaults = {
      username: Rails.application.secrets.isic_api_user,
      password: Rails.application.secrets.isic_api_password,

      cardType: "ISIC",
      StudentCity: "Gent",
      School: "Universiteit Gent",
    }
  end

  def submit(member, card)
    return if card.academic_year != Member.current_academic_year
    return if not ['request'].include? card.isic_status
    return if card.status != 'paid'

    state_info = {
      'request' => ['REQUESTED', 'requested'],
    }

    params = @defaults.merge({
      ClientID: member.club.isic_name,
      MemberNumber: card.number,
      ISICCardNumber: "",
      Course: member.club.full_name,
      type: state_info[card.isic_status][0],

      Firstname: member.first_name,
      Lastname: member.last_name,
      BirthDate: member.date_of_birth.strftime("%d/%m/%Y"),
      BirthPlace: "",
      Gender: member.sex.upcase,
      Nationality: "",
      language: "NL",

      Street: member.home_street,
      PostalCode: member.home_postal_code,
      City: member.home_city,
      email: member.email,
      PhoneNumber: "",

      isStudent: "1",
      Year: "0",
      sendToHome: member.isic_mail_card ? "1" : "0",
      promotionCode: "",
      Optin: member.isic_newsletter ? "1" : "0",
      postOptOut: "1",
      postOptOutThird: "1",
      special: "1"
    })

    photo = File.read(member.photo.path(:cropped), mode: 'rb')
    params.update({
      Photo: Base64.encode64(photo),
      ImageExtension: "jpg"
    })

    response = @client.call(:add_isic_registration, message: params)
    result = response.body[:add_isic_registration_response][:add_isic_registration_result]

    # Response is either "OKS 000 000 000 000 A"
    # or "ASK FOR YOUR REVALIDATION STICKER"
    if result[0..1] == 'OK' or result[0..2] == 'ASK'
      if result[0..1] == 'OK'
        card.isic_number = result[2..-1]
      end

      # Update card state
      card.isic_status = state_info[card.isic_status][1]
      card.isic_exported = true
      card.save
    else
      raise result
    end
  end
end