Files
cobol-tna-system/詳細設計書/詳細設計書_SHA06TWM.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

154 lines
7.3 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 | SHA06TWM |
| 3 | プログラム名 | 保険料率適用・控除計算処理 |
| 4 | PGMタイプ | メイン |
| 5 | PGMパターン | マッチング(M:N→M:N 2段階) |
| 6 | 機能概要 | 従業員保険情報データ(EMP-INSURANCE)をもとに、DB2 INSURANCE-RATESとAPPLICABLE-RULESの2段階M:Nマッチングで保険料を算出する。 |
| 7 | | 第1段階(M×N):各従業員の給与等級に対応する保険料率をDB2より取得し、保険料を計算 |
| 8 | | 第2段階(M:N):年齢・扶養人数・地域コードの条件に合致する適用ルールを探索し、料率を調整後、控除結果を出力 |
※PGMタイプ:メイン、サブ
※PGMパターン:マッチング(1:1、1:N、N:1、M:N)、レイアウト編集のみ(GETPUT)、振り分け(IF文、EVALUATE文)、キーブレイク(集計、集約、集計・集約の以外)、DB更新
### 前提条件
| NO | 対象ファイル | 条件 |
|----|-------------|------|
| 1 | ファイルR01EMP-INSURANCE | 社員番号(EMP-ID)の昇順ソート済 |
| 2 | ファイルR02APPLICABLE-RULES | ルールコード(RULE-CODE)の昇順ソート済 |
### 使用ファイル一覧
| NO | 使用ファイル/DB名 | 識別子 | DD名 | I/O | COPY群 | 形式 | ブロック | レコード長 | 媒体 | 備考 |
|----|------------------|--------|------|-----|--------|------|---------|-----------|------|------|
| 1 | EMP-INSURANCE | R01 | SHA06R01 | I | SHA02REC | FB | | 200 | PS | 従業員保険情報 |
| 2 | APPLICABLE-RULES | R02 | SHA06R02 | I | 自前(80B) | FB | | 80 | PS | 適用ルール定義テーブル |
| 3 | DEDUCTED-RESULT | W01 | SHA06W01 | O | SHA06REC | FB | | 300 | PS | 保険料確定結果 |
| 4 | ERROR-LOG | W02 | SHA06W02 | O | ZAN05REC | VB | | 200 | PS | エラー退避 |
| 5 | INSURANCEDB | DB | — | I | — | DB2 | — | — | DASD | DB2: INSURANCE-RATES |
| 6 | SALARYDB | DB | — | I | — | DB2 | — | — | DASD | DB2: EMP-MASTER(誕生日・扶養人数・地域コード取得) |
### キー項目一覧
| NO | ファイル名 | ソート条件(キー項目) | キー条件(マッチング/キーブレイク) |
|----|-----------|---------------------|-------------------------------------------|
| 1 | ファイルR01 | EMP-ID | EMP-ID(第1段階) |
| 2 | ファイルR02 | RULE-CODE | 年齢・扶養人数・地域コード(第2段階, M:N) |
### 使用モジュール一覧
| 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.ワークエリアの初期化
1-4.運用日付取得SUB(SUB01DAT)により運用日を取得する。
復帰コード≠ZEROの場合、メッセージを出力し、ABEND処理SUBを呼び出し異常終了する。
【メッセージ編集】
メッセージ番号:5(サブエラー)
PARM1'SUB01DAT'
PARM2:復帰コード
【ABEND処理SUB】
ABENDコード:999
1-5.使用ファイルのオープン
1-6.DB接続
EXEC SQL CONNECT TO 'data/INSURANCEDB.db'
1-7.R02APPLICABLE-RULES)を全件読み込み、内部テーブル(RULE-TBL)に格納する。(1110R02LDASOR
1-8.R01を読み込む。(1100R01INNSOR)(1回目)
2.主処理(2000MAJSOR)(R01を全て読み終えるまで下記を繰り返す)
2-1.第1段階:保険料率M×Nマッチング(DB2 INSURANCE-RATES)(2010RATESOR
2-1-1.EMP-INSURANCEのGRADE-CODE(等級コード)をもとに
DB2 INSURANCE-RATESテーブルをSELECT
2-1-2.SQLCODE=0の場合→健康保険料率・厚生年金保険料率を取得
2-1-3.SQLCODE=100の場合(該当なし)→ERROR-LOGに出力
2-1-4.SQLCODE<0の場合→ERROR-LOGに出力、処理継続
2-1-5.保険料計算
HEALTH-PREMIUM = MONTHLY-AMOUNT × HEALTH-RATE / 1000000
PENSION-PREMIUM = MONTHLY-AMOUNT × PENSION-RATE / 1000000
2-1-6.COMPUTE文を使用し、ON SIZE ERROR処理を実装
2-2.第2段階:適用ルールM:Nマッチング(APPLICABLE-RULES)(2020RULESCOL
2-2-1.年齢算出(運用日付 - BIRTH-DATEで満年齢)
2-2-2.SALARYDB.EMP-MASTERをSELECTし、BIRTH-DATE・DEPENDENT-COUNT・
REGION-CODEを取得。SQLCODE異常→ERROR-LOG出力。
2-2-3.RULE-TBLを線形探索し、以下の条件すべて合致するルールを検索
AGE >= AGE-FROM AND AGE <= AGE-TO
DEPENDENTS >= DEPENDENTS-FROM AND DEPENDENTS <= DEPENDENTS-TO
REGION-CODE = DBV-REGION-CODE
2-2-4.合致ルールあり→HEALTH-RATE-ADJ / PENSION-RATE-ADJで料率調整
IF 合致 AND HEALTH-RATE-ADJ > 0
HEALTH-RATE = DB2取得率 + HEALTH-RATE-ADJ
IF 合致 AND PENSION-RATE-ADJ > 0
PENSION-RATE = DB2取得率 + PENSION-RATE-ADJ
2-2-5.保険料再計算(調整後)
2-2-6.DEDUCTED-RESULTに出力(W01
TOTAL-PREMIUM = HEALTH-PREMIUM + PENSION-PREMIUM
2-3.R01を読み込む。(1100R01INNSOR)(2件目以降)
3.終了処理(3000STPSOR
3-1.入出力ファイルのクローズ
3-2.入出力件数出力メッセージ出力
【入力メッセージ編集】
メッセージ番号:6(入力件数メッセージ)
PARM1:当該入力ファイルのDD名
PARM2:当該入力ファイルの件数
【出力メッセージ編集】
メッセージ番号:7(出力件数メッセージ)
PARM1:当該出力ファイルのDD名
PARM2:当該出力ファイルの件数
3-3.終了メッセージ出力
【メッセージ編集】
メッセージ番号:2(終了メッセージ)
```
---
## 出力レコード定義
### 出力ファイル1W01/DEDUCTED-RESULT
SHA06REC.cpyに従う。300B固定長。
| No | 項目名 | 設定元 | 備考 |
|----|--------|--------|------|
| 1 | EMP-ID | R01.EMP-ID | |
| 2 | EMP-NAME | R01.EMP-NAME | |
| 3 | INSURANCE-TYPE | R01.HEALTH-INS-TYPE | 健康保険種別 |
| 4 | GRADE-CODE | R01.GRADE-CODE | |
| 5 | MONTHLY-AMOUNT | R01.MONTHLY-AMOUNT | |
| 6 | HEALTH-RATE | DB2取得率(調整後) | 9(7) 小数点位置はプログラム内で規定 |
| 7 | PENSION-RATE | DB2取得率(調整後) | 9(7) 小数点位置はプログラム内で規定 |
| 8 | HEALTH-PREMIUM | 計算値 | MONTHLY-AMOUNT × HEALTH-RATE / 1000000 |
| 9 | PENSION-PREMIUM | 計算値 | MONTHLY-AMOUNT × PENSION-RATE / 1000000 |
| 10 | TOTAL-PREMIUM | 計算値 | HEALTH-PREMIUM + PENSION-PREMIUM |
| 11 | FILLER | 初期値 | |
### 出力ファイル2W02/ERROR-LOG
| No | 項目名 | 設定元 | 備考 |
|----|--------|--------|------|
| 1 | ERR-CATEGORY | 01で固定 | エラー種別(DBエラー/等級該当なし) |
| 2 | ERR-DETAIL | STRINGで編集 | エラー内容(EMP-ID + SQLCODE or 理由) |