MFmainframe-rea
WS carddemo · 26f629ef

Converted program · 317 lines of TypeScript from 572 lines of COBOL · 422 COBOL lines cited (74%)COBIL00C

TypeScript carddemo-ts/src/programs/COBIL00C.ts

1/**
2 * COBIL00C — bill payment (transaction CB00).
3 * Converted from app/cbl/COBIL00C.cbl; screen COBIL00/COBIL0A; files ACCTDAT (READ
4 * UPDATE / REWRITE), CXACAIX (xref by account) and TRANSACT (browse + WRITE).
5 */
6import { editNumber, isBlank, roundScale } from "../runtime/cobol.js";
7import { RESP, type Cics, type Program } from "../runtime/cics.js";
8import type { SymbolicMap } from "../runtime/screen.js";
9import type { AccountRecord, CardXrefRecord, TranRecord } from "../generated/records.js";
10import { CCDA_MSG_INVALID_KEY, populateHeaderInfo } from "./common.js";
11import { cicsTimestamp, digits16 } from "./account-lib.js";
12
13// WS-VARIABLES (COBIL00C.cbl:36-61)
14const WS_PGMNAME = "COBIL00C";
15const WS_TRANID = "CB00";
16const WS_TRANSACT_FILE = "TRANSACT";
17const WS_ACCTDAT_FILE = "ACCTDAT";
18const WS_CXACAIX_FILE = "CXACAIX";
19
20/** CDEMO-CB00-INFO, the tail of this program's CARDDEMO-COMMAREA (COBIL00C.cbl:64-72). */
21interface Cb00Info {
22 trnidFirst: string;
23 trnidLast: string;
24 pageNum: number;
25 nextPageFlg: string;
26 trnSelFlg: string;
27 trnSelected: string;
28}
29
30interface Ws {
31 message: string;
32 errFlg: string;
33 usrModified: string;
34 confPayFlg: string;
35 /** The single COBIL0AI/COBIL0AO storage (BMS input and output overlay). */
36 map: SymbolicMap;
37 /** ACCOUNT-RECORD (only filled by a successful READ) */
38 account?: AccountRecord;
39 /** CARD-XREF-RECORD */
40 xref?: CardXrefRecord;
41 /** TRAN-RECORD / TRAN-ID */
42 tranId: string;
43 tran?: TranRecord;
44}
45
46export const COBIL00C: Program = {
47 name: WS_PGMNAME,
48 source: "app/cbl/COBIL00C.cbl",
49 run(ctx: Cics) {
50 // MAIN-PARA (COBIL00C.cbl:99-149)
51 const ws: Ws = { message: "", errFlg: "N", usrModified: "N", confPayFlg: "N", map: ctx.map("COBIL00", "COBIL0A"), tranId: "" };
52 ws.map.set("ERRMSG", "");
53
54 const area = ctx.area();
55 if (ctx.eib.calen === 0) {
56 area.toProgram = "COSGN00C";
57 returnToPrevScreen(ctx);
58 }
59 const cb00 = ctx.ext<Cb00Info>(() => ({ trnidFirst: "", trnidLast: "", pageNum: 0, nextPageFlg: "N", trnSelFlg: "", trnSelected: "" }));
60 if (area.pgmContext !== 1) {
61 area.pgmContext = 1;
62 ws.map.clear();
63 ws.map.cursor("ACTIDIN");
64 if (!isBlank(cb00.trnSelected)) {
65 ws.map.set("ACTIDIN", cb00.trnSelected);
66 processEnterKey(ctx, ws);
67 }
68 sendBillpayScreen(ctx, ws);
69 } else {
70 receiveBillpayScreen(ctx, ws);
71 switch (ctx.eib.aid) {
72 case "ENTER":
73 processEnterKey(ctx, ws);
74 break;
75 case "PF3":
76 area.toProgram = isBlank(area.fromProgram) ? "COMEN01C" : area.fromProgram;
77 returnToPrevScreen(ctx);
78 // falls through: XCTL does not return
79 case "PF4":
80 clearCurrentScreen(ctx, ws);
81 break;
82 default:
83 ws.errFlg = "Y";
84 ws.message = CCDA_MSG_INVALID_KEY;
85 sendBillpayScreen(ctx, ws);
86 }
87 }
88 ctx.return(WS_TRANID, area);
89 },
90};
91
92/** PROCESS-ENTER-KEY (COBIL00C.cbl:154-244) */
93function processEnterKey(ctx: Cics, ws: Ws): void {
94 const map = ws.map;
95 ws.confPayFlg = "N";
96
97 if (isBlank(map.get("ACTIDIN"))) {
98 ws.errFlg = "Y";
99 ws.message = "Acct ID can NOT be empty...";
100 map.cursor("ACTIDIN");
101 sendBillpayScreen(ctx, ws);
102 }
103
104 if (ws.errFlg !== "Y") {
105 // MOVE ACTIDINI (X(11)) TO ACCT-ID XREF-ACCT-ID (PIC 9(11)): the bytes become the key.
106 const key = map.get("ACTIDIN").padEnd(11, " ").slice(0, 11);
107 const confirm = map.isLow("CONFIRM") ? "" : map.get("CONFIRM");
108 switch (confirm) {
109 case "Y":
110 case "y":
111 ws.confPayFlg = "Y";
112 readAcctdatFile(ctx, ws, key);
113 break;
114 case "N":
115 case "n":
116 clearCurrentScreen(ctx, ws);
117 ws.errFlg = "Y";
118 break;
119 case "":
120 case " ":
121 readAcctdatFile(ctx, ws, key);
122 break;
123 default:
124 ws.errFlg = "Y";
125 ws.message = "Invalid value. Valid values are (Y/N)...";
126 map.cursor("CONFIRM");
127 sendBillpayScreen(ctx, ws);
128 }
129 // MOVE ACCT-CURR-BAL TO WS-CURR-BAL (PIC +9999999999.99), then TO CURBALI.
130 map.set("CURBAL", editNumber(ws.account?.acctCurrBal ?? 0, "+9999999999.99"));
131 }
132
133 if (ws.errFlg !== "Y") {
134 if ((ws.account?.acctCurrBal ?? 0) <= 0 && !isBlank(map.get("ACTIDIN"))) {
135 ws.errFlg = "Y";
136 ws.message = "You have nothing to pay...";
137 map.cursor("ACTIDIN");
138 sendBillpayScreen(ctx, ws);
139 }
140 }
141
142 if (ws.errFlg !== "Y") {
143 if (ws.confPayFlg === "Y") {
144 const key = map.get("ACTIDIN").padEnd(11, " ").slice(0, 11);
145 // Faithful: none of these steps check WS-ERR-FLG; the COBOL carries on regardless.
146 readCxacaixFile(ctx, ws, key);
147 ws.tranId = "￿"; // MOVE HIGH-VALUES TO TRAN-ID
148 startbrTransactFile(ctx, ws);
149 readprevTransactFile(ctx, ws);
150 endbrTransactFile(ctx);
151 const next = (digits16(ws.tranId) + 1n) % 10n ** 16n; // ADD 1 TO WS-TRAN-ID-NUM (PIC 9(16))
152 const acct = ws.account!;
153 ws.tranId = next.toString().padStart(16, "0");
154 const ts = getCurrentTimestamp(ctx);
155 // INITIALIZE TRAN-RECORD, then the MOVEs (COBIL00C.cbl:218-232)
156 ws.tran = {
157 tranId: ws.tranId,
158 tranTypeCd: "02",
159 tranCatCd: 2,
160 tranSource: "POS TERM",
161 tranDesc: "BILL PAYMENT - ONLINE",
162 // ACCT-CURR-BAL S9(10)V99 into TRAN-AMT S9(09)V99: high-order digit truncated.
163 tranAmt: Math.sign(acct.acctCurrBal) * roundScale(Math.abs(acct.acctCurrBal) % 1e9, 2),
164 tranMerchantId: 999999999,
165 tranMerchantName: "BILL PAYMENT",
166 tranMerchantCity: "N/A",
167 tranMerchantZip: "N/A",
168 tranCardNum: ws.xref?.xrefCardNum ?? "",
169 tranOrigTs: ts,
170 tranProcTs: ts,
171 };
172 writeTransactFile(ctx, ws);
173 acct.acctCurrBal = roundScale(acct.acctCurrBal - ws.tran.tranAmt, 2);
174 updateAcctdatFile(ctx, ws);
175 } else {
176 ws.message = "Confirm to make a bill payment...";
177 map.cursor("CONFIRM");
178 }
179 sendBillpayScreen(ctx, ws);
180 }
181}
182
183/** GET-CURRENT-TIMESTAMP (COBIL00C.cbl:249-267) */
184function getCurrentTimestamp(ctx: Cics): string {
185 return cicsTimestamp(ctx.now);
186}
187
188/** RETURN-TO-PREV-SCREEN (COBIL00C.cbl:273-284) */
189function returnToPrevScreen(ctx: Cics): never {
190 const area = ctx.area();
191 if (isBlank(area.toProgram)) area.toProgram = "COSGN00C";
192 area.fromTranid = WS_TRANID;
193 area.fromProgram = WS_PGMNAME;
194 area.pgmContext = 0;
195 ctx.xctl(area.toProgram, area);
196}
197
198/** SEND-BILLPAY-SCREEN (COBIL00C.cbl:289-301) */
199function sendBillpayScreen(ctx: Cics, ws: Ws): void {
200 populateHeaderInfo(ctx, ws.map, WS_TRANID, WS_PGMNAME);
201 ws.map.set("ERRMSG", ws.message);
202 ctx.sendMap(ws.map, { erase: true, cursor: true });
203}
204
205/** RECEIVE-BILLPAY-SCREEN (COBIL00C.cbl:306-314) */
206function receiveBillpayScreen(ctx: Cics, ws: Ws): void {
207 ws.map = ctx.receiveMap("COBIL00", "COBIL0A").map;
208}
209
210/** READ-ACCTDAT-FILE (COBIL00C.cbl:343-372) */
211function readAcctdatFile(ctx: Cics, ws: Ws, key: string): void {
212 const { resp, record } = ctx.read<AccountRecord>(WS_ACCTDAT_FILE, key, { update: true });
213 if (resp === RESP.NORMAL) {
214 ws.account = record;
215 } else if (resp === RESP.NOTFND) {
216 ws.errFlg = "Y";
217 ws.message = "Account ID NOT found...";
218 ws.map.cursor("ACTIDIN");
219 sendBillpayScreen(ctx, ws);
220 } else {
221 ws.errFlg = "Y";
222 ws.message = "Unable to lookup Account...";
223 ws.map.cursor("ACTIDIN");
224 sendBillpayScreen(ctx, ws);
225 }
226}
227
228/** UPDATE-ACCTDAT-FILE (COBIL00C.cbl:377-403) */
229function updateAcctdatFile(ctx: Cics, ws: Ws): void {
230 const resp = ctx.rewrite(WS_ACCTDAT_FILE, ws.account!);
231 if (resp === RESP.NORMAL) return;
232 ws.errFlg = "Y";
233 ws.message = resp === RESP.NOTFND ? "Account ID NOT found..." : "Unable to Update Account...";
234 ws.map.cursor("ACTIDIN");
235 sendBillpayScreen(ctx, ws);
236}
237
238/** READ-CXACAIX-FILE (COBIL00C.cbl:408-436) */
239function readCxacaixFile(ctx: Cics, ws: Ws, key: string): void {
240 const { resp, record } = ctx.read<CardXrefRecord>(WS_CXACAIX_FILE, key);
241 if (resp === RESP.NORMAL) {
242 ws.xref = record;
243 return;
244 }
245 ws.errFlg = "Y";
246 ws.message = resp === RESP.NOTFND ? "Account ID NOT found..." : "Unable to lookup XREF AIX file...";
247 ws.map.cursor("ACTIDIN");
248 sendBillpayScreen(ctx, ws);
249}
250
251/** STARTBR-TRANSACT-FILE (COBIL00C.cbl:441-467) */
252function startbrTransactFile(ctx: Cics, ws: Ws): void {
253 const resp = ctx.startbr(WS_TRANSACT_FILE, ws.tranId);
254 if (resp === RESP.NORMAL) return;
255 ws.errFlg = "Y";
256 ws.message = resp === RESP.NOTFND ? "Transaction ID NOT found..." : "Unable to lookup Transaction...";
257 ws.map.cursor("ACTIDIN");
258 sendBillpayScreen(ctx, ws);
259}
260
261/** READPREV-TRANSACT-FILE (COBIL00C.cbl:472-496) */
262function readprevTransactFile(ctx: Cics, ws: Ws): void {
263 const { resp, record } = ctx.readprev<TranRecord>(WS_TRANSACT_FILE);
264 if (resp === RESP.NORMAL && record) {
265 ws.tranId = record.tranId;
266 } else if (resp === RESP.ENDFILE) {
267 ws.tranId = "0".repeat(16); // MOVE ZEROS TO TRAN-ID
268 } else {
269 ws.errFlg = "Y";
270 ws.message = "Unable to lookup Transaction...";
271 ws.map.cursor("ACTIDIN");
272 sendBillpayScreen(ctx, ws);
273 }
274}
275
276/** ENDBR-TRANSACT-FILE (COBIL00C.cbl:501-505) */
277function endbrTransactFile(ctx: Cics): void {
278 ctx.endbr(WS_TRANSACT_FILE);
279}
280
281/** WRITE-TRANSACT-FILE (COBIL00C.cbl:510-547) */
282function writeTransactFile(ctx: Cics, ws: Ws): void {
283 const resp = ctx.write(WS_TRANSACT_FILE, ws.tran!);
284 if (resp === RESP.NORMAL) {
285 initializeAllFields(ws);
286 ws.message = "";
287 ws.map.color("ERRMSG", "GREEN");
288 // STRING ... TRAN-ID DELIMITED BY SPACE '.' — note the two spaces after 'successful.'
289 ws.message = `Payment successful. Your Transaction ID is ${ws.tranId.split(" ")[0]}.`;
290 sendBillpayScreen(ctx, ws);
291 } else if (resp === RESP.DUPKEY || resp === RESP.DUPREC) {
292 ws.errFlg = "Y";
293 ws.message = "Tran ID already exist...";
294 ws.map.cursor("ACTIDIN");
295 sendBillpayScreen(ctx, ws);
296 } else {
297 ws.errFlg = "Y";
298 ws.message = "Unable to Add Bill pay Transaction...";
299 ws.map.cursor("ACTIDIN");
300 sendBillpayScreen(ctx, ws);
301 }
302}
303
304/** CLEAR-CURRENT-SCREEN (COBIL00C.cbl:552-555) */
305function clearCurrentScreen(ctx: Cics, ws: Ws): void {
306 initializeAllFields(ws);
307 sendBillpayScreen(ctx, ws);
308}
309
310/** INITIALIZE-ALL-FIELDS (COBIL00C.cbl:560-566) */
311function initializeAllFields(ws: Ws): void {
312 ws.map.cursor("ACTIDIN");
313 ws.map.set("ACTIDIN", "");
314 ws.map.set("CURBAL", "");
315 ws.map.set("CONFIRM", "");
316 ws.message = "";
317}

