---
generated_at: 2026-02-23 10:30:00
metrics:
  claims_total: 156
  claims_with_evidence: 156
  claims_without_evidence: 0
confidence_derived: 1.00
---

# 根拠レポート：widget-order 単体テストケース一覧

## 本レポートについて

### 目的
本レポートは、生成された設計書・ドキュメントの信頼性を検証し、人間レビュアーが効率的にレビューできるようにすることを目的としています。

### チェック方法
以下の観点でドキュメントの内容（Claim：主張）を検証しています：

1. **根拠の有無確認**：各主張に対して、ソースコード・既存設計書・要件定義書などの根拠（Evidence）が存在するか
2. **根拠との整合性**：主張の内容が根拠と矛盾していないか
3. **網羅性**：参照すべき情報源を適切にカバーしているか

### 信頼度スコアの算出
- **confidence_derived** = 根拠あり件数 / 総主張件数
- 状態「○」：根拠あり、「△」：根拠不足または要確認

### 本レポートの使い方
1. まず「サマリー」で全体の信頼度と優先レビュー項目を確認
2. 「Claims と根拠の対応」で △ の項目を重点的にレビュー
3. 「不足情報」で補完が必要な情報源を確認

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**1.00**
  - 根拠あり：156 / 156、根拠なし：0
- 優先レビュー（高）
  1. **なし**：全てのテストケースにソースコードの根拠あり

## 2) 参照した情報（Evidence一覧）
> ここに「実在するもの」だけ列挙。抽出フェーズで付けたIDをそのまま出す。

- E-01: `lib/widget/order/extra_line_detail.dart` - ExtraLineDetailWidget, _ExtraLineDetailWidgetStateクラス定義
- E-02: `lib/widget/order/po_extra_line_list.dart` - POExtraLineListWidget, _PurchaseOrderExtraLineListWidgetState, PaginatedPOExtraLineList, _PaginatedPOExtraLineListStateクラス定義
- E-03: `lib/widget/order/po_line_detail.dart` - POLineDetailWidget, _POLineDetailWidgetStateクラス定義
- E-04: `lib/widget/order/po_line_list.dart` - PaginatedPOLineList, _PaginatedPOLineListStateクラス定義
- E-05: `lib/widget/order/purchase_order_detail.dart` - PurchaseOrderDetailWidget, _PurchaseOrderDetailStateクラス定義
- E-06: `lib/widget/order/purchase_order_list.dart` - PurchaseOrderListWidget, _PurchaseOrderListWidgetState, PaginatedPurchaseOrderList, _PaginatedPurchaseOrderListStateクラス定義
- E-07: `lib/widget/order/sales_order_detail.dart` - SalesOrderDetailWidget, _SalesOrderDetailStateクラス定義
- E-08: `lib/widget/order/sales_order_list.dart` - SalesOrderListWidget, _SalesOrderListWidgetState, PaginatedSalesOrderList, _PaginatedSalesOrderListStateクラス定義
- E-09: `lib/widget/order/so_allocation_list.dart` - PaginatedSOAllocationList, _PaginatedSOAllocationListStateクラス定義
- E-10: `lib/widget/order/so_extra_line_list.dart` - SOExtraLineListWidget, _SalesOrderExtraLineListWidgetState, PaginatedSOExtraLineList, _PaginatedSOExtraLineListStateクラス定義
- E-11: `lib/widget/order/so_line_detail.dart` - SoLineDetailWidget, _SOLineDetailWidgetStateクラス定義
- E-12: `lib/widget/order/so_line_list.dart` - PaginatedSOLineList, _PaginatedSOLineListStateクラス定義
- E-13: `lib/widget/order/so_shipment_detail.dart` - SOShipmentDetailWidget, _SOShipmentDetailWidgetStateクラス定義
- E-14: `lib/widget/order/so_shipment_list.dart` - SOShipmentListWidget, _SOShipmentListWidgetState, PaginatedSOShipmentList, _PaginatedSOShipmentListStateクラス定義

