Files
cobol-tna-system/詳細設計書/詳細設計書_SHA05TWN.md
qiuqiuqiu 71232af484 Add Subsystem D (SHA01-10): social insurance subsystem + design-resource consistency fixes
- Add SHA01CVT-SHA10S10: all 10 programs, COPY books (13), binaries,
  design docs, resource usage lists, DDL schema_sha.sql
- Add KYU01REC-KYU06REC COPY books (previously missing from git)
- Fix design-code inconsistencies detected in audit:
  - SHA07KBR: remove dead SHACHKAC COPY (SUB04CHK never called)
  - SHA02MNC: 2020TYPSOR paragraph -> inline EVALUATE; SUB04CHK = PARM val
  - SHA05TWN: REVISED-TYPE values 'C'/'N' -> 'A'(定期決定)/'B'(月変)
  - SHA03MNP: 2010CALCSOR/2020WRTSOR -> inline implementation
  - SHA04TWO: remove GRADE-HISTORY from DB table list (not accessed)
  - SHA06TWM: add SALARYDB.EMP-MASTER to DB table list
  - SHA10S10: fix error file W99OUTFIL, 10+1 file count
- Fix comment column alignment (Area A col 7) in SHA07KBR, SHA08SRT
- Update KYU source/design docs: BOM removal, classification comment cleanup
- Update README: Subsystem D added, program count 39
2026-07-15 20:32:51 +08:00