COBOL app/cbl/COBIL00C.cbl

1 ******************************************************************
2 * Program : COBIL00C.CBL
3 * Application : CardDemo
4 * Type : CICS COBOL Program
5 * Function : Bill Payment - Pay account balance in full and a
6 * tractionsaction for the online bill payment.
7 ******************************************************************
8 * Copyright Amazon.com, Inc. or its affiliates.
9 * All Rights Reserved.
10 *
11 * Licensed under the Apache License, Version 2.0 (the "License").
12 * You may not use this file except in compliance with the License.
13 * You may obtain a copy of the License at
14 *
15 * http://www.apache.org/licenses/LICENSE-2.0
16 *
17 * Unless required by applicable law or agreed to in writing,
18 * software distributed under the License is distributed on an
19 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
20 * either express or implied. See the License for the specific
21 * language governing permissions and limitations under the License
22 ******************************************************************
23 IDENTIFICATION DIVISION.
24 PROGRAM-ID. COBIL00C.
25 AUTHOR. AWS.
26
27 ENVIRONMENT DIVISION.
28 CONFIGURATION SECTION.
29
30 DATA DIVISION.
31 *----------------------------------------------------------------*
32 * WORKING STORAGE SECTION
33 *----------------------------------------------------------------*
34 WORKING-STORAGE SECTION.
35
36 01 WS-VARIABLES.
37 05 WS-PGMNAME PIC X(08) VALUE 'COBIL00C'.
38 05 WS-TRANID PIC X(04) VALUE 'CB00'.
39 05 WS-MESSAGE PIC X(80) VALUE SPACES.
40 05 WS-TRANSACT-FILE PIC X(08) VALUE 'TRANSACT'.
41 05 WS-ACCTDAT-FILE PIC X(08) VALUE 'ACCTDAT '.
42 05 WS-CXACAIX-FILE PIC X(08) VALUE 'CXACAIX '.
43 05 WS-ERR-FLG PIC X(01) VALUE 'N'.
44 88 ERR-FLG-ON VALUE 'Y'.
45 88 ERR-FLG-OFF VALUE 'N'.
46 05 WS-RESP-CD PIC S9(09) COMP VALUE ZEROS.
47 05 WS-REAS-CD PIC S9(09) COMP VALUE ZEROS.
48 05 WS-USR-MODIFIED PIC X(01) VALUE 'N'.
49 88 USR-MODIFIED-YES VALUE 'Y'.
50 88 USR-MODIFIED-NO VALUE 'N'.
51 05 WS-CONF-PAY-FLG PIC X(01) VALUE 'N'.
52 88 CONF-PAY-YES VALUE 'Y'.
53 88 CONF-PAY-NO VALUE 'N'.
54
55 05 WS-TRAN-AMT PIC +99999999.99.
56 05 WS-CURR-BAL PIC +9999999999.99.
57 05 WS-TRAN-ID-NUM PIC 9(16) VALUE ZEROS.
58 05 WS-TRAN-DATE PIC X(08) VALUE '00/00/00'.
59 05 WS-ABS-TIME PIC S9(15) COMP-3 VALUE 0.
60 05 WS-CUR-DATE-X10 PIC X(10) VALUE SPACES.
61 05 WS-CUR-TIME-X08 PIC X(08) VALUE SPACES.
62
63 COPY COCOM01Y.
64 05 CDEMO-CB00-INFO.
65 10 CDEMO-CB00-TRNID-FIRST PIC X(16).
66 10 CDEMO-CB00-TRNID-LAST PIC X(16).
67 10 CDEMO-CB00-PAGE-NUM PIC 9(08).
68 10 CDEMO-CB00-NEXT-PAGE-FLG PIC X(01) VALUE 'N'.
69 88 NEXT-PAGE-YES VALUE 'Y'.
70 88 NEXT-PAGE-NO VALUE 'N'.
71 10 CDEMO-CB00-TRN-SEL-FLG PIC X(01).
72 10 CDEMO-CB00-TRN-SELECTED PIC X(16).
73
74 COPY COBIL00.
75
76 COPY COTTL01Y.
77 COPY CSDAT01Y.
78 COPY CSMSG01Y.
79
80 COPY CVACT01Y.
81 COPY CVACT03Y.
82 COPY CVTRA05Y.
83
84 COPY DFHAID.
85 COPY DFHBMSCA.
86
87 *----------------------------------------------------------------*
88 * LINKAGE SECTION
89 *----------------------------------------------------------------*
90 LINKAGE SECTION.
91 01 DFHCOMMAREA.
92 05 LK-COMMAREA PIC X(01)
93 OCCURS 1 TO 32767 TIMES DEPENDING ON EIBCALEN.
94
95 *----------------------------------------------------------------*
96 * PROCEDURE DIVISION
97 *----------------------------------------------------------------*
98 PROCEDURE DIVISION.
99 MAIN-PARA.
100
101 SET ERR-FLG-OFF TO TRUE
102 SET USR-MODIFIED-NO TO TRUE
103
104 MOVE SPACES TO WS-MESSAGE
105 ERRMSGO OF COBIL0AO
106
107 IF EIBCALEN = 0
108 MOVE 'COSGN00C' TO CDEMO-TO-PROGRAM
109 PERFORM RETURN-TO-PREV-SCREEN
110 ELSE
111 MOVE DFHCOMMAREA(1:EIBCALEN) TO CARDDEMO-COMMAREA
112 IF NOT CDEMO-PGM-REENTER
113 SET CDEMO-PGM-REENTER TO TRUE
114 MOVE LOW-VALUES TO COBIL0AO
115 MOVE -1 TO ACTIDINL OF COBIL0AI
116 IF CDEMO-CB00-TRN-SELECTED NOT =
117 SPACES AND LOW-VALUES
118 MOVE CDEMO-CB00-TRN-SELECTED TO
119 ACTIDINI OF COBIL0AI
120 PERFORM PROCESS-ENTER-KEY
121 END-IF
122 PERFORM SEND-BILLPAY-SCREEN
123 ELSE
124 PERFORM RECEIVE-BILLPAY-SCREEN
125 EVALUATE EIBAID
126 WHEN DFHENTER
127 PERFORM PROCESS-ENTER-KEY
128 WHEN DFHPF3
129 IF CDEMO-FROM-PROGRAM = SPACES OR LOW-VALUES
130 MOVE 'COMEN01C' TO CDEMO-TO-PROGRAM
131 ELSE
132 MOVE CDEMO-FROM-PROGRAM TO
133 CDEMO-TO-PROGRAM
134 END-IF
135 PERFORM RETURN-TO-PREV-SCREEN
136 WHEN DFHPF4
137 PERFORM CLEAR-CURRENT-SCREEN
138 WHEN OTHER
139 MOVE 'Y' TO WS-ERR-FLG
140 MOVE CCDA-MSG-INVALID-KEY TO WS-MESSAGE
141 PERFORM SEND-BILLPAY-SCREEN
142 END-EVALUATE
143 END-IF
144 END-IF
145
146 EXEC CICS RETURN
147 TRANSID (WS-TRANID)
148 COMMAREA (CARDDEMO-COMMAREA)
149 END-EXEC.
150
151 *----------------------------------------------------------------*
152 * PROCESS-ENTER-KEY
153 *----------------------------------------------------------------*
154 PROCESS-ENTER-KEY.
155
156 SET CONF-PAY-NO TO TRUE
157
158 EVALUATE TRUE
159 WHEN ACTIDINI OF COBIL0AI = SPACES OR LOW-VALUES
160 MOVE 'Y' TO WS-ERR-FLG
161 MOVE 'Acct ID can NOT be empty...' TO
162 WS-MESSAGE
163 MOVE -1 TO ACTIDINL OF COBIL0AI
164 PERFORM SEND-BILLPAY-SCREEN
165 WHEN OTHER
166 CONTINUE
167 END-EVALUATE
168
169 IF NOT ERR-FLG-ON
170 MOVE ACTIDINI OF COBIL0AI TO ACCT-ID
171 XREF-ACCT-ID
172
173 EVALUATE CONFIRMI OF COBIL0AI
174 WHEN 'Y'
175 WHEN 'y'
176 SET CONF-PAY-YES TO TRUE
177 PERFORM READ-ACCTDAT-FILE
178 WHEN 'N'
179 WHEN 'n'
180 PERFORM CLEAR-CURRENT-SCREEN
181 MOVE 'Y' TO WS-ERR-FLG
182 WHEN SPACES
183 WHEN LOW-VALUES
184 PERFORM READ-ACCTDAT-FILE
185 WHEN OTHER
186 MOVE 'Y' TO WS-ERR-FLG
187 MOVE 'Invalid value. Valid values are (Y/N)...'
188 TO WS-MESSAGE
189 MOVE -1 TO CONFIRML OF COBIL0AI
190 PERFORM SEND-BILLPAY-SCREEN
191 END-EVALUATE
192
193 MOVE ACCT-CURR-BAL TO WS-CURR-BAL
194 MOVE WS-CURR-BAL TO CURBALI OF COBIL0AI
195 END-IF
196
197 IF NOT ERR-FLG-ON
198 IF ACCT-CURR-BAL <= ZEROS AND
199 ACTIDINI OF COBIL0AI NOT = SPACES AND LOW-VALUES
200 MOVE 'Y' TO WS-ERR-FLG
201 MOVE 'You have nothing to pay...' TO
202 WS-MESSAGE
203 MOVE -1 TO ACTIDINL OF COBIL0AI
204 PERFORM SEND-BILLPAY-SCREEN
205 END-IF
206 END-IF
207
208 IF NOT ERR-FLG-ON
209
210 IF CONF-PAY-YES
211 PERFORM READ-CXACAIX-FILE
212 MOVE HIGH-VALUES TO TRAN-ID
213 PERFORM STARTBR-TRANSACT-FILE
214 PERFORM READPREV-TRANSACT-FILE
215 PERFORM ENDBR-TRANSACT-FILE
216 MOVE TRAN-ID TO WS-TRAN-ID-NUM
217 ADD 1 TO WS-TRAN-ID-NUM
218 INITIALIZE TRAN-RECORD
219 MOVE WS-TRAN-ID-NUM TO TRAN-ID
220 MOVE '02' TO TRAN-TYPE-CD
221 MOVE 2 TO TRAN-CAT-CD
222 MOVE 'POS TERM' TO TRAN-SOURCE
223 MOVE 'BILL PAYMENT - ONLINE' TO TRAN-DESC
224 MOVE ACCT-CURR-BAL TO TRAN-AMT
225 MOVE XREF-CARD-NUM TO TRAN-CARD-NUM
226 MOVE 999999999 TO TRAN-MERCHANT-ID
227 MOVE 'BILL PAYMENT' TO TRAN-MERCHANT-NAME
228 MOVE 'N/A' TO TRAN-MERCHANT-CITY
229 MOVE 'N/A' TO TRAN-MERCHANT-ZIP
230 PERFORM GET-CURRENT-TIMESTAMP
231 MOVE WS-TIMESTAMP TO TRAN-ORIG-TS
232 TRAN-PROC-TS
233 PERFORM WRITE-TRANSACT-FILE
234 COMPUTE ACCT-CURR-BAL = ACCT-CURR-BAL - TRAN-AMT
235 PERFORM UPDATE-ACCTDAT-FILE
236 ELSE
237 MOVE 'Confirm to make a bill payment...' TO
238 WS-MESSAGE
239 MOVE -1 TO CONFIRML OF COBIL0AI
240 END-IF
241
242 PERFORM SEND-BILLPAY-SCREEN
243
244 END-IF.
245
246 *----------------------------------------------------------------*
247 * GET-CURRENT-TIMESTAMP
248 *----------------------------------------------------------------*
249 GET-CURRENT-TIMESTAMP.
250
251 EXEC CICS ASKTIME
252 ABSTIME(WS-ABS-TIME)
253 END-EXEC
254
255 EXEC CICS FORMATTIME
256 ABSTIME(WS-ABS-TIME)
257 YYYYMMDD(WS-CUR-DATE-X10)
258 DATESEP('-')
259 TIME(WS-CUR-TIME-X08)
260 TIMESEP(':')
261 END-EXEC
262
263 INITIALIZE WS-TIMESTAMP
264 MOVE WS-CUR-DATE-X10 TO WS-TIMESTAMP(01:10)
265 MOVE WS-CUR-TIME-X08 TO WS-TIMESTAMP(12:08)
266 MOVE ZEROS TO WS-TIMESTAMP-TM-MS6
267 .
268
269
270 *----------------------------------------------------------------*
271 * RETURN-TO-PREV-SCREEN
272 *----------------------------------------------------------------*
273 RETURN-TO-PREV-SCREEN.
274
275 IF CDEMO-TO-PROGRAM = LOW-VALUES OR SPACES
276 MOVE 'COSGN00C' TO CDEMO-TO-PROGRAM
277 END-IF
278 MOVE WS-TRANID TO CDEMO-FROM-TRANID
279 MOVE WS-PGMNAME TO CDEMO-FROM-PROGRAM
280 MOVE ZEROS TO CDEMO-PGM-CONTEXT
281 EXEC CICS
282 XCTL PROGRAM(CDEMO-TO-PROGRAM)
283 COMMAREA(CARDDEMO-COMMAREA)
284 END-EXEC.
285
286 *----------------------------------------------------------------*
287 * SEND-BILLPAY-SCREEN
288 *----------------------------------------------------------------*
289 SEND-BILLPAY-SCREEN.
290
291 PERFORM POPULATE-HEADER-INFO
292
293 MOVE WS-MESSAGE TO ERRMSGO OF COBIL0AO
294
295 EXEC CICS SEND
296 MAP('COBIL0A')
297 MAPSET('COBIL00')
298 FROM(COBIL0AO)
299 ERASE
300 CURSOR
301 END-EXEC.
302
303 *----------------------------------------------------------------*
304 * RECEIVE-BILLPAY-SCREEN
305 *----------------------------------------------------------------*
306 RECEIVE-BILLPAY-SCREEN.
307
308 EXEC CICS RECEIVE
309 MAP('COBIL0A')
310 MAPSET('COBIL00')
311 INTO(COBIL0AI)
312 RESP(WS-RESP-CD)
313 RESP2(WS-REAS-CD)
314 END-EXEC.
315
316 *----------------------------------------------------------------*
317 * POPULATE-HEADER-INFO
318 *----------------------------------------------------------------*
319 POPULATE-HEADER-INFO.
320
321 MOVE FUNCTION CURRENT-DATE TO WS-CURDATE-DATA
322
323 MOVE CCDA-TITLE01 TO TITLE01O OF COBIL0AO
324 MOVE CCDA-TITLE02 TO TITLE02O OF COBIL0AO
325 MOVE WS-TRANID TO TRNNAMEO OF COBIL0AO
326 MOVE WS-PGMNAME TO PGMNAMEO OF COBIL0AO
327
328 MOVE WS-CURDATE-MONTH TO WS-CURDATE-MM
329 MOVE WS-CURDATE-DAY TO WS-CURDATE-DD
330 MOVE WS-CURDATE-YEAR(3:2) TO WS-CURDATE-YY
331
332 MOVE WS-CURDATE-MM-DD-YY TO CURDATEO OF COBIL0AO
333
334 MOVE WS-CURTIME-HOURS TO WS-CURTIME-HH
335 MOVE WS-CURTIME-MINUTE TO WS-CURTIME-MM
336 MOVE WS-CURTIME-SECOND TO WS-CURTIME-SS
337
338 MOVE WS-CURTIME-HH-MM-SS TO CURTIMEO OF COBIL0AO.
339
340 *----------------------------------------------------------------*
341 * READ-ACCTDAT-FILE
342 *----------------------------------------------------------------*
343 READ-ACCTDAT-FILE.
344
345 EXEC CICS READ
346 DATASET (WS-ACCTDAT-FILE)
347 INTO (ACCOUNT-RECORD)
348 LENGTH (LENGTH OF ACCOUNT-RECORD)
349 RIDFLD (ACCT-ID)
350 KEYLENGTH (LENGTH OF ACCT-ID)
351 UPDATE
352 RESP (WS-RESP-CD)
353 RESP2 (WS-REAS-CD)
354 END-EXEC
355
356 EVALUATE WS-RESP-CD
357 WHEN DFHRESP(NORMAL)
358 CONTINUE
359 WHEN DFHRESP(NOTFND)
360 MOVE 'Y' TO WS-ERR-FLG
361 MOVE 'Account ID NOT found...' TO
362 WS-MESSAGE
363 MOVE -1 TO ACTIDINL OF COBIL0AI
364 PERFORM SEND-BILLPAY-SCREEN
365 WHEN OTHER
366 DISPLAY 'RESP:' WS-RESP-CD 'REAS:' WS-REAS-CD
367 MOVE 'Y' TO WS-ERR-FLG
368 MOVE 'Unable to lookup Account...' TO
369 WS-MESSAGE
370 MOVE -1 TO ACTIDINL OF COBIL0AI
371 PERFORM SEND-BILLPAY-SCREEN
372 END-EVALUATE.
373
374 *----------------------------------------------------------------*
375 * UPDATE-ACCTDAT-FILE
376 *----------------------------------------------------------------*
377 UPDATE-ACCTDAT-FILE.
378
379 EXEC CICS REWRITE
380 DATASET (WS-ACCTDAT-FILE)
381 FROM (ACCOUNT-RECORD)
382 LENGTH (LENGTH OF ACCOUNT-RECORD)
383 RESP (WS-RESP-CD)
384 RESP2 (WS-REAS-CD)
385 END-EXEC
386
387 EVALUATE WS-RESP-CD
388 WHEN DFHRESP(NORMAL)
389 CONTINUE
390 WHEN DFHRESP(NOTFND)
391 MOVE 'Y' TO WS-ERR-FLG
392 MOVE 'Account ID NOT found...' TO
393 WS-MESSAGE
394 MOVE -1 TO ACTIDINL OF COBIL0AI
395 PERFORM SEND-BILLPAY-SCREEN
396 WHEN OTHER
397 DISPLAY 'RESP:' WS-RESP-CD 'REAS:' WS-REAS-CD
398 MOVE 'Y' TO WS-ERR-FLG
399 MOVE 'Unable to Update Account...' TO
400 WS-MESSAGE
401 MOVE -1 TO ACTIDINL OF COBIL0AI
402 PERFORM SEND-BILLPAY-SCREEN
403 END-EVALUATE.
404
405 *----------------------------------------------------------------*
406 * READ-CXACAIX-FILE
407 *----------------------------------------------------------------*
408 READ-CXACAIX-FILE.
409
410 EXEC CICS READ
411 DATASET (WS-CXACAIX-FILE)
412 INTO (CARD-XREF-RECORD)
413 LENGTH (LENGTH OF CARD-XREF-RECORD)
414 RIDFLD (XREF-ACCT-ID)
415 KEYLENGTH (LENGTH OF XREF-ACCT-ID)
416 RESP (WS-RESP-CD)
417 RESP2 (WS-REAS-CD)
418 END-EXEC
419
420 EVALUATE WS-RESP-CD
421 WHEN DFHRESP(NORMAL)
422 CONTINUE
423 WHEN DFHRESP(NOTFND)
424 MOVE 'Y' TO WS-ERR-FLG
425 MOVE 'Account ID NOT found...' TO
426 WS-MESSAGE
427 MOVE -1 TO ACTIDINL OF COBIL0AI
428 PERFORM SEND-BILLPAY-SCREEN
429 WHEN OTHER
430 DISPLAY 'RESP:' WS-RESP-CD 'REAS:' WS-REAS-CD
431 MOVE 'Y' TO WS-ERR-FLG
432 MOVE 'Unable to lookup XREF AIX file...' TO
433 WS-MESSAGE
434 MOVE -1 TO ACTIDINL OF COBIL0AI
435 PERFORM SEND-BILLPAY-SCREEN
436 END-EVALUATE.
437
438 *----------------------------------------------------------------*
439 * STARTBR-TRANSACT-FILE
440 *----------------------------------------------------------------*
441 STARTBR-TRANSACT-FILE.
442
443 EXEC CICS STARTBR
444 DATASET (WS-TRANSACT-FILE)
445 RIDFLD (TRAN-ID)
446 KEYLENGTH (LENGTH OF TRAN-ID)
447 RESP (WS-RESP-CD)
448 RESP2 (WS-REAS-CD)
449 END-EXEC
450
451 EVALUATE WS-RESP-CD
452 WHEN DFHRESP(NORMAL)
453 CONTINUE
454 WHEN DFHRESP(NOTFND)
455 MOVE 'Y' TO WS-ERR-FLG
456 MOVE 'Transaction ID NOT found...' TO
457 WS-MESSAGE
458 MOVE -1 TO ACTIDINL OF COBIL0AI
459 PERFORM SEND-BILLPAY-SCREEN
460 WHEN OTHER
461 DISPLAY 'RESP:' WS-RESP-CD 'REAS:' WS-REAS-CD
462 MOVE 'Y' TO WS-ERR-FLG
463 MOVE 'Unable to lookup Transaction...' TO
464 WS-MESSAGE
465 MOVE -1 TO ACTIDINL OF COBIL0AI
466 PERFORM SEND-BILLPAY-SCREEN
467 END-EVALUATE.
468
469 *----------------------------------------------------------------*
470 * READPREV-TRANSACT-FILE
471 *----------------------------------------------------------------*
472 READPREV-TRANSACT-FILE.
473
474 EXEC CICS READPREV
475 DATASET (WS-TRANSACT-FILE)
476 INTO (TRAN-RECORD)
477 LENGTH (LENGTH OF TRAN-RECORD)
478 RIDFLD (TRAN-ID)
479 KEYLENGTH (LENGTH OF TRAN-ID)
480 RESP (WS-RESP-CD)
481 RESP2 (WS-REAS-CD)
482 END-EXEC
483
484 EVALUATE WS-RESP-CD
485 WHEN DFHRESP(NORMAL)
486 CONTINUE
487 WHEN DFHRESP(ENDFILE)
488 MOVE ZEROS TO TRAN-ID
489 WHEN OTHER
490 DISPLAY 'RESP:' WS-RESP-CD 'REAS:' WS-REAS-CD
491 MOVE 'Y' TO WS-ERR-FLG
492 MOVE 'Unable to lookup Transaction...' TO
493 WS-MESSAGE
494 MOVE -1 TO ACTIDINL OF COBIL0AI
495 PERFORM SEND-BILLPAY-SCREEN
496 END-EVALUATE.
497
498 *----------------------------------------------------------------*
499 * ENDBR-TRANSACT-FILE
500 *----------------------------------------------------------------*
501 ENDBR-TRANSACT-FILE.
502
503 EXEC CICS ENDBR
504 DATASET (WS-TRANSACT-FILE)
505 END-EXEC.
506
507 *----------------------------------------------------------------*
508 * WRITE-TRANSACT-FILE
509 *----------------------------------------------------------------*
510 WRITE-TRANSACT-FILE.
511
512 EXEC CICS WRITE
513 DATASET (WS-TRANSACT-FILE)
514 FROM (TRAN-RECORD)
515 LENGTH (LENGTH OF TRAN-RECORD)
516 RIDFLD (TRAN-ID)
517 KEYLENGTH (LENGTH OF TRAN-ID)
518 RESP (WS-RESP-CD)
519 RESP2 (WS-REAS-CD)
520 END-EXEC
521
522 EVALUATE WS-RESP-CD
523 WHEN DFHRESP(NORMAL)
524 PERFORM INITIALIZE-ALL-FIELDS
525 MOVE SPACES TO WS-MESSAGE
526 MOVE DFHGREEN TO ERRMSGC OF COBIL0AO
527 STRING 'Payment successful. ' DELIMITED BY SIZE
528 ' Your Transaction ID is ' DELIMITED BY SIZE
529 TRAN-ID DELIMITED BY SPACE
530 '.' DELIMITED BY SIZE
531 INTO WS-MESSAGE
532 PERFORM SEND-BILLPAY-SCREEN
533 WHEN DFHRESP(DUPKEY)
534 WHEN DFHRESP(DUPREC)
535 MOVE 'Y' TO WS-ERR-FLG
536 MOVE 'Tran ID already exist...' TO
537 WS-MESSAGE
538 MOVE -1 TO ACTIDINL OF COBIL0AI
539 PERFORM SEND-BILLPAY-SCREEN
540 WHEN OTHER
541 DISPLAY 'RESP:' WS-RESP-CD 'REAS:' WS-REAS-CD
542 MOVE 'Y' TO WS-ERR-FLG
543 MOVE 'Unable to Add Bill pay Transaction...' TO
544 WS-MESSAGE
545 MOVE -1 TO ACTIDINL OF COBIL0AI
546 PERFORM SEND-BILLPAY-SCREEN
547 END-EVALUATE.
548
549 *----------------------------------------------------------------*
550 * CLEAR-CURRENT-SCREEN
551 *----------------------------------------------------------------*
552 CLEAR-CURRENT-SCREEN.
553
554 PERFORM INITIALIZE-ALL-FIELDS
555 PERFORM SEND-BILLPAY-SCREEN.
556
557 *----------------------------------------------------------------*
558 * INITIALIZE-ALL-FIELDS
559 *----------------------------------------------------------------*
560 INITIALIZE-ALL-FIELDS.
561
562 MOVE -1 TO ACTIDINL OF COBIL0AI
563 MOVE SPACES TO ACTIDINI OF COBIL0AI
564 CURBALI OF COBIL0AI
565 CONFIRMI OF COBIL0AI
566 WS-MESSAGE.
567
568
569
570 *
571 * Ver: CardDemo_v1.0-15-g27d6c6f-68 Date: 2022-07-19 23:12:32 CDT
572 *