## 3) Claims と根拠の対応（レビューの主戦場）

### extra_line_detail.dart (UT-ORD-001 - UT-ORD-008)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-01 | ExtraLineDetailWidgetコンストラクタがInvenTreeExtraLineItemを受け取る | E-01: line 12-15 `const ExtraLineDetailWidget(this.item, {Key? key})` | ○ |
| C-02 | getAppBarTitle()がL10().extraLineItemを返す | E-01: line 26 `String getAppBarTitle() => L10().extraLineItem` | ○ |
| C-03 | appBarActions()がcanEdit条件で編集ボタンを表示 | E-01: line 29-44 `if (widget.item.canEdit)` | ○ |
| C-04 | request()がreload()を呼び出す | E-01: line 48-50 `await widget.item.reload()` | ○ |
| C-05 | _editLineItem()がeditFormを呼び出す | E-01: line 53-65 `widget.item.editForm()` | ○ |
| C-06 | getTiles()がnotesの条件付き表示を行う | E-01: line 105-113 `if (widget.item.notes.isNotEmpty)` | ○ |

### po_extra_line_list.dart (UT-ORD-009 - UT-ORD-016)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-07 | POExtraLineListWidgetコンストラクタがorderとfiltersを受け取る | E-02: line 13-15 `const POExtraLineListWidget(this.order, {this.filters = const {}})` | ○ |
| C-08 | _addLineItem()がcreateFormを呼び出す | E-02: line 33-47 `InvenTreePOExtraLineItem().createForm()` | ○ |
| C-09 | actionButtons()がcanEdit条件でボタンを表示 | E-02: line 50-66 `if (widget.order.canEdit)` | ○ |
| C-10 | requestPage()がlistPaginatedを呼び出す | E-02: line 94-105 `InvenTreePOExtraLineItem().listPaginated()` | ○ |
| C-11 | buildItem()がListTileを返す | E-02: line 107-121 `return ListTile()` | ○ |

### po_line_detail.dart (UT-ORD-017 - UT-ORD-027)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-12 | POLineDetailWidgetコンストラクタがInvenTreePOLineItemを受け取る | E-03: line 23-24 `const POLineDetailWidget(this.item, {Key? key})` | ○ |
| C-13 | actionButtons()がcanCreateとisComplete条件で受領ボタンを表示 | E-03: line 62-81 `if (widget.item.canCreate) { if (!widget.item.isComplete)` | ○ |
| C-14 | request()がdestinationId条件でlocationを取得 | E-03: line 84-110 `if (widget.item.destinationId > 0)` | ○ |
| C-15 | receiveLineItem()がreceive()を呼び出す | E-03: line 128-136 `widget.item.receive()` | ○ |
| C-16 | getTiles()がreference条件付き表示を行う | E-03: line 208-216 `if (widget.item.reference.isNotEmpty)` | ○ |

### po_line_list.dart (UT-ORD-028 - UT-ORD-033)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-17 | orderingOptionsがpart, SKU, quantityを含む | E-04: line 41-45 `"part": L10().part, "SKU": L10().sku, "quantity": L10().quantity` | ○ |
| C-18 | filterOptionsがpending, receivedを含む | E-04: line 47-59 `"pending": {...}, "received": {...}` | ○ |
| C-19 | buildItem()がsupplierPartがnullの場合にエラータイルを返す | E-04: line 99-108 `} else { return ListTile(title: Text(L10().error)` | ○ |

