🏦

【Rails】GMOあおぞらネット銀行指定形式CSVエクスポートの実装

に公開

自己紹介

はじめまして、はると申します。
駆け出しエンジニアとして働き始めて約1ヶ月が経過しました🐣

概要

業務内で、GMOあおぞらネット銀行指定形式のCSVファイルをエクスポートする機能を実装する必要がありましたが、なかなか想定する形式で出力できず苦労したためまとめました✏️

環境

  • Ruby 3.2.3
  • Rails 7.1.3
  • Importmap
  • Tailwindcss、daisyUI
  • PostgreSQL

エクスポート・インポートとは?

改めて言葉の定義を確認しておきます。

エクスポートとは

あるソフトウェアで作成・編集したデータを他のソフトが読み込める形式に変換したり、そのような形式でファイルに保存することを指す。1)

インポートとは

あるソフトウェアが、他のソフトで作成されたデータやファイルを読み込んで利用できるようにすることをこのように呼ぶ。2)

CSVエクスポート機能の必要性

会社から複数名のお客様にお金の振り込みを行うなど、GMOあおぞらネット銀行の企業用口座から、複数口座に一括振り込みを行う際に、「一括振込(WEBアップロード) ご利用ガイド」からダウンロードできるPDFで説明されている書式に沿ったCSVファイルが必要になります。

実装方法

Railsのアプリで、下記のようなテーブル設計があるとして実装します。ユーザーごとに決まった金額を、お店側からユーザーへ一括で振り込む状況を想定しています。
\tiny{命名のセンスが無いのは多めに見てください…!}

account_informationsテーブルは口座情報のテーブルですが、銀行コードや支店コードなど、全て string(文字列)型 を使用しています!
これは、電話番号などでも同じですが、データベースの性質上、integer型だと先頭の0が省略されてしまうためです。

サンプルコードはこちらです。

https://github.com/lemonade-37/csv_sample

1. コントローラーのアクション定義

RubyのCSVライブラリを使用できるようにします。(追加後はRailsサーバーの再起動が必要です。)

controllers/static_pages_controller.rb
class StaticPagesController < ApplicationController
+ require 'csv'

exportアクションを定義します。

controllers/static_pages_controller.rb
def export
  @account_informations = AccountInformation.all

  respond_to do |format|
    format.csv { send_data generate_csv(@account_informations), filename: "CSVサンプル.csv" }
  end
end

exportアクション内で呼び出すgenerate_csvメソッドを定義します。

controllers/static_pages_controller.rb
private

# GMOあおぞらネット銀行指定形式
def generate_csv(account_informations)
  csv_data = CSV.generate(encoding: 'Shift_JIS') do |csv| # 文字コードをShift_JISに指定する必要があります。
    account_informations.each do |account_information|
      sale = Sale.find_by(user_id: account_information.user.id) # 振込金額を先に検索しておきます
      # この時の値の呼び出し方等はアプリに応じて調整してください。

      # GMOあおぞらネット銀行指定形式では、下記項目がこの順番で並んでいる必要があります。
      # 他細かいデータ形式は公式のPDF参照。
      csv << [
        account_information.bank_code,      # 銀行コード :先頭の0は省略せず4桁で表記
        account_information.branch_code,    # 支店コード :先頭の0は省略せず3桁で表記
        account_information.deposit_type,   # 預金種目  :1(普通),2(当座),4(貯蓄)の数値で表記
        account_information.account_number, # 口座番号  :先頭の0は省略せず7桁で表記
        account_information.bank_account,   # 受取口座名義:半角カタカナで表記
        sale&.price,                        # 振込金額
        nil,                                # 手数料負担区分(空欄)
        nil,                                # 振り込み依頼人(空欄)
        nil                                 # EDI情報(空欄)
      ]
    end
  end
end

2. ルーティングの追加

エクスポートのアクションを実行するためのルーティングを追加します。

config/routes.rb
resources :static_pages, only: [:index] do
+ collection do
+   get :export
+ end
end

3. ビューファイルのCSVエクスポートボタン

先ほど追加したルーティングで生成されたヘルパーを使用します。

app/views/static_pages/index.html.erb
<%= link_to 'CSVエクスポート', export_static_pages_path(format: :csv), class: 'btn btn-primary w-40' %>

動作確認

それではCSVエクスポートボタンを押してみます。
(各テーブルのサンプルデータはRailsコンソールで入れておきました。)

ダウンロードできました!

実際のファイルを確認してみます。
Mac💻だと、Shift_JISの文字コードだと、半角カタカナが文字化けしていたり、
Numbersアプリの仕様で先頭の0が省略されてしまっていますが、問題ありません⭕️

  
テキストエディットで開いた際に、下記画像のように正しい形式で、余計なクォーテーションなどが入っていない状態であれば、GMO銀行でのインポートが可能です!

まとめ

初めてのRailsのエクスポート機能実装で、銀行でインポート可能な所定の形式に合わせるのが大変でした。
ここまで読んでいただきありがとうございました🙇

参考・引用記事

引用記事

1)IT用語辞典 e-Words エクスポート
2)IT用語辞典 e-Words インポート

参考記事

Discussion