Files
cobol-tna-system/詳細設計書/詳細設計書_SHA03MNP.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
6.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 | SHA03MNP |
| 3 | プログラム名 | 保険料計算明細出力処理 |
| 4 | PGMタイプ | メイン |
| 5 | PGMパターン | 20M:N→M×N件直積出力) |
| 6 | 機能概要 | EMP-INSURANCESHA02MNC出力)の従業員情報とINSURANCE-RATESの料率を組合せ、 |
| 7 | | 従業員ごとに健康保険・厚生年金の保険料明細をM×N件(全組合せ)出力する。 |
| 8 | | 各組合せについて標準報酬月額×料率で保険料を算出する。 |
※PGMタイプ:メイン、サブ
※PGMパターン:マッチング(1:1、1:N、N:1、M:N)、レイアウト編集のみ(GETPUT)、振り分け(IF文、EVALUATE文)、キーブレイク(集計、集約、集計・集約の以外)、DB更新
### 前提条件
| NO | 対象ファイル/DB | 条件 |
|----|---------------|------|
| 1 | EMP-INSURANCE | ソート済であること(SHA02MNC出力) |
| 2 | DB2 INSURANCE-RATES | EFFECTIVE-FROMEFFECTIVE-TOに該当月が含まれること |
### 使用ファイル一覧
| NO | 使用ファイル/DB名 | 識別子 | DD名 | I/O | COPY群 | 形式 | ブロック | レコード長 | 媒体 | 備考 |
|----|------------------|--------|------|-----|--------|------|---------|-----------|------|------|
| 1 | EMP-INSURANCE | R01 | SHA03R01 | I | SHA02REC | FB | | 200 | PS | 従業員保険情報(SHA02MNC出力) |
| 2 | INS-DETAIL | W01 | SHA03W01 | O | SHA03REC | FB | | 300 | PS | 保険料計算明細(M×N件) |
| 3 | ERROR-LOG | W02 | SHA03W02 | O | ZAN05REC | VB | | 200 | PS | エラー退避 |
| 4 | INSURANCEDB | DB | — | I | — | DB2 | — | — | DASD | DB2: INSURANCE-RATES |
### キー項目一覧
| NO | ファイル名 | ソート条件(キー項目) | キー条件(マッチング/キーブレイク) |
|----|-----------|---------------------|-------------------------------------------|
| 1 | EMP-INSURANCE | EMP-ID(既定) | なし(ファイル順次読込) |
| 2 | INSURANCE-RATES | GRADE-CODE | 全件組合せ(直積) |
### 使用モジュール一覧
| 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.PARM取得(YEARMONTH
1-6.DB接続
EXEC SQL CONNECT TO 'data/INSURANCE.db'
1-7.INSURANCE-RATES内部表LOAD1200RATELDASOR
DECLARE C1 CURSOR FOR
SELECT GRADE-CODE, MONTHLY-FROM, MONTHLY-TO,
HEALTH-RATE, PENSION-RATE
FROM INSURANCE-RATES
WHERE EFFECTIVE-FROM <= :WRK-YEAR-MONTH
AND EFFECTIVE-TO >= :WRK-YEAR-MONTH
ORDER BY GRADE-CODE
OPEN C1
PERFORM UNTIL SQLCODE≠0
FETCH C1 INTO :DBV-xxx
MOVE TO WRK-INS-RATES(WS-COUNT)
ADD 1 TO WS-COUNT
END-PERFORM
CLOSE C1
1-8.使用ファイルのオープン
1-9.R01を読み込む。(1300R01INNSOR)(1回目)
2.主処理(2000MAJSOR)(R01を全て読み終えるまで下記を繰り返す)
2-1.直積組合せ生成+W01出力(2000MAJSOR内でインライン実装)
取得した従業員レコードに対し、WRK-INS-RATESの全エントリを
PERFORM VARYINGで走査し、以下の組合せレコードを生成する。
【健康保険(INSURANCE-TYPE='1')】
HEALTH-PREMIUM = MONTHLY-AMOUNT × HEALTH-RATEROUNDED
PENSION-PREMIUM = 0
【厚生年金(INSURANCE-TYPE='2')】
PENSION-PREMIUM = MONTHLY-AMOUNT × PENSION-RATEROUNDED
HEALTH-PREMIUM = 0
2-2.W01出力
各組合せのSHA03RECをWRITE2-1と同一ループ内)
2-3.エラー発生時は2100ERROUTSORでW02(ERROR-LOG)出力
2-3.R01を読み込む。(1300R01INNSOR)(2件目以降)
3.終了処理(3000STPSOR
3-1.入出力ファイルのクローズ
3-2.入出力件数出力メッセージ出力
【入力メッセージ編集】
メッセージ番号:6(入力件数メッセージ)
PARM1'SHA03R01'
PARM2CUN-R01INN
【出力メッセージ編集】
メッセージ番号:7(出力件数メッセージ)
PARM1'SHA03W01'
PARM2CUN-W01OUT
PARM1'SHA03W02'
PARM2CUN-W02OUT
3-3.終了メッセージ出力
【メッセージ編集】
メッセージ番号:2(終了メッセージ)
```
---
## 出力レコード定義
### 出力ファイル1W01/INS-DETAIL
SHA03REC.cpyに従う。300B固定長。
| No | 項目名 | 属性 | 設定元 | 備考 |
|----|--------|------|--------|------|
| 1 | EMP-ID | 9(8) | R01.EMP-ID | |
| 2 | EMP-NAME | X(40) | R01.EMP-NAME | |
| 3 | INSURANCE-TYPE | X(1) | 固定 | '1'=健康保険 / '2'=厚生年金 |
| 4 | GRADE-CODE | 9(2) | WRK-INS-RATES.GRADE-CODE | 料率該当等級 |
| 5 | MONTHLY-AMOUNT | 9(9) | R01.MONTHLY-AMOUNT | 標準報酬月額(従業員の該当額) |
| 6 | HEALTH-RATE | 9(7) | WRK-INS-RATES.HEALTH-RATE | 健康保険料率 |
| 7 | PENSION-RATE | 9(7) | WRK-INS-RATES.PENSION-RATE | 厚生年金料率 |
| 8 | HEALTH-PREMIUM | 9(9) | MONTHLY-AMOUNT × HEALTH-RATE | 健康保険料(従業員負担分) |
| 9 | PENSION-PREMIUM | 9(9) | MONTHLY-AMOUNT × PENSION-RATE | 厚生年金保険料(従業員負担分) |
| 10 | FILLER | X(208) | LOW-VALUES固定 | |
### 出力ファイル2W02/ERROR-LOG
| No | 項目名 | 設定元 | 備考 |
|----|--------|--------|------|
| 1 | ERR-CATEGORY | 01で固定 | |
| 2 | ERR-DETAIL | STRINGで編集 | エラー内容 |