特殊案件管理システムにCSV出力機能を追加しようとしている話

Laravel Filamentで久々の実装作業

最近は設計や導入支援に比重が偏っていたのですが、久しぶりにLaravelで手を動かす機会がありました。
「特殊案件管理システム」にCSV出力機能を追加する作業です。

久々に「エンジニアっぽいこと」をやれて、少しうれしくなりました。

FilamentのExport Actionは使わない方針

FilamentにはCSVを出力する「Export Action」という便利な機能があります。
公式ドキュメントでも紹介されていますが、今回は使用を見送りました。

理由はシンプルで、出力形式を細かくコントロールしたかったからです。
分析用途で利用するCSVなので、文字エンコードや列構成の自由度が重要になります。
Export Actionでは対応が難しそうだったため、自作することにしました。

実装の仕様と現時点の進捗

今回のCSV出力機能は以下のような仕様です。

  • 一覧画面の検索条件をそのまま出力対象の絞り込みに使用
  • 一覧上部に「CSVダウンロード」ボタンを配置
  • ボタンをクリックすると別タブが開いてCSVのダウンロードが始まり、終了後にタブが自動で閉じる

現時点では、出力対象のデータを集めて、一覧画面に「CSVダウンロード」ボタンを表示するところまで実装しました。

データ構造の整備に一番時間を使った

今回対象としているデータは以下のようなリレーション構造になっています。

  • 「業務情報」 → 「見積明細」(1:多)
  • 「業務情報」 → 「請求情報」 → 「請求明細」(1:多 → 1:多)

つまり、「業務情報」を起点として複数の明細が紐づく構造です。
この複雑な構造を1行のCSVにどう落とし込むかを考えるのに、2時間ほど使いました。

JOINだけでは済まず、ある程度データを分解・変形しながら整える必要があります。

今後の予定

現時点では、まだCSVとしての出力処理は完成していません。
今後の作業としては以下のような流れを予定しています。

  1. 集めたデータをエクセルで開ける形式(Shift-JIS、BOM付きなど)に整形
  2. 実際にCSVファイルとして出力する処理の作成
  3. ダウンロード処理の動作確認とテスト

分析に使える形にするため、整形処理にはある程度の工夫が必要です。
明日以降で順次対応していく予定です。

地味だけど大事な作業

派手な機能ではありませんが、業務データを扱う以上、最終的に「出力して分析できる」ことは重要です。
今回はそのための一歩として、CSV出力処理の実装に着手しました。

こういう作業を黙々とこなしていると、「コンサルって言ってるけど、たぶん何でも屋です」というブログタイトルがしっくり来ます。