148 lines
6.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 詳細設計書
## 基本情報
| # | 項目 | 内容 |
|---|------|------|
| 1 | システム名 | 社会保険管理システム |
| 2 | プログラムID | SHA05TWN |
| 3 | プログラム名 | 標準報酬月額等級判定処理 |
| 4 | PGMタイプ | メイン |
| 5 | PGMパターン | マッチング(N:1→N:1 2段階) |
| 6 | 機能概要 | 月額給与データ(SALARY-MONTHLY)を社員番号(EMP-ID)でN:1集約し、平均標準報酬月額を算出する。 |
| 7 | | 第1段階(N:1):社員番号キーブレイクで月額給与を平均化 |
| 8 | | 第2段階(N:1):平均標準報酬月額と等級テーブル(GRADE-TBL)をマッチングし、等級改定判定を実施 |
※PGMタイプ:メイン、サブ
※PGMパターン:マッチング(1:1、1:N、N:1、M:N)、レイアウト編集のみ(GETPUT)、振り分け(IF文、EVALUATE文)、キーブレイク(集計、集約、集計・集約の以外)、DB更新
### 前提条件
| NO | 対象ファイル | 条件 |
|----|-------------|------|
| 1 | ファイルR01SALARY-MONTHLY | 社員番号(EMP-ID)+対象年月(YEAR-MONTH)の昇順ソート済 |
| 2 | ファイルR02GRADE-TBL | 等級コード(GRADE-CODE)の昇順ソート済、重複なし |
### 使用ファイル一覧
| NO | 使用ファイル/DB名 | 識別子 | DD名 | I/O | COPY群 | 形式 | ブロック | レコード長 | 媒体 | 備考 |
|----|------------------|--------|------|-----|--------|------|---------|-----------|------|------|
| 1 | SALARY-MONTHLY | R01 | SHA05R01 | I | 自前(200B) | FB | | 200 | PS | 月額給与データ(Cサブシステム由来) |
| 2 | GRADE-TBL | R02 | SHA05R02 | I | 自前(80B) | FB | | 80 | PS | 等級定義テーブル |
| 3 | REVISED-GRADE | W01 | SHA05W01 | O | SHA05REC | FB | | 200 | PS | 等級改定結果 |
| 4 | ERROR-LOG | W02 | SHA05W02 | O | ZAN05REC | VB | | 200 | PS | エラー退避 |
### キー項目一覧
| NO | ファイル名 | ソート条件(キー項目) | キー条件(マッチング/キーブレイク) |
|----|-----------|---------------------|-------------------------------------------|
| 1 | ファイルR01 | EMP-ID + YEAR-MONTH | EMP-ID(第1段階キーブレイク, N:1) |
| 2 | ファイルR02 | GRADE-CODE | 平均標準報酬月額(第2段階, N:1) |
### 使用モジュール一覧
| NO | 機能 | プログラムID | 使用COPY名 |
|----|------|-------------|-----------|
| 1 | 運用日付取得SUB | SUB01DAT | SHADATAC |
| 2 | メッセージ編集出力SUB | SUB02MSG | SHAMSGAC |
| 3 | ABEND処理SUB | SUB03END | SHAENDAC |
---
## 処理詳細
```
1.初期処理(1000ITTSOR
1-1.開始メッセージ出力
【メッセージ編集】
メッセージ番号:1(開始メッセージ)
1-2.コンパイル日時出力
【メッセージ編集】
メッセージ番号:33(コンパイル日時)
PARM1:コンパイル日時
PARM2'COMPILED'
1-3.ワークエリアの初期化
PARM(対象年月 YYYYMM)をACCEPT COMMAND-LINEから取得
未設定時はデフォルト'202607'を使用
1-4.運用日付取得SUB(SUB01DAT)により運用日を取得する。
復帰コード≠ZEROの場合、メッセージを出力し、ABEND処理SUBを呼び出し異常終了する。
【メッセージ編集】
メッセージ番号:5(サブエラー)
PARM1'SUB01DAT'
PARM2:復帰コード
【ABEND処理SUB】
ABENDコード:999
1-5.使用ファイルのオープン
1-6.R02GRADE-TBL)を全件読み込み、内部テーブル(GRADE-TBL)に格納する。(1110R02LDASOR
1-7.R01を読み込む。(1100R01INNSOR)(1回目)
2.主処理(2000MAJSOR)(R01を全て読み終えるまで下記を繰り返す)
2-1.第1段階:キーブレイクN:1集約(2010KEYBRSOR
2-1-1.同一EMP-IDのレコードを集約
2-1-2.MONTHLY-AMOUNTをADD TOで累積加算
2-1-3.COUNTをADD 1でカウント
2-1-4.グループ内の月数をカウント(WRK-MONTH-COUNT
2-1-5.キー変更時(新EMP-ID検出)、以下の処理を実行
2-1-5-1.WRK-TOTAL ÷ WRK-COUNT = 平均標準報酬月額
DIVIDE WRK-TOTAL BY WRK-COUNT GIVING WRK-AVG
REMAINDER WRK-REM
2-1-5-2.定時決定(4-6ヶ月平均)or 月変(3ヶ月平均)の判定
IF WRK-MONTH-COUNT >= 4 → 定時決定(TYPE='A'
IF WRK-MONTH-COUNT = 3 → 月変(TYPE='B'
ELSE → ERROR-LOGに出力
2-2.第2段階:等級テーブルN:1マッチング(2020GRADSOR
2-2-1.GRADE-TBLを平均標準報酬月額で線形探索
IF WRK-AVG >= MONTHLY-FROM AND WRK-AVG <= MONTHLY-TO
→ 該当等級コードを取得
2-2-2.該当等級なし→ ERROR-LOGに出力
2-2-3.該当等級あり→ 現在の等級と比較
2-2-3-1.現在等級はGRADE-HISTORYから取得(直近有効レコード)
2-2-3-2.OLD-GRADE ≠ NEW-GRADEの場合:REVISED-GRADEに出力
REVISED-TYPE='A'(定時決定:4-6ヶ月平均)/'B'(月変:3ヶ月平均)
2-2-3-3.OLD-GRADE = NEW-GRADEの場合:出力なし(変更不要)
2-2-4.WRK-ACCUMをINITIALIZEし、次のキーブレイクに備える
2-3.次のR01読み込み→次のキーグループへ(1100R01INNSOR
3.終了処理(3000STPSOR
3-1.入出力ファイルのクローズ
3-2.最終キーグループの処理(最終レコードの集約結果出力)
3-3.入出力件数出力メッセージ出力
【入力メッセージ編集】
メッセージ番号:6(入力件数メッセージ)
PARM1:当該入力ファイルのDD名
PARM2:当該入力ファイルの件数
【出力メッセージ編集】
メッセージ番号:7(出力件数メッセージ)
PARM1:当該出力ファイルのDD名
PARM2:当該出力ファイルの件数
3-4.終了メッセージ出力
【メッセージ編集】
メッセージ番号:2(終了メッセージ)
```
---
## 出力レコード定義
### 出力ファイル1W01/REVISED-GRADE
SHA05REC.cpyに従う。200B固定長。
| No | 項目名 | 設定元 | 備考 |
|----|--------|--------|------|
| 1 | EMP-ID | R01.EMP-ID | キーブレイク元の社員番号 |
| 2 | EMP-NAME | R01.EMP-NAME | キーブレイク元の氏名 |
| 3 | REVISED-YM | PARM(対象年月) | |
| 4 | OLD-GRADE | GRADE-HISTORYより取得 | 変更前等級 |
| 5 | NEW-GRADE | GRADE-TBLより取得 | 変更後等級 |
| 6 | AVG-STD-MONTHLY | 第1段階算出値 | DIVIDE結果(整数) |
| 7 | REVISED-TYPE | 'A'=定時決定/'B'=月変 | |
| 8 | FILLER | 初期値 | |
### 出力ファイル2W02/ERROR-LOG
| No | 項目名 | 設定元 | 備考 |
|----|--------|--------|------|
| 1 | ERR-CATEGORY | 01で固定 | エラー種別 |
| 2 | ERR-DETAIL | STRINGで編集 | エラー内容(EMP-ID + エラー理由) |