# プログラム仕様書　BV28100P（他社直卸し中継渡し入力（委託票）　センター登録）

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

---

## 1. 概要

| 項目 | 内容 |
|---|---|
| プログラムID | BV28100P（手続き名：BV28100） |
| プログラム名称 | 他社直卸し中継渡し入力（委託票）センター登録（ソースの冒頭コメントは「ＫＳＤＳ・ＵＰＤＡＴＥ　センター　ＣＩＣＳ」。処理内容から命名） |
| 言語 | PL/I（CICS コマンドレベル） |
| 処理形態 | オンライン（APPC 会話の相手側。画面なし） |
| 動作環境 | CIC1（センター側） |
| トランザクションID | B81V（DDP の BV18100P から CONNECT PROCESS で起動される） |
| パターンID | PPOC050P（1987/05/06）、業務 BXHEAD30 |
| 呼出し元 | BV18100P（BV81） |
| 更新ファイル | VKUNKSH（運行指令マスター）更新 |
| 呼出しモジュール | SC20100P（日付取得、LINK）。LSS0030A は定義だけで使っていない |

### 1.1 機能概要

DDP で入力した中継渡しの到着を、センターの運行指令マスターに登録する。

1. 入力年月日（処理日付）をセットする。
2. 到着店所が最終卸店なら、実績年月日時分に到着日時をセットする。
3. 到着店所が卸店（最大3店）として登録されていなければ、卸店に追加する。
4. 送付書ＮＯ の発到区分を「発送のみ」から「発送・到着」にする（一覧になければ「到着のみ」で追加する）。
5. 運行指令マスターを書き換え、結果を DDP に返す。

回送区分によって、更新する指令書が変わる（1：受信した指令書ＮＯ、2：行き分・回送帰り分の指令書（最大4件））。BV18100P は常に回送区分 1 で呼ぶ。

```mermaid
flowchart LR
    DDP[DDP BV18100P<br/>BV81] -- 到着データ 57バイト --> B81V[B81V<br/>本プログラム]
    B81V -- 結果 24バイト --> DDP
    B81V <--> UNK[(VKUNKSH<br/>運行指令マスター)]
    B81V -- LINK --> SC[SC20100P<br/>日付取得]
```

---

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

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

トランザクションID（4）＋ DPCEB81V（他社直卸し中継渡し入力（委）［ＤＣ］）。

| 項目ID | 項目名 | 用途 |
|---|---|---|
| B81VSRNO | 指令書ＮＯ | 回送区分 1 のとき、運行指令マスターのキー |
| B81VSOFN | 送付書ＮＯ | 送付書の一覧の更新 |
| B81VKSKB | 回送区分 | 1：受信した指令書を更新、2：行き分・回送帰り分の指令書を更新、それ以外：何もしない |
| B81VTTCD | 店所コード | 到着店所（卸店・最終卸店の判定） |
| B81VTYMD・B81VTHHM | 年月日・時分 | 到着年月日時分 |
| B81VORKB | 卸し区分 | 使用しない |
| B81VKONO(1)・(2) | 行き分 | 回送区分 2 のとき更新する指令書ＮＯ（0 なら処理しない） |
| B81VKFNO(1)・(2) | 回送帰り分 | 同上 |

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

エラーフラグ（1）＋エラーコード（4）＋ CEDPBV81（指令書ＮＯ BV81SRNO・送付書ＮＯ BV81SOFN・回送区分 BV81KSKB に受信した値をセット）。送信前に全体を空にし、エラーフラグを '0' にする。

| エラーフラグ | 意味 | エラーコード |
|---|---|---|
| '0' | 正常 | 空白 |
| '1' | 運行指令マスターが読めない、または書換えエラー | 空白 |
| '2' | CICS のエラー | 'BU02' |

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

