Release Notes: v0.1.7

← バージョン一覧に戻る

v0.1.7 Release Notes

リリース日: 2025年10月16日

🚀 新機能

🔄 反映取り消し機能

在庫反映履歴から、過去の反映を取り消せる機能を追加しました。

主な機能:

  • 履歴からの取り消し: 反映履歴詳細モーダルから各反映を個別に取り消し可能
  • ソフトデリート: データの完全性と監査証跡を維持
  • 確認ダイアログ: 取り消し前に詳細情報を表示して安全性を確保
  • 自動更新: 取り消し成功後、ページデータが自動的に再読み込み

使用方法:

  1. 在庫反映ページで組織の「既反映済み」列をクリック
  2. 反映履歴詳細モーダルで取り消したい反映の「取り消し」ボタンをクリック
  3. 確認ダイアログで内容を確認して実行
  4. 在庫が元の状態に戻り、反映履歴が更新される

技術仕様:

  • 新規APIエンドポイント: DELETE /admin/catch-shipping/:titleId/reflections/:reflectionId/undo
  • ソフトデリート方式で deleted_at タイムスタンプを設定
  • 関連する MaterialTransactionSetMaterialTransaction も同時に削除

📅 日付選択の大幅改善

Flatpickrライブラリを統合し、発送日の選択体験を向上させました。

主な機能:

  • Flatpickr統合: 直感的な日付選択UIを提供
  • 動的な最小日付計算:
    • 最終出庫日がある場合:その翌日以降のみ選択可能
    • 最終出庫日がない場合:受注日以降を選択可能(受注日当日も可)
    • どちらもない場合:制限なし
  • 週末の色分け: 土曜日は青、日曜日は赤で表示
  • 日付ヘルプモーダル: 「?」アイコンから選択ルールを確認可能

ヘルプモーダル内容:

  • 選択可能な日付のルール説明
  • 最終出庫日と受注日の関係
  • 視覚的なセクション分けと注意事項
  • ヒント表示

💾 入力値の自動保存・復元

ページ遷移時に反映入力値を保存し、戻ってきたときに復元する機能を追加しました。

主な機能:

  • sessionStorage活用: ブラウザのセッションストレージで一時保存
  • 1時間の有効期限: 古いデータは自動的にクリア
  • 日付も保存: 反映数だけでなく選択した発送日も保存・復元
  • 検証機能: 復元時に現在の最大反映可能数と照合

動作タイミング:

  • 組織名のリンクをクリックして在庫状況ページへ遷移するとき自動保存
  • 反映ページに戻ってきたとき自動復元
  • 入力値が変更されるたびに自動保存

🔗 組織名のリンク化

在庫反映ページの組織名をクリックして、その組織の在庫状況ページに遷移できるようになりました。

主な機能:

  • クリック可能な組織名: 青いリンクスタイルで表示
  • 入力値の保持: 遷移前の反映入力値が保持される
  • 納品連絡ボタンの非表示: 反映ページから遷移した場合、在庫状況ページの納品連絡ボタンを非表示

デザイン:

  • ホバー時に下線と色変化
  • 訪問済みリンクも同じ色を維持

📋 CLIPデータ処理の高度化

CLIP1/CLIP2形式のクリップボードデータ処理を大幅に改善しました。

主な機能:

  • 自動カラム選択: ページタイトルの回数から該当カラムを自動検出
  • ファジーマッチング: 組織名の類似度スコアで候補を提案
  • 結合マッピング: 1つの組織が複数行に分割されている場合に対応
  • 詳細な通知: 更新内容、未検出組織、候補提案を明示

処理フロー:

  1. クリップボードデータの形式を自動判定
  2. CLIP1/CLIP2の場合、カラム選択モーダルを表示
  3. 回数から自動的にカラムを選択(手動変更も可)
  4. 組織番号で完全一致 → 部分一致 → ファジーマッチングの順で検索
  5. 結果を通知メッセージで詳細表示

通知内容:

  • 更新された組織数と合計件数
  • 結合マッピングの詳細
  • 未検出組織のリストと候補提案
  • 値が変更されなかった組織

📖 ペーストヘルプモーダル

クリップボードデータの貼り付け機能について説明するヘルプモーダルを追加しました。

主な内容:

  • 対応フォーマット(標準、CLIP1、CLIP2)の説明
  • 高度な機能(ファジーマッチング、結合マッピング)の解説
  • 使用例と注意事項

🔧 改善

📊 最終出庫日の計算ロジック改善

最終出庫日の取得ロジックを、現在のCATCH注文に限定せず、すべての出庫トランザクションから取得するように変更しました。

変更内容:

  • 変更前: CatchShippingReflection テーブルから現在のタイトルの反映のみを対象
  • 変更後: MaterialTransaction テーブルから組織のすべての出庫を対象

対象トランザクション:

  • CATCH注文の反映による出庫(全回)
  • 手動での在庫編集による出庫
  • その他のあらゆる出庫トランザクション

理由:

  • 在庫の整合性を保つため、組織全体の出庫履歴を考慮する必要がある
  • 過去の出庫より前の日付で反映すると、在庫計算がマイナスになる可能性がある
  • 時系列の整合性を維持するため

技術詳細:

// 変更前
Where("title_id = ? AND organization_id = ?", titleID, orgID)

// 変更後(JOINを使用)
Joins("JOIN materials ON materials.id = material_transactions.material_id").
Where("materials.organization_id = ? AND material_transactions.type = ?", orgID, "out")

🎨 UI/UX改善

在庫反映ページ

  • 組織名を青いリンクスタイルで表示
  • ホバー効果の追加
  • 最終出庫日列の追加
  • 日付ヘルプアイコンの追加