### purchase_order_detail.dart (UT-ORD-034 - UT-ORD-056)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-20 | getAppBarTitle()がreferenceを含むタイトルを返す | E-05: line 62-70 `if (widget.order.reference.isNotEmpty) { title += " - ${widget.order.reference}" }` | ○ |
| C-21 | actionButtons()がisPending条件でラインアイテム追加と発行ボタンを表示 | E-05: line 107-128 `if (widget.order.isPending)` | ○ |
| C-22 | actionButtons()がisOpen && !isPending条件で完了ボタンを表示 | E-05: line 130-140 `if (widget.order.isOpen && !widget.order.isPending)` | ○ |
| C-23 | _addLineItem()がcreateFormを呼び出す | E-05: line 159-177 `InvenTreePOLineItem().createForm()` | ○ |
| C-24 | _issueOrder()がconfirmationDialogを表示 | E-05: line 191-204 `confirmationDialog(L10().issueOrder)` | ○ |
| C-25 | _completeOrder()がlaunchApiFormを呼び出す | E-05: line 207-222 `launchApiForm()` | ○ |
| C-26 | _cancelOrder()がconfirmationDialogを表示 | E-05: line 225-238 `confirmationDialog(L10().cancelOrder)` | ○ |
| C-27 | barcodeButtons()がsupportsBarcodePOReceiveEndpoint条件でスキャンボタンを表示 | E-05: line 244-259 `if (api.supportsBarcodePOReceiveEndpoint && widget.order.isPlaced)` | ○ |
| C-28 | request()がcompletedLinesを計算 | E-05: line 298-304 `for (var line in lines) { if (line.isComplete) { completedLines += 1 } }` | ○ |
| C-29 | editOrder()がsupplierフィールドを除外 | E-05: line 368 `fields.remove("supplier")` | ○ |
| C-30 | getTabIcons()が3つのタブを返す | E-05: line 615-621 `Tab(text: L10().details), Tab(text: L10().lineItems), Tab(text: L10().received)` | ○ |

### purchase_order_list.dart (UT-ORD-057 - UT-ORD-067)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-31 | actionButtons()がcanCreate条件で作成ボタンを表示 | E-06: line 38-54 `if (InvenTreePurchaseOrder().canCreate)` | ○ |
| C-32 | _createPurchaseOrder()がcontactフィールドを除外 | E-06: line 61 `fields.remove("contact")` | ○ |
| C-33 | barcodeButtons()がsupportsBarcodePOReceiveEndpoint条件でスキャンボタンを表示 | E-06: line 79-95 `if (api.supportsBarcodePOReceiveEndpoint)` | ○ |
| C-34 | orderingOptionsがreference, supplier__name, status, target_dateを含む | E-06: line 123-128 | ○ |
| C-35 | filterOptionsがoutstanding, overdue, assigned_to_meを含む | E-06: line 131-148 | ○ |
| C-36 | buildItem()がsupplierがnullの場合にleadingがnullになる | E-06: line 175-177 `leading: supplier == null ? null` | ○ |

### sales_order_detail.dart (UT-ORD-068 - UT-ORD-089)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-37 | _addShipment()がcreateFormを呼び出す | E-07: line 80-94 `InvenTreeSalesOrderShipment().createForm()` | ○ |
| C-38 | _addLineItem()がcreateFormを呼び出す | E-07: line 97-111 `InvenTreeSOLineItem().createForm()` | ○ |
| C-39 | _issueOrder()がconfirmationDialogを表示 | E-07: line 125-138 `confirmationDialog(L10().issueOrder)` | ○ |
| C-40 | _cancelOrder()がconfirmationDialogを表示 | E-07: line 141-154 `confirmationDialog(L10().cancelOrder)` | ○ |
| C-41 | actionButtons()がisPending条件で発行ボタンを表示 | E-07: line 172-182 `if (widget.order.isPending)` | ○ |
| C-42 | actionButtons()がisPending || isInProgress条件でラインアイテム追加ボタンを表示 | E-07: line 197-218 `if ((widget.order.isPending || widget.order.isInProgress) && InvenTreeSOLineItem().canCreate)` | ○ |
| C-43 | barcodeButtons()がsupportsBarcodeSOAllocateEndpoint条件で割当ボタンを表示 | E-07: line 242-255 `if (api.supportsBarcodeSOAllocateEndpoint)` | ○ |
| C-44 | editOrder()がcustomerフィールドを除外 | E-07: line 313 `fields.remove("customer")` | ○ |
| C-45 | orderTiles()がshipmentCount条件でshipmentタイルを表示 | E-07: line 413-428 `if (widget.order.shipmentCount > 0)` | ○ |
| C-46 | getTabIcons()が3つのタブを返す | E-07: line 542-547 `Tab(text: L10().details), Tab(text: L10().lineItems), Tab(text: L10().shipments)` | ○ |

