      ******************************************************************
      * PROGRAM-ID : STOCK02                                             *
      * 概  要     : 当日の店舗売上数を製品在庫から減算し、              *
      *              入荷予定ファイルから新規入荷を加算する。            *
      *              安全在庫を下回った商品に欠品アラートを発する。      *
      * 作成       : 1989-02-20 田中 一郎                                *
      * 履歴       : 1996-08-05 原材料在庫からの引落しロジック追加        *
      *            : 2010-04-01 賞味期限管理対応                          *
      *            : 2017-07-15 欠品アラートメール出力廃止                *
      ******************************************************************
       IDENTIFICATION DIVISION.
       PROGRAM-ID.    STOCK02.
       AUTHOR.        ICHIRO-TANAKA.
       DATE-WRITTEN.  1989-02-20.
      *
       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT SALES-OUT-FILE   ASSIGN TO "SALESOUT"
                                   ORGANIZATION IS SEQUENTIAL.
           SELECT INBOUND-FILE     ASSIGN TO "INBOUND"
                                   ORGANIZATION IS SEQUENTIAL.
           SELECT PRODUCT-MASTER   ASSIGN TO "PRODMST"
                                   ORGANIZATION IS INDEXED
                                   ACCESS MODE IS DYNAMIC
                                   RECORD KEY IS PM-PRODUCT-CODE.
           SELECT STOCK-MASTER     ASSIGN TO "STOCKMST"
                                   ORGANIZATION IS INDEXED
                                   ACCESS MODE IS DYNAMIC
                                   RECORD KEY IS SM-PRODUCT-CODE.
           SELECT ALERT-OUT        ASSIGN TO "ALERTOUT"
                                   ORGANIZATION IS SEQUENTIAL.
      *
       DATA DIVISION.
       FILE SECTION.
       FD  SALES-OUT-FILE.
       01  SALES-OUT-RECORD.
           05  SO-DATE             PIC 9(8).
           05  SO-SHOP-CODE        PIC 9(4).
           05  SO-SHOP-NAME        PIC X(30).
           05  SO-TOTAL-QTY        PIC 9(7).
           05  SO-TOTAL-AMOUNT     PIC 9(11)V99.
           05  SO-TAX8-AMOUNT      PIC 9(11)V99.
           05  SO-TAX10-AMOUNT     PIC 9(11)V99.
      *
       FD  INBOUND-FILE.
       01  INBOUND-RECORD.
           05  IB-DATE             PIC 9(8).
           05  IB-PRODUCT-CODE     PIC X(6).
           05  IB-QTY              PIC 9(7).
           05  IB-EXPIRE-DATE      PIC 9(8).
      *
       FD  PRODUCT-MASTER.
       01  PRODUCT-MASTER-RECORD.
           05  PM-PRODUCT-CODE     PIC X(6).
           05  PM-PRODUCT-NAME     PIC X(40).
           05  PM-CATEGORY         PIC X(2).
           05  PM-SAFETY-STOCK     PIC 9(7).
           05  PM-SHELF-DAYS       PIC 9(3).
           05  PM-FILLER           PIC X(20).
      *
       FD  STOCK-MASTER.
       01  STOCK-MASTER-RECORD.
           05  SM-PRODUCT-CODE     PIC X(6).
           05  SM-CURRENT-QTY      PIC S9(9) COMP-3.
           05  SM-LAST-UPDATE-DATE PIC 9(8).
           05  SM-INBOUND-TODAY    PIC 9(7).
           05  SM-OUTBOUND-TODAY   PIC 9(7).
           05  SM-FILLER           PIC X(20).
      *
       FD  ALERT-OUT.
       01  ALERT-RECORD.
           05  AL-DATE             PIC 9(8).
           05  AL-PRODUCT-CODE     PIC X(6).
           05  AL-PRODUCT-NAME     PIC X(40).
           05  AL-CURRENT-QTY      PIC S9(9).
           05  AL-SAFETY-STOCK     PIC 9(7).
           05  AL-LEVEL            PIC X(4).
      *
       WORKING-STORAGE SECTION.
       01  WS-PARAMETERS.
           05  WS-RUN-DATE         PIC 9(8).
           05  WS-RC               PIC 9(2).
      *
       01  WS-EOF-FLAG             PIC X(1)   VALUE "N".
           88  EOF-YES                        VALUE "Y".
           88  EOF-NO                         VALUE "N".
       01  WS-INBOUND-EOF          PIC X(1)   VALUE "N".
           88  INBOUND-EOF-YES                VALUE "Y".
       01  WS-FOUND-FLAG           PIC X(1)   VALUE "N".
           88  FOUND-YES                      VALUE "Y".
           88  FOUND-NO                       VALUE "N".
      *
       01  WS-COUNTERS.
           05  WS-SALES-READ-CNT   PIC 9(9)   VALUE ZERO.
           05  WS-INBOUND-READ-CNT PIC 9(9)   VALUE ZERO.
           05  WS-ALERT-WRITE-CNT  PIC 9(9)   VALUE ZERO.
           05  WS-MISSING-PROD-CNT PIC 9(9)   VALUE ZERO.
      *
       01  WS-AGGREGATED-SALES.
           05  WS-AGG-PRODUCT-CODE PIC X(6)   VALUE SPACES.
           05  WS-AGG-QTY          PIC 9(9)   VALUE ZERO.
      *
       LINKAGE SECTION.
       01  LK-RUN-DATE             PIC 9(8).
       01  LK-RETURN-CODE          PIC 9(2).
      *
       PROCEDURE DIVISION USING LK-RUN-DATE LK-RETURN-CODE.
      *
       0000-MAIN.
           PERFORM 1000-INITIAL
           PERFORM 2000-ADJUST-OUTBOUND-FROM-SALES
           PERFORM 3000-APPLY-INBOUND
           PERFORM 4000-CHECK-SAFETY-STOCK
           PERFORM 9000-TERMINATE
           MOVE 0 TO LK-RETURN-CODE
           EXIT PROGRAM.
      *
       1000-INITIAL.
           MOVE LK-RUN-DATE TO WS-RUN-DATE
           OPEN INPUT  SALES-OUT-FILE
           OPEN INPUT  INBOUND-FILE
           OPEN I-O    STOCK-MASTER
           OPEN INPUT  PRODUCT-MASTER
           OPEN OUTPUT ALERT-OUT
           SET EOF-NO TO TRUE
           SET INBOUND-EOF-YES TO FALSE.
      *
       2000-ADJUST-OUTBOUND-FROM-SALES.
           READ SALES-OUT-FILE
               AT END SET EOF-YES TO TRUE
           END-READ
           PERFORM UNTIL EOF-YES
               ADD 1 TO WS-SALES-READ-CNT
               PERFORM 2100-DECREMENT-STOCK-BY-SHOP
               READ SALES-OUT-FILE
                   AT END SET EOF-YES TO TRUE
               END-READ
           END-PERFORM.
      *
       2100-DECREMENT-STOCK-BY-SHOP.
      *    本来は売上明細から商品コード別に集計するが、
      *    本日次バッチでは店舗別合計を主力商品コードへ按分する
      *    旧仕様 (1996改修) のロジックを維持している。
           IF SO-SHOP-CODE < 1000
              MOVE "P00001" TO WS-AGG-PRODUCT-CODE
           ELSE
              IF SO-SHOP-CODE < 2000
                 MOVE "P00002" TO WS-AGG-PRODUCT-CODE
              ELSE
                 MOVE "P00003" TO WS-AGG-PRODUCT-CODE
              END-IF
           END-IF
           MOVE WS-AGG-PRODUCT-CODE TO SM-PRODUCT-CODE
           READ STOCK-MASTER
               INVALID KEY
                  ADD 1 TO WS-MISSING-PROD-CNT
               NOT INVALID KEY
                  SUBTRACT SO-TOTAL-QTY FROM SM-CURRENT-QTY
                  ADD SO-TOTAL-QTY     TO SM-OUTBOUND-TODAY
                  MOVE WS-RUN-DATE      TO SM-LAST-UPDATE-DATE
                  REWRITE STOCK-MASTER-RECORD
           END-READ.
      *
       3000-APPLY-INBOUND.
           READ INBOUND-FILE
               AT END SET INBOUND-EOF-YES TO TRUE
           END-READ
           PERFORM UNTIL INBOUND-EOF-YES
               ADD 1 TO WS-INBOUND-READ-CNT
               PERFORM 3100-ADD-INBOUND-QTY
               READ INBOUND-FILE
                   AT END SET INBOUND-EOF-YES TO TRUE
               END-READ
           END-PERFORM.
      *
       3100-ADD-INBOUND-QTY.
           MOVE IB-PRODUCT-CODE TO SM-PRODUCT-CODE
           READ STOCK-MASTER
               INVALID KEY
                  ADD 1 TO WS-MISSING-PROD-CNT
               NOT INVALID KEY
                  ADD IB-QTY  TO SM-CURRENT-QTY
                  ADD IB-QTY  TO SM-INBOUND-TODAY
                  MOVE WS-RUN-DATE TO SM-LAST-UPDATE-DATE
                  REWRITE STOCK-MASTER-RECORD
           END-READ.
      *
       4000-CHECK-SAFETY-STOCK.
           MOVE LOW-VALUES TO SM-PRODUCT-CODE
           START STOCK-MASTER KEY IS GREATER THAN SM-PRODUCT-CODE
           READ STOCK-MASTER NEXT
               AT END SET EOF-YES TO TRUE
           END-READ
           SET EOF-NO TO TRUE
           PERFORM UNTIL EOF-YES
               PERFORM 4100-EVALUATE-LEVEL
               READ STOCK-MASTER NEXT
                   AT END SET EOF-YES TO TRUE
               END-READ
           END-PERFORM.
      *
       4100-EVALUATE-LEVEL.
           MOVE SM-PRODUCT-CODE TO PM-PRODUCT-CODE
           READ PRODUCT-MASTER
               INVALID KEY CONTINUE
               NOT INVALID KEY
                  IF SM-CURRENT-QTY < PM-SAFETY-STOCK
                     MOVE WS-RUN-DATE        TO AL-DATE
                     MOVE PM-PRODUCT-CODE    TO AL-PRODUCT-CODE
                     MOVE PM-PRODUCT-NAME    TO AL-PRODUCT-NAME
                     MOVE SM-CURRENT-QTY     TO AL-CURRENT-QTY
                     MOVE PM-SAFETY-STOCK    TO AL-SAFETY-STOCK
                     IF SM-CURRENT-QTY < 0
                        MOVE "NEG "          TO AL-LEVEL
                     ELSE
                        MOVE "LOW "          TO AL-LEVEL
                     END-IF
                     WRITE ALERT-RECORD
                     ADD 1 TO WS-ALERT-WRITE-CNT
                  END-IF
           END-READ.
      *
       9000-TERMINATE.
           CLOSE SALES-OUT-FILE
                 INBOUND-FILE
                 STOCK-MASTER
                 PRODUCT-MASTER
                 ALERT-OUT
           DISPLAY "STOCK02 完了 売上反映=" WS-SALES-READ-CNT
                   " 入荷反映=" WS-INBOUND-READ-CNT
                   " 欠品アラート=" WS-ALERT-WRITE-CNT.
      *
