総合振込で使用する「全銀フォーマット(全銀協規定形式)」のファイル作成方法をまとめてみました。
全銀フォーマットはどの銀行も似通っているかと思いますが、実装する際は必ず該当銀行の資料を読み込む事をお勧めします。
※ 下記は GMOあおぞらネット銀行 のフォーマットになります。だいぶ愚直に書いた例です。
File.open("payout-example.txt", "w", encoding: "Shift_JIS") { |f|
# 1. ヘッダー・レコード
h_01 = 1 # データ区分(固定値)
h_02 = 21 # 種別コード(固定値)
h_03 = 0 # コード区分(固定値)
h_04 = 9999999999 # 振込依頼人コード(固定値)
h_05 = "#{振込依頼人名}".ljust(40) # 振込依頼人名
h_06 = Date.today.strftime("%m%d") # 振込実施日
h_07 = "0310" # 仕向銀行番号(固定値)
h_08 = "ジーエムオーアオゾラネツト" # 仕向銀行名(固定値)
h_09 = "#{仕向支店番号}" # 仕向支店番号
h_10 = "#{仕向支店名}".ljust(15) # 仕向支店名
h_11 = 1 # 預金種目(依頼人)(固定値)
h_12 = "#{口座番号}" # 口座番号(依頼人)
h_13 = "".ljust(17) # ダミー
f.write("#{h_01}#{h_02}#{h_03}#{h_04}#{h_05}#{h_06}#{h_07}#{h_08}#{h_09}#{h_10}#{h_11}#{h_12}#{h_13}\r\n")
# 2. データ・レコード
payouts = ...
payouts.each do |payout|
d_01 = 2 # データ区分(固定値)
d_02 = "#{payout.被仕向銀行番号}".rjust(4, "0") # 被仕向銀行番号
d_03 = "".ljust(15) # 被仕向銀行名
d_04 = "#{payout.被仕向支店番号}".rjust(3, "0") # 被仕向支店番号
d_05 = "".ljust(15) # 被仕向支店名
d_06 = "".ljust(4) # 統一手形交換所番号(固定値)
d_07 = 1 # 預金種目
d_08 = "#{payout.口座番号}".rjust(7, "0") # 口座番号
d_09 = "#{payout.受取人名}".ljust(30) # 受取人名
d_10 = "#{payout.振込金額}".rjust(10, "0") # 振込金額
d_11 = 1 # 新規コード
d_12 = "".ljust(10) # 顧客コード1
d_13 = "".ljust(10) # 顧客コード2
d_14 = "".ljust(1) # 振込指定区分
d_15 = "".ljust(1) # 識別表示
d_16 = "".ljust(7) # ダミー
f.write("#{d_01}#{d_02}#{d_03}#{d_04}#{d_05}#{d_06}#{d_07}#{d_08}#{d_09}#{d_10}#{d_11}#{d_12}#{d_13}#{d_14}#{d_15}#{d_16}\r\n")
end
# 3. トレーラ・レコード
t_01 = 8 # データ区分(固定値)
t_02 = payouts.count.to_s.rjust(6, "0") # 合計件数
t_03 = payouts.sum(:振込金額).to_s.rjust(12, "0") # 合計金額
t_04 = "".ljust(101) # ダミー
f.write("#{t_01}#{t_02}#{t_03}#{t_04}\r\n")
# 4. エンド・レコード
e_01 = 9 # データ区分(固定値)
e_02 = "".ljust(119) # ダミー
f.write("#{e_01}#{e_02}\r\n")
}