| 項目 | 内容 |
|---|---|
| 入力年月日（処理日付）（VBKINYMD） | SC20100P で取得した日付 |
| 実績年月日時分（VBKGXTIM） | 着店コード（最終卸店）（VBKGJCCD）が到着店所と同じなら「年月日×10000＋時分」 |
| 卸店所数（VBKGORTS） | 到着店所が登録済みの卸店のどれでもなく、卸店所数が 3 未満なら 1 増やす |
| 第１～第３卸店の店所コード（VBKGHTEN・VBKGITEN・VBKGJTEN） | 増やした卸店所数の位置に到着店所をセット |
| 第１～第３卸店の到着年月日時分（VBKGHTIM・VBKGITIM・VBKGJTIM） | 同じ位置に「年月日×10000＋時分」をセット |
| 発到区分（VBKBHTKB） | 一覧に同じ送付書ＮＯ があり発到区分が '1'（発送）なら '3' に変える。一覧になければ追加して '2' にする |
| 送付書枚数・送付書ＮＯ・取消区分（VBKBSOFM・VBKBSENO・VBKBTKID） | 一覧になければ、送付書枚数を 1 増やし、その位置に送付書ＮＯ・取消区分空白をセット |

---

## 3. 処理仕様

### 3.1 処理の流れ

```mermaid
flowchart TD
    S([開始]) --> RCV[到着データを受信<br/>SC20100P で日付取得]
    RCV --> K{回送区分}
    K -- 1 --> ONE[受信した指令書ＮＯで<br/>3.2 の更新]
    K -- 2 --> LOOP[行き分・回送帰り分の<br/>指令書ＮＯごとに 3.2 の更新]
    K -- それ以外 --> SND
    ONE --> SND
    LOOP --> SND[結果を送信<br/>終了データを受信して終了]
```

### 3.2 運行指令マスターの更新

1. 指令書ＮＯ で運行指令マスターを更新モードで読む。読めなければエラーフラグ '1' にして送信する。
2. 入力年月日に処理日付をセットする。
3. 着店コード（最終卸店）が到着店所と同じなら、実績年月日時分に到着日時をセットする。
4. 卸店の追加：卸店所数で分ける。

| 卸店所数 | 処理 |
|---|---|
| 0 | 卸店所数を 1 にし、第１卸店に到着店所・到着日時をセット |
| 1 | 第１卸店が到着店所でなければ、卸店所数を 2 にし、第２卸店に到着店所・到着日時をセット |
| 2 | 第１・第２卸店のどちらも到着店所でなければ、卸店所数を 3 にし、第３卸店に到着店所・到着日時をセット |
| 3 以上 | 何もしない |

5. 送付書の一覧（送付書枚数分）から送付書ＮＯ を探す。
   - あれば、発到区分が '1' なら '3' にする（'1' 以外はそのまま）。
   - なければ、送付書枚数を 1 増やし、送付書ＮＯ・取消区分空白・発到区分 '2' を追加する。
6. レコード長を「650＋7×送付書枚数」にして書き換える。書換えエラーはエラーフラグ '1'。

回送区分 2 の場合は、行き分（2件）・回送帰り分（2件）の指令書ＮＯ を順に処理し、0 の指令書ＮＯ は飛ばす。途中で読込み・書換えエラーになったら、そこで送信する（それまでに更新した指令書はそのまま）。

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

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

---

## 4. 補足・留意事項

1. **回送区分 1 の書換えエラー**：回送区分 1 では書換えエラーでもエラーフラグ '1' にしてそのまま送信する。回送区分 2 では書換えエラーでその時点で送信する。
2. **発到区分の意味**：発到区分 '1' は発送、'2' は到着、'3' は発送・到着と読み取れる（自社便・傭車便の発送入力 BV23200P・BV23600P は新しい送付書を '1' で追加し、'2' のものを '3' にしている）。
3. **卸店が4店以上**：卸店所数が 3 の場合は、到着店所が卸店になくても追加しない（エラーにもしない）。
4. **卸し区分を使わない**：受信した卸し区分（BV18100P は 0 を送る）は使っていない。
5. **同じ送付書ＮＯ が複数ある場合**：一覧の最初に見つかった送付書ＮＯ だけを更新する。