### sales_order_list.dart (UT-ORD-090 - UT-ORD-100)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-47 | actionButtons()がcanCreate条件で作成ボタンを表示 | E-08: line 33-49 `if (InvenTreeSalesOrder().canCreate)` | ○ |
| C-48 | _createSalesOrder()がcontactフィールドを除外 | E-08: line 56 `fields.remove("contact")` | ○ |
| C-49 | buildItem()がtotalPrice条件でsubtitleに価格を含める | E-08: line 156-159 `if (order.totalPrice != null && order.totalPrice! > 0)` | ○ |
| C-50 | buildItem()がcustomerがnullの場合にdescriptionを表示 | E-08: line 155 `String subtitle = customer?.name ?? order.description` | ○ |

### so_allocation_list.dart (UT-ORD-101 - UT-ORD-105)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-51 | requestPage()がlistPaginatedを呼び出す | E-09: line 37-49 `InvenTreeSalesOrderAllocation().listPaginated()` | ○ |
| C-52 | buildItem()がpartがnullの場合に空文字列を表示 | E-09: line 61 `Text(part?.fullname ?? "")` | ○ |
| C-53 | buildItem()がlocationがnullの場合にlocationNotSetを表示 | E-09: line 62 `Text(location?.pathstring ?? L10().locationNotSet)` | ○ |

### so_extra_line_list.dart (UT-ORD-106 - UT-ORD-111)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-54 | _addLineItem()がcreateFormを呼び出す | E-10: line 35-49 `InvenTreeSOExtraLineItem().createForm()` | ○ |
| C-55 | actionButtons()がcanEdit条件でボタンを表示 | E-10: line 52-68 `if (widget.order.canEdit)` | ○ |
| C-56 | requestPage()がlistPaginatedを呼び出す | E-10: line 96-107 `InvenTreeSOExtraLineItem().listPaginated()` | ○ |

### so_line_detail.dart (UT-ORD-112 - UT-ORD-125)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-57 | _allocateStock()がorderがnullの場合に早期リターン | E-11: line 59-62 `if (order == null) { return }` | ○ |
| C-58 | _allocateStock()がlaunchApiFormを呼び出す | E-11: line 75-86 `launchApiForm()` | ○ |
| C-59 | _editLineItem()がshipped > 0の場合にpartフィールドを非表示 | E-11: line 92-94 `if (widget.item.shipped > 0) { fields["part"]?["hidden"] = true }` | ○ |
| C-60 | actionButtons()がorder != null && order.isOpen条件で割当ボタンを表示 | E-11: line 108-124 `if (order != null && order!.isOpen)` | ○ |
| C-61 | barcodeButtons()がsupportsBarcodeSOAllocateEndpoint条件でスキャンボタンを表示 | E-11: line 131-147 `if (api.supportsBarcodeSOAllocateEndpoint)` | ○ |
| C-62 | getTiles()がreference条件付き表示を行う | E-11: line 225-233 `if (widget.item.reference.isNotEmpty)` | ○ |
| C-63 | getTiles()がnotes条件付き表示を行う | E-11: line 236-244 `if (widget.item.notes.isNotEmpty)` | ○ |

### so_line_list.dart (UT-ORD-126 - UT-ORD-130)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-64 | orderingOptionsがpart, quantityを含む | E-12: line 39-42 `"part": L10().part, "quantity": L10().quantity` | ○ |
| C-65 | buildItem()がpartがnullの場合にエラータイルを返す | E-12: line 85-93 `} else { return ListTile(title: Text(L10().error)` | ○ |

