# プログラム仕様書　BV23600P（他社直卸分発送伝票送付書（傭車便）　センター登録）

| 項目 | 内容 |
|---|---|
| システムID | BV |
| 参考資料 | ・現行ソース BV23600P.pl1<br/>・現行の解析資料 BV0180_他社直卸出発入力（傭車.xlsx（シート「資産一覧」「Link XCTL 一覧」「レコードフォーマット」「SRC_BV23600P」） |
| 項目名の出典 | 送受信データ・マスターの項目は解析資料のシート「レコードフォーマット」の日本語名称 |

---

## 1. 概要

| 項目 | 内容 |
|---|---|
| プログラムID | BV23600P（手続き名：BV23600） |
| プログラム名称 | 他社直卸分発送伝票送付書（傭車便）センター登録（ソースの冒頭コメントは空欄。処理内容から命名） |
| 言語 | PL/I（CICS コマンドレベル） |
| 処理形態 | オンライン（APPC 会話の相手側。画面なし） |
| 動作環境 | CIC1（センター側） |
| トランザクションID | B36V（DDP の BV13600P から CONNECT PROCESS で起動される） |
| パターンID | PPOC050P（1987/05/06）、業務 BXHEAD30 |
| 呼出し元 | BV13600P（BV36）。新規の送付書（区分 '2'・'5'）のときだけ呼ばれる |
| 更新ファイル | VKUNKSH（運行指令マスター）更新 |
| 呼出しモジュール | SC20100P（日付取得、LINK）、LSS0030A（応答コードの16進文字変換） |

### 1.1 機能概要

DDP で入力した新規の送付書を、センターの運行指令マスターに登録する。処理内容は自社便版（BV23200P）と同じ。

1. 指令書ＮＯ で運行指令マスターを更新モードで読む。
2. 入力年月日（処理日付）をセットする。
3. 発店が積店として登録されていなければ、積店（最大3店）に発店と出発年月日時分を追加する。
4. 送付書ＮＯ を送付書の一覧に追加する（すでにあり発到区分が '2' なら '3' にする）。
5. 運行指令マスターを書き換え、結果を DDP に返す。

```mermaid
flowchart LR
    DDP[DDP BV13600P<br/>BV36] -- 送付書データ 42バイト --> B36V[B36V<br/>本プログラム]
    B36V -- 結果 22バイト --> DDP
    B36V <--> UNK[(VKUNKSH<br/>運行指令マスター)]
    B36V -- LINK --> SC[SC20100P<br/>日付取得]
```

---

## 2. インターフェース

### 2.1 受信データ（42バイト）

トランザクションID（4）＋ DPCEB36V。

| 項目ID | 項目名 | 桁 | 用途 |
|---|---|---|---|
| B36VSRNO | 指令書ＮＯ | 9 | 運行指令マスターのキー |
| B36VSOFN | 送付書ＮＯ | 8 | 送付書の一覧に追加 |
| B36VSYMD | 年月日 | 6 | 積店の出発年月日時分 |
| B36VDHMM | 時分 | 4 | 同上 |
| B36VSTNC | 発店 | 4 | 積店の店所コード |
| B36VSRCT | 着店 | 4 | 使用しない |
| B36VBNKB | 運行車区分 | 2 | 使用しない |
| B36VTSKB | 積区分 | 1 | 使用しない |

### 2.2 送信データ（22バイト）

エラーフラグ（1）＋エラーコード（4）＋ CEDPBV36（指令書ＮＯ・送付書ＮＯ）。送信前に全体を空にし、エラーフラグを '0' にする。CEDPBV36 の指令書ＮＯ・送付書ＮＯ はセットしない。

| エラーフラグ | 意味 | エラーコード |
|---|---|---|
| '0' | 正常（運行指令マスターを更新した） | 空白 |
| '1' | 運行指令マスターに指令書がない | 空白 |
| '2' | 読込みエラー、CICS のエラー | 読込みエラーのときは応答コード（EIBRCODE の先頭2バイト）を16進文字に変換した値 |

### 2.3 運行指令マスター（VKUNKSH）の更新項目

