10
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

自己紹介

はじめまして、はる(@lemonade_37)と申します。
駆け出しエンジニアとして働き始めて約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が省略されてしまうためです。

csv_sample.png

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

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

filenameでは、エクスポート時のCSVファイルのファイル名を指定することができます。

  
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

RubyのCSVクラスの特異メソッドであるCSV.generateを使用しています。

本来であれば、月毎に金額を合計するメソッドなども必要になる可能性がありますが、
今回はCSVエクスポート機能に絞っての説明のため、合計などはせずそのまま値を使用する形とします。

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コンソールで入れておきました。)
ba5432a729f5889f91d7e2633233fe32.gif
ダウンロードできました!

実際のファイルを確認してみます。
Mac💻だと、Shift_JISの文字コードだと、半角カタカナが文字化けしていたり、
Numbersアプリの仕様で先頭の0が省略されてしまっていますが、問題ありません⭕️
c0b21e9fefcd718465c7b81ef8b6405d.png
  
テキストエディットで開いた際に、下記画像のように正しい形式で、余計なクォーテーションなどが入っていない状態であれば、GMO銀行でのインポートが可能です!
db3e7e4ed325d4e0ee02956176f21f78.png

3fe0c6c639ac74d1e4856c1d7d7de447.png

もしこの形式でもGMO銀行インポート時にエラーが出る際は、
銀行コードや支店コードが実在しないものになっている場合があります。

まとめ

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

 

参考・引用記事

引用記事

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

参考記事

10
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?