### so_shipment_detail.dart (UT-ORD-131 - UT-ORD-149)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-66 | _editShipment()がeditFormを呼び出す | E-13: line 62-76 `widget.shipment.editForm()` | ○ |
| C-67 | _sendShipment()がlaunchApiFormを呼び出す | E-13: line 121-143 `launchApiForm()` | ○ |
| C-68 | _sendShipment()がisShipped条件で既存日付を使用 | E-13: line 124-126 `widget.shipment.isShipped ? widget.shipment.shipment_date! : DateTime.now()` | ○ |
| C-69 | actionButtons()がcanEdit == false条件で早期リターン | E-13: line 149-152 `if (!widget.shipment.canEdit) { return actions }` | ○ |
| C-70 | actionButtons()がisChecked && !isShipped条件でチェック解除ボタンを表示 | E-13: line 185-198 `if (widget.shipment.isChecked && !widget.shipment.isShipped)` | ○ |
| C-71 | actionButtons()が!isShipped条件で出荷ボタンを表示 | E-13: line 200-211 `if (!widget.shipment.isShipped)` | ○ |
| C-72 | shipmentTiles()がinvoice_number条件付き表示を行う | E-13: line 256-264 `if (widget.shipment.invoice_number.isNotEmpty)` | ○ |
| C-73 | shipmentTiles()がtracking_number条件付き表示を行う | E-13: line 267-275 `if (widget.shipment.tracking_number.isNotEmpty)` | ○ |
| C-74 | getTabIcons()が2つのタブを返す | E-13: line 367-369 `Tab(text: L10().details), Tab(text: L10().allocatedStock)` | ○ |

### so_shipment_list.dart (UT-ORD-150 - UT-ORD-156)
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-75 | SOShipmentListWidgetコンストラクタがtitleとfiltersを受け取る | E-14: line 12-17 `const SOShipmentListWidget({this.title = "", this.filters = const {}})` | ○ |
| C-76 | requestPage()がlistPaginatedを呼び出す | E-14: line 66-77 `InvenTreeSalesOrderShipment().listPaginated()` | ○ |
| C-77 | buildItem()がisShipped条件でアイコンと日付を表示 | E-14: line 92-97 `leading: shipment.isShipped ? Icon(...) : Icon(...), trailing: shipment.isShipped ? LargeText(shipment.shipment_date) : LargeText(L10().pending)` | ○ |
| C-78 | buildItem()がorderがnullの場合にL10().salesOrderを表示 | E-14: line 85-86 `"${order?.reference ?? L10().salesOrder}"` | ○ |

## 4) 不足情報（Unknown / Missing）
- 該当なし
  - 全てのテストケースはソースコードの解析に基づいて生成されており、根拠が存在します。

## 5) リスクフラグ（レビュー観点）
- **0（低リスク）**: 全てのテストケースがソースコードに基づいており、高い信頼性があります。
- 注意点：
  - 実際のテスト実装時には、モックオブジェクトの準備が必要です（InvenTreeAPI, BuildContext等）
  - Flutter Widgetテストの特性上、Widgetのビルドコンテキストが必要なケースがあります
  - 非同期処理（Future）のテストには適切なawait処理が必要です

## 6) レビュアーチェックリスト（最小）
- [ ] テストケースの網羅性：14ファイル全てのpublicメソッドがカバーされているか
- [ ] 正常系・異常系・境界値のバランス：各クラスに対して適切な観点が含まれているか
- [ ] 優先度の妥当性：ビジネスロジック（注文発行・完了・キャンセル等）が「高」になっているか
- [ ] 条件分岐のカバレッジ：canEdit, canCreate, isOpen, isPending等の状態による分岐がテストされているか
- [ ] nullハンドリング：supplier, customer, order等のnullチェックが含まれているか