在庫状況ページ

  • 反映ページから遷移した場合の条件付きUI調整
  • データ読み込み時のエラー防止

モーダルデザイン

  • 日付ヘルプモーダルのセクション分け
  • 色分けされた注意事項とヒント
  • 反映履歴詳細モーダルの取り消しボタン追加

🐛 バグ修正

Alpine.jsのデータ読み込みエラー防止

ページ初期化時にデータが未読み込みの状態でアクセスされる問題を修正しました。

修正内容:

  • computed propertiesに防御的チェック追加:
    • sortedTransactionSets
    • sortedCatchOrders
    • sortedEntries
  • テンプレートの条件分岐にnullチェック追加:
    • materials && materials.length > 0
    • transactionSets && transactionSets.length > 0

効果:

  • ページ読み込み時の TypeError: Cannot read properties of null エラーを防止
  • データが未読み込みの場合は空配列を返す

JSONマーシャリングの修正

Go言語のハンドラーでnilスライスを空スライスに変更し、JSON出力を改善しました。

修正内容:

  • 変更前: nil スライスが JSON で null として出力
  • 変更後: 空スライス (make([]T, 0) または []T{}) が JSON で [] として出力

対象関数:

  • getCatchOrderDataForOrganization
  • 各種material handlers

効果:

  • JavaScriptでのパースエラーを防止
  • テンプレートの条件分岐が正しく動作

🔧 技術的改善

バックエンド

新規APIエンドポイント

  • DELETE /admin/catch-shipping/:titleId/reflections/:reflectionId/undo - 反映取り消し
  • データベースクエリの最適化(JOIN活用)

データベースクエリ改善

  • 最終出庫日取得クエリの変更:
    • CatchShippingReflectionMaterialTransaction + Material JOIN
    • reflected_atapplied_date 使用
    • 組織IDのみでフィルタリング

エラーログ改善

  • 組織固有のコンテキストを含むログメッセージ
  • デバッグ用の実行トレースログ追加

フロントエンド

グローバル関数の追加

  • reloadReflectionData: 反映ステータスを再読み込み(モーダルから呼び出し可能)
  • saveReflectionInputs: 入力値を保存(onclick属性から呼び出し可能)

モーダル管理

  • 日付ヘルプモーダルの追加
  • 反映詳細モーダルに取り消しボタン追加
  • モーダル外クリックでの閉じる機能

sessionStorage活用

  • 入力値と日付の保存・復元
  • タイムスタンプによる有効期限管理
  • 最大値との整合性チェック

スコープ管理改善

  • IIFE内関数とグローバル関数の適切な分離
  • window オブジェクトへの選択的な関数公開

パフォーマンス

クエリ最適化

  • JOINを使った効率的なクエリ
  • インデックスを活用した検索

フロントエンド最適化

  • 条件分岐による不要なDOM操作の削減
  • sessionStorageの効率的な利用
  • 入力変更イベントの適切なハンドリング

📝 ドキュメント改善

README更新

  • Go言語のスライス初期化のベストプラクティス追加
  • JSONマーシャリング時の注意事項説明
  • 空スライスとnilスライスの違いを明確化

コードコメント

  • 複雑なロジックへの説明コメント追加
  • 日付計算アルゴリズムの文書化
  • モーダル操作フローの説明

🎯 対象ユーザー

  • 管理者: 反映取り消し機能で柔軟な在庫管理が可能
  • 入力担当者: CLIPデータの高度な処理で入力効率が向上
  • 全ユーザー: 改善されたUI/UXで操作性が向上

📋 使用上の注意

反映取り消し機能

  • 取り消しはソフトデリート方式で、データは完全には削除されません
  • 取り消した反映は監査証跡として保持されます
  • 取り消し操作自体は記録されません(将来的に実装予定)

最終出庫日の計算

  • すべての出庫トランザクションが対象となります
  • 他のCATCH注文や手動編集の出庫も考慮されます
  • 最終出庫日より前の日付は選択できません

入力値の保存

  • sessionStorageを使用するため、ブラウザを閉じると消えます
  • 1時間で自動的に期限切れになります
  • 最大反映可能数を超える値は復元時に調整されます

CLIPデータ処理

  • 自動カラム選択は回数から判定されるため、タイトルが正しい必要があります
  • ファジーマッチングは類似度70%以上の候補を表示します
  • 結合マッピングは組織番号が一致する複数行を自動的に合算します

🔄 移行ガイド

データベース変更

このバージョンではデータベーススキーマの変更はありません。

API変更

既存のAPIとの互換性は維持されています。新しいエンドポイントが追加されましたが、既存の機能には影響しません。

フロントエンド変更

  • ブラウザキャッシュをクリアして最新のJavaScriptとCSSを読み込んでください
  • 古いブラウザではFlatpickrが正しく動作しない可能性があります(モダンブラウザ推奨)

推奨事項

  • 反映取り消し機能は重要でないデータで先にテストしてください
  • 日付選択ルールをユーザーに周知してください
  • CLIPデータのファジーマッチング結果を確認してから反映してください

📄 変更ファイル

バックエンド

  • internal/handlers/admin.go

フロントエンドテンプレート

  • web/templates/admin_catch_shipping.gohtml
  • web/templates/admin_catch_shipping_reflect.gohtml
  • web/templates/inventory_status.gohtml

ドキュメント

  • README.md
  • docs/release-notes/v0.1.7.md (このファイル)

互換性: v0.1.6からの移行において、データベーススキーマの変更はありません。既存のAPIとの互換性は維持されています。新しい機能はすべて追加機能として実装されており、既存の機能に影響を与えません。