| 項目 | 内容 |
|---|---|
| 入力年月日（処理日付）（VBKINYMD） | SC20100P で取得した日付 |
| 積店所数（VBKGTTSU） | 発店が第１～第３積店のどれでもなく、積店所数が 3 未満なら 1 増やす |
| 第１～第３積店 積店所コード（VBKGETEN・VBKGFTEN・VBKGGTEN） | 増やした積店所数の位置に発店をセット |
| 第１～第３積店 出発年月日時分（VBKGETIM・VBKGFTIM・VBKGGTIM） | 同じ位置に「年月日×10000＋時分」をセット |
| 送付書枚数（VBKBSOFM） | 送付書ＮＯ が一覧にない（または発到区分 '2' でない）場合に 1 増やす |
| 送付書ＮＯ（VBKBSENO） | 増やした位置に送付書ＮＯ をセット |
| 発到区分（VBKBHTKB） | 一覧に同じ送付書ＮＯ があり発到区分が '2' なら '3' に変える。新しく追加した場合は '1'（4章 1 参照） |
| 取消区分（VBKBTKID） | 新しく追加した場合は空白（4章 1 参照） |

---

## 3. 処理仕様

### 3.1 処理の流れ

```mermaid
flowchart TD
    S([開始]) --> RCV[送付書データを受信]
    RCV --> RD[運行指令マスターを更新モードで読む]
    RD -- なし --> E1[エラーフラグ 1]
    RD -- エラー --> E2[エラーフラグ 2・応答コード]
    RD -- あり --> DT[入力年月日をセット<br/>SC20100P]
    DT --> TS[積店の追加 3.2]
    TS --> SF[送付書の追加 3.3]
    SF --> RW[運行指令マスターを書き換え]
    E1 --> SND
    E2 --> SND
    RW --> SND[結果を送信<br/>終了データを受信して終了]
```

### 3.2 積店の追加

1. 発店が、第１～第３積店の積店所コードのどれかと同じなら何もしない。
2. 違う場合、積店所数が 3 未満なら 1 増やし、その位置（第１・第２・第３積店）の積店所コードに発店、出発年月日時分に「年月日×10000＋時分」をセットする。積店所数が 3 なら何もしない。

### 3.3 送付書の追加

1. 送付書の一覧（送付書枚数分）から、受信した送付書ＮＯ と同じものを探す。同じ送付書ＮＯ で発到区分が '2' のものがあれば、発到区分を '3' にする。
2. 1 に当たるものがなければ、送付書枚数を 1 増やし、その位置に送付書ＮＯ をセットする。取消区分を空白、発到区分を '1' にする。
3. レコード長を「650＋7×送付書枚数」にして運行指令マスターを書き換える。

### 3.4 送受信・エラー処理

1. 結果（22バイト）を送信して応答を待ち（SEND INVITE WAIT）、DDP からの終了データを受信して終了する。
2. CICS のエラー（HANDLE CONDITION ERROR）が発生した場合は、エラーフラグ '2' にして送信する。

---

## 4. 補足・留意事項

1. **発到区分・取消区分の一括設定**：新しく送付書を追加するとき、発到区分・取消区分を添え字なしでセットしている（「VBKBHTKB ＝ '1'」「VBKBTKID ＝ ' '」）。PL/I では配列全体への代入になるため、追加した送付書だけでなく、一覧のすべての送付書の発到区分が '1'、取消区分が空白になる。
2. **同じ送付書ＮＯ の再登録**：同じ送付書ＮＯ がすでに一覧にあっても、発到区分が '2' でなければもう1件追加される。BV13500P はセンターに送付書があっても新規（区分 '2'）として扱うため（BV13500P_仕様書.md 7章 1）、再入力すると同じ送付書ＮＯ が重ねて追加される場合がある。
3. **積店が4店以上**：積店所数が 3 の場合は、発店が積店になくても追加しない（エラーにもしない）。
4. **書換えの結果を判定しない**：運行指令マスターの書換えに失敗しても、エラーフラグは '0' のまま返す（CICS のエラー処理に入った場合を除く）。
5. **DDP 側の判定**：自社便版と違い、DDP の BV13600P はエラーフラグが '0' 以外なら「センター登録エラー」にする（BV13600P_仕様書.md 4.5）。
6. **使っていない項目**：受信データの着店・運行車区分・積区分は使っていない。
