MFmainframe-rea
WS carddemo · 26f629ef

Converted program · 1751 lines of TypeScript from 4236 lines of COBOL · 3953 COBOL lines cited (93%)COACTUPC

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

1/**
2 * COACTUPC — account update (transaction CAUP).
3 * Converted from app/cbl/COACTUPC.cbl; screen COACTUP/CACTUPA; files CXACAIX (card
4 * xref by account), ACCTDAT and CUSTDAT (READ, READ UPDATE, REWRITE). Copybooks:
5 * CSSTRPFY (PF keys), CSLKPCDY (lookups, in account-update-lib.ts), CSUTLDWY/CSUTLDPY
6 * (date edits), CSSETATY (error attributes), CVACT01Y, CVACT03Y, CVCUS01Y.
7 *
8 * Data convention (see account-update-lib.ts): PIC X items are fixed-length strings and
9 * LOW-VALUES is "\0". The distinction matters: the program maps '*' and SPACES input to
10 * LOW-VALUES, then compares with the SPACES fetched from the files (COACTUPC.cbl:1684-1773).
11 */
12import { currentDate, editNumber, isBlank, isValidDate, upper } from "../runtime/cobol.js";
13import { blank } from "../runtime/codec.js";
14import { RESP, type CardDemoCommarea, type Cics, type Program } from "../runtime/cics.js";
15import { ATTR, type AttrOverride, type SymbolicMap } from "../runtime/screen.js";
16import { LAYOUTS, type AccountRecord, type CardXrefRecord, type CustomerRecord } from "../generated/records.js";
17import { populateHeaderInfo } from "./common.js";
18import {
19 eqX,
20 isLowValues,
21 isNumericX,
22 isSpaces,
23 isValidGeneralPurpCode,
24 isValidStateZip2,
25 isValidUsStateCode,
26 low,
27 lowOrSpaces,
28 numvalC,
29 numvalPlain,
30 resp2Of,
31 respX10,
32 s9v2,
33 trimSp,
34 unsigned2,
35 x,
36 zoned,
37} from "./account-update-lib.js";
38
39// WS-LITERALS (COACTUPC.cbl:532-582)
40const LIT_THISPGM = "COACTUPC";
41const LIT_THISTRANID = "CAUP";
42const LIT_THISMAPSET = "COACTUP";
43const LIT_THISMAP = "CACTUPA";
44const LIT_CCLISTMAPSET = "COCRDLI";
45const LIT_MENUPGM = "COMEN01C";
46const LIT_MENUTRANID = "CM00";
47const LIT_ACCTFILENAME = "ACCTDAT ";
48const LIT_CUSTFILENAME = "CUSTDAT ";
49const LIT_CARDXREFNAME_ACCT_PATH = "CXACAIX ";
50
51// WS-INFO-MSG condition values (COACTUPC.cbl:463-477)
52const FOUND_ACCOUNT_DATA = "Details of selected account shown above";
53const PROMPT_FOR_SEARCH_KEYS = "Enter or update id of account to update";
54const PROMPT_FOR_CHANGES = "Update account details presented above.";
55const PROMPT_FOR_CONFIRMATION = "Changes validated.Press F5 to save";
56const CONFIRM_UPDATE_SUCCESS = "Changes committed to database";
57const INFORM_FAILURE = "Changes unsuccessful. Please try again";
58
59// WS-RETURN-MSG condition values (COACTUPC.cbl:479-528)
60const WS_PROMPT_FOR_ACCT = "Account number not provided";
61const NO_SEARCH_CRITERIA_RECEIVED = "No input received";
62const NO_CHANGES_DETECTED = "No change detected with respect to values fetched.";
63const DID_NOT_FIND_ACCT_IN_ACCTDAT = "Did not find this account in account master file";
64const DID_NOT_FIND_CUST_IN_CUSTDAT = "Did not find associated customer in master file";
65const COULD_NOT_LOCK_ACCT_FOR_UPDATE = "Could not lock account record for update";
66const COULD_NOT_LOCK_CUST_FOR_UPDATE = "Could not lock customer record for update";
67const DATA_WAS_CHANGED_BEFORE_UPDATE = "Record changed by some one else. Please review";
68const LOCKED_BUT_UPDATE_FAILED = "Update of record failed";
69
70/** Full attribute bytes (DFHBMSCA): a MOVE replaces the whole byte, so every property is set. */
71const BMS: Record<"PRF" | "FSE" | "ASB" | "DAR", AttrOverride> = {
72 PRF: { ...ATTR.DFHBMPRF, hidden: false, bright: false, numeric: false },
73 FSE: { ...ATTR.DFHBMFSE, hidden: false, bright: false, numeric: false },
74 ASB: { ...ATTR.DFHBMASB, hidden: false, numeric: false, mdt: false },
75 // DFHBMDAR = X'4C': unprotected, non-display.
76 DAR: { protected: false, hidden: true, bright: false, numeric: false, mdt: false },
77};
78
79/** PIC X(12) REDEFINES PIC S9(10)V99: a number, or null when the bytes are SPACES / LOW-VALUES. */
80type Amount = number | null;
81
82/** ACUP-OLD-ACCT-DATA / ACUP-NEW-ACCT-DATA (COACTUPC.cbl:670-708, 758-796) */
83interface AcctData {
84 acctIdX: string; // X(11)
85 activeStatus: string; // X(1)
86 currBal: Amount;
87 creditLimit: Amount;
88 cashCreditLimit: Amount;
89 openDate: string; // X(8) YYYYMMDD
90 expiraionDate: string; // X(8)
91 reissueDate: string; // X(8)
92 currCycCredit: Amount;
93 currCycDebit: Amount;
94 groupId: string; // X(10)
95}
96
97/** ACUP-OLD-CUST-DATA / ACUP-NEW-CUST-DATA (COACTUPC.cbl:709-756, 797-849) */
98interface CustData {
99 custIdX: string; // X(9)
100 firstName: string; // X(25)
101 middleName: string;
102 lastName: string;
103 addrLine1: string; // X(50)
104 addrLine2: string;
105 addrLine3: string;
106 stateCd: string; // X(2)
107 countryCd: string; // X(3)
108 zip: string; // X(10)
109 phone1: string; // X(15) '(999)999-9999 '
110 phone2: string;
111 ssnX: string; // X(9)
112 govtId: string; // X(20)
113 dob: string; // X(8) YYYYMMDD
114 eftAccountId: string; // X(10)
115 priHolderInd: string; // X(1)
116 ficoX: string; // X(3)
117}
118
119/** WS-THIS-PROGCOMMAREA (COACTUPC.cbl:652-849), kept in the COMMAREA via ctx.ext. */
120interface ThisProgCommarea {
121 /**
122 * ACUP-CHANGE-ACTION: LOW-VALUES/SPACES details not fetched, 'S' show details,
123 * 'E' changes not ok, 'N' ok not confirmed, 'C' done, 'L' lock error, 'F' failed.
124 */
125 changeAction: string;
126 oldAcct: AcctData;
127 oldCust: CustData;
128 newAcct: AcctData;
129 newCust: CustData;
130}
131
132/** INITIALIZE of an account data group: PIC X to SPACES (REDEFINES are skipped). */
133function initAcct(): AcctData {
134 return {
135 acctIdX: x("", 11),
136 activeStatus: " ",
137 currBal: null,
138 creditLimit: null,
139 cashCreditLimit: null,
140 openDate: x("", 8),
141 expiraionDate: x("", 8),
142 reissueDate: x("", 8),
143 currCycCredit: null,
144 currCycDebit: null,
145 groupId: x("", 10),
146 };
147}
148
149/** MOVE LOW-VALUES TO ACUP-OLD-ACCT-DATA */
150function lowAcct(): AcctData {
151 return {
152 acctIdX: low(11),
153 activeStatus: low(1),
154 currBal: null,
155 creditLimit: null,
156 cashCreditLimit: null,
157 openDate: low(8),
158 expiraionDate: low(8),
159 reissueDate: low(8),
160 currCycCredit: null,
161 currCycDebit: null,
162 groupId: low(10),
163 };
164}
165
166function initCust(): CustData {
167 return {
168 custIdX: x("", 9),
169 firstName: x("", 25),
170 middleName: x("", 25),
171 lastName: x("", 25),
172 addrLine1: x("", 50),
173 addrLine2: x("", 50),
174 addrLine3: x("", 50),
175 stateCd: x("", 2),
176 countryCd: x("", 3),
177 zip: x("", 10),
178 phone1: x("", 15),
179 phone2: x("", 15),
180 ssnX: x("", 9),
181 govtId: x("", 20),
182 dob: x("", 8),
183 eftAccountId: x("", 10),
184 priHolderInd: " ",
185 ficoX: x("", 3),
186 };
187}
188
189function initProgCommarea(): ThisProgCommarea {
190 return { changeAction: " ", oldAcct: initAcct(), oldCust: initCust(), newAcct: initAcct(), newCust: initCust() };
191}
192
193/** WS-NON-KEY-FLAGS (COACTUPC.cbl:191-352): one char per flag, three for dates and phones. */
194interface NonKeyFlags {
195 acctStatus: string;
196 credLimit: string;
197 cashCreditLimit: string;
198 currBal: string;
199 currCycCredit: string;
200 currCycDebit: string;
201 dtOfBirth: string;
202 ficoScore: string;
203 openDate: string;
204 expiryDate: string;
205 reissueDate: string;
206 firstName: string;
207 middleName: string;
208 lastName: string;
209 addressLine1: string;
210 addressLine2: string;
211 city: string;
212 state: string;
213 zipcode: string;
214 country: string;
215 phoneNum1: string;
216 phoneNum2: string;
217 eftAccountId: string;
218 priCardholder: string;
219}
220
221function nonKeyFlags(fill: string): NonKeyFlags {
222 const one = fill;
223 const three = fill.repeat(3);
224 return {
225 acctStatus: one, credLimit: one, cashCreditLimit: one, currBal: one, currCycCredit: one, currCycDebit: one,
226 dtOfBirth: three, ficoScore: one, openDate: three, expiryDate: three, reissueDate: three,
227 firstName: one, middleName: one, lastName: one, addressLine1: one, addressLine2: one, city: one,
228 state: one, zipcode: one, country: one, phoneNum1: three, phoneNum2: three, eftAccountId: one, priCardholder: one,
229 };
230}
231
232/** WS-MISC-STORAGE after INITIALIZE (COACTUPC.cbl:35-528): alphanumerics SPACES. */
233interface Ws {
234 editVariableName: string;
235 /** WS-EDIT-DATE-CCYYMMDD (CSUTLDWY): the working copy the date edits normalise. */
236 editDateCcyymmdd: string;
237 /** WS-EDIT-DATE-FLGS (CSUTLDWY) */
238 editDateFlgs: string;
239 datachangedFlag: string; // '0' NO-CHANGES-FOUND, '1' CHANGE-HAS-OCCURRED
240 inputFlag: string; // '0' INPUT-OK, '1' INPUT-ERROR
241 editAcctFlag: string; // '1' valid, '0' not ok, ' ' blank
242 editCustFlag: string;
243 nonKey: NonKeyFlags;
244 editUsSsnFlgs: string; // WS-EDIT-US-SSN-FLGS, 3 chars
245 cardRidAcctId: string; // WS-CARD-RID-ACCT-ID-X
246 cardRidCustId: string; // WS-CARD-RID-CUST-ID-X
247 acctMasterReadFlag: string; // '1' FOUND-ACCT-IN-MASTER
248 custMasterReadFlag: string; // '1' FOUND-CUST-IN-MASTER
249 infoMsg: string; // X(40)
250 returnMsg: string; // X(75)
251 // ALPHA-VARS-FOR-DATA-EDITING (COACTUPC.cbl:411-416), X(15)
252 newCreditLimitX: string;
253 newCashCreditLimitX: string;
254 newCurrBalX: string;
255 newCurrCycCreditX: string;
256 newCurrCycDebitX: string;
257 // Record areas (CVACT01Y, CVACT03Y, CVCUS01Y)
258 xref: CardXrefRecord | undefined;
259 account: AccountRecord;
260 customer: CustomerRecord;
261}
262
263function initMisc(): Omit<Ws, "xref" | "account" | "customer"> {
264 return {
265 editVariableName: x("", 25),
266 editDateCcyymmdd: x("", 8),
267 editDateFlgs: x("", 3),
268 datachangedFlag: " ",
269 inputFlag: " ",
270 editAcctFlag: " ",
271 editCustFlag: " ",
272 nonKey: nonKeyFlags(" "),
273 editUsSsnFlgs: x("", 3),
274 cardRidAcctId: x("", 11),
275 cardRidCustId: x("", 9),
276 acctMasterReadFlag: " ",
277 custMasterReadFlag: " ",
278 infoMsg: x("", 40),
279 returnMsg: x("", 75),
280 newCreditLimitX: x("", 15),
281 newCashCreditLimitX: x("", 15),
282 newCurrBalX: x("", 15),
283 newCurrCycCreditX: x("", 15),
284 newCurrCycDebitX: x("", 15),
285 };
286}
287
288/** CC-WORK-AREA (CVCRD01Y) after INITIALIZE. */
289interface CcWorkArea {
290 /** CCARD-AID: 'ENTER', 'CLEAR', 'PA1', 'PA2', 'PFK01'..'PFK12' or SPACES */
291 aid: string;
292 /** CC-ACCT-ID PIC X(11) */
293 acctId: string;
294}
295
296interface Task {
297 ctx: Cics;
298 area: CardDemoCommarea;
299 st: ThisProgCommarea;
300 ws: Ws;
301 cc: CcWorkArea;
302}
303
304// ------------------------------------------------------------------ small helpers
305
306const VALID = "\0"; // 88 ...-ISVALID VALUE LOW-VALUES
307const isFlagBad = (f: string | undefined) => f === "0" || f === "B";
308const notFetched = (st: ThisProgCommarea) => st.changeAction === "\0" || st.changeAction === " ";
309const changesMade = (st: ThisProgCommarea) => ["E", "N", "C", "L", "F"].includes(st.changeAction);
310const msgOff = (ws: Ws) => isSpaces(ws.returnMsg);
311const setMsg = (ws: Ws, text: string) => (ws.returnMsg = x(text, 75));
312const isMsg = (ws: Ws, text: string) => ws.returnMsg === x(text, 75);
313const inputError = (ws: Ws) => ws.inputFlag === "1";
314/** STRING FUNCTION TRIM(WS-EDIT-VARIABLE-NAME) suffix DELIMITED BY SIZE INTO WS-RETURN-MSG (only when no message yet) */
315function editMsg(ws: Ws, suffix: string): void {
316 if (msgOff(ws)) setMsg(ws, trimSp(ws.editVariableName) + suffix);
317}
318/** MOVE literal TO WS-EDIT-VARIABLE-NAME (PIC X(25): 'Current Cycle Credit Limit' loses its last letter). */
319function varName(ws: Ws, name: string): void {
320 ws.editVariableName = x(name, 25);
321}
322/** Reference modification item(start:len), 1-based. */
323const sub = (s: string, start: number, len: number) => s.slice(start - 1, start - 1 + len);
324const put = (s: string, start: number, len: number, v: string) => s.slice(0, start - 1) + x(v, len) + s.slice(start - 1 + len);
325const amountEq = (a: Amount, b: Amount) => (a === null || b === null ? a === b : a === b);
326
327/** MOVE value TO fieldO: LOW-VALUES are not sent (the map's initial data shows instead). */
328function out(o: SymbolicMap, name: string, value: string | null): void {
329 if (value === null || isLowValues(value)) {
330 o.set(name, null);
331 return;
332 }
333 o.set(name, value.replace(/\0+$/, "").replace(/\0/g, " "));
334}
335
336/** MOVE amount TO WS-EDIT-CURRENCY-9-2-F (PIC +ZZZ,ZZZ,ZZZ.99) */
337const currency = (v: Amount) => editNumber(v ?? 0, "+ZZZ,ZZZ,ZZZ.99");
338
339export const COACTUPC: Program = {
340 name: LIT_THISPGM,
341 source: "app/cbl/COACTUPC.cbl",
342 run(ctx: Cics) {
343 // 0000-MAIN (COACTUPC.cbl:859-1005)
344 // EXEC CICS HANDLE ABEND LABEL(ABEND-ROUTINE): the runtime reports abends itself.
345 // INITIALIZE CC-WORK-AREA WS-MISC-STORAGE WS-COMMAREA
346 const blankAcct = blank<AccountRecord>(LAYOUTS.CVACT01Y!);
347 const blankCust = blank<CustomerRecord>(LAYOUTS.CVCUS01Y!);
348 const ws: Ws = { ...initMisc(), xref: undefined, account: blankAcct, customer: blankCust };
349 const cc: CcWorkArea = { aid: x("", 5), acctId: x("", 11) };
350
351 // IF EIBCALEN = 0 OR (CDEMO-FROM-PROGRAM = LIT-MENUPGM AND NOT CDEMO-PGM-REENTER):
352 // the second test reads the working-storage CARDDEMO-COMMAREA before DFHCOMMAREA has
353 // been moved into it, so in practice only EIBCALEN = 0 takes this branch.
354 const area = ctx.area();
355 if (ctx.eib.calen === 0) {
356 area.pgmContext = 0; // SET CDEMO-PGM-ENTER
357 }
358 const st = ctx.ext<ThisProgCommarea>(initProgCommarea);
359 if (ctx.eib.calen === 0) {
360 Object.assign(st, initProgCommarea());
361 st.changeAction = "\0"; // SET ACUP-DETAILS-NOT-FETCHED
362 }
363 const t: Task = { ctx, area, st, ws, cc };
364
365 storePfkey(t);
366
367 // SET PFK-INVALID; only ENTER, PF3, PF5 (awaiting confirmation) and PF12 (details shown) are valid.
368 const pfkValid =
369 cc.aid === "ENTER" ||
370 cc.aid === "PFK03" ||
371 (cc.aid === "PFK05" && st.changeAction === "N") ||
372 (cc.aid === "PFK12" && !notFetched(st));
373 if (!pfkValid) cc.aid = "ENTER";
374
375 if (cc.aid === "PFK03") {
376 // USER PRESSES PF03 TO EXIT (COACTUPC.cbl:927-959)
377 area.toTranid = isBlank(area.fromTranid) ? LIT_MENUTRANID : area.fromTranid;
378 area.toProgram = isBlank(area.fromProgram) ? LIT_MENUPGM : area.fromProgram;
379 area.fromTranid = LIT_THISTRANID;
380 area.fromProgram = LIT_THISPGM;
381 area.userType = "U"; // SET CDEMO-USRTYP-USER
382 area.pgmContext = 0;
383 area.lastMapset = LIT_THISMAPSET;
384 area.lastMap = LIT_THISMAP;
385 ctx.syncpoint();
386 ctx.xctl(area.toProgram, area);
387 }
388 if ((notFetched(st) && area.pgmContext === 0) || (area.fromProgram === LIT_MENUPGM && area.pgmContext !== 1)) {
389 // FRESH ENTRY INTO PROGRAM (COACTUPC.cbl:964-973)
390 Object.assign(st, initProgCommarea());
391 sendMap(t);
392 area.pgmContext = 1;
393 st.changeAction = "\0";
394 commonReturn(t);
395 }
396 if (st.changeAction === "C" || st.changeAction === "L" || st.changeAction === "F") {
397 // CHANGES DONE OR FAILED: ASK FOR A FRESH SEARCH (COACTUPC.cbl:979-989)
398 Object.assign(st, initProgCommarea());
399 Object.assign(ws, initMisc());
400 area.acctId = 0;
401 area.pgmContext = 0;
402 sendMap(t);
403 area.pgmContext = 1;
404 st.changeAction = "\0";
405 commonReturn(t);
406 }
407 // WHEN OTHER (COACTUPC.cbl:996-1003)
408 processInputs(t);
409 decideAction(t);
410 sendMap(t);
411 commonReturn(t);
412 },
413};
414
415/** COMMON-RETURN (COACTUPC.cbl:1007-1020): RETURN TRANSID(CAUP) with the COMMAREA (WS-THIS-PROGCOMMAREA rides in ext). */
416function commonReturn(t: Task): never {
417 t.ctx.return(LIT_THISTRANID, t.area);
418}
419
420/** YYYY-STORE-PFKEY (CSSTRPFY.cpy:18-81): PF13-PF24 fold onto PF1-PF12. */
421function storePfkey(t: Task): void {
422 const aid = t.ctx.eib.aid;
423 const pf = /^PF(\d+)$/.exec(aid);
424 if (aid === "ENTER" || aid === "CLEAR" || aid === "PA1" || aid === "PA2") t.cc.aid = x(aid, 5).trimEnd();
425 else if (pf) t.cc.aid = `PFK${String(((Number(pf[1]) - 1) % 12) + 1).padStart(2, "0")}`;
426}
427
428/** 1000-PROCESS-INPUTS (COACTUPC.cbl:1025-1034) */
429function processInputs(t: Task): void {
430 receiveMap(t);
431 editMapInputs(t);
432 // MOVE WS-RETURN-MSG TO CCARD-ERROR-MSG, LIT-THISPGM TO CCARD-NEXT-PROG ...: not used afterwards.
433}
434
435/** 1100-RECEIVE-MAP (COACTUPC.cbl:1039-1425) */
436function receiveMap(t: Task): void {
437 const { ctx, st, ws, cc } = t;
438 const { resp, map } = ctx.receiveMap(LIT_THISMAPSET, LIT_THISMAP);
439 // On MAPFAIL (CLEAR/PA keys) INTO(CACTUPAI) is not updated: the fresh map storage is LOW-VALUES.
440 const inp = resp === RESP.NORMAL ? map : ctx.map(LIT_THISMAPSET, LIT_THISMAP);
441 const def = (name: string) => inp.def.fields.find((f) => f.name === name)!.length;
442 /** xxxI: not received or erased = LOW-VALUES; received data is padded with blanks by BMS. */
443 const fieldI = (name: string): string => {
444 const n = def(name);
445 const v = inp.get(name);
446 return inp.isLow(name) || v === "" ? low(n) : x(v, n);
447 };
448 /** IF xxxI = '*' OR xxxI = SPACES MOVE LOW-VALUES TO target ELSE MOVE xxxI TO target */
449 const take = (name: string, n: number): string => {
450 const v = fieldI(name);
451 return eqX(v, "*") || isSpaces(v) ? low(n) : x(v, n);
452 };
453
454 // INITIALIZE ACUP-NEW-DETAILS
455 st.newAcct = initAcct();
456 st.newCust = initCust();
457 const na = st.newAcct;
458 const nc = st.newCust;
459
460 cc.acctId = take("ACCTSID", 11);
461 na.acctIdX = cc.acctId;
462
463 if (notFetched(st)) return;
464
465 na.activeStatus = take("ACSTTUS", 1);
466
467 // Credit Limit, Cash Limit, Current Balance, Cycle Credit, Cycle Debit (COACTUPC.cbl:1072-1140)
468 const amount = (name: string): { xText: string; n: Amount } => {
469 const v = take(name, 15);
470 if (isLowValues(v)) return { xText: v, n: null };
471 const n = numvalC(v);
472 return { xText: v, n: n === undefined ? null : s9v2(n) };
473 };
474 ({ xText: ws.newCreditLimitX, n: na.creditLimit } = amount("ACRDLIM"));
475 ({ xText: ws.newCashCreditLimitX, n: na.cashCreditLimit } = amount("ACSHLIM"));
476 ({ xText: ws.newCurrBalX, n: na.currBal } = amount("ACURBAL"));
477 ({ xText: ws.newCurrCycCreditX, n: na.currCycCredit } = amount("ACRCYCR"));
478 ({ xText: ws.newCurrCycDebitX, n: na.currCycDebit } = amount("ACRCYDB"));
479
480 // Open, expiry and reissue dates (COACTUPC.cbl:1142-1209)
481 na.openDate = take("OPNYEAR", 4) + take("OPNMON", 2) + take("OPNDAY", 2);
482 na.expiraionDate = take("EXPYEAR", 4) + take("EXPMON", 2) + take("EXPDAY", 2);
483 na.reissueDate = take("RISYEAR", 4) + take("RISMON", 2) + take("RISDAY", 2);
484 na.groupId = take("AADDGRP", 10);
485
486 // Customer master data (COACTUPC.cbl:1219-1424)
487 nc.custIdX = take("ACSTNUM", 9);
488 nc.ssnX = take("ACTSSN1", 3) + take("ACTSSN2", 2) + take("ACTSSN3", 4);
489 nc.dob = take("DOBYEAR", 4) + take("DOBMON", 2) + take("DOBDAY", 2);
490 nc.ficoX = take("ACSTFCO", 3);
491 nc.firstName = take("ACSFNAM", 25);
492 nc.middleName = take("ACSMNAM", 25);
493 nc.lastName = take("ACSLNAM", 25);
494 nc.addrLine1 = take("ACSADL1", 50);
495 nc.addrLine2 = take("ACSADL2", 50);
496 nc.addrLine3 = take("ACSCITY", 50);
497 nc.stateCd = take("ACSSTTE", 2);
498 nc.countryCd = take("ACSCTRY", 3);
499 nc.zip = take("ACSZIPC", 10);
500 // ACUP-NEW-CUST-PHONE-NUM-1A/1B/1C at (2:3) (6:3) (10:4) of the X(15) item.
501 nc.phone1 = put(put(put(nc.phone1, 2, 3, take("ACSPH1A", 3)), 6, 3, take("ACSPH1B", 3)), 10, 4, take("ACSPH1C", 4));
502 nc.phone2 = put(put(put(nc.phone2, 2, 3, take("ACSPH2A", 3)), 6, 3, take("ACSPH2B", 3)), 10, 4, take("ACSPH2C", 4));
503 nc.govtId = take("ACSGOVT", 20);
504 nc.eftAccountId = take("ACSEFTC", 10);
505 nc.priHolderInd = take("ACSPFLG", 1);
506}
507
508/** 1200-EDIT-MAP-INPUTS (COACTUPC.cbl:1429-1676) */
509function editMapInputs(t: Task): void {
510 const { ctx, st, ws } = t;
511 ws.inputFlag = "0";
512
513 if (notFetched(st)) {
514 // VALIDATE THE SEARCH KEYS
515 editAccount(t);
516 st.oldAcct = lowAcct();
517 if (ws.editAcctFlag === " ") setMsg(ws, NO_SEARCH_CRITERIA_RECEIVED);
518 return;
519 }
520
521 // SEARCH KEYS ALREADY VALIDATED AND DATA FETCHED
522 ws.infoMsg = x(FOUND_ACCOUNT_DATA, 40);
523 ws.acctMasterReadFlag = "1";
524 ws.editAcctFlag = "1";
525 ws.custMasterReadFlag = "1";
526 ws.editCustFlag = "1";
527
528 compareOldNew(t);
529
530 if (ws.datachangedFlag === "0" || st.changeAction === "N" || st.changeAction === "C") {
531 ws.nonKey = nonKeyFlags(VALID);
532 return;
533 }
534
535 st.changeAction = "E";
536 const na = st.newAcct;
537 const nc = st.newCust;
538 const f = ws.nonKey;
539
540 varName(ws, "Account Status");
541 f.acctStatus = editYesNo(ws, na.activeStatus);
542
543 varName(ws, "Open Date");
544 f.openDate = editDateCcyymmdd(ws, na.openDate);
545
546 varName(ws, "Credit Limit");
547 f.credLimit = editSigned9v2(ws, ws.newCreditLimitX);
548
549 varName(ws, "Expiry Date");
550 f.expiryDate = editDateCcyymmdd(ws, na.expiraionDate);
551
552 varName(ws, "Cash Credit Limit");
553 f.cashCreditLimit = editSigned9v2(ws, ws.newCashCreditLimitX);
554
555 varName(ws, "Reissue Date");
556 f.reissueDate = editDateCcyymmdd(ws, na.reissueDate);
557
558 varName(ws, "Current Balance");
559 f.currBal = editSigned9v2(ws, ws.newCurrBalX);
560
561 varName(ws, "Current Cycle Credit Limit");
562 f.currCycCredit = editSigned9v2(ws, ws.newCurrCycCreditX);
563
564 varName(ws, "Current Cycle Debit Limit");
565 f.currCycDebit = editSigned9v2(ws, ws.newCurrCycDebitX);
566
567 varName(ws, "SSN");
568 editUsSsn(t);
569
570 varName(ws, "Date of Birth");
571 f.dtOfBirth = editDateCcyymmdd(ws, nc.dob);
572 if (f.dtOfBirth === VALID.repeat(3)) {
573 editDateOfBirth(ctx, ws);
574 f.dtOfBirth = ws.editDateFlgs;
575 }
576
577 varName(ws, "FICO Score");
578 f.ficoScore = editNumReqd(ws, nc.ficoX, 3);
579 if (f.ficoScore === VALID) editFicoScore(t);
580
581 // Edit names
582 varName(ws, "First Name");
583 f.firstName = editAlphaReqd(ws, nc.firstName, 25);
584
585 varName(ws, "Middle Name");
586 f.middleName = editAlphaOpt(ws, nc.middleName, 25);
587
588 varName(ws, "Last Name");
589 f.lastName = editAlphaReqd(ws, nc.lastName, 25);
590
591 varName(ws, "Address Line 1");
592 f.addressLine1 = editMandatory(ws, nc.addrLine1, 50);
593
594 varName(ws, "State");
595 f.state = editAlphaReqd(ws, nc.stateCd, 2);
596 if (f.state === VALID) editUsStateCd(t);
597
598 varName(ws, "Zip");
599 f.zipcode = editNumReqd(ws, nc.zip, 5);
600
601 // Address Line 2 is optional
602 varName(ws, "City");
603 f.city = editAlphaReqd(ws, nc.addrLine3, 50);
604
605 varName(ws, "Country");
606 f.country = editAlphaReqd(ws, nc.countryCd, 3);
607
608 varName(ws, "Phone Number 1");
609 f.phoneNum1 = editUsPhoneNum(ws, nc.phone1);
610
611 varName(ws, "Phone Number 2");
612 f.phoneNum2 = editUsPhoneNum(ws, nc.phone2);
613
614 varName(ws, "EFT Account Id");
615 f.eftAccountId = editNumReqd(ws, nc.eftAccountId, 10);
616
617 varName(ws, "Primary Card Holder");
618 f.priCardholder = editYesNo(ws, nc.priHolderInd);
619
620 // Cross field edits begin here
621 if (f.state === VALID && f.zipcode === VALID) editUsStateZipCd(t);
622
623 if (!inputError(ws)) st.changeAction = "N";
624}
625
626/** 1205-COMPARE-OLD-NEW (COACTUPC.cbl:1681-1779) */
627function compareOldNew(t: Task): void {
628 const { st, ws } = t;
629 ws.datachangedFlag = "0";
630 const na = st.newAcct;
631 const oa = st.oldAcct;
632 const tu = (s: string) => upper(trimSp(s));
633
634 const acctSame =
635 na.acctIdX === oa.acctIdX &&
636 upper(na.activeStatus) === upper(oa.activeStatus) &&
637 amountEq(na.currBal, oa.currBal) &&
638 amountEq(na.creditLimit, oa.creditLimit) &&
639 amountEq(na.cashCreditLimit, oa.cashCreditLimit) &&
640 na.openDate === oa.openDate &&
641 na.expiraionDate === oa.expiraionDate &&
642 na.reissueDate === oa.reissueDate &&
643 amountEq(na.currCycCredit, oa.currCycCredit) &&
644 amountEq(na.currCycDebit, oa.currCycDebit) &&
645 eqX(tu(na.groupId), tu(oa.groupId));
646 if (!acctSame) {
647 ws.datachangedFlag = "1";
648 return;
649 }
650
651 const nc = st.newCust;
652 const oc = st.oldCust;
653 const custSame =
654 eqX(tu(nc.custIdX), tu(oc.custIdX)) &&
655 eqX(tu(nc.firstName), tu(oc.firstName)) &&
656 eqX(tu(nc.middleName), tu(oc.middleName)) &&
657 eqX(tu(nc.lastName), tu(oc.lastName)) &&
658 eqX(tu(nc.addrLine1), tu(oc.addrLine1)) &&
659 eqX(tu(nc.addrLine2), tu(oc.addrLine2)) &&
660 eqX(tu(nc.addrLine3), tu(oc.addrLine3)) &&
661 eqX(tu(nc.stateCd), tu(oc.stateCd)) &&
662 eqX(tu(nc.countryCd), tu(oc.countryCd)) &&
663 eqX(tu(nc.zip), tu(oc.zip)) &&
664 sub(nc.phone1, 2, 3) === sub(oc.phone1, 2, 3) &&
665 sub(nc.phone1, 6, 3) === sub(oc.phone1, 6, 3) &&
666 sub(nc.phone1, 10, 4) === sub(oc.phone1, 10, 4) &&
667 sub(nc.phone2, 2, 3) === sub(oc.phone2, 2, 3) &&
668 sub(nc.phone2, 6, 3) === sub(oc.phone2, 6, 3) &&
669 sub(nc.phone2, 10, 4) === sub(oc.phone2, 10, 4) &&
670 nc.ssnX === oc.ssnX &&
671 eqX(tu(nc.govtId), tu(oc.govtId)) &&
672 nc.dob === oc.dob &&
673 nc.eftAccountId === oc.eftAccountId &&
674 eqX(tu(nc.priHolderInd), tu(oc.priHolderInd)) &&
675 nc.ficoX === oc.ficoX;
676 if (custSame) setMsg(ws, NO_CHANGES_DETECTED);
677 else ws.datachangedFlag = "1";
678}
679
680/** 1210-EDIT-ACCOUNT (COACTUPC.cbl:1783-1822) */
681function editAccount(t: Task): void {
682 const { area, st, ws, cc } = t;
683 ws.editAcctFlag = "0";
684
685 // Not supplied
686 if (lowOrSpaces(cc.acctId)) {
687 ws.inputFlag = "1";
688 ws.editAcctFlag = " ";
689 if (msgOff(ws)) setMsg(ws, WS_PROMPT_FOR_ACCT);
690 area.acctId = 0;
691 st.newAcct.acctIdX = "0".repeat(11);
692 return;
693 }
694
695 // Not numeric / not 11 characters
696 st.newAcct.acctIdX = cc.acctId; // MOVE CC-ACCT-ID TO ACUP-NEW-ACCT-ID
697 if (!isNumericX(cc.acctId) || Number(cc.acctId) === 0) {
698 ws.inputFlag = "1";
699 if (msgOff(ws)) setMsg(ws, "Account Number if supplied must be a 11 digit" + " Non-Zero Number");
700 area.acctId = 0;
701 return;
702 }
703 area.acctId = Number(cc.acctId);
704 ws.editAcctFlag = "1";
705}
706
707/** 1215-EDIT-MANDATORY (COACTUPC.cbl:1824-1854): returns WS-EDIT-MANDATORY-FLAGS. */
708function editMandatory(ws: Ws, value: string, length: number): string {
709 const v = x(value, 256).slice(0, length);
710 if (isLowValues(v) || isSpaces(v) || trimSp(v).length === 0) {
711 ws.inputFlag = "1";
712 editMsg(ws, " must be supplied.");
713 return "B";
714 }
715 return VALID;
716}
717
718/** 1220-EDIT-YESNO (COACTUPC.cbl:1856-1896): returns WS-EDIT-YES-NO, which doubles as the flag. */
719function editYesNo(ws: Ws, value: string): string {
720 const yn = x(value, 1);
721 if (yn === "\0" || yn === " " || yn === "0") {
722 ws.inputFlag = "1";
723 editMsg(ws, " must be supplied.");
724 return "B";
725 }
726 if (yn === "Y" || yn === "N") return yn;
727 ws.inputFlag = "1";
728 editMsg(ws, " must be Y or N.");
729 return "0";
730}
731
732/** INSPECT ... CONVERTING letters (and digits) TO SPACES, then FUNCTION LENGTH(FUNCTION TRIM(...)) = 0 */
733const onlyAlpha = (v: string) => trimSp(v.replace(/[A-Za-z]/g, " ")).length === 0;
734
735/** 1225-EDIT-ALPHA-REQD (COACTUPC.cbl:1898-1953): returns WS-EDIT-ALPHA-ONLY-FLAGS. */
736function editAlphaReqd(ws: Ws, value: string, length: number): string {
737 const v = x(value, 256).slice(0, length);
738 if (isLowValues(v) || isSpaces(v) || trimSp(v).length === 0) {
739 ws.inputFlag = "1";
740 editMsg(ws, " must be supplied.");
741 return "B";
742 }
743 if (!onlyAlpha(v)) {
744 ws.inputFlag = "1";
745 editMsg(ws, " can have alphabets only.");
746 return "0";
747 }
748 return VALID;
749}
750
751/** 1235-EDIT-ALPHA-OPT (COACTUPC.cbl:2012-2059) */
752function editAlphaOpt(ws: Ws, value: string, length: number): string {
753 const v = x(value, 256).slice(0, length);
754 if (isLowValues(v) || isSpaces(v) || trimSp(v).length === 0) return VALID;
755 if (!onlyAlpha(v)) {
756 ws.inputFlag = "1";
757 editMsg(ws, " can have alphabets only.");
758 return "0";
759 }
760 return VALID;
761}
762
763// 1230-EDIT-ALPHANUM-REQD and 1240-EDIT-ALPHANUM-OPT (COACTUPC.cbl:1955-2011, 2061-2107)
764// are never performed by COACTUPC and are not converted.
765
766/** 1245-EDIT-NUM-REQD (COACTUPC.cbl:2109-2178): returns WS-EDIT-ALPHANUM-ONLY-FLAGS. */
767function editNumReqd(ws: Ws, value: string, length: number): string {
768 const v = x(value, 256).slice(0, length);
769 if (isLowValues(v) || isSpaces(v) || trimSp(v).length === 0) {
770 ws.inputFlag = "1";
771 editMsg(ws, " must be supplied.");
772 return "B";
773 }
774 if (!isNumericX(v)) {
775 ws.inputFlag = "1";
776 editMsg(ws, " must be all numeric.");
777 return "0";
778 }
779 if (Number(v) === 0) {
780 ws.inputFlag = "1";
781 editMsg(ws, " must not be zero.");
782 return "0";
783 }
784 return VALID;
785}
786
787/** 1250-EDIT-SIGNED-9V2 (COACTUPC.cbl:2180-2223): returns WS-FLG-SIGNED-NUMBER-EDIT. */
788function editSigned9v2(ws: Ws, value: string): string {
789 if (isLowValues(value) || isSpaces(value)) {
790 ws.inputFlag = "1";
791 editMsg(ws, " must be supplied.");
792 return "B";
793 }
794 if (numvalC(value) === undefined) {
795 ws.inputFlag = "1";
796 editMsg(ws, " is not valid");
797 return "0";
798 }
799 return VALID;
800}
801
802/**
803 * 1260-EDIT-US-PHONE-NUM, EDIT-AREA-CODE, EDIT-US-PHONE-PREFIX, EDIT-US-PHONE-LINENUM
804 * (COACTUPC.cbl:2225-2429): returns WS-EDIT-US-PHONE-NUM-FLGS (area, prefix, line).
805 */
806function editUsPhoneNum(ws: Ws, phone: string): string {
807 const numa = sub(phone, 2, 3);
808 const numb = sub(phone, 6, 3);
809 const numc = sub(phone, 10, 4);
810 const flg = ["0", "0", "0"]; // SET WS-EDIT-US-PHONE-IS-INVALID
811
812 // Not mandatory. Faithful slip: the third test reads NUMA = SPACES OR NUMC = LOW-VALUES.
813 if (lowOrSpaces(numa) && lowOrSpaces(numb) && (isSpaces(numa) || isLowValues(numc))) return VALID.repeat(3);
814
815 // EDIT-AREA-CODE (COACTUPC.cbl:2246-2315)
816 areaCode: {
817 if (lowOrSpaces(numa)) {
818 ws.inputFlag = "1";
819 flg[0] = "B";
820 editMsg(ws, ": Area code must be supplied.");
821 break areaCode;
822 }
823 if (!isNumericX(numa)) {
824 ws.inputFlag = "1";
825 flg[0] = "0";
826 editMsg(ws, ": Area code must be A 3 digit number.");
827 break areaCode;
828 }
829 if (Number(numa) === 0) {
830 ws.inputFlag = "1";
831 flg[0] = "0";
832 editMsg(ws, ": Area code cannot be zero");
833 break areaCode;
834 }
835 if (!isValidGeneralPurpCode(trimSp(numa))) {
836 ws.inputFlag = "1";
837 flg[0] = "0";
838 editMsg(ws, ": Not valid North America general purpose area code");
839 break areaCode;
840 }
841 flg[0] = VALID;
842 }
843
844 // EDIT-US-PHONE-PREFIX (COACTUPC.cbl:2316-2368)
845 prefix: {
846 if (lowOrSpaces(numb)) {
847 ws.inputFlag = "1";
848 flg[1] = "B";
849 editMsg(ws, ": Prefix code must be supplied.");
850 break prefix;
851 }
852 if (!isNumericX(numb)) {
853 ws.inputFlag = "1";
854 flg[1] = "0";
855 editMsg(ws, ": Prefix code must be A 3 digit number.");
856 break prefix;
857 }
858 if (Number(numb) === 0) {
859 ws.inputFlag = "1";
860 flg[1] = "0";
861 editMsg(ws, ": Prefix code cannot be zero");
862 break prefix;
863 }
864 flg[1] = VALID;
865 }
866
867 // EDIT-US-PHONE-LINENUM (COACTUPC.cbl:2370-2422)
868 lineNum: {
869 if (lowOrSpaces(numc)) {
870 ws.inputFlag = "1";
871 flg[2] = "B";
872 editMsg(ws, ": Line number code must be supplied.");
873 break lineNum;
874 }
875 if (!isNumericX(numc)) {
876 ws.inputFlag = "1";
877 flg[2] = "0";
878 editMsg(ws, ": Line number code must be A 4 digit number.");
879 break lineNum;
880 }
881 if (Number(numc) === 0) {
882 ws.inputFlag = "1";
883 flg[2] = "0";
884 editMsg(ws, ": Line number code cannot be zero");
885 break lineNum;
886 }
887 flg[2] = VALID;
888 }
889 return flg.join("");
890}
891
892/** 1265-EDIT-US-SSN (COACTUPC.cbl:2431-2491): sets WS-EDIT-US-SSN-FLGS. */
893function editUsSsn(t: Task): void {
894 const { st, ws } = t;
895 const ssn = st.newCust.ssnX;
896 const flg = [" ", " ", " "];
897
898 varName(ws, "SSN: First 3 chars");
899 flg[0] = editNumReqd(ws, sub(ssn, 1, 3), 3);
900 // Part1 should not be 000, 666, or between 900 and 999 (88 INVALID-SSN-PART1)
901 if (flg[0] === VALID) {
902 const part1 = Number(sub(ssn, 1, 3));
903 if (part1 === 0 || part1 === 666 || (part1 >= 900 && part1 <= 999)) {
904 ws.inputFlag = "1";
905 flg[0] = "0";
906 editMsg(ws, ": should not be 000, 666, or between 900 and 999");
907 }
908 }
909
910 varName(ws, "SSN 4th & 5th chars");
911 flg[1] = editNumReqd(ws, sub(ssn, 4, 2), 2);
912
913 varName(ws, "SSN Last 4 chars");
914 flg[2] = editNumReqd(ws, sub(ssn, 6, 4), 4);
915 ws.editUsSsnFlgs = flg.join("");
916}
917
918/** 1270-EDIT-US-STATE-CD (COACTUPC.cbl:2493-2513) */
919function editUsStateCd(t: Task): void {
920 const { st, ws } = t;
921 if (!isValidUsStateCode(st.newCust.stateCd)) {
922 ws.inputFlag = "1";
923 ws.nonKey.state = "0";
924 editMsg(ws, ": is not a valid state code");
925 }
926}
927
928/** 1275-EDIT-FICO-SCORE (COACTUPC.cbl:2514-2533): 88 FICO-RANGE-IS-VALID VALUES 300 THROUGH 850. */
929function editFicoScore(t: Task): void {
930 const { st, ws } = t;
931 const fico = Number(st.newCust.ficoX);
932 if (!(fico >= 300 && fico <= 850)) {
933 ws.inputFlag = "1";
934 ws.nonKey.ficoScore = "0";
935 editMsg(ws, ": should be between 300 and 850");
936 }
937}
938
939/** 1280-EDIT-US-STATE-ZIP-CD (COACTUPC.cbl:2535-2560): a crude zip code edit based on USPS data. */
940function editUsStateZipCd(t: Task): void {
941 const { st, ws } = t;
942 if (!isValidStateZip2(st.newCust.stateCd + sub(st.newCust.zip, 1, 2))) {
943 ws.inputFlag = "1";
944 ws.nonKey.state = "0";
945 ws.nonKey.zipcode = "0";
946 if (msgOff(ws)) setMsg(ws, "Invalid zip code for state");
947 }
948}
949
950/**
951 * EDIT-DATE-CCYYMMDD THRU EDIT-DATE-CCYYMMDD-EXIT (CSUTLDPY.cpy:18-331), including the
952 * fall-through between its paragraphs: a GO TO ...-EXIT of the year, month and day edits
953 * continues with the next edit; only EDIT-DAY-MONTH-YEAR leaves early. Returns
954 * WS-EDIT-DATE-FLGS (year, month, day) and leaves WS-EDIT-DATE-CCYYMMDD normalised.
955 */
956function editDateCcyymmdd(ws: Ws, date: string): string {
957 let ccyy = sub(date, 1, 4);
958 let mm = sub(date, 5, 2);
959 let dd = sub(date, 7, 2);
960 const flg = ["0", "0", "0"]; // SET WS-EDIT-DATE-IS-INVALID
961 const done = () => {
962 ws.editDateCcyymmdd = ccyy + mm + dd;
963 ws.editDateFlgs = flg.join("");
964 return ws.editDateFlgs;
965 };
966
967 // EDIT-YEAR-CCYY (CSUTLDPY.cpy:25-90)
968 year: {
969 flg[0] = "0";
970 if (lowOrSpaces(ccyy)) {
971 ws.inputFlag = "1";
972 flg[0] = "B";
973 editMsg(ws, " : Year must be supplied.");
974 break year;
975 }
976 if (!isNumericX(ccyy)) {
977 ws.inputFlag = "1";
978 flg[0] = "0";
979 editMsg(ws, " must be 4 digit number.");
980 break year;
981 }
982 // Only 19 and 20 are valid centuries (88 THIS-CENTURY / LAST-CENTURY)
983 const cc = Number(ccyy.slice(0, 2));
984 if (cc !== 20 && cc !== 19) {
985 ws.inputFlag = "1";
986 flg[0] = "0";
987 editMsg(ws, " : Century is not valid.");
988 break year;
989 }
990 flg[0] = VALID;
991 }
992
993 // EDIT-MONTH (CSUTLDPY.cpy:91-147)
994 month: {
995 flg[1] = "0";
996 if (lowOrSpaces(mm)) {
997 ws.inputFlag = "1";
998 flg[1] = "B";
999 editMsg(ws, " : Month must be supplied.");
1000 break month;
1001 }
1002 // 88 WS-VALID-MONTH 1 THROUGH 12 on the PIC 9(2) REDEFINES, tested before any NUMERIC check.
1003 const m = zoned(mm);
1004 if (!(m >= 1 && m <= 12)) {
1005 ws.inputFlag = "1";
1006 flg[1] = "0";
1007 editMsg(ws, ": Month must be a number between 1 and 12.");
1008 break month;
1009 }
1010 const n = numvalPlain(mm);
1011 if (n === undefined) {
1012 ws.inputFlag = "1";
1013 flg[1] = "0";
1014 editMsg(ws, ": Month must be a number between 1 and 12.");
1015 break month;
1016 }
1017 mm = unsigned2(n); // COMPUTE WS-EDIT-DATE-MM-N = FUNCTION NUMVAL(WS-EDIT-DATE-MM)
1018 flg[1] = VALID;
1019 }
1020
1021 // EDIT-DAY (CSUTLDPY.cpy:150-207)
1022 day: {
1023 flg[2] = VALID;
1024 if (lowOrSpaces(dd)) {
1025 ws.inputFlag = "1";
1026 flg[2] = "B";
1027 editMsg(ws, " : Day must be supplied.");
1028 break day;
1029 }
1030 const n = numvalPlain(dd);
1031 if (n === undefined) {
1032 ws.inputFlag = "1";
1033 flg[2] = "0";
1034 editMsg(ws, ":day must be a number between 1 and 31.");
1035 break day;
1036 }
1037 dd = unsigned2(n);
1038 const d = Number(dd);
1039 if (!(d >= 1 && d <= 31)) {
1040 ws.inputFlag = "1";
1041 flg[2] = "0";
1042 editMsg(ws, ":day must be a number between 1 and 31.");
1043 break day;
1044 }
1045 flg[2] = VALID;
1046 }
1047
1048 // EDIT-DAY-MONTH-YEAR (CSUTLDPY.cpy:209-282)
1049 const mmN = zoned(mm);
1050 const ddN = zoned(dd);
1051 if (![1, 3, 5, 7, 8, 10, 12].includes(mmN) && ddN === 31) {
1052 ws.inputFlag = "1";
1053 flg[2] = "0";
1054 flg[1] = "0";
1055 editMsg(ws, ":Cannot have 31 days in this month.");
1056 return done();
1057 }
1058 if (mmN === 2 && ddN === 30) {
1059 ws.inputFlag = "1";
1060 flg[2] = "0";
1061 flg[1] = "0";
1062 editMsg(ws, ":Cannot have 30 days in this month.");
1063 return done();
1064 }
1065 if (mmN === 2 && ddN === 29) {
1066 const divBy = zoned(ccyy.slice(2, 4)) === 0 ? 400 : 4;
1067 if (zoned(ccyy) % divBy !== 0) {
1068 ws.inputFlag = "1";
1069 flg[2] = "0";
1070 flg[1] = "0";
1071 flg[0] = "0";
1072 editMsg(ws, ":Not a leap year.Cannot have 29 days in this month.");
1073 return done();
1074 }
1075 }
1076 if (flg.join("") !== VALID.repeat(3)) return done();
1077
1078 // EDIT-DATE-LE (CSUTLDPY.cpy:284-325): CALL 'CSUTLDTC' (CEEDAYS) with mask YYYYMMDD.
1079 if (!isValidDate(ccyy + mm + dd, "YYYYMMDD")) {
1080 ws.inputFlag = "1";
1081 flg[2] = "0";
1082 flg[1] = "0";
1083 flg[0] = "0";
1084 // CEEDAYS feedback: severity 3, msg 2508 (invalid date). The edits above leave no date
1085 // for CEEDAYS to reject, so this branch is not reachable with 19xx/20xx years.
1086 editMsg(ws, " validation error Sev code: " + "0003" + " Message code: " + "2508");
1087 } else if (!inputError(ws)) {
1088 flg[2] = VALID;
1089 }
1090 // Falls through from EDIT-DATE-LE-EXIT: SET WS-EDIT-DATE-IS-VALID TO TRUE (CSUTLDPY.cpy:327).
1091 flg[0] = flg[1] = flg[2] = VALID;
1092 return done();
1093}
1094
1095/** EDIT-DATE-OF-BIRTH (CSUTLDPY.cpy:341-372): a date of birth in the future is not acceptable. */
1096function editDateOfBirth(ctx: Cics, ws: Ws): void {
1097 const now = currentDate(ctx.now);
1098 const current = Number(`${now.year}${now.month}${now.day}`);
1099 // FUNCTION INTEGER-OF-DATE preserves the order of valid YYYYMMDD dates.
1100 if (current > Number(ws.editDateCcyymmdd)) return;
1101 ws.inputFlag = "1";
1102 ws.editDateFlgs = "000";
1103 editMsg(ws, ":cannot be in the future ");
1104}
1105
1106/** 2000-DECIDE-ACTION (COACTUPC.cbl:2562-2645) */
1107function decideAction(t: Task): void {
1108 const { area, st, ws, cc } = t;
1109 if (notFetched(st) || cc.aid === "PFK12") {
1110 // NO DETAILS SHOWN / CHANGES MADE BUT USER CANCELS: fetch and set up the edit screen.
1111 if (ws.editAcctFlag === "1") {
1112 setMsg(ws, ""); // SET WS-RETURN-MSG-OFF
1113 readAcct(t);
1114 if (ws.custMasterReadFlag === "1") st.changeAction = "S";
1115 }
1116 } else if (st.changeAction === "S") {
1117 if (!(inputError(ws) || isMsg(ws, NO_CHANGES_DETECTED))) st.changeAction = "N";
1118 } else if (st.changeAction === "E") {
1119 // DETAILS SHOWN BUT INPUT EDIT ERRORS FOUND
1120 } else if (st.changeAction === "N" && cc.aid === "PFK05") {
1121 // CONFIRMATION GIVEN. SO SAVE THE CHANGES
1122 writeProcessing(t);
1123 if (isMsg(ws, COULD_NOT_LOCK_ACCT_FOR_UPDATE)) st.changeAction = "L";
1124 else if (isMsg(ws, LOCKED_BUT_UPDATE_FAILED)) st.changeAction = "F";
1125 else if (isMsg(ws, DATA_WAS_CHANGED_BEFORE_UPDATE)) st.changeAction = "S";
1126 else st.changeAction = "C";
1127 } else if (st.changeAction === "N") {
1128 // CONFIRMATION NOT GIVEN. SO SHOW DETAILS AGAIN
1129 } else if (st.changeAction === "C") {
1130 // Not reachable: 0000-MAIN handles 'C' before 1000-PROCESS-INPUTS.
1131 st.changeAction = "S";
1132 if (isBlank(area.fromTranid)) {
1133 area.acctId = 0;
1134 area.cardNum = "0".repeat(16);
1135 area.acctStatus = "";
1136 }
1137 } else {
1138 abendRoutine(t, "0001", "UNEXPECTED DATA SCENARIO");
1139 }
1140}
1141
1142/** 3000-SEND-MAP (COACTUPC.cbl:2649-2666) */
1143function sendMap(t: Task): void {
1144 // 3100-SCREEN-INIT (COACTUPC.cbl:2668-2696): MOVE LOW-VALUES TO CACTUPAO, titles, date and time.
1145 const o = t.ctx.map(LIT_THISMAPSET, LIT_THISMAP);
1146 populateHeaderInfo(t.ctx, o, LIT_THISTRANID, LIT_THISPGM);
1147 setupScreenVars(t, o);
1148 setupInfoMsg(t, o);
1149 setupScreenAttrs(t, o);
1150 setupInfoMsgAttrs(t, o);
1151 // 3400-SEND-SCREEN (COACTUPC.cbl:3589-3605): SEND MAP CURSOR ERASE FREEKB
1152 t.ctx.sendMap(o, { erase: true, cursor: true, freekb: true });
1153}
1154
1155/** 3200-SETUP-SCREEN-VARS (COACTUPC.cbl:2698-2729) */
1156function setupScreenVars(t: Task, o: SymbolicMap): void {
1157 const { area, st, ws, cc } = t;
1158 if (area.pgmContext === 0) return;
1159 if (zoned(cc.acctId) === 0 && ws.editAcctFlag === "1") out(o, "ACCTSID", null);
1160 else out(o, "ACCTSID", cc.acctId);
1161
1162 if (notFetched(st) || zoned(cc.acctId) === 0) showInitialValues(o);
1163 else if (st.changeAction === "S") showOriginalValues(t, o);
1164 else if (changesMade(st)) showUpdatedValues(t, o);
1165 else showOriginalValues(t, o);
1166}
1167
1168/** 3201-SHOW-INITIAL-VALUES (COACTUPC.cbl:2731-2785): every data field LOW-VALUES. */
1169function showInitialValues(o: SymbolicMap): void {
1170 for (const name of [
1171 "ACSTTUS", "ACRDLIM", "ACURBAL", "ACSHLIM", "ACRCYCR", "ACRCYDB",
1172 "OPNYEAR", "OPNMON", "OPNDAY", "EXPYEAR", "EXPMON", "EXPDAY", "RISYEAR", "RISMON", "RISDAY", "AADDGRP",
1173 "ACSTNUM", "ACTSSN1", "ACTSSN2", "ACTSSN3", "ACSTFCO", "DOBYEAR", "DOBMON", "DOBDAY",
1174 "ACSFNAM", "ACSMNAM", "ACSLNAM", "ACSADL1", "ACSADL2", "ACSCITY", "ACSSTTE", "ACSZIPC", "ACSCTRY",
1175 "ACSPH1A", "ACSPH1B", "ACSPH1C", "ACSPH2A", "ACSPH2B", "ACSPH2C", "ACSGOVT", "ACSEFTC", "ACSPFLG",
1176 ]) out(o, name, null);
1177}
1178
1179/** 3202-SHOW-ORIGINAL-VALUES (COACTUPC.cbl:2787-2869) */
1180function showOriginalValues(t: Task, o: SymbolicMap): void {
1181 const { st, ws } = t;
1182 ws.nonKey = nonKeyFlags(VALID);
1183 ws.infoMsg = x(PROMPT_FOR_CHANGES, 40);
1184 const a = st.oldAcct;
1185 const c = st.oldCust;
1186
1187 if (ws.acctMasterReadFlag === "1" || ws.custMasterReadFlag === "1") {
1188 out(o, "ACSTTUS", a.activeStatus);
1189 out(o, "ACURBAL", currency(a.currBal));
1190 out(o, "ACRDLIM", currency(a.creditLimit));
1191 out(o, "ACSHLIM", currency(a.cashCreditLimit));
1192 out(o, "ACRCYCR", currency(a.currCycCredit));
1193 out(o, "ACRCYDB", currency(a.currCycDebit));
1194 out(o, "OPNYEAR", sub(a.openDate, 1, 4));
1195 out(o, "OPNMON", sub(a.openDate, 5, 2));
1196 out(o, "OPNDAY", sub(a.openDate, 7, 2));
1197 out(o, "EXPYEAR", sub(a.expiraionDate, 1, 4));
1198 out(o, "EXPMON", sub(a.expiraionDate, 5, 2));
1199 out(o, "EXPDAY", sub(a.expiraionDate, 7, 2));
1200 out(o, "RISYEAR", sub(a.reissueDate, 1, 4));
1201 out(o, "RISMON", sub(a.reissueDate, 5, 2));
1202 out(o, "RISDAY", sub(a.reissueDate, 7, 2));
1203 out(o, "AADDGRP", a.groupId);
1204 }
1205
1206 if (ws.custMasterReadFlag === "1") {
1207 out(o, "ACSTNUM", c.custIdX);
1208 out(o, "ACTSSN1", sub(c.ssnX, 1, 3));
1209 out(o, "ACTSSN2", sub(c.ssnX, 4, 2));
1210 out(o, "ACTSSN3", sub(c.ssnX, 6, 4));
1211 out(o, "ACSTFCO", c.ficoX);
1212 out(o, "DOBYEAR", sub(c.dob, 1, 4));
1213 out(o, "DOBMON", sub(c.dob, 5, 2));
1214 out(o, "DOBDAY", sub(c.dob, 7, 2));
1215 out(o, "ACSFNAM", c.firstName);
1216 out(o, "ACSMNAM", c.middleName);
1217 out(o, "ACSLNAM", c.lastName);
1218 out(o, "ACSADL1", c.addrLine1);
1219 out(o, "ACSADL2", c.addrLine2);
1220 out(o, "ACSCITY", c.addrLine3);
1221 out(o, "ACSSTTE", c.stateCd);
1222 out(o, "ACSZIPC", c.zip);
1223 out(o, "ACSCTRY", c.countryCd);
1224 out(o, "ACSPH1A", sub(c.phone1, 2, 3));
1225 out(o, "ACSPH1B", sub(c.phone1, 6, 3));
1226 out(o, "ACSPH1C", sub(c.phone1, 10, 4));
1227 out(o, "ACSPH2A", sub(c.phone2, 2, 3));
1228 out(o, "ACSPH2B", sub(c.phone2, 6, 3));
1229 out(o, "ACSPH2C", sub(c.phone2, 10, 4));
1230 out(o, "ACSGOVT", c.govtId);
1231 out(o, "ACSEFTC", c.eftAccountId);
1232 out(o, "ACSPFLG", c.priHolderInd);
1233 }
1234}
1235
1236/** 3203-SHOW-UPDATED-VALUES (COACTUPC.cbl:2870-2953): valid amounts are re-edited, others shown as typed. */
1237function showUpdatedValues(t: Task, o: SymbolicMap): void {
1238 const { st, ws } = t;
1239 const a = st.newAcct;
1240 const c = st.newCust;
1241 const f = ws.nonKey;
1242
1243 out(o, "ACSTTUS", a.activeStatus);
1244 out(o, "ACRDLIM", f.credLimit === VALID ? currency(a.creditLimit) : ws.newCreditLimitX);
1245 out(o, "ACSHLIM", f.cashCreditLimit === VALID ? currency(a.cashCreditLimit) : ws.newCashCreditLimitX);
1246 out(o, "ACURBAL", f.currBal === VALID ? currency(a.currBal) : ws.newCurrBalX);
1247 out(o, "ACRCYCR", f.currCycCredit === VALID ? currency(a.currCycCredit) : ws.newCurrCycCreditX);
1248 out(o, "ACRCYDB", f.currCycDebit === VALID ? currency(a.currCycDebit) : ws.newCurrCycDebitX);
1249
1250 out(o, "OPNYEAR", sub(a.openDate, 1, 4));
1251 out(o, "OPNMON", sub(a.openDate, 5, 2));
1252 out(o, "OPNDAY", sub(a.openDate, 7, 2));
1253 out(o, "EXPYEAR", sub(a.expiraionDate, 1, 4));
1254 out(o, "EXPMON", sub(a.expiraionDate, 5, 2));
1255 out(o, "EXPDAY", sub(a.expiraionDate, 7, 2));
1256 out(o, "RISYEAR", sub(a.reissueDate, 1, 4));
1257 out(o, "RISMON", sub(a.reissueDate, 5, 2));
1258 out(o, "RISDAY", sub(a.reissueDate, 7, 2));
1259 out(o, "AADDGRP", a.groupId);
1260 out(o, "ACSTNUM", c.custIdX);
1261 out(o, "ACTSSN1", sub(c.ssnX, 1, 3));
1262 out(o, "ACTSSN2", sub(c.ssnX, 4, 2));
1263 out(o, "ACTSSN3", sub(c.ssnX, 6, 4));
1264 out(o, "ACSTFCO", c.ficoX);
1265 out(o, "DOBYEAR", sub(c.dob, 1, 4));
1266 out(o, "DOBMON", sub(c.dob, 5, 2));
1267 out(o, "DOBDAY", sub(c.dob, 7, 2));
1268 out(o, "ACSFNAM", c.firstName);
1269 out(o, "ACSMNAM", c.middleName);
1270 out(o, "ACSLNAM", c.lastName);
1271 out(o, "ACSADL1", c.addrLine1);
1272 out(o, "ACSADL2", c.addrLine2);
1273 out(o, "ACSCITY", c.addrLine3);
1274 out(o, "ACSSTTE", c.stateCd);
1275 out(o, "ACSZIPC", c.zip);
1276 out(o, "ACSCTRY", c.countryCd);
1277 out(o, "ACSPH1A", sub(c.phone1, 2, 3));
1278 out(o, "ACSPH1B", sub(c.phone1, 6, 3));
1279 out(o, "ACSPH1C", sub(c.phone1, 10, 4));
1280 out(o, "ACSPH2A", sub(c.phone2, 2, 3));
1281 out(o, "ACSPH2B", sub(c.phone2, 6, 3));
1282 out(o, "ACSPH2C", sub(c.phone2, 10, 4));
1283 out(o, "ACSGOVT", c.govtId);
1284 out(o, "ACSEFTC", c.eftAccountId);
1285 out(o, "ACSPFLG", c.priHolderInd);
1286}
1287
1288/** 3250-SETUP-INFOMSG (COACTUPC.cbl:2955-2985) */
1289function setupInfoMsg(t: Task, o: SymbolicMap): void {
1290 const { area, st, ws } = t;
1291 const a = st.changeAction;
1292 if (area.pgmContext === 0) ws.infoMsg = x(PROMPT_FOR_SEARCH_KEYS, 40);
1293 else if (notFetched(st)) ws.infoMsg = x(PROMPT_FOR_SEARCH_KEYS, 40);
1294 else if (a === "S") ws.infoMsg = x(PROMPT_FOR_CHANGES, 40);
1295 else if (a === "E") ws.infoMsg = x(PROMPT_FOR_CHANGES, 40);
1296 else if (a === "N") ws.infoMsg = x(PROMPT_FOR_CONFIRMATION, 40);
1297 else if (a === "C") ws.infoMsg = x(CONFIRM_UPDATE_SUCCESS, 40);
1298 else if (a === "L") ws.infoMsg = x(INFORM_FAILURE, 40);
1299 else if (a === "F") ws.infoMsg = x(INFORM_FAILURE, 40);
1300 else if (lowOrSpaces(ws.infoMsg)) ws.infoMsg = x(PROMPT_FOR_SEARCH_KEYS, 40);
1301 out(o, "INFOMSG", ws.infoMsg);
1302 out(o, "ERRMSG", ws.returnMsg);
1303}
1304
1305/** COPY CSSETATY REPLACING (TESTVAR1) (SCRNVAR2): red when in error, '*' when blank. */
1306function csSetAty(t: Task, o: SymbolicMap, flag: string | undefined, field: string): void {
1307 if (isFlagBad(flag) && t.area.pgmContext === 1) {
1308 o.color(field, "RED");
1309 if (flag === "B") out(o, field, "*");
1310 }
1311}
1312
1313/** 3300-SETUP-SCREEN-ATTRS (COACTUPC.cbl:2986-3439) */
1314function setupScreenAttrs(t: Task, o: SymbolicMap): void {
1315 const { area, st, ws } = t;
1316 const f = ws.nonKey;
1317 const ssn = ws.editUsSsnFlgs;
1318
1319 protectAllAttrs(o);
1320
1321 // UNPROTECT BASED ON CONTEXT
1322 if (notFetched(st)) o.attr("ACCTSID", BMS.FSE);
1323 else if (st.changeAction === "S" || st.changeAction === "E") unprotectFewAttrs(o);
1324 else if (st.changeAction === "N" || st.changeAction === "C") {
1325 // all fields stay protected
1326 } else o.attr("ACCTSID", BMS.FSE);
1327
1328 // POSITION CURSOR - ORDER BASED ON SCREEN LOCATION (COACTUPC.cbl:3008-3167)
1329 const cursor: [boolean, string][] = [
1330 [ws.infoMsg === x(FOUND_ACCOUNT_DATA, 40) || isMsg(ws, NO_CHANGES_DETECTED), "ACSTTUS"],
1331 [ws.editAcctFlag === "0" || ws.editAcctFlag === " ", "ACCTSID"],
1332 [isFlagBad(f.acctStatus), "ACSTTUS"],
1333 [isFlagBad(f.openDate[0]), "OPNYEAR"],
1334 [isFlagBad(f.openDate[1]), "OPNMON"],
1335 [isFlagBad(f.openDate[2]), "OPNDAY"],
1336 [isFlagBad(f.credLimit), "ACRDLIM"],
1337 [isFlagBad(f.expiryDate[0]), "EXPYEAR"],
1338 [isFlagBad(f.expiryDate[1]), "EXPMON"],
1339 [isFlagBad(f.expiryDate[2]), "EXPDAY"],
1340 [isFlagBad(f.cashCreditLimit), "ACSHLIM"],
1341 [isFlagBad(f.reissueDate[0]), "RISYEAR"],
1342 [isFlagBad(f.reissueDate[1]), "RISMON"],
1343 [isFlagBad(f.reissueDate[2]), "RISDAY"],
1344 [isFlagBad(f.currBal), "ACURBAL"],
1345 [isFlagBad(f.currCycCredit), "ACRCYCR"],
1346 [isFlagBad(f.currCycDebit), "ACRCYDB"],
1347 [isFlagBad(ssn[0]), "ACTSSN1"],
1348 [isFlagBad(ssn[1]), "ACTSSN2"],
1349 [isFlagBad(ssn[2]), "ACTSSN3"],
1350 [isFlagBad(f.dtOfBirth[0]), "DOBYEAR"],
1351 [isFlagBad(f.dtOfBirth[1]), "DOBMON"],
1352 [isFlagBad(f.dtOfBirth[2]), "DOBDAY"],
1353 [isFlagBad(f.ficoScore), "ACSTFCO"],
1354 [isFlagBad(f.firstName), "ACSFNAM"],
1355 [f.middleName === "0", "ACSMNAM"],
1356 [isFlagBad(f.lastName), "ACSLNAM"],
1357 [isFlagBad(f.addressLine1), "ACSADL1"],
1358 [isFlagBad(f.state), "ACSSTTE"],
1359 [isFlagBad(f.zipcode), "ACSZIPC"],
1360 [isFlagBad(f.city), "ACSCITY"],
1361 [isFlagBad(f.country), "ACSCTRY"],
1362 [isFlagBad(f.phoneNum1[0]), "ACSPH1A"],
1363 [isFlagBad(f.phoneNum1[1]), "ACSPH1B"],
1364 [isFlagBad(f.phoneNum1[2]), "ACSPH1C"],
1365 [isFlagBad(f.phoneNum2[0]), "ACSPH2A"],
1366 [isFlagBad(f.phoneNum2[1]), "ACSPH2B"],
1367 [isFlagBad(f.phoneNum2[2]), "ACSPH2C"],
1368 [isFlagBad(f.eftAccountId), "ACSEFTC"],
1369 [isFlagBad(f.priCardholder), "ACSPFLG"],
1370 ];
1371 o.cursor(cursor.find(([when]) => when)?.[1] ?? "ACCTSID");
1372
1373 // SETUP COLOR
1374 if (area.lastMapset.trim() === LIT_CCLISTMAPSET) o.color("ACCTSID", "DEFAULT");
1375 if (ws.editAcctFlag === "0") o.color("ACCTSID", "RED");
1376 if (ws.editAcctFlag === " " && area.pgmContext === 1) {
1377 out(o, "ACCTSID", "*");
1378 o.color("ACCTSID", "RED");
1379 }
1380
1381 if (notFetched(st) || ws.editAcctFlag === " " || ws.editAcctFlag === "0") return;
1382
1383 // COPY CSSETATY REPLACING ... for the remaining fields (COACTUPC.cbl:3207-3435)
1384 csSetAty(t, o, f.acctStatus, "ACSTTUS");
1385 csSetAty(t, o, f.openDate[0], "OPNYEAR");
1386 csSetAty(t, o, f.openDate[1], "OPNMON");
1387 csSetAty(t, o, f.openDate[2], "OPNDAY");
1388 csSetAty(t, o, f.credLimit, "ACRDLIM");
1389 csSetAty(t, o, f.expiryDate[0], "EXPYEAR");
1390 csSetAty(t, o, f.expiryDate[1], "EXPMON");
1391 csSetAty(t, o, f.expiryDate[2], "EXPDAY");
1392 csSetAty(t, o, f.cashCreditLimit, "ACSHLIM");
1393 csSetAty(t, o, f.reissueDate[0], "RISYEAR");
1394 csSetAty(t, o, f.reissueDate[1], "RISMON");
1395 csSetAty(t, o, f.reissueDate[2], "RISDAY");
1396 csSetAty(t, o, f.currBal, "ACURBAL");
1397 csSetAty(t, o, f.currCycCredit, "ACRCYCR");
1398 csSetAty(t, o, f.currCycDebit, "ACRCYDB");
1399 csSetAty(t, o, ssn[0], "ACTSSN1");
1400 csSetAty(t, o, ssn[1], "ACTSSN2");
1401 csSetAty(t, o, ssn[2], "ACTSSN3");
1402 csSetAty(t, o, f.dtOfBirth[0], "DOBYEAR");
1403 csSetAty(t, o, f.dtOfBirth[1], "DOBMON");
1404 csSetAty(t, o, f.dtOfBirth[2], "DOBDAY");
1405 csSetAty(t, o, f.ficoScore, "ACSTFCO");
1406 csSetAty(t, o, f.firstName, "ACSFNAM");
1407 csSetAty(t, o, f.middleName, "ACSMNAM");
1408 csSetAty(t, o, f.lastName, "ACSLNAM");
1409 csSetAty(t, o, f.addressLine1, "ACSADL1");
1410 csSetAty(t, o, f.state, "ACSSTTE");
1411 csSetAty(t, o, f.addressLine2, "ACSADL2");
1412 csSetAty(t, o, f.zipcode, "ACSZIPC");
1413 csSetAty(t, o, f.city, "ACSCITY");
1414 csSetAty(t, o, f.country, "ACSCTRY");
1415 csSetAty(t, o, f.phoneNum1[0], "ACSPH1A");
1416 csSetAty(t, o, f.phoneNum1[1], "ACSPH1B");
1417 csSetAty(t, o, f.phoneNum1[2], "ACSPH1C");
1418 csSetAty(t, o, f.phoneNum2[0], "ACSPH2A");
1419 csSetAty(t, o, f.phoneNum2[1], "ACSPH2B");
1420 csSetAty(t, o, f.phoneNum2[2], "ACSPH2C");
1421 csSetAty(t, o, f.priCardholder, "ACSPFLG");
1422 csSetAty(t, o, f.eftAccountId, "ACSEFTC");
1423}
1424
1425/** 3310-PROTECT-ALL-ATTRS (COACTUPC.cbl:3441-3498): DFHBMPRF on every data field and INFOMSG. */
1426function protectAllAttrs(o: SymbolicMap): void {
1427 for (const name of [
1428 "ACCTSID", "ACSTTUS", "ACRDLIM", "ACSHLIM", "ACURBAL", "ACRCYCR", "ACRCYDB",
1429 "OPNYEAR", "OPNMON", "OPNDAY", "EXPYEAR", "EXPMON", "EXPDAY", "RISYEAR", "RISMON", "RISDAY", "AADDGRP",
1430 "ACSTNUM", "ACTSSN1", "ACTSSN2", "ACTSSN3", "ACSTFCO", "DOBYEAR", "DOBMON", "DOBDAY",
1431 "ACSFNAM", "ACSMNAM", "ACSLNAM", "ACSADL1", "ACSADL2", "ACSCITY", "ACSSTTE", "ACSZIPC", "ACSCTRY",
1432 "ACSPH1A", "ACSPH1B", "ACSPH1C", "ACSPH2A", "ACSPH2B", "ACSPH2C", "ACSGOVT", "ACSEFTC", "ACSPFLG", "INFOMSG",
1433 ]) o.attr(name, BMS.PRF);
1434}
1435
1436/** 3320-UNPROTECT-FEW-ATTRS (COACTUPC.cbl:3500-3564): customer id and country stay protected. */
1437function unprotectFewAttrs(o: SymbolicMap): void {
1438 for (const name of [
1439 "ACSTTUS", "ACRDLIM", "ACSHLIM", "ACURBAL", "ACRCYCR", "ACRCYDB",
1440 "OPNYEAR", "OPNMON", "OPNDAY", "EXPYEAR", "EXPMON", "EXPDAY", "RISYEAR", "RISMON", "RISDAY",
1441 "DOBYEAR", "DOBMON", "DOBDAY", "AADDGRP",
1442 ]) o.attr(name, BMS.FSE);
1443 o.attr("ACSTNUM", BMS.PRF);
1444 for (const name of [
1445 "ACTSSN1", "ACTSSN2", "ACTSSN3", "ACSTFCO", "ACSFNAM", "ACSMNAM", "ACSLNAM",
1446 "ACSADL1", "ACSADL2", "ACSCITY", "ACSSTTE", "ACSZIPC",
1447 ]) o.attr(name, BMS.FSE);
1448 // Since most of the edits are USA specific protected country
1449 o.attr("ACSCTRY", BMS.PRF);
1450 for (const name of ["ACSPH1A", "ACSPH1B", "ACSPH1C", "ACSPH2A", "ACSPH2B", "ACSPH2C", "ACSGOVT", "ACSEFTC", "ACSPFLG"]) {
1451 o.attr(name, BMS.FSE);
1452 }
1453 o.attr("INFOMSG", BMS.PRF);
1454}
1455
1456/** 3390-SETUP-INFOMSG-ATTRS (COACTUPC.cbl:3566-3586): F5/F12 light up when they are valid. */
1457function setupInfoMsgAttrs(t: Task, o: SymbolicMap): void {
1458 const { st, ws } = t;
1459 o.attr("INFOMSG", lowOrSpaces(ws.infoMsg) ? BMS.DAR : BMS.ASB);
1460 if (changesMade(st) && st.changeAction !== "C") o.attr("FKEY12", BMS.ASB);
1461 if (ws.infoMsg === x(PROMPT_FOR_CONFIRMATION, 40)) {
1462 o.attr("FKEY05", BMS.ASB);
1463 o.attr("FKEY12", BMS.ASB);
1464 }
1465}
1466
1467/** 9000-READ-ACCT (COACTUPC.cbl:3608-3649) */
1468function readAcct(t: Task): void {
1469 const { area, st, ws, cc } = t;
1470 st.oldAcct = initAcct();
1471 st.oldCust = initCust();
1472 ws.infoMsg = x("", 40); // SET WS-NO-INFO-MESSAGE
1473 st.oldAcct.acctIdX = cc.acctId;
1474 ws.cardRidAcctId = cc.acctId;
1475
1476 getCardXrefByAcct(t);
1477 if (ws.editAcctFlag === "0") return;
1478
1479 getAcctDataByAcct(t);
1480 // Never true: 9300 builds its own NOTFND text (the SET DID-NOT-FIND-ACCT-IN-ACCTDAT is commented out).
1481 if (isMsg(ws, DID_NOT_FIND_ACCT_IN_ACCTDAT)) return;
1482
1483 ws.cardRidCustId = String(area.custId).padStart(9, "0").slice(-9);
1484 getCustDataByCust(t);
1485 if (isMsg(ws, DID_NOT_FIND_CUST_IN_CUSTDAT)) return;
1486
1487 storeFetchedData(t);
1488}
1489
1490/** WS-FILE-ERROR-MESSAGE (COACTUPC.cbl:389-408) */
1491function fileErrorMessage(op: string, file: string, resp: number): string {
1492 return "File Error: " + x(op, 8) + " on " + x(file, 9) + " returned RESP " + respX10(resp) + ",RESP2 " + respX10(resp2Of(resp)) + x("", 5);
1493}
1494
1495/** 9200-GETCARDXREF-BYACCT (COACTUPC.cbl:3650-3700): READ CXACAIX by account id. */
1496function getCardXrefByAcct(t: Task): void {
1497 const { ctx, area, ws } = t;
1498 const { resp, record } = ctx.read<CardXrefRecord>(LIT_CARDXREFNAME_ACCT_PATH.trim(), ws.cardRidAcctId);
1499 if (resp === RESP.NORMAL && record) {
1500 ws.xref = record;
1501 area.custId = record.xrefCustId;
1502 area.cardNum = record.xrefCardNum;
1503 } else if (resp === RESP.NOTFND) {
1504 ws.inputFlag = "1";
1505 ws.editAcctFlag = "0";
1506 if (msgOff(ws)) {
1507 setMsg(ws, "Account:" + ws.cardRidAcctId + " not found in" + " Cross ref file. Resp:" + respX10(resp) + " Reas:" + respX10(resp2Of(resp)));
1508 }
1509 } else {
1510 ws.inputFlag = "1";
1511 ws.editAcctFlag = "0";
1512 setMsg(ws, fileErrorMessage("READ", LIT_CARDXREFNAME_ACCT_PATH, resp));
1513 }
1514}
1515
1516/** 9300-GETACCTDATA-BYACCT (COACTUPC.cbl:3701-3750): READ ACCTDAT. */
1517function getAcctDataByAcct(t: Task): void {
1518 const { ctx, ws } = t;
1519 const { resp, record } = ctx.read<AccountRecord>(LIT_ACCTFILENAME.trim(), ws.cardRidAcctId);
1520 if (resp === RESP.NORMAL && record) {
1521 ws.account = record;
1522 ws.acctMasterReadFlag = "1";
1523 } else if (resp === RESP.NOTFND) {
1524 ws.inputFlag = "1";
1525 ws.editAcctFlag = "0";
1526 if (msgOff(ws)) {
1527 setMsg(ws, "Account:" + ws.cardRidAcctId + " not found in" + " Acct Master file.Resp:" + respX10(resp) + " Reas:" + respX10(resp2Of(resp)));
1528 }
1529 } else {
1530 ws.inputFlag = "1";
1531 ws.editAcctFlag = "0";
1532 setMsg(ws, fileErrorMessage("READ", LIT_ACCTFILENAME, resp));
1533 }
1534}
1535
1536/** 9400-GETCUSTDATA-BYCUST (COACTUPC.cbl:3752-3799): READ CUSTDAT. */
1537function getCustDataByCust(t: Task): void {
1538 const { ctx, ws } = t;
1539 const { resp, record } = ctx.read<CustomerRecord>(LIT_CUSTFILENAME.trim(), ws.cardRidCustId);
1540 if (resp === RESP.NORMAL && record) {
1541 ws.customer = record;
1542 ws.custMasterReadFlag = "1";
1543 } else if (resp === RESP.NOTFND) {
1544 ws.inputFlag = "1";
1545 ws.editCustFlag = "0";
1546 if (msgOff(ws)) {
1547 setMsg(ws, "CustId:" + ws.cardRidCustId + " not found" + " in customer master.Resp: " + respX10(resp) + " REAS:" + respX10(resp2Of(resp)));
1548 }
1549 } else {
1550 ws.inputFlag = "1";
1551 ws.editCustFlag = "0";
1552 setMsg(ws, fileErrorMessage("READ", LIT_CUSTFILENAME, resp));
1553 }
1554}
1555
1556/** 9500-STORE-FETCHED-DATA (COACTUPC.cbl:3801-3887): context into the COMMAREA, records into ACUP-OLD-DETAILS. */
1557function storeFetchedData(t: Task): void {
1558 const { area, st, ws } = t;
1559 const acct = ws.account;
1560 const cust = ws.customer;
1561 area.acctId = acct.acctId;
1562 area.custId = cust.custId;
1563 area.custFname = cust.custFirstName;
1564 area.custMname = cust.custMiddleName;
1565 area.custLname = cust.custLastName;
1566 area.acctStatus = acct.acctActiveStatus;
1567 area.cardNum = ws.xref?.xrefCardNum ?? area.cardNum;
1568
1569 st.oldAcct = initAcct();
1570 st.oldCust = initCust();
1571 const a = st.oldAcct;
1572 a.acctIdX = String(acct.acctId).padStart(11, "0");
1573 a.activeStatus = x(acct.acctActiveStatus, 1);
1574 a.currBal = acct.acctCurrBal;
1575 a.creditLimit = acct.acctCreditLimit;
1576 a.cashCreditLimit = acct.acctCashCreditLimit;
1577 a.currCycCredit = acct.acctCurrCycCredit;
1578 a.currCycDebit = acct.acctCurrCycDebit;
1579 a.openDate = sub(acct.acctOpenDate, 1, 4) + sub(acct.acctOpenDate, 6, 2) + sub(acct.acctOpenDate, 9, 2);
1580 a.expiraionDate = sub(acct.acctExpiraionDate, 1, 4) + sub(acct.acctExpiraionDate, 6, 2) + sub(acct.acctExpiraionDate, 9, 2);
1581 a.reissueDate = sub(acct.acctReissueDate, 1, 4) + sub(acct.acctReissueDate, 6, 2) + sub(acct.acctReissueDate, 9, 2);
1582 a.groupId = x(acct.acctGroupId, 10);
1583
1584 const c = st.oldCust;
1585 c.custIdX = String(cust.custId).padStart(9, "0");
1586 c.ssnX = String(cust.custSsn).padStart(9, "0");
1587 c.dob = sub(cust.custDobYyyyMmDd, 1, 4) + sub(cust.custDobYyyyMmDd, 6, 2) + sub(cust.custDobYyyyMmDd, 9, 2);
1588 c.ficoX = String(cust.custFicoCreditScore).padStart(3, "0");
1589 c.firstName = x(cust.custFirstName, 25);
1590 c.middleName = x(cust.custMiddleName, 25);
1591 c.lastName = x(cust.custLastName, 25);
1592 c.addrLine1 = x(cust.custAddrLine1, 50);
1593 c.addrLine2 = x(cust.custAddrLine2, 50);
1594 c.addrLine3 = x(cust.custAddrLine3, 50);
1595 c.stateCd = x(cust.custAddrStateCd, 2);
1596 c.countryCd = x(cust.custAddrCountryCd, 3);
1597 c.zip = x(cust.custAddrZip, 10);
1598 c.phone1 = x(cust.custPhoneNum1, 15);
1599 c.phone2 = x(cust.custPhoneNum2, 15);
1600 c.govtId = x(cust.custGovtIssuedId, 20);
1601 c.eftAccountId = x(cust.custEftAccountId, 10);
1602 c.priHolderInd = x(cust.custPriCardHolderInd, 1);
1603}
1604
1605/** 9600-WRITE-PROCESSING (COACTUPC.cbl:3888-4107): lock both records, check, REWRITE both. */
1606function writeProcessing(t: Task): void {
1607 const { ctx, area, st, ws, cc } = t;
1608
1609 // Read the account file for update
1610 ws.cardRidAcctId = cc.acctId;
1611 const acctRead = ctx.read<AccountRecord>(LIT_ACCTFILENAME.trim(), ws.cardRidAcctId, { update: true });
1612 if (acctRead.resp !== RESP.NORMAL || !acctRead.record) {
1613 ws.inputFlag = "1";
1614 if (msgOff(ws)) setMsg(ws, COULD_NOT_LOCK_ACCT_FOR_UPDATE);
1615 return;
1616 }
1617 ws.account = acctRead.record;
1618
1619 // Read the customer file for update
1620 ws.cardRidCustId = String(area.custId).padStart(9, "0").slice(-9);
1621 const custRead = ctx.read<CustomerRecord>(LIT_CUSTFILENAME.trim(), ws.cardRidCustId, { update: true });
1622 if (custRead.resp !== RESP.NORMAL || !custRead.record) {
1623 ws.inputFlag = "1";
1624 if (msgOff(ws)) setMsg(ws, COULD_NOT_LOCK_CUST_FOR_UPDATE);
1625 return;
1626 }
1627 ws.customer = custRead.record;
1628
1629 // Did someone change the record while we were out ?
1630 checkChangeInRec(t);
1631 if (isMsg(ws, DATA_WAS_CHANGED_BEFORE_UPDATE)) return;
1632
1633 // Prepare the update: INITIALIZE ACCT-UPDATE-RECORD (COACTUPC.cbl:418-433). That layout
1634 // has no ACCT-ADDR-ZIP, so ACCT-UPDATE-GROUP-ID lands on ACCT-ADDR-ZIP of CVACT01Y and
1635 // ACCT-GROUP-ID receives the first bytes of the (never initialised) FILLER: spaces here.
1636 const na = st.newAcct;
1637 const dateText = (d: string) => sub(d, 1, 4) + "-" + sub(d, 5, 2) + "-" + sub(d, 7, 2);
1638 const acctUpdate: AccountRecord = {
1639 acctId: zoned(na.acctIdX),
1640 acctActiveStatus: na.activeStatus,
1641 acctCurrBal: na.currBal ?? 0,
1642 acctCreditLimit: na.creditLimit ?? 0,
1643 acctCashCreditLimit: na.cashCreditLimit ?? 0,
1644 acctOpenDate: dateText(na.openDate),
1645 acctExpiraionDate: dateText(na.expiraionDate),
1646 // MOVE ACCT-REISSUE-DATE TO ACCT-UPDATE-REISSUE-DATE, then the STRING overwrites all 10 bytes.
1647 acctReissueDate: dateText(na.reissueDate),
1648 acctCurrCycCredit: na.currCycCredit ?? 0,
1649 acctCurrCycDebit: na.currCycDebit ?? 0,
1650 acctAddrZip: na.groupId,
1651 acctGroupId: x("", 10),
1652 };
1653
1654 // Customer data: INITIALIZE CUST-UPDATE-RECORD (same layout as CVCUS01Y)
1655 const nc = st.newCust;
1656 const phone = (p: string) => x("(" + sub(p, 2, 3) + ")" + sub(p, 6, 3) + "-" + sub(p, 10, 4), 15);
1657 const custUpdate: CustomerRecord = {
1658 custId: zoned(nc.custIdX),
1659 custFirstName: nc.firstName,
1660 custMiddleName: nc.middleName,
1661 custLastName: nc.lastName,
1662 custAddrLine1: nc.addrLine1,
1663 custAddrLine2: nc.addrLine2,
1664 custAddrLine3: nc.addrLine3,
1665 custAddrStateCd: nc.stateCd,
1666 custAddrCountryCd: nc.countryCd,
1667 custAddrZip: nc.zip,
1668 custPhoneNum1: phone(nc.phone1),
1669 custPhoneNum2: phone(nc.phone2),
1670 custSsn: zoned(nc.ssnX),
1671 custGovtIssuedId: nc.govtId,
1672 custDobYyyyMmDd: dateText(nc.dob),
1673 custEftAccountId: nc.eftAccountId,
1674 custPriCardHolderInd: nc.priHolderInd,
1675 custFicoCreditScore: zoned(nc.ficoX),
1676 };
1677
1678 // Update account
1679 if (ctx.rewrite(LIT_ACCTFILENAME.trim(), acctUpdate) !== RESP.NORMAL) {
1680 setMsg(ws, LOCKED_BUT_UPDATE_FAILED);
1681 return;
1682 }
1683 // Update customer
1684 if (ctx.rewrite(LIT_CUSTFILENAME.trim(), custUpdate) !== RESP.NORMAL) {
1685 setMsg(ws, LOCKED_BUT_UPDATE_FAILED);
1686 // EXEC CICS SYNCPOINT ROLLBACK: the runtime has no rollback, so the account image read
1687 // for update is put back, which is what backing out the REWRITE achieves.
1688 ctx.rewrite(LIT_ACCTFILENAME.trim(), acctRead.record);
1689 return;
1690 }
1691}
1692
1693/** 9700-CHECK-CHANGE-IN-REC (COACTUPC.cbl:4109-4195); its GO TO leaves 9600 as well. */
1694function checkChangeInRec(t: Task): void {
1695 const { st, ws } = t;
1696 const acct = ws.account;
1697 const a = st.oldAcct;
1698 const acctSame =
1699 eqX(acct.acctActiveStatus, a.activeStatus) &&
1700 acct.acctCurrBal === a.currBal &&
1701 acct.acctCreditLimit === a.creditLimit &&
1702 acct.acctCashCreditLimit === a.cashCreditLimit &&
1703 acct.acctCurrCycCredit === a.currCycCredit &&
1704 acct.acctCurrCycDebit === a.currCycDebit &&
1705 sub(acct.acctOpenDate, 1, 4) === sub(a.openDate, 1, 4) &&
1706 sub(acct.acctOpenDate, 6, 2) === sub(a.openDate, 5, 2) &&
1707 sub(acct.acctOpenDate, 9, 2) === sub(a.openDate, 7, 2) &&
1708 sub(acct.acctExpiraionDate, 1, 4) === sub(a.expiraionDate, 1, 4) &&
1709 sub(acct.acctExpiraionDate, 6, 2) === sub(a.expiraionDate, 5, 2) &&
1710 sub(acct.acctExpiraionDate, 9, 2) === sub(a.expiraionDate, 7, 2) &&
1711 sub(acct.acctReissueDate, 1, 4) === sub(a.reissueDate, 1, 4) &&
1712 sub(acct.acctReissueDate, 6, 2) === sub(a.reissueDate, 5, 2) &&
1713 sub(acct.acctReissueDate, 9, 2) === sub(a.reissueDate, 7, 2) &&
1714 eqX(acct.acctGroupId.toLowerCase(), a.groupId.toLowerCase());
1715 if (!acctSame) {
1716 setMsg(ws, DATA_WAS_CHANGED_BEFORE_UPDATE);
1717 return;
1718 }
1719
1720 const cust = ws.customer;
1721 const c = st.oldCust;
1722 const custSame =
1723 eqX(upper(cust.custFirstName), upper(c.firstName)) &&
1724 eqX(upper(cust.custMiddleName), upper(c.middleName)) &&
1725 eqX(upper(cust.custLastName), upper(c.lastName)) &&
1726 eqX(upper(cust.custAddrLine1), upper(c.addrLine1)) &&
1727 eqX(upper(cust.custAddrLine2), upper(c.addrLine2)) &&
1728 eqX(upper(cust.custAddrLine3), upper(c.addrLine3)) &&
1729 eqX(upper(cust.custAddrStateCd), upper(c.stateCd)) &&
1730 eqX(upper(cust.custAddrCountryCd), upper(c.countryCd)) &&
1731 eqX(cust.custAddrZip, c.zip) &&
1732 eqX(cust.custPhoneNum1, c.phone1) &&
1733 eqX(cust.custPhoneNum2, c.phone2) &&
1734 cust.custSsn === Number(c.ssnX) &&
1735 eqX(upper(cust.custGovtIssuedId), upper(c.govtId)) &&
1736 sub(cust.custDobYyyyMmDd, 1, 4) === sub(c.dob, 1, 4) &&
1737 sub(cust.custDobYyyyMmDd, 6, 2) === sub(c.dob, 5, 2) &&
1738 sub(cust.custDobYyyyMmDd, 9, 2) === sub(c.dob, 7, 2) &&
1739 eqX(cust.custEftAccountId, c.eftAccountId) &&
1740 eqX(cust.custPriCardHolderInd, c.priHolderInd) &&
1741 cust.custFicoCreditScore === Number(c.ficoX);
1742 if (!custSame) setMsg(ws, DATA_WAS_CHANGED_BEFORE_UPDATE);
1743}
1744
1745/** ABEND-ROUTINE (COACTUPC.cbl:4203-4228): SEND ABEND-DATA, then ABEND ABCODE('9999'). */
1746function abendRoutine(t: Task, code: string, msg: string): never {
1747 const abendMsg = isBlank(msg) ? "UNEXPECTED ABEND OCCURRED." : msg;
1748 // ABEND-DATA (CSMSG02Y): ABEND-CODE X(4), ABEND-CULPRIT X(8), ABEND-REASON X(50), ABEND-MSG X(72)
1749 t.ctx.sendText(x(code, 4) + x(LIT_THISPGM, 8) + x("", 50) + x(abendMsg, 72));
1750 t.ctx.abend("9999", abendMsg);
1751}

COBOL app/cbl/COACTUPC.cbl

1 **************************************** *************************
2 * Program: COACTUPC.CBL *
3 * Layer: Business logic *
4 * Function: Accept and process ACCOUNT UPDATE *
5 ******************************************************************
6 * Copyright Amazon.com, Inc. or its affiliates.
7 * All Rights Reserved.
8 *
9 * Licensed under the Apache License, Version 2.0 (the "License").
10 * You may not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
12 *
13 * http://www.apache.org/licenses/LICENSE-2.0
14 *
15 * Unless required by applicable law or agreed to in writing,
16 * software distributed under the License is distributed on an
17 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
18 * either express or implied. See the License for the specific
19 * language governing permissions and limitations under the License
20 ******************************************************************
21 IDENTIFICATION DIVISION.
22 PROGRAM-ID.
23 COACTUPC.
24 DATE-WRITTEN.
25 July 2022.
26 DATE-COMPILED.
27 Today.
28
29 ENVIRONMENT DIVISION.
30 INPUT-OUTPUT SECTION.
31
32 DATA DIVISION.
33
34 WORKING-STORAGE SECTION.
35 01 WS-MISC-STORAGE.
36 ******************************************************************
37 * General CICS related
38 ******************************************************************
39 05 WS-CICS-PROCESSNG-VARS.
40 07 WS-RESP-CD PIC S9(09) COMP
41 VALUE ZEROS.
42 07 WS-REAS-CD PIC S9(09) COMP
43 VALUE ZEROS.
44 07 WS-TRANID PIC X(4)
45 VALUE SPACES.
46 07 WS-UCTRANS PIC X(4)
47 VALUE SPACES.
48 ******************************************************************
49 * Input edits
50 ******************************************************************
51 * Generic Input Edits
52 05 WS-GENERIC-EDITS.
53 10 WS-EDIT-VARIABLE-NAME PIC X(25).
54
55 10 WS-EDIT-SIGNED-NUMBER-9V2-X PIC X(15).
56 10 WS-FLG-SIGNED-NUMBER-EDIT PIC X(1).
57 88 FLG-SIGNED-NUMBER-ISVALID VALUE LOW-VALUES.
58 88 FLG-SIGNED-NUMBER-NOT-OK VALUE '0'.
59 88 FLG-SIGNED-NUMBER-BLANK VALUE 'B'.
60
61 10 WS-EDIT-ALPHANUM-ONLY PIC X(256).
62 10 WS-EDIT-ALPHANUM-LENGTH PIC S9(4) COMP-3.
63
64 10 WS-EDIT-ALPHA-ONLY-FLAGS PIC X(1).
65 88 FLG-ALPHA-ISVALID VALUE LOW-VALUES.
66 88 FLG-ALPHA-NOT-OK VALUE '0'.
67 88 FLG-ALPHA-BLANK VALUE 'B'.
68 10 WS-EDIT-ALPHANUM-ONLY-FLAGS PIC X(1).
69 88 FLG-ALPHNANUM-ISVALID VALUE LOW-VALUES.
70 88 FLG-ALPHNANUM-NOT-OK VALUE '0'.
71 88 FLG-ALPHNANUM-BLANK VALUE 'B'.
72 10 WS-EDIT-MANDATORY-FLAGS PIC X(1).
73 88 FLG-MANDATORY-ISVALID VALUE LOW-VALUES.
74 88 FLG-MANDATORY-NOT-OK VALUE '0'.
75 88 FLG-MANDATORY-BLANK VALUE 'B'.
76 10 WS-EDIT-YES-NO PIC X(1)
77 VALUE 'N'.
78 88 FLG-YES-NO-ISVALID VALUES 'Y', 'N'.
79 88 FLG-YES-NO-NOT-OK VALUE '0'.
80 88 FLG-YES-NO-BLANK VALUE 'B'.
81
82 10 WS-EDIT-US-PHONE-NUM PIC X(15).
83 10 WS-EDIT-US-PHONE-NUM-X REDEFINES
84 WS-EDIT-US-PHONE-NUM.
85 20 FILLER PIC X(1).
86 * VALUE '('
87 20 WS-EDIT-US-PHONE-NUMA PIC X(3).
88 20 WS-EDIT-US-PHONE-NUMA-N REDEFINES
89 WS-EDIT-US-PHONE-NUMA PIC 9(3).
90 20 FILLER PIC X(1).
91 * VALUE ')'
92 20 WS-EDIT-US-PHONE-NUMB PIC X(3).
93 20 WS-EDIT-US-PHONE-NUMB-N REDEFINES
94 WS-EDIT-US-PHONE-NUMB PIC 9(3).
95 20 FILLER PIC X(1).
96 * VALUE '-'
97 20 WS-EDIT-US-PHONE-NUMC PIC X(4).
98 20 WS-EDIT-US-PHONE-NUMC-N REDEFINES
99 WS-EDIT-US-PHONE-NUMC PIC 9(4).
100 20 FILLER PIC X(2).
101 10 WS-EDIT-US-PHONE-NUM-FLGS.
102 88 WS-EDIT-US-PHONE-IS-INVALID VALUE '000'.
103 88 WS-EDIT-US-PHONE-IS-VALID VALUE LOW-VALUES.
104 20 WS-EDIT-US-PHONEA-FLG PIC X(01).
105 88 FLG-EDIT-US-PHONEA-ISVALID VALUE LOW-VALUES.
106 88 FLG-EDIT-US-PHONEA-NOT-OK VALUE '0'.
107 88 FLG-EDIT-US-PHONEA-BLANK VALUE 'B'.
108 20 WS-EDIT-EDIT-US-PHONEB PIC X(01).
109 88 FLG-EDIT-US-PHONEB-ISVALID VALUE LOW-VALUES.
110 88 FLG-EDIT-US-PHONEB-NOT-OK VALUE '0'.
111 88 FLG-EDIT-US-PHONEB-BLANK VALUE 'B'.
112 20 WS-EDIT-EDIT-PHONEC PIC X(01).
113 88 FLG-EDIT-US-PHONEC-ISVALID VALUE LOW-VALUES.
114 88 FLG-EDIT-US-PHONEC-NOT-OK VALUE '0'.
115 88 FLG-EDIT-US-PHONEC-BLANK VALUE 'B'.
116
117 10 WS-EDIT-US-SSN.
118 20 WS-EDIT-US-SSN-PART1 PIC X(3).
119 20 WS-EDIT-US-SSN-PART1-N REDEFINES
120 WS-EDIT-US-SSN-PART1 PIC 9(3).
121 88 INVALID-SSN-PART1 VALUES 0,
122 666,
123 900 THRU 999.
124 20 WS-EDIT-US-SSN-PART2 PIC X(2).
125 20 WS-EDIT-US-SSN-PART2-N REDEFINES
126 WS-EDIT-US-SSN-PART2 PIC 9(2).
127 20 WS-EDIT-US-SSN-PART3 PIC X(4).
128 20 WS-EDIT-US-SSN-PART3-N REDEFINES
129 WS-EDIT-US-SSN-PART3 PIC 9(4).
130 10 WS-EDIT-US-SSN-N REDEFINES
131 WS-EDIT-US-SSN PIC 9(09).
132 10 WS-EDIT-US-SSN-FLGS.
133 88 WS-EDIT-US-SSN-IS-INVALID VALUE '000'.
134 88 WS-EDIT-US-SSN-IS-VALID VALUE LOW-VALUES.
135 20 WS-EDIT-US-SSN-PART1-FLGS PIC X(01).
136 88 FLG-EDIT-US-SSN-PART1-ISVALID VALUE LOW-VALUES.
137 88 FLG-EDIT-US-SSN-PART1-NOT-OK VALUE '0'.
138 88 FLG-EDIT-US-SSN-PART1-BLANK VALUE 'B'.
139 20 WS-EDIT-US-SSN-PART2-FLGS PIC X(01).
140 88 FLG-EDIT-US-SSN-PART2-ISVALID VALUE LOW-VALUES.
141 88 FLG-EDIT-US-SSN-PART2-NOT-OK VALUE '0'.
142 88 FLG-EDIT-US-SSN-PART2-BLANK VALUE 'B'.
143 20 WS-EDIT-US-SSN-PART3-FLGS PIC X(01).
144 88 FLG-EDIT-US-SSN-PART3-ISVALID VALUE LOW-VALUES.
145 88 FLG-EDIT-US-SSN-PART3-NOT-OK VALUE '0'.
146 88 FLG-EDIT-US-SSN-PART3-BLANK VALUE 'B'.
147
148 ******************************************************************
149 * Work variables
150 ******************************************************************
151 05 WS-CALCULATION-VARS.
152 10 WS-DIV-BY PIC S9(4) COMP-3
153 VALUE 4.
154 10 WS-DIVIDEND PIC S9(4) COMP-3
155 VALUE 0.
156
157 10 WS-REMAINDER PIC S9(4) COMP-3
158 VALUE 0.
159 10 WS-CURR-DATE PIC X(21)
160 VALUE SPACES.
161
162
163 ******************************************************************
164 * Generic date edit variables CCYYMMDD
165 ******************************************************************
166 COPY 'CSUTLDWY'.
167 ******************************************************************
168 05 WS-DATACHANGED-FLAG PIC X(1).
169 88 NO-CHANGES-FOUND VALUE '0'.
170 88 CHANGE-HAS-OCCURRED VALUE '1'.
171 05 WS-INPUT-FLAG PIC X(1).
172 88 INPUT-OK VALUE '0'.
173 88 INPUT-ERROR VALUE '1'.
174 88 INPUT-PENDING VALUE LOW-VALUES.
175 05 WS-RETURN-FLAG PIC X(1).
176 88 WS-RETURN-FLAG-OFF VALUE LOW-VALUES.
177 88 WS-RETURN-FLAG-ON VALUE '1'.
178 05 WS-PFK-FLAG PIC X(1).
179 88 PFK-VALID VALUE '0'.
180 88 PFK-INVALID VALUE '1'.
181
182 * Program specific edits
183 05 WS-EDIT-ACCT-FLAG PIC X(1).
184 88 FLG-ACCTFILTER-ISVALID VALUE '1'.
185 88 FLG-ACCTFILTER-NOT-OK VALUE '0'.
186 88 FLG-ACCTFILTER-BLANK VALUE ' '.
187 05 WS-EDIT-CUST-FLAG PIC X(1).
188 88 FLG-CUSTFILTER-ISVALID VALUE '1'.
189 88 FLG-CUSTFILTER-NOT-OK VALUE '0'.
190 88 FLG-CUSTFILTER-BLANK VALUE ' '.
191 05 WS-NON-KEY-FLAGS.
192 10 WS-EDIT-ACCT-STATUS PIC X(1).
193 88 FLG-ACCT-STATUS-ISVALID VALUES 'Y', 'N'.
194 88 FLG-ACCT-STATUS-NOT-OK VALUE '0'.
195 88 FLG-ACCT-STATUS-BLANK VALUE 'B'.
196 10 WS-EDIT-CREDIT-LIMIT PIC X(1).
197 88 FLG-CRED-LIMIT-ISVALID VALUE LOW-VALUES.
198 88 FLG-CRED-LIMIT-NOT-OK VALUE '0'.
199 88 FLG-CRED-LIMIT-BLANK VALUE 'B'.
200 10 WS-EDIT-CASH-CREDIT-LIMIT PIC X(1).
201 88 FLG-CASH-CREDIT-LIMIT-ISVALID VALUE LOW-VALUES.
202 88 FLG-CASH-CREDIT-LIMIT-NOT-OK VALUE '0'.
203 88 FLG-CASH-CREDIT-LIMIT-BLANK VALUE 'B'.
204 10 WS-EDIT-CURR-BAL PIC X(1).
205 88 FLG-CURR-BAL-ISVALID VALUE LOW-VALUES.
206 88 FLG-CURR-BAL-NOT-OK VALUE '0'.
207 88 FLG-CURR-BAL-BLANK VALUE 'B'.
208 10 WS-EDIT-CURR-CYC-CREDIT PIC X(1).
209 88 FLG-CURR-CYC-CREDIT-ISVALID VALUE LOW-VALUES.
210 88 FLG-CURR-CYC-CREDIT-NOT-OK VALUE '0'.
211 88 FLG-CURR-CYC-CREDIT-BLANK VALUE 'B'.
212 10 WS-EDIT-CURR-CYC-DEBIT PIC X(1).
213 88 FLG-CURR-CYC-DEBIT-ISVALID VALUE LOW-VALUES.
214 88 FLG-CURR-CYC-DEBIT-NOT-OK VALUE '0'.
215 88 FLG-CURR-CYC-DEBIT-BLANK VALUE 'B'.
216 10 WS-EDIT-DT-OF-BIRTH-FLGS.
217 88 WS-EDIT-DT-OF-BIRTH-INVALID VALUE '000'.
218 88 WS-EDIT-DT-OF-BIRTH-ISVALID VALUE LOW-VALUES.
219 20 WS-EDIT-DT-OF-BIRTH-YEAR-FLG PIC X(01).
220 88 FLG-DT-OF-BIRTH-YEAR-ISVALID VALUE LOW-VALUES.
221 88 FLG-DT-OF-BIRTH-YEAR-NOT-OK VALUE '0'.
222 88 FLG-DT-OF-BIRTH-YEAR-BLANK VALUE 'B'.
223 20 WS-EDIT-DT-OF-BIRTH-MONTH PIC X(01).
224 88 FLG-DT-OF-BIRTH-MONTH-ISVALID VALUE LOW-VALUES.
225 88 FLG-DT-OF-BIRTH-MONTH-NOT-OK VALUE '0'.
226 88 FLG-DT-OF-BIRTH-MONTH-BLANK VALUE 'B'.
227 20 WS-EDIT-DT-OF-BIRTH-DAY PIC X(01).
228 88 FLG-DT-OF-BIRTH-DAY-ISVALID VALUE LOW-VALUES.
229 88 FLG-DT-OF-BIRTH-DAY-NOT-OK VALUE '0'.
230 88 FLG-DT-OF-BIRTH-DAY-BLANK VALUE 'B'.
231 10 WS-EDIT-FICO-SCORE-FLGS PIC X(1).
232 88 FLG-FICO-SCORE-ISVALID VALUE LOW-VALUES.
233 88 FLG-FICO-SCORE-NOT-OK VALUE '0'.
234 88 FLG-FICO-SCORE-BLANK VALUE 'B'.
235 10 WS-EDIT-OPEN-DATE-FLGS.
236 88 WS-EDIT-OPEN-DATE-IS-INVALID VALUE '000'.
237 20 WS-EDIT-OPEN-YEAR-FLG PIC X(01).
238 88 FLG-OPEN-YEAR-ISVALID VALUE LOW-VALUES.
239 88 FLG-OPEN-YEAR-NOT-OK VALUE '0'.
240 88 FLG-OPEN-YEAR-BLANK VALUE 'B'.
241 20 WS-EDIT-OPEN-MONTH PIC X(01).
242 88 FLG-OPEN-MONTH-ISVALID VALUE LOW-VALUES.
243 88 FLG-OPEN-MONTH-NOT-OK VALUE '0'.
244 88 FLG-OPEN-MONTH-BLANK VALUE 'B'.
245 20 WS-EDIT-OPEN-DAY PIC X(01).
246 88 FLG-OPEN-DAY-ISVALID VALUE LOW-VALUES.
247 88 FLG-OPEN-DAY-NOT-OK VALUE '0'.
248 88 FLG-OPEN-DAY-BLANK VALUE 'B'.
249 10 WS-EXPIRY-DATE-FLGS.
250 88 WS-EDIT-EXPIRY-IS-INVALID VALUE '000'.
251 20 WS-EDIT-EXPIRY-YEAR-FLG PIC X(01).
252 88 FLG-EXPIRY-YEAR-ISVALID VALUE LOW-VALUES.
253 88 FLG-EXPIRY-YEAR-NOT-OK VALUE '0'.
254 88 FLG-EXPIRY-YEAR-BLANK VALUE 'B'.
255 20 WS-EDIT-EXPIRY-MONTH PIC X(01).
256 88 FLG-EXPIRY-MONTH-ISVALID VALUE LOW-VALUES.
257 88 FLG-EXPIRY-MONTH-NOT-OK VALUE '0'.
258 88 FLG-EXPIRY-MONTH-BLANK VALUE 'B'.
259 20 WS-EDIT-EXPIRY-DAY PIC X(01).
260 88 FLG-EXPIRY-DAY-ISVALID VALUE LOW-VALUES.
261 88 FLG-EXPIRY-DAY-NOT-OK VALUE '0'.
262 88 FLG-EXPIRY-DAY-BLANK VALUE 'B'.
263 10 WS-EDIT-REISSUE-DATE-FLGS.
264 88 WS-EDIT-REISSUE-DATE-INVALID VALUE '000'.
265 20 WS-EDIT-REISSUE-YEAR-FLG PIC X(01).
266 88 FLG-REISSUE-YEAR-ISVALID VALUE LOW-VALUES.
267 88 FLG-REISSUE-YEAR-NOT-OK VALUE '0'.
268 88 FLG-REISSUE-YEAR-BLANK VALUE 'B'.
269 20 WS-EDIT-REISSUE-MONTH PIC X(01).
270 88 FLG-REISSUE-MONTH-ISVALID VALUE LOW-VALUES.
271 88 FLG-REISSUE-MONTH-NOT-OK VALUE '0'.
272 88 FLG-REISSUE-MONTH-BLANK VALUE 'B'.
273 20 WS-EDIT-REISSUE-DAY PIC X(01).
274 88 FLG-REISSUE-DAY-ISVALID VALUE LOW-VALUES.
275 88 FLG-REISSUE-DAY-NOT-OK VALUE '0'.
276 88 FLG-REISSUE-DAY-BLANK VALUE 'B'.
277 10 WS-EDIT-NAME-FLAGS.
278 20 WS-EDIT-FIRST-NAME-FLGS PIC X(01).
279 88 FLG-FIRST-NAME-ISVALID VALUE LOW-VALUES.
280 88 FLG-FIRST-NAME-NOT-OK VALUE '0'.
281 88 FLG-FIRST-NAME-BLANK VALUE 'B'.
282 20 WS-EDIT-MIDDLE-NAME-FLGS PIC X(01).
283 88 FLG-MIDDLE-NAME-ISVALID VALUE LOW-VALUES.
284 88 FLG-MIDDLE-NAME-NOT-OK VALUE '0'.
285 88 FLG-MIDDLE-NAME-BLANK VALUE 'B'.
286 20 WS-EDIT-LAST-NAME-FLGS PIC X(01).
287 88 FLG-LAST-NAME-ISVALID VALUE LOW-VALUES.
288 88 FLG-LAST-NAME-NOT-OK VALUE '0'.
289 88 FLG-LAST-NAME-BLANK VALUE 'B'.
290 10 WS-EDIT-ADDRESS-FLAGS.
291 20 WS-EDIT-ADDRESS-LINE-1-FLGS PIC X(01).
292 88 FLG-ADDRESS-LINE-1-ISVALID VALUE LOW-VALUES.
293 88 FLG-ADDRESS-LINE-1-NOT-OK VALUE '0'.
294 88 FLG-ADDRESS-LINE-1-BLANK VALUE 'B'.
295 20 WS-EDIT-ADDRESS-LINE-2-FLGS PIC X(01).
296 88 FLG-ADDRESS-LINE-2-ISVALID VALUE LOW-VALUES.
297 88 FLG-ADDRESS-LINE-2-NOT-OK VALUE '0'.
298 88 FLG-ADDRESS-LINE-2-BLANK VALUE 'B'.
299 20 WS-EDIT-CITY-FLGS PIC X(01).
300 88 FLG-CITY-ISVALID VALUE LOW-VALUES.
301 88 FLG-CITY-NOT-OK VALUE '0'.
302 88 FLG-CITY-BLANK VALUE 'B'.
303 20 WS-EDIT-STATE-FLGS PIC X(01).
304 88 FLG-STATE-ISVALID VALUE LOW-VALUES.
305 88 FLG-STATE-NOT-OK VALUE '0'.
306 88 FLG-STATE-BLANK VALUE 'B'.
307 20 WS-EDIT-ZIPCODE-FLGS PIC X(01).
308 88 FLG-ZIPCODE-ISVALID VALUE LOW-VALUES.
309 88 FLG-ZIPCODE-NOT-OK VALUE '0'.
310 88 FLG-ZIPCODE-BLANK VALUE 'B'.
311 20 WS-EDIT-COUNTRY-FLGS PIC X(01).
312 88 FLG-COUNTRY-ISVALID VALUE LOW-VALUES.
313 88 FLG-COUNTRY-NOT-OK VALUE '0'.
314 88 FLG-COUNTRY-BLANK VALUE 'B'.
315 20 WS-EDIT-PHONE-NUM-1-FLGS.
316 88 WS-EDIT-PHONE-NUM-1-IS-INVALID
317 VALUE '000'.
318 30 WS-EDIT-PHONE-NUM-1A-FLG PIC X(01).
319 88 FLG-PHONE-NUM-1A-ISVALID VALUE LOW-VALUES.
320 88 FLG-PHONE-NUM-1A-NOT-OK VALUE '0'.
321 88 FLG-PHONE-NUM-1A-BLANK VALUE 'B'.
322 30 WS-EDIT-PHONE-NUM-1B PIC X(01).
323 88 FLG-PHONE-NUM-1B-ISVALID VALUE LOW-VALUES.
324 88 FLG-PHONE-NUM-1B-NOT-OK VALUE '0'.
325 88 FLG-PHONE-NUM-1B-BLANK VALUE 'B'.
326 30 WS-EDIT-PHONE-NUM-1C PIC X(01).
327 88 FLG-PHONE-NUM-1C-ISVALID VALUE LOW-VALUES.
328 88 FLG-PHONE-NUM-1C-NOT-OK VALUE '0'.
329 88 FLG-PHONE-NUM-1C-BLANK VALUE 'B'.
330 20 WS-EDIT-PHONE-NUM-2-FLGS.
331 88 WS-EDIT-PHONE-NUM-2-IS-INVALID
332 VALUE '000'.
333 30 WS-EDIT-PHONE-NUM-2A-FLG PIC X(01).
334 88 FLG-PHONE-NUM-2A-ISVALID VALUE LOW-VALUES.
335 88 FLG-PHONE-NUM-2A-NOT-OK VALUE '0'.
336 88 FLG-PHONE-NUM-2A-BLANK VALUE 'B'.
337 30 WS-EDIT-PHONE-NUM-2B PIC X(01).
338 88 FLG-PHONE-NUM-2B-ISVALID VALUE LOW-VALUES.
339 88 FLG-PHONE-NUM-2B-NOT-OK VALUE '0'.
340 88 FLG-PHONE-NUM-2B-BLANK VALUE 'B'.
341 30 WS-EDIT-PHONE-NUM-2C PIC X(01).
342 88 FLG-PHONE-NUM-2C-ISVALID VALUE LOW-VALUES.
343 88 FLG-PHONE-NUM-2C-NOT-OK VALUE '0'.
344 88 FLG-PHONE-NUM-2C-BLANK VALUE 'B'.
345 10 WS-EFT-ACCOUNT-ID-FLGS PIC X(01).
346 88 FLG-EFT-ACCOUNT-ID-ISVALID VALUE LOW-VALUES.
347 88 FLG-EFT-ACCOUNT-ID-NOT-OK VALUE '0'.
348 88 FLG-EFT-ACCOUNT-ID-BLANK VALUE 'B'.
349 10 WS-EDIT-PRI-CARDHOLDER PIC X(1).
350 88 FLG-PRI-CARDHOLDER-ISVALID VALUES 'Y', 'N'.
351 88 FLG-PRI-CARDHOLDER-NOT-OK VALUE '0'.
352 88 FLG-PRI-CARDHOLDER-BLANK VALUE 'B'.
353
354 ******************************************************************
355 * Output edits
356 ******************************************************************
357 05 CICS-OUTPUT-EDIT-VARS.
358 10 CUST-ACCT-ID-X PIC X(11).
359 10 CUST-ACCT-ID-N REDEFINES CUST-ACCT-ID-X
360 PIC 9(11).
361 10 WS-EDIT-DATE-X PIC X(10).
362 10 FILLER REDEFINES WS-EDIT-DATE-X.
363 20 WS-EDIT-DATE-X-YEAR PIC X(4).
364 20 FILLER PIC X(1).
365 20 WS-EDIT-DATE-MONTH PIC X(2).
366 20 FILLER PIC X(1).
367 20 WS-EDIT-DATE-DAY PIC X(2).
368 10 WS-EDIT-DATE-X REDEFINES
369 WS-EDIT-DATE-X PIC 9(10).
370 10 WS-EDIT-CURRENCY-9-2 PIC X(15).
371 10 WS-EDIT-CURRENCY-9-2-F PIC +ZZZ,ZZZ,ZZZ.99.
372
373 ******************************************************************
374 * File and data Handling
375 ******************************************************************
376 05 WS-XREF-RID.
377 10 WS-CARD-RID-CARDNUM PIC X(16).
378 10 WS-CARD-RID-CUST-ID PIC 9(09).
379 10 WS-CARD-RID-CUST-ID-X REDEFINES
380 WS-CARD-RID-CUST-ID PIC X(09).
381 10 WS-CARD-RID-ACCT-ID PIC 9(11).
382 10 WS-CARD-RID-ACCT-ID-X REDEFINES
383 WS-CARD-RID-ACCT-ID PIC X(11).
384 05 WS-FILE-READ-FLAGS.
385 10 WS-ACCOUNT-MASTER-READ-FLAG PIC X(1).
386 88 FOUND-ACCT-IN-MASTER VALUE '1'.
387 10 WS-CUST-MASTER-READ-FLAG PIC X(1).
388 88 FOUND-CUST-IN-MASTER VALUE '1'.
389 05 WS-FILE-ERROR-MESSAGE.
390 10 FILLER PIC X(12)
391 VALUE 'File Error: '.
392 10 ERROR-OPNAME PIC X(8)
393 VALUE SPACES.
394 10 FILLER PIC X(4)
395 VALUE ' on '.
396 10 ERROR-FILE PIC X(9)
397 VALUE SPACES.
398 10 FILLER PIC X(15)
399 VALUE
400 ' returned RESP '.
401 10 ERROR-RESP PIC X(10)
402 VALUE SPACES.
403 10 FILLER PIC X(7)
404 VALUE ',RESP2 '.
405 10 ERROR-RESP2 PIC X(10)
406 VALUE SPACES.
407 10 FILLER PIC X(5)
408 VALUE SPACES.
409 * Alpha variables for editing numerics
410 *
411 05 ALPHA-VARS-FOR-DATA-EDITING.
412 15 ACUP-NEW-CREDIT-LIMIT-X PIC X(15).
413 15 ACUP-NEW-CASH-CREDIT-LIMIT-X PIC X(15).
414 15 ACUP-NEW-CURR-BAL-X PIC X(15).
415 15 ACUP-NEW-CURR-CYC-CREDIT-X PIC X(15).
416 15 ACUP-NEW-CURR-CYC-DEBIT-X PIC X(15).
417
418 05 ACCT-UPDATE-RECORD.
419 *****************************************************************
420 * Data-structure for account entity (RECLN 300)
421 *****************************************************************
422 15 ACCT-UPDATE-ID PIC 9(11).
423 15 ACCT-UPDATE-ACTIVE-STATUS PIC X(01).
424 15 ACCT-UPDATE-CURR-BAL PIC S9(10)V99.
425 15 ACCT-UPDATE-CREDIT-LIMIT PIC S9(10)V99.
426 15 ACCT-UPDATE-CASH-CREDIT-LIMIT PIC S9(10)V99.
427 15 ACCT-UPDATE-OPEN-DATE PIC X(10).
428 15 ACCT-UPDATE-EXPIRAION-DATE PIC X(10).
429 15 ACCT-UPDATE-REISSUE-DATE PIC X(10).
430 15 ACCT-UPDATE-CURR-CYC-CREDIT PIC S9(10)V99.
431 15 ACCT-UPDATE-CURR-CYC-DEBIT PIC S9(10)V99.
432 15 ACCT-UPDATE-GROUP-ID PIC X(10).
433 15 FILLER PIC X(188).
434 05 CUST-UPDATE-RECORD.
435 *****************************************************************
436 * Data-structure for CUSTOMER entity (RECLN 300)
437 *****************************************************************
438 15 CUST-UPDATE-ID PIC 9(09).
439 15 CUST-UPDATE-FIRST-NAME PIC X(25).
440 15 CUST-UPDATE-MIDDLE-NAME PIC X(25).
441 15 CUST-UPDATE-LAST-NAME PIC X(25).
442 15 CUST-UPDATE-ADDR-LINE-1 PIC X(50).
443 15 CUST-UPDATE-ADDR-LINE-2 PIC X(50).
444 15 CUST-UPDATE-ADDR-LINE-3 PIC X(50).
445 15 CUST-UPDATE-ADDR-STATE-CD PIC X(02).
446 15 CUST-UPDATE-ADDR-COUNTRY-CD PIC X(03).
447 15 CUST-UPDATE-ADDR-ZIP PIC X(10).
448 15 CUST-UPDATE-PHONE-NUM-1 PIC X(15).
449 15 CUST-UPDATE-PHONE-NUM-2 PIC X(15).
450 15 CUST-UPDATE-SSN PIC 9(09).
451 15 CUST-UPDATE-GOVT-ISSUED-ID PIC X(20).
452 15 CUST-UPDATE-DOB-YYYY-MM-DD PIC X(10).
453 15 CUST-UPDATE-EFT-ACCOUNT-ID PIC X(10).
454 15 CUST-UPDATE-PRI-CARD-IND PIC X(01).
455 15 CUST-UPDATE-FICO-CREDIT-SCORE PIC 9(03).
456 15 FILLER PIC X(168).
457
458
459 ******************************************************************
460 * Output Message Construction
461 ******************************************************************
462 05 WS-LONG-MSG PIC X(500).
463 05 WS-INFO-MSG PIC X(40).
464 88 WS-NO-INFO-MESSAGE VALUES
465 SPACES LOW-VALUES.
466 88 FOUND-ACCOUNT-DATA VALUE
467 'Details of selected account shown above'.
468 88 PROMPT-FOR-SEARCH-KEYS VALUE
469 'Enter or update id of account to update'.
470 88 PROMPT-FOR-CHANGES VALUE
471 'Update account details presented above.'.
472 88 PROMPT-FOR-CONFIRMATION VALUE
473 'Changes validated.Press F5 to save'.
474 88 CONFIRM-UPDATE-SUCCESS VALUE
475 'Changes committed to database'.
476 88 INFORM-FAILURE VALUE
477 'Changes unsuccessful. Please try again'.
478
479 05 WS-RETURN-MSG PIC X(75).
480 88 WS-RETURN-MSG-OFF VALUE SPACES.
481 88 WS-EXIT-MESSAGE VALUE
482 'PF03 pressed.Exiting '.
483 88 WS-PROMPT-FOR-ACCT VALUE
484 'Account number not provided'.
485 88 WS-PROMPT-FOR-LASTNAME VALUE
486 'Last name not provided'.
487 88 WS-NAME-MUST-BE-ALPHA VALUE
488 'Name can only contain alphabets and spaces'.
489 88 NO-SEARCH-CRITERIA-RECEIVED VALUE
490 'No input received'.
491 88 NO-CHANGES-DETECTED VALUE
492 'No change detected with respect to values fetched.'.
493 88 SEARCHED-ACCT-ZEROES VALUE
494 'Account number must be a non zero 11 digit number'.
495 88 SEARCHED-ACCT-NOT-NUMERIC VALUE
496 'Account number must be a non zero 11 digit number'.
497 88 DID-NOT-FIND-ACCT-IN-CARDXREF VALUE
498 'Did not find this account in account card xref file'.
499 88 DID-NOT-FIND-ACCT-IN-ACCTDAT VALUE
500 'Did not find this account in account master file'.
501 88 DID-NOT-FIND-CUST-IN-CUSTDAT VALUE
502 'Did not find associated customer in master file'.
503 88 ACCT-STATUS-MUST-BE-YES-NO VALUE
504 'Account Active Status must be Y or N'.
505 88 CRED-LIMIT-IS-BLANK VALUE
506 'Credit Limit must be supplied'.
507 88 CRED-LIMIT-IS-NOT-VALID VALUE
508 'Credit Limit is not valid'.
509 88 THIS-MONTH-NOT-VALID VALUE
510 'Card expiry month must be between 1 and 12'.
511 88 THIS-YEAR-NOT-VALID VALUE
512 'Invalid card expiry year'.
513 88 DID-NOT-FIND-ACCT-IN-CARDXREF VALUE
514 'Did not find this account in cards database'.
515 88 DID-NOT-FIND-ACCTCARD-COMBO VALUE
516 'Did not find cards for this search condition'.
517 88 COULD-NOT-LOCK-ACCT-FOR-UPDATE VALUE
518 'Could not lock account record for update'.
519 88 COULD-NOT-LOCK-CUST-FOR-UPDATE VALUE
520 'Could not lock customer record for update'.
521 88 DATA-WAS-CHANGED-BEFORE-UPDATE VALUE
522 'Record changed by some one else. Please review'.
523 88 LOCKED-BUT-UPDATE-FAILED VALUE
524 'Update of record failed'.
525 88 XREF-READ-ERROR VALUE
526 'Error reading Card Data File'.
527 88 CODING-TO-BE-DONE VALUE
528 'Looks Good.... so far'.
529 ******************************************************************
530 * Literals and Constants
531 ******************************************************************
532 01 WS-LITERALS.
533 05 LIT-THISPGM PIC X(8)
534 VALUE 'COACTUPC'.
535 05 LIT-THISTRANID PIC X(4)
536 VALUE 'CAUP'.
537 05 LIT-THISMAPSET PIC X(8)
538 VALUE 'COACTUP '.
539 05 LIT-THISMAP PIC X(7)
540 VALUE 'CACTUPA'.
541 05 LIT-CARDUPDATE-PGM PIC X(8)
542 VALUE 'COCRDUPC'.
543 05 LIT-CARDUPDATE-TRANID PIC X(4)
544 VALUE 'CCUP'.
545 05 LIT-CARDUPDATE-MAPSET PIC X(8)
546 VALUE 'COCRDUP '.
547 05 LIT-CARDUPDATE-MAP PIC X(7)
548 VALUE 'CCRDUPA'.
549 05 LIT-CCLISTPGM PIC X(8)
550 VALUE 'COCRDLIC'.
551 05 LIT-CCLISTTRANID PIC X(4)
552 VALUE 'CCLI'.
553 05 LIT-CCLISTMAPSET PIC X(7)
554 VALUE 'COCRDLI'.
555 05 LIT-CCLISTMAP PIC X(7)
556 VALUE 'CCRDSLA'.
557 05 LIT-MENUPGM PIC X(8)
558 VALUE 'COMEN01C'.
559 05 LIT-MENUTRANID PIC X(4)
560 VALUE 'CM00'.
561 05 LIT-MENUMAPSET PIC X(7)
562 VALUE 'COMEN01'.
563 05 LIT-MENUMAP PIC X(7)
564 VALUE 'COMEN1A'.
565 05 LIT-CARDDTLPGM PIC X(8)
566 VALUE 'COCRDSLC'.
567 05 LIT-CARDDTLTRANID PIC X(4)
568 VALUE 'CCDL'.
569 05 LIT-CARDDTLMAPSET PIC X(7)
570 VALUE 'COCRDSL'.
571 05 LIT-CARDDTLMAP PIC X(7)
572 VALUE 'CCRDSLA'.
573 05 LIT-ACCTFILENAME PIC X(8)
574 VALUE 'ACCTDAT '.
575 05 LIT-CUSTFILENAME PIC X(8)
576 VALUE 'CUSTDAT '.
577 05 LIT-CARDFILENAME PIC X(8)
578 VALUE 'CARDDAT '.
579 05 LIT-CARDFILENAME-ACCT-PATH PIC X(8)
580 VALUE 'CARDAIX '.
581 05 LIT-CARDXREFNAME-ACCT-PATH PIC X(8)
582 VALUE 'CXACAIX '.
583 ******************************************************************
584 * Literals for use in INSPECT statements
585 ******************************************************************
586 05 LIT-ALL-ALPHANUM-FROM-X.
587 10 LIT-ALL-ALPHA-FROM-X.
588 15 LIT-UPPER PIC X(26)
589 VALUE 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.
590 15 LIT-LOWER PIC X(26)
591 VALUE 'abcdefghijklmnopqrstuvwxyz'.
592 10 LIT-NUMBERS PIC X(10)
593 VALUE '0123456789'.
594 ******************************************************************
595 *Other common working storage Variables
596 ******************************************************************
597 COPY CVCRD01Y.
598 ******************************************************************
599 *Lookups
600 ******************************************************************
601 *North America Phone Area codes
602 COPY CSLKPCDY.
603
604 ******************************************************************
605 * Variables for use in INSPECT statements
606 ******************************************************************
607 01 LIT-ALL-ALPHA-FROM PIC X(52) VALUE SPACES.
608 01 LIT-ALL-ALPHANUM-FROM PIC X(62) VALUE SPACES.
609 01 LIT-ALL-NUM-FROM PIC X(10) VALUE SPACES.
610 77 LIT-ALPHA-SPACES-TO PIC X(52) VALUE SPACES.
611 77 LIT-ALPHANUM-SPACES-TO PIC X(62) VALUE SPACES.
612 77 LIT-NUM-SPACES-TO PIC X(10) VALUE SPACES.
613
614 *IBM SUPPLIED COPYBOOKS
615 COPY DFHBMSCA.
616 COPY DFHAID.
617
618 *COMMON COPYBOOKS
619 *Screen Titles
620 COPY COTTL01Y.
621
622 *Account Update Screen Layout
623 COPY COACTUP.
624
625 *Current Date
626 COPY CSDAT01Y.
627
628 *Common Messages
629 COPY CSMSG01Y.
630
631 *Abend Variables
632 COPY CSMSG02Y.
633
634 *Signed on user data
635 COPY CSUSR01Y.
636
637 *Dataset layouts
638
639 *ACCT RECORD LAYOUT
640 COPY CVACT01Y.
641
642 *CARD XREF LAYOUT
643 COPY CVACT03Y.
644
645 *CUSTOMER LAYOUT
646 COPY CVCUS01Y.
647
648 ******************************************************************
649 *Application Commmarea Copybook
650 COPY COCOM01Y.
651
652 01 WS-THIS-PROGCOMMAREA.
653 05 ACCT-UPDATE-SCREEN-DATA.
654 10 ACUP-CHANGE-ACTION PIC X(1)
655 VALUE LOW-VALUES.
656 88 ACUP-DETAILS-NOT-FETCHED VALUES
657 LOW-VALUES,
658 SPACES.
659 88 ACUP-SHOW-DETAILS VALUE 'S'.
660 88 ACUP-CHANGES-MADE VALUES 'E', 'N'
661 , 'C', 'L'
662 , 'F'.
663 88 ACUP-CHANGES-NOT-OK VALUE 'E'.
664 88 ACUP-CHANGES-OK-NOT-CONFIRMED VALUE 'N'.
665 88 ACUP-CHANGES-OKAYED-AND-DONE VALUE 'C'.
666 88 ACUP-CHANGES-FAILED VALUES 'L', 'F'.
667 88 ACUP-CHANGES-OKAYED-LOCK-ERROR VALUE 'L'.
668 88 ACUP-CHANGES-OKAYED-BUT-FAILED VALUE 'F'.
669 05 ACUP-OLD-DETAILS.
670 10 ACUP-OLD-ACCT-DATA.
671 15 ACUP-OLD-ACCT-ID-X PIC X(11).
672 15 ACUP-OLD-ACCT-ID REDEFINES
673 ACUP-OLD-ACCT-ID-X PIC 9(11).
674 15 ACUP-OLD-ACTIVE-STATUS PIC X(01).
675 15 ACUP-OLD-CURR-BAL PIC X(12).
676 15 ACUP-OLD-CURR-BAL-N REDEFINES
677 ACUP-OLD-CURR-BAL PIC S9(10)V99.
678 15 ACUP-OLD-CREDIT-LIMIT PIC X(12).
679 15 ACUP-OLD-CREDIT-LIMIT-N REDEFINES
680 ACUP-OLD-CREDIT-LIMIT PIC S9(10)V99.
681 15 ACUP-OLD-CASH-CREDIT-LIMIT PIC X(12).
682 15 ACUP-OLD-CASH-CREDIT-LIMIT-N REDEFINES
683 ACUP-OLD-CASH-CREDIT-LIMIT PIC S9(10)V99.
684 15 ACUP-OLD-OPEN-DATE PIC X(08).
685 15 ACUP-OLD-OPEN-DATE-PARTS REDEFINES
686 ACUP-OLD-OPEN-DATE.
687 20 ACUP-OLD-OPEN-YEAR PIC X(4).
688 20 ACUP-OLD-OPEN-MON PIC X(2).
689 20 ACUP-OLD-OPEN-DAY PIC X(2).
690 15 ACUP-OLD-EXPIRAION-DATE PIC X(08).
691 15 ACUP-OLD-EXPIRAION-DATE-PARTS REDEFINES
692 ACUP-OLD-EXPIRAION-DATE.
693 20 ACUP-OLD-EXP-YEAR PIC X(4).
694 20 ACUP-OLD-EXP-MON PIC X(2).
695 20 ACUP-OLD-EXP-DAY PIC X(2).
696 15 ACUP-OLD-REISSUE-DATE PIC X(08).
697 15 ACUP-OLD-REISSUE-DATE-PARTS REDEFINES
698 ACUP-OLD-REISSUE-DATE.
699 20 ACUP-OLD-REISSUE-YEAR PIC X(4).
700 20 ACUP-OLD-REISSUE-MON PIC X(2).
701 20 ACUP-OLD-REISSUE-DAY PIC X(2).
702 15 ACUP-OLD-CURR-CYC-CREDIT PIC X(12).
703 15 ACUP-OLD-CURR-CYC-CREDIT-N REDEFINES
704 ACUP-OLD-CURR-CYC-CREDIT PIC S9(10)V99.
705 15 ACUP-OLD-CURR-CYC-DEBIT PIC X(12).
706 15 ACUP-OLD-CURR-CYC-DEBIT-N REDEFINES
707 ACUP-OLD-CURR-CYC-DEBIT PIC S9(10)V99.
708 15 ACUP-OLD-GROUP-ID PIC X(10).
709 10 ACUP-OLD-CUST-DATA.
710 15 ACUP-OLD-CUST-ID-X PIC X(09).
711 15 ACUP-OLD-CUST-ID REDEFINES
712 ACUP-OLD-CUST-ID-X PIC 9(09).
713 15 ACUP-OLD-CUST-FIRST-NAME PIC X(25).
714 15 ACUP-OLD-CUST-MIDDLE-NAME PIC X(25).
715 15 ACUP-OLD-CUST-LAST-NAME PIC X(25).
716 15 ACUP-OLD-CUST-ADDR-LINE-1 PIC X(50).
717 15 ACUP-OLD-CUST-ADDR-LINE-2 PIC X(50).
718 15 ACUP-OLD-CUST-ADDR-LINE-3 PIC X(50).
719 15 ACUP-OLD-CUST-ADDR-STATE-CD PIC X(02).
720 15 ACUP-OLD-CUST-ADDR-COUNTRY-CD PIC X(03).
721 15 ACUP-OLD-CUST-ADDR-ZIP PIC X(10).
722 15 ACUP-OLD-CUST-PHONE-NUM-1 PIC X(15).
723 15 ACUP-OLD-CUST-PHONE-NUM-1-X REDEFINES
724 ACUP-OLD-CUST-PHONE-NUM-1.
725 20 FILLER PIC X(1).
726 20 ACUP-OLD-CUST-PHONE-NUM-1A PIC X(3).
727 20 FILLER PIC X(1).
728 20 ACUP-OLD-CUST-PHONE-NUM-1B PIC X(3).
729 20 FILLER PIC X(1).
730 20 ACUP-OLD-CUST-PHONE-NUM-1C PIC X(4).
731 20 FILLER PIC X(2).
732 15 ACUP-OLD-CUST-PHONE-NUM-2 PIC X(15).
733 15 ACUP-OLD-CUST-PHONE-NUM-2-X REDEFINES
734 ACUP-OLD-CUST-PHONE-NUM-2.
735 20 FILLER PIC X(1).
736 20 ACUP-OLD-CUST-PHONE-NUM-2A PIC X(3).
737 20 FILLER PIC X(1).
738 20 ACUP-OLD-CUST-PHONE-NUM-2B PIC X(3).
739 20 FILLER PIC X(1).
740 20 ACUP-OLD-CUST-PHONE-NUM-2C PIC X(4).
741 20 FILLER PIC X(2).
742 15 ACUP-OLD-CUST-SSN-X PIC X(09).
743 15 ACUP-OLD-CUST-SSN REDEFINES
744 ACUP-OLD-CUST-SSN-X PIC 9(09).
745 15 ACUP-OLD-CUST-GOVT-ISSUED-ID PIC X(20).
746 15 ACUP-OLD-CUST-DOB-YYYY-MM-DD PIC X(08).
747 15 ACUP-OLD-CUST-DOB-PARTS REDEFINES
748 ACUP-OLD-CUST-DOB-YYYY-MM-DD.
749 20 ACUP-OLD-CUST-DOB-YEAR PIC X(4).
750 20 ACUP-OLD-CUST-DOB-MON PIC X(2).
751 20 ACUP-OLD-CUST-DOB-DAY PIC X(2).
752 15 ACUP-OLD-CUST-EFT-ACCOUNT-ID PIC X(10).
753 15 ACUP-OLD-CUST-PRI-HOLDER-IND PIC X(01).
754 15 ACUP-OLD-CUST-FICO-SCORE-X PIC X(03).
755 15 ACUP-OLD-CUST-FICO-SCORE REDEFINES
756 ACUP-OLD-CUST-FICO-SCORE-X PIC 9(03).
757 05 ACUP-NEW-DETAILS.
758 10 ACUP-NEW-ACCT-DATA.
759 15 ACUP-NEW-ACCT-ID-X PIC X(11).
760 15 ACUP-NEW-ACCT-ID REDEFINES
761 ACUP-NEW-ACCT-ID-X PIC 9(11).
762 15 ACUP-NEW-ACTIVE-STATUS PIC X(01).
763 15 ACUP-NEW-CURR-BAL PIC X(12).
764 15 ACUP-NEW-CURR-BAL-N REDEFINES
765 ACUP-NEW-CURR-BAL PIC S9(10)V99.
766 15 ACUP-NEW-CREDIT-LIMIT PIC X(12).
767 15 ACUP-NEW-CREDIT-LIMIT-N REDEFINES
768 ACUP-NEW-CREDIT-LIMIT PIC S9(10)V99.
769 15 ACUP-NEW-CASH-CREDIT-LIMIT PIC X(12).
770 15 ACUP-NEW-CASH-CREDIT-LIMIT-N REDEFINES
771 ACUP-NEW-CASH-CREDIT-LIMIT PIC S9(10)V99.
772 15 ACUP-NEW-OPEN-DATE PIC X(08).
773 15 ACUP-NEW-OPEN-DATE-PARTS REDEFINES
774 ACUP-NEW-OPEN-DATE.
775 20 ACUP-NEW-OPEN-YEAR PIC X(4).
776 20 ACUP-NEW-OPEN-MON PIC X(2).
777 20 ACUP-NEW-OPEN-DAY PIC X(2).
778 15 ACUP-NEW-EXPIRAION-DATE PIC X(08).
779 15 ACUP-NEW-EXPIRAION-DATE-PARTS REDEFINES
780 ACUP-NEW-EXPIRAION-DATE.
781 20 ACUP-NEW-EXP-YEAR PIC X(4).
782 20 ACUP-NEW-EXP-MON PIC X(2).
783 20 ACUP-NEW-EXP-DAY PIC X(2).
784 15 ACUP-NEW-REISSUE-DATE PIC X(08).
785 15 ACUP-NEW-REISSUE-DATE-PARTS REDEFINES
786 ACUP-NEW-REISSUE-DATE.
787 20 ACUP-NEW-REISSUE-YEAR PIC X(4).
788 20 ACUP-NEW-REISSUE-MON PIC X(2).
789 20 ACUP-NEW-REISSUE-DAY PIC X(2).
790 15 ACUP-NEW-CURR-CYC-CREDIT PIC X(12).
791 15 ACUP-NEW-CURR-CYC-CREDIT-N REDEFINES
792 ACUP-NEW-CURR-CYC-CREDIT PIC S9(10)V99.
793 15 ACUP-NEW-CURR-CYC-DEBIT PIC X(12).
794 15 ACUP-NEW-CURR-CYC-DEBIT-N REDEFINES
795 ACUP-NEW-CURR-CYC-DEBIT PIC S9(10)V99.
796 15 ACUP-NEW-GROUP-ID PIC X(10).
797 10 ACUP-NEW-CUST-DATA.
798 15 ACUP-NEW-CUST-ID-X PIC X(09).
799 15 ACUP-NEW-CUST-ID REDEFINES
800 ACUP-NEW-CUST-ID-X PIC 9(09).
801 15 ACUP-NEW-CUST-FIRST-NAME PIC X(25).
802 15 ACUP-NEW-CUST-MIDDLE-NAME PIC X(25).
803 15 ACUP-NEW-CUST-LAST-NAME PIC X(25).
804 15 ACUP-NEW-CUST-ADDR-LINE-1 PIC X(50).
805 15 ACUP-NEW-CUST-ADDR-LINE-2 PIC X(50).
806 15 ACUP-NEW-CUST-ADDR-LINE-3 PIC X(50).
807 15 ACUP-NEW-CUST-ADDR-STATE-CD PIC X(02).
808 15 ACUP-NEW-CUST-ADDR-COUNTRY-CD PIC X(03).
809 15 ACUP-NEW-CUST-ADDR-ZIP PIC X(10).
810 15 ACUP-NEW-CUST-PHONE-NUM-1 PIC X(15).
811 15 ACUP-NEW-CUST-PHONE-NUM-1-X REDEFINES
812 ACUP-NEW-CUST-PHONE-NUM-1.
813 20 FILLER PIC X(1).
814 20 ACUP-NEW-CUST-PHONE-NUM-1A PIC X(3).
815 20 FILLER PIC X(1).
816 20 ACUP-NEW-CUST-PHONE-NUM-1B PIC X(3).
817 20 FILLER PIC X(1).
818 20 ACUP-NEW-CUST-PHONE-NUM-1C PIC X(4).
819 20 FILLER PIC X(2).
820 15 ACUP-NEW-CUST-PHONE-NUM-2 PIC X(15).
821 15 ACUP-NEW-CUST-PHONE-NUM-2-X REDEFINES
822 ACUP-NEW-CUST-PHONE-NUM-2.
823 20 FILLER PIC X(1).
824 20 ACUP-NEW-CUST-PHONE-NUM-2A PIC X(3).
825 20 FILLER PIC X(1).
826 20 ACUP-NEW-CUST-PHONE-NUM-2B PIC X(3).
827 20 FILLER PIC X(1).
828 20 ACUP-NEW-CUST-PHONE-NUM-2C PIC X(4).
829 20 FILLER PIC X(2).
830 15 ACUP-NEW-CUST-SSN-X.
831 20 ACUP-NEW-CUST-SSN-1 PIC X(03).
832 20 ACUP-NEW-CUST-SSN-2 PIC X(02).
833 20 ACUP-NEW-CUST-SSN-3 PIC X(04).
834 15 ACUP-NEW-CUST-SSN REDEFINES
835 ACUP-NEW-CUST-SSN-X PIC 9(09).
836 15 ACUP-NEW-CUST-GOVT-ISSUED-ID PIC X(20).
837 15 ACUP-NEW-CUST-DOB-YYYY-MM-DD PIC X(08).
838 15 ACUP-NEW-CUST-DOB-PARTS REDEFINES
839 ACUP-NEW-CUST-DOB-YYYY-MM-DD.
840 20 ACUP-NEW-CUST-DOB-YEAR PIC X(4).
841 20 ACUP-NEW-CUST-DOB-MON PIC X(2).
842 20 ACUP-NEW-CUST-DOB-DAY PIC X(2).
843 15 ACUP-NEW-CUST-EFT-ACCOUNT-ID PIC X(10).
844 15 ACUP-NEW-CUST-PRI-HOLDER-IND PIC X(01).
845 15 ACUP-NEW-CUST-FICO-SCORE-X PIC X(03).
846 15 ACUP-NEW-CUST-FICO-SCORE REDEFINES
847 ACUP-NEW-CUST-FICO-SCORE-X PIC 9(03).
848 88 FICO-RANGE-IS-VALID VALUES 300
849 THROUGH 850.
850 01 WS-COMMAREA PIC X(2000).
851
852
853 LINKAGE SECTION.
854 01 DFHCOMMAREA.
855 05 FILLER PIC X(1)
856 OCCURS 1 TO 32767 TIMES DEPENDING ON EIBCALEN.
857
858 PROCEDURE DIVISION.
859 0000-MAIN.
860
861
862 EXEC CICS HANDLE ABEND
863 LABEL(ABEND-ROUTINE)
864 END-EXEC
865
866 INITIALIZE CC-WORK-AREA
867 WS-MISC-STORAGE
868 WS-COMMAREA
869 *****************************************************************
870 * Store our context
871 *****************************************************************
872 MOVE LIT-THISTRANID TO WS-TRANID
873 *****************************************************************
874 * Ensure error message is cleared *
875 *****************************************************************
876 SET WS-RETURN-MSG-OFF TO TRUE
877 *****************************************************************
878 * Store passed data if any *
879 *****************************************************************
880 IF EIBCALEN IS EQUAL TO 0
881 OR (CDEMO-FROM-PROGRAM = LIT-MENUPGM
882 AND NOT CDEMO-PGM-REENTER)
883 INITIALIZE CARDDEMO-COMMAREA
884 WS-THIS-PROGCOMMAREA
885 SET CDEMO-PGM-ENTER TO TRUE
886 SET ACUP-DETAILS-NOT-FETCHED TO TRUE
887 ELSE
888 MOVE DFHCOMMAREA (1:LENGTH OF CARDDEMO-COMMAREA) TO
889 CARDDEMO-COMMAREA
890 MOVE DFHCOMMAREA(LENGTH OF CARDDEMO-COMMAREA + 1:
891 LENGTH OF WS-THIS-PROGCOMMAREA ) TO
892 WS-THIS-PROGCOMMAREA
893 END-IF
894 *****************************************************************
895 * Remap PFkeys as needed.
896 * Store the Mapped PF Key
897 *****************************************************************
898 PERFORM YYYY-STORE-PFKEY
899 THRU YYYY-STORE-PFKEY-EXIT
900 *****************************************************************
901 * Check the AID to see if its valid at this point *
902 * F3 - Exit
903 * Enter show screen again
904 *****************************************************************
905 SET PFK-INVALID TO TRUE
906 IF CCARD-AID-ENTER OR
907 CCARD-AID-PFK03 OR
908 (CCARD-AID-PFK05 AND ACUP-CHANGES-OK-NOT-CONFIRMED)
909 OR
910 (CCARD-AID-PFK12 AND NOT ACUP-DETAILS-NOT-FETCHED)
911 SET PFK-VALID TO TRUE
912 END-IF
913
914 IF PFK-INVALID
915 SET CCARD-AID-ENTER TO TRUE
916 END-IF
917
918 *****************************************************************
919 * Decide what to do based on inputs received
920 *****************************************************************
921 EVALUATE TRUE
922 ******************************************************************
923 * USER PRESSES PF03 TO EXIT
924 * OR USER IS DONE WITH UPDATE
925 * XCTL TO CALLING PROGRAM OR MAIN MENU
926 ******************************************************************
927 WHEN CCARD-AID-PFK03
928 SET CCARD-AID-PFK03 TO TRUE
929
930 IF CDEMO-FROM-TRANID EQUAL LOW-VALUES
931 OR CDEMO-FROM-TRANID EQUAL SPACES
932 MOVE LIT-MENUTRANID TO CDEMO-TO-TRANID
933 ELSE
934 MOVE CDEMO-FROM-TRANID TO CDEMO-TO-TRANID
935 END-IF
936
937 IF CDEMO-FROM-PROGRAM EQUAL LOW-VALUES
938 OR CDEMO-FROM-PROGRAM EQUAL SPACES
939 MOVE LIT-MENUPGM TO CDEMO-TO-PROGRAM
940 ELSE
941 MOVE CDEMO-FROM-PROGRAM TO CDEMO-TO-PROGRAM
942 END-IF
943
944 MOVE LIT-THISTRANID TO CDEMO-FROM-TRANID
945 MOVE LIT-THISPGM TO CDEMO-FROM-PROGRAM
946
947 SET CDEMO-USRTYP-USER TO TRUE
948 SET CDEMO-PGM-ENTER TO TRUE
949 MOVE LIT-THISMAPSET TO CDEMO-LAST-MAPSET
950 MOVE LIT-THISMAP TO CDEMO-LAST-MAP
951
952 EXEC CICS
953 SYNCPOINT
954 END-EXEC
955 *
956 EXEC CICS XCTL
957 PROGRAM (CDEMO-TO-PROGRAM)
958 COMMAREA(CARDDEMO-COMMAREA)
959 END-EXEC
960 ******************************************************************
961 * FRESH ENTRY INTO PROGRAM
962 * ASK THE USER FOR THE KEYS TO FETCH CARD TO BE UPDATED
963 ******************************************************************
964 WHEN ACUP-DETAILS-NOT-FETCHED
965 AND CDEMO-PGM-ENTER
966 WHEN CDEMO-FROM-PROGRAM EQUAL LIT-MENUPGM
967 AND NOT CDEMO-PGM-REENTER
968 INITIALIZE WS-THIS-PROGCOMMAREA
969 PERFORM 3000-SEND-MAP THRU
970 3000-SEND-MAP-EXIT
971 SET CDEMO-PGM-REENTER TO TRUE
972 SET ACUP-DETAILS-NOT-FETCHED TO TRUE
973 GO TO COMMON-RETURN
974 ******************************************************************
975 * ACCT DATA CHANGES REVIEWED, OKAYED AND DONE SUCESSFULLY
976 * RESET THE SEARCH KEYS
977 * ASK THE USER FOR FRESH SEARCH CRITERIA
978 ******************************************************************
979 WHEN ACUP-CHANGES-OKAYED-AND-DONE
980 WHEN ACUP-CHANGES-FAILED
981 INITIALIZE WS-THIS-PROGCOMMAREA
982 WS-MISC-STORAGE
983 CDEMO-ACCT-ID
984 SET CDEMO-PGM-ENTER TO TRUE
985 PERFORM 3000-SEND-MAP THRU
986 3000-SEND-MAP-EXIT
987 SET CDEMO-PGM-REENTER TO TRUE
988 SET ACUP-DETAILS-NOT-FETCHED TO TRUE
989 GO TO COMMON-RETURN
990 ******************************************************************
991 * ACCT DATA HAS BEEN PRESENTED TO USER
992 * CHECK THE USER INPUTS
993 * DECIDE WHAT TO DO
994 * PRESENT NEXT STEPS TO USER
995 ******************************************************************
996 WHEN OTHER
997 PERFORM 1000-PROCESS-INPUTS
998 THRU 1000-PROCESS-INPUTS-EXIT
999 PERFORM 2000-DECIDE-ACTION
1000 THRU 2000-DECIDE-ACTION-EXIT
1001 PERFORM 3000-SEND-MAP
1002 THRU 3000-SEND-MAP-EXIT
1003 GO TO COMMON-RETURN
1004 END-EVALUATE
1005 .
1006
1007 COMMON-RETURN.
1008 MOVE WS-RETURN-MSG TO CCARD-ERROR-MSG
1009
1010 MOVE CARDDEMO-COMMAREA TO WS-COMMAREA
1011 MOVE WS-THIS-PROGCOMMAREA TO
1012 WS-COMMAREA(LENGTH OF CARDDEMO-COMMAREA + 1:
1013 LENGTH OF WS-THIS-PROGCOMMAREA )
1014
1015 EXEC CICS RETURN
1016 TRANSID (LIT-THISTRANID)
1017 COMMAREA (WS-COMMAREA)
1018 LENGTH(LENGTH OF WS-COMMAREA)
1019 END-EXEC
1020 .
1021 0000-MAIN-EXIT.
1022 EXIT
1023 .
1024
1025 1000-PROCESS-INPUTS.
1026 PERFORM 1100-RECEIVE-MAP
1027 THRU 1100-RECEIVE-MAP-EXIT
1028 PERFORM 1200-EDIT-MAP-INPUTS
1029 THRU 1200-EDIT-MAP-INPUTS-EXIT
1030 MOVE WS-RETURN-MSG TO CCARD-ERROR-MSG
1031 MOVE LIT-THISPGM TO CCARD-NEXT-PROG
1032 MOVE LIT-THISMAPSET TO CCARD-NEXT-MAPSET
1033 MOVE LIT-THISMAP TO CCARD-NEXT-MAP
1034 .
1035 *
1036 1000-PROCESS-INPUTS-EXIT.
1037 EXIT
1038 .
1039 1100-RECEIVE-MAP.
1040 EXEC CICS RECEIVE MAP(LIT-THISMAP)
1041 MAPSET(LIT-THISMAPSET)
1042 INTO(CACTUPAI)
1043 RESP(WS-RESP-CD)
1044 RESP2(WS-REAS-CD)
1045 END-EXEC
1046 *
1047 INITIALIZE ACUP-NEW-DETAILS
1048 ******************************************************************
1049 * Account Master data
1050 ******************************************************************
1051 IF ACCTSIDI OF CACTUPAI = '*'
1052 OR ACCTSIDI OF CACTUPAI = SPACES
1053 MOVE LOW-VALUES TO CC-ACCT-ID
1054 ACUP-NEW-ACCT-ID-X
1055 ELSE
1056 MOVE ACCTSIDI OF CACTUPAI TO CC-ACCT-ID
1057 ACUP-NEW-ACCT-ID-X
1058 END-IF
1059
1060 IF ACUP-DETAILS-NOT-FETCHED
1061 GO TO 1100-RECEIVE-MAP-EXIT
1062 END-IF
1063
1064 * Active Status
1065 IF ACSTTUSI OF CACTUPAI = '*'
1066 OR ACSTTUSI OF CACTUPAI = SPACES
1067 MOVE LOW-VALUES TO ACUP-NEW-ACTIVE-STATUS
1068 ELSE
1069 MOVE ACSTTUSI OF CACTUPAI TO ACUP-NEW-ACTIVE-STATUS
1070 END-IF
1071
1072 * Credit Limit
1073 IF ACRDLIMI OF CACTUPAI = '*'
1074 OR ACRDLIMI OF CACTUPAI = SPACES
1075 MOVE LOW-VALUES TO ACUP-NEW-CREDIT-LIMIT-X
1076 ELSE
1077 MOVE ACRDLIMI OF CACTUPAI TO ACUP-NEW-CREDIT-LIMIT-X
1078 IF FUNCTION TEST-NUMVAL-C(ACUP-NEW-CREDIT-LIMIT-X) = 0
1079 COMPUTE ACUP-NEW-CREDIT-LIMIT-N =
1080 FUNCTION NUMVAL-C(ACRDLIMI OF CACTUPAI)
1081 ELSE
1082 CONTINUE
1083 END-IF
1084 END-IF
1085
1086 * Cash Limit
1087 IF ACSHLIMI OF CACTUPAI = '*'
1088 OR ACSHLIMI OF CACTUPAI = SPACES
1089 MOVE LOW-VALUES TO ACUP-NEW-CASH-CREDIT-LIMIT-X
1090 ELSE
1091 MOVE ACSHLIMI OF CACTUPAI TO ACUP-NEW-CASH-CREDIT-LIMIT-X
1092 IF FUNCTION TEST-NUMVAL-C(ACUP-NEW-CASH-CREDIT-LIMIT-X) = 0
1093 COMPUTE ACUP-NEW-CASH-CREDIT-LIMIT-N =
1094 FUNCTION NUMVAL-C(ACSHLIMI OF CACTUPAI)
1095 ELSE
1096 CONTINUE
1097 END-IF
1098 END-IF
1099
1100 * Current Balance
1101 IF ACURBALI OF CACTUPAI = '*'
1102 OR ACURBALI OF CACTUPAI = SPACES
1103 MOVE LOW-VALUES TO ACUP-NEW-CURR-BAL-X
1104 ELSE
1105 MOVE ACURBALI OF CACTUPAI TO ACUP-NEW-CURR-BAL-X
1106 IF FUNCTION TEST-NUMVAL-C(ACUP-NEW-CURR-BAL-X) = 0
1107 COMPUTE ACUP-NEW-CURR-BAL-N =
1108 FUNCTION NUMVAL-C(ACUP-NEW-CURR-BAL-X)
1109 ELSE
1110 CONTINUE
1111 END-IF
1112 END-IF
1113
1114 *Current Cycle Credit
1115 IF ACRCYCRI OF CACTUPAI = '*'
1116 OR ACRCYCRI OF CACTUPAI = SPACES
1117 MOVE LOW-VALUES TO ACUP-NEW-CURR-CYC-CREDIT-X
1118 ELSE
1119 MOVE ACRCYCRI OF CACTUPAI TO ACUP-NEW-CURR-CYC-CREDIT-X
1120 IF FUNCTION TEST-NUMVAL-C(ACUP-NEW-CURR-CYC-CREDIT-X) = 0
1121 COMPUTE ACUP-NEW-CURR-CYC-CREDIT-N =
1122 FUNCTION NUMVAL-C(ACRCYCRI OF CACTUPAI)
1123 ELSE
1124 CONTINUE
1125 END-IF
1126 END-IF
1127
1128 *Current Cycle Debit
1129 IF ACRCYDBI OF CACTUPAI = '*'
1130 OR ACRCYDBI OF CACTUPAI = SPACES
1131 MOVE LOW-VALUES TO ACUP-NEW-CURR-CYC-DEBIT-X
1132 ELSE
1133 MOVE ACRCYDBI OF CACTUPAI TO ACUP-NEW-CURR-CYC-DEBIT-X
1134 IF FUNCTION TEST-NUMVAL-C(ACUP-NEW-CURR-CYC-DEBIT-X) = 0
1135 COMPUTE ACUP-NEW-CURR-CYC-DEBIT-N =
1136 FUNCTION NUMVAL-C(ACRCYDBI OF CACTUPAI)
1137 ELSE
1138 CONTINUE
1139 END-IF
1140 END-IF
1141
1142 *Open date
1143 *
1144 IF OPNYEARI OF CACTUPAI = '*'
1145 OR OPNYEARI OF CACTUPAI = SPACES
1146 MOVE LOW-VALUES TO ACUP-NEW-OPEN-YEAR
1147 ELSE
1148 MOVE OPNYEARI OF CACTUPAI TO ACUP-NEW-OPEN-YEAR
1149 END-IF
1150
1151 IF OPNMONI OF CACTUPAI = '*'
1152 OR OPNMONI OF CACTUPAI = SPACES
1153 MOVE LOW-VALUES TO ACUP-NEW-OPEN-MON
1154 ELSE
1155 MOVE OPNMONI OF CACTUPAI TO ACUP-NEW-OPEN-MON
1156 END-IF
1157
1158 IF OPNDAYI OF CACTUPAI = '*'
1159 OR OPNDAYI OF CACTUPAI = SPACES
1160 MOVE LOW-VALUES TO ACUP-NEW-OPEN-DAY
1161 ELSE
1162 MOVE OPNDAYI OF CACTUPAI TO ACUP-NEW-OPEN-DAY
1163 END-IF
1164
1165 *Expiry date
1166 *
1167 IF EXPYEARI OF CACTUPAI = '*'
1168 OR EXPYEARI OF CACTUPAI = SPACES
1169 MOVE LOW-VALUES TO ACUP-NEW-EXP-YEAR
1170 ELSE
1171 MOVE EXPYEARI OF CACTUPAI TO ACUP-NEW-EXP-YEAR
1172 END-IF
1173
1174 IF EXPMONI OF CACTUPAI = '*'
1175 OR EXPMONI OF CACTUPAI = SPACES
1176 MOVE LOW-VALUES TO ACUP-NEW-EXP-MON
1177 ELSE
1178 MOVE EXPMONI OF CACTUPAI TO ACUP-NEW-EXP-MON
1179 END-IF
1180
1181 IF EXPDAYI OF CACTUPAI = '*'
1182 OR EXPDAYI OF CACTUPAI = SPACES
1183 MOVE LOW-VALUES TO ACUP-NEW-EXP-DAY
1184 ELSE
1185 MOVE EXPDAYI OF CACTUPAI TO ACUP-NEW-EXP-DAY
1186 END-IF
1187
1188 *Reissue date
1189 *
1190 IF RISYEARI OF CACTUPAI = '*'
1191 OR RISYEARI OF CACTUPAI = SPACES
1192 MOVE LOW-VALUES TO ACUP-NEW-REISSUE-YEAR
1193 ELSE
1194 MOVE RISYEARI OF CACTUPAI TO ACUP-NEW-REISSUE-YEAR
1195 END-IF
1196
1197 IF RISMONI OF CACTUPAI = '*'
1198 OR RISMONI OF CACTUPAI = SPACES
1199 MOVE LOW-VALUES TO ACUP-NEW-REISSUE-MON
1200 ELSE
1201 MOVE RISMONI OF CACTUPAI TO ACUP-NEW-REISSUE-MON
1202 END-IF
1203
1204 IF RISDAYI OF CACTUPAI = '*'
1205 OR RISDAYI OF CACTUPAI = SPACES
1206 MOVE LOW-VALUES TO ACUP-NEW-REISSUE-DAY
1207 ELSE
1208 MOVE RISDAYI OF CACTUPAI TO ACUP-NEW-REISSUE-DAY
1209 END-IF
1210
1211 *Account Group
1212 *
1213 IF AADDGRPI OF CACTUPAI = '*'
1214 OR AADDGRPI OF CACTUPAI = SPACES
1215 MOVE LOW-VALUES TO ACUP-NEW-GROUP-ID
1216 ELSE
1217 MOVE AADDGRPI OF CACTUPAI TO ACUP-NEW-GROUP-ID
1218 END-IF
1219 ******************************************************************
1220 * Customer Master data
1221 ******************************************************************
1222 *Customer Id (actually not editable)
1223 *
1224 IF ACSTNUMI OF CACTUPAI = '*'
1225 OR ACSTNUMI OF CACTUPAI = SPACES
1226 MOVE LOW-VALUES TO ACUP-NEW-CUST-ID-X
1227 ELSE
1228 MOVE ACSTNUMI OF CACTUPAI TO ACUP-NEW-CUST-ID-X
1229 END-IF
1230
1231 *Social Security Number
1232 *
1233 IF ACTSSN1I OF CACTUPAI = '*'
1234 OR ACTSSN1I OF CACTUPAI = SPACES
1235 MOVE LOW-VALUES TO ACUP-NEW-CUST-SSN-1
1236 ELSE
1237 MOVE ACTSSN1I OF CACTUPAI TO ACUP-NEW-CUST-SSN-1
1238 END-IF
1239
1240 IF ACTSSN2I OF CACTUPAI = '*'
1241 OR ACTSSN2I OF CACTUPAI = SPACES
1242 MOVE LOW-VALUES TO ACUP-NEW-CUST-SSN-2
1243 ELSE
1244 MOVE ACTSSN2I OF CACTUPAI TO ACUP-NEW-CUST-SSN-2
1245 END-IF
1246
1247 IF ACTSSN3I OF CACTUPAI = '*'
1248 OR ACTSSN3I OF CACTUPAI = SPACES
1249 MOVE LOW-VALUES TO ACUP-NEW-CUST-SSN-3
1250 ELSE
1251 MOVE ACTSSN3I OF CACTUPAI TO ACUP-NEW-CUST-SSN-3
1252 END-IF
1253 *
1254 *Date of birth
1255 *
1256 IF DOBYEARI OF CACTUPAI = '*'
1257 OR DOBYEARI OF CACTUPAI = SPACES
1258 MOVE LOW-VALUES TO ACUP-NEW-CUST-DOB-YEAR
1259 ELSE
1260 MOVE DOBYEARI OF CACTUPAI TO ACUP-NEW-CUST-DOB-YEAR
1261 END-IF
1262
1263 IF DOBMONI OF CACTUPAI = '*'
1264 OR DOBMONI OF CACTUPAI = SPACES
1265 MOVE LOW-VALUES TO ACUP-NEW-CUST-DOB-MON
1266 ELSE
1267 MOVE DOBMONI OF CACTUPAI TO ACUP-NEW-CUST-DOB-MON
1268 END-IF
1269
1270 IF DOBDAYI OF CACTUPAI = '*'
1271 OR DOBDAYI OF CACTUPAI = SPACES
1272 MOVE LOW-VALUES TO ACUP-NEW-CUST-DOB-DAY
1273 ELSE
1274 MOVE DOBDAYI OF CACTUPAI TO ACUP-NEW-CUST-DOB-DAY
1275 END-IF
1276 *
1277 *FICO
1278 *
1279 IF ACSTFCOI OF CACTUPAI = '*'
1280 OR ACSTFCOI OF CACTUPAI = SPACES
1281 MOVE LOW-VALUES TO ACUP-NEW-CUST-FICO-SCORE-X
1282 ELSE
1283 MOVE ACSTFCOI OF CACTUPAI TO ACUP-NEW-CUST-FICO-SCORE-X
1284 END-IF
1285 *
1286 *First Name
1287 *
1288 IF ACSFNAMI OF CACTUPAI = '*'
1289 OR ACSFNAMI OF CACTUPAI = SPACES
1290 MOVE LOW-VALUES TO ACUP-NEW-CUST-FIRST-NAME
1291 ELSE
1292 MOVE ACSFNAMI OF CACTUPAI TO ACUP-NEW-CUST-FIRST-NAME
1293 END-IF
1294 *
1295 *Middle Name
1296 *
1297 IF ACSMNAMI OF CACTUPAI = '*'
1298 OR ACSMNAMI OF CACTUPAI = SPACES
1299 MOVE LOW-VALUES TO ACUP-NEW-CUST-MIDDLE-NAME
1300 ELSE
1301 MOVE ACSMNAMI OF CACTUPAI TO ACUP-NEW-CUST-MIDDLE-NAME
1302 END-IF
1303 *
1304 *Last Name
1305 *
1306 IF ACSLNAMI OF CACTUPAI = '*'
1307 OR ACSLNAMI OF CACTUPAI = SPACES
1308 MOVE LOW-VALUES TO ACUP-NEW-CUST-LAST-NAME
1309 ELSE
1310 MOVE ACSLNAMI OF CACTUPAI TO ACUP-NEW-CUST-LAST-NAME
1311 END-IF
1312 *
1313 *Address
1314 *
1315 IF ACSADL1I OF CACTUPAI = '*'
1316 OR ACSADL1I OF CACTUPAI = SPACES
1317 MOVE LOW-VALUES TO ACUP-NEW-CUST-ADDR-LINE-1
1318 ELSE
1319 MOVE ACSADL1I OF CACTUPAI TO ACUP-NEW-CUST-ADDR-LINE-1
1320 END-IF
1321
1322 IF ACSADL2I OF CACTUPAI = '*'
1323 OR ACSADL2I OF CACTUPAI = SPACES
1324 MOVE LOW-VALUES TO ACUP-NEW-CUST-ADDR-LINE-2
1325 ELSE
1326 MOVE ACSADL2I OF CACTUPAI TO ACUP-NEW-CUST-ADDR-LINE-2
1327 END-IF
1328
1329 IF ACSCITYI OF CACTUPAI = '*'
1330 OR ACSCITYI OF CACTUPAI = SPACES
1331 MOVE LOW-VALUES TO ACUP-NEW-CUST-ADDR-LINE-3
1332 ELSE
1333 MOVE ACSCITYI OF CACTUPAI TO ACUP-NEW-CUST-ADDR-LINE-3
1334 END-IF
1335
1336 IF ACSSTTEI OF CACTUPAI = '*'
1337 OR ACSSTTEI OF CACTUPAI = SPACES
1338 MOVE LOW-VALUES TO ACUP-NEW-CUST-ADDR-STATE-CD
1339 ELSE
1340 MOVE ACSSTTEI OF CACTUPAI TO ACUP-NEW-CUST-ADDR-STATE-CD
1341 END-IF
1342
1343 IF ACSCTRYI OF CACTUPAI = '*'
1344 OR ACSCTRYI OF CACTUPAI = SPACES
1345 MOVE LOW-VALUES TO ACUP-NEW-CUST-ADDR-COUNTRY-CD
1346 ELSE
1347 MOVE ACSCTRYI OF CACTUPAI TO ACUP-NEW-CUST-ADDR-COUNTRY-CD
1348 END-IF
1349
1350 IF ACSZIPCI OF CACTUPAI = '*'
1351 OR ACSZIPCI OF CACTUPAI = SPACES
1352 MOVE LOW-VALUES TO ACUP-NEW-CUST-ADDR-ZIP
1353 ELSE
1354 MOVE ACSZIPCI OF CACTUPAI TO ACUP-NEW-CUST-ADDR-ZIP
1355 END-IF
1356
1357 IF ACSPH1AI OF CACTUPAI = '*'
1358 OR ACSPH1AI OF CACTUPAI = SPACES
1359 MOVE LOW-VALUES TO ACUP-NEW-CUST-PHONE-NUM-1A
1360 ELSE
1361 MOVE ACSPH1AI OF CACTUPAI TO ACUP-NEW-CUST-PHONE-NUM-1A
1362 END-IF
1363
1364 IF ACSPH1BI OF CACTUPAI = '*'
1365 OR ACSPH1BI OF CACTUPAI = SPACES
1366 MOVE LOW-VALUES TO ACUP-NEW-CUST-PHONE-NUM-1B
1367 ELSE
1368 MOVE ACSPH1BI OF CACTUPAI TO ACUP-NEW-CUST-PHONE-NUM-1B
1369 END-IF
1370
1371 IF ACSPH1CI OF CACTUPAI = '*'
1372 OR ACSPH1CI OF CACTUPAI = SPACES
1373 MOVE LOW-VALUES TO ACUP-NEW-CUST-PHONE-NUM-1C
1374 ELSE
1375 MOVE ACSPH1CI OF CACTUPAI TO ACUP-NEW-CUST-PHONE-NUM-1C
1376 END-IF
1377
1378 IF ACSPH2AI OF CACTUPAI = '*'
1379 OR ACSPH2AI OF CACTUPAI = SPACES
1380 MOVE LOW-VALUES TO ACUP-NEW-CUST-PHONE-NUM-2A
1381 ELSE
1382 MOVE ACSPH2AI OF CACTUPAI TO ACUP-NEW-CUST-PHONE-NUM-2A
1383 END-IF
1384
1385 IF ACSPH2BI OF CACTUPAI = '*'
1386 OR ACSPH2BI OF CACTUPAI = SPACES
1387 MOVE LOW-VALUES TO ACUP-NEW-CUST-PHONE-NUM-2B
1388 ELSE
1389 MOVE ACSPH2BI OF CACTUPAI TO ACUP-NEW-CUST-PHONE-NUM-2B
1390 END-IF
1391
1392 IF ACSPH2CI OF CACTUPAI = '*'
1393 OR ACSPH2CI OF CACTUPAI = SPACES
1394 MOVE LOW-VALUES TO ACUP-NEW-CUST-PHONE-NUM-2C
1395 ELSE
1396 MOVE ACSPH2CI OF CACTUPAI TO ACUP-NEW-CUST-PHONE-NUM-2C
1397 END-IF
1398 *
1399 *Government Id
1400 *
1401 IF ACSGOVTI OF CACTUPAI = '*'
1402 OR ACSGOVTI OF CACTUPAI = SPACES
1403 MOVE LOW-VALUES TO ACUP-NEW-CUST-GOVT-ISSUED-ID
1404 ELSE
1405 MOVE ACSGOVTI OF CACTUPAI TO ACUP-NEW-CUST-GOVT-ISSUED-ID
1406 END-IF
1407 *
1408 *EFT Code
1409 *
1410 IF ACSEFTCI OF CACTUPAI = '*'
1411 OR ACSEFTCI OF CACTUPAI = SPACES
1412 MOVE LOW-VALUES TO ACUP-NEW-CUST-EFT-ACCOUNT-ID
1413 ELSE
1414 MOVE ACSEFTCI OF CACTUPAI TO ACUP-NEW-CUST-EFT-ACCOUNT-ID
1415 END-IF
1416 *
1417 *Primary Holder Indicator
1418 *
1419 IF ACSPFLGI OF CACTUPAI = '*'
1420 OR ACSPFLGI OF CACTUPAI = SPACES
1421 MOVE LOW-VALUES TO ACUP-NEW-CUST-PRI-HOLDER-IND
1422 ELSE
1423 MOVE ACSPFLGI OF CACTUPAI TO ACUP-NEW-CUST-PRI-HOLDER-IND
1424 END-IF
1425 .
1426 1100-RECEIVE-MAP-EXIT.
1427 EXIT
1428 .
1429 1200-EDIT-MAP-INPUTS.
1430
1431 SET INPUT-OK TO TRUE
1432
1433 IF ACUP-DETAILS-NOT-FETCHED
1434 * VALIDATE THE SEARCH KEYS
1435 PERFORM 1210-EDIT-ACCOUNT
1436 THRU 1210-EDIT-ACCOUNT-EXIT
1437
1438 MOVE LOW-VALUES TO ACUP-OLD-ACCT-DATA
1439
1440 * IF THE SEARCH CONDITIONS HAVE PROBLEMS FLAG THEM
1441 IF FLG-ACCTFILTER-BLANK
1442 SET NO-SEARCH-CRITERIA-RECEIVED TO TRUE
1443 END-IF
1444
1445 * AT THIS STAGE. NO DETAILS FETCHED. NOTHING MORE TO EDIT.
1446 GO TO 1200-EDIT-MAP-INPUTS-EXIT
1447 ELSE
1448 CONTINUE
1449 END-IF
1450 *
1451 * SEARCH KEYS ALREADY VALIDATED AND DATA FETCHED
1452 SET FOUND-ACCOUNT-DATA TO TRUE
1453 SET FOUND-ACCT-IN-MASTER TO TRUE
1454 SET FLG-ACCTFILTER-ISVALID TO TRUE
1455
1456 SET FOUND-CUST-IN-MASTER TO TRUE
1457 SET FLG-CUSTFILTER-ISVALID TO TRUE
1458
1459 *
1460 PERFORM 1205-COMPARE-OLD-NEW
1461 THRU 1205-COMPARE-OLD-NEW-EXIT
1462
1463 IF NO-CHANGES-FOUND
1464 OR ACUP-CHANGES-OK-NOT-CONFIRMED
1465 OR ACUP-CHANGES-OKAYED-AND-DONE
1466 MOVE LOW-VALUES TO WS-NON-KEY-FLAGS
1467 GO TO 1200-EDIT-MAP-INPUTS-EXIT
1468 END-IF
1469
1470 SET ACUP-CHANGES-NOT-OK TO TRUE
1471
1472 MOVE 'Account Status' TO WS-EDIT-VARIABLE-NAME
1473 MOVE ACUP-NEW-ACTIVE-STATUS TO WS-EDIT-YES-NO
1474 PERFORM 1220-EDIT-YESNO
1475 THRU 1220-EDIT-YESNO-EXIT
1476 MOVE WS-EDIT-YES-NO TO WS-EDIT-ACCT-STATUS
1477
1478 MOVE 'Open Date' TO WS-EDIT-VARIABLE-NAME
1479 MOVE ACUP-NEW-OPEN-DATE TO WS-EDIT-DATE-CCYYMMDD
1480 PERFORM EDIT-DATE-CCYYMMDD
1481 THRU EDIT-DATE-CCYYMMDD-EXIT
1482 MOVE WS-EDIT-DATE-FLGS TO WS-EDIT-OPEN-DATE-FLGS
1483
1484 MOVE 'Credit Limit' TO WS-EDIT-VARIABLE-NAME
1485 MOVE ACUP-NEW-CREDIT-LIMIT-X TO WS-EDIT-SIGNED-NUMBER-9V2-X
1486 PERFORM 1250-EDIT-SIGNED-9V2
1487 THRU 1250-EDIT-SIGNED-9V2-EXIT
1488 MOVE WS-FLG-SIGNED-NUMBER-EDIT TO WS-EDIT-CREDIT-LIMIT
1489
1490 MOVE 'Expiry Date' TO WS-EDIT-VARIABLE-NAME
1491 MOVE ACUP-NEW-EXPIRAION-DATE TO WS-EDIT-DATE-CCYYMMDD
1492 PERFORM EDIT-DATE-CCYYMMDD
1493 THRU EDIT-DATE-CCYYMMDD-EXIT
1494 MOVE WS-EDIT-DATE-FLGS TO WS-EXPIRY-DATE-FLGS
1495
1496 MOVE 'Cash Credit Limit' TO WS-EDIT-VARIABLE-NAME
1497 MOVE ACUP-NEW-CASH-CREDIT-LIMIT-X
1498 TO WS-EDIT-SIGNED-NUMBER-9V2-X
1499 PERFORM 1250-EDIT-SIGNED-9V2
1500 THRU 1250-EDIT-SIGNED-9V2-EXIT
1501 MOVE WS-FLG-SIGNED-NUMBER-EDIT TO WS-EDIT-CASH-CREDIT-LIMIT
1502
1503 MOVE 'Reissue Date' TO WS-EDIT-VARIABLE-NAME
1504 MOVE ACUP-NEW-REISSUE-DATE TO WS-EDIT-DATE-CCYYMMDD
1505 PERFORM EDIT-DATE-CCYYMMDD
1506 THRU EDIT-DATE-CCYYMMDD-EXIT
1507 MOVE WS-EDIT-DATE-FLGS TO WS-EDIT-REISSUE-DATE-FLGS
1508
1509 MOVE 'Current Balance' TO WS-EDIT-VARIABLE-NAME
1510 MOVE ACUP-NEW-CURR-BAL-X TO WS-EDIT-SIGNED-NUMBER-9V2-X
1511 PERFORM 1250-EDIT-SIGNED-9V2
1512 THRU 1250-EDIT-SIGNED-9V2-EXIT
1513 MOVE WS-FLG-SIGNED-NUMBER-EDIT TO WS-EDIT-CURR-BAL
1514
1515 MOVE 'Current Cycle Credit Limit' TO WS-EDIT-VARIABLE-NAME
1516 MOVE ACUP-NEW-CURR-CYC-CREDIT-X
1517 TO WS-EDIT-SIGNED-NUMBER-9V2-X
1518 PERFORM 1250-EDIT-SIGNED-9V2
1519 THRU 1250-EDIT-SIGNED-9V2-EXIT
1520 MOVE WS-FLG-SIGNED-NUMBER-EDIT TO WS-EDIT-CURR-CYC-CREDIT
1521
1522 MOVE 'Current Cycle Debit Limit' TO WS-EDIT-VARIABLE-NAME
1523 MOVE ACUP-NEW-CURR-CYC-DEBIT-X
1524 TO WS-EDIT-SIGNED-NUMBER-9V2-X
1525 PERFORM 1250-EDIT-SIGNED-9V2
1526 THRU 1250-EDIT-SIGNED-9V2-EXIT
1527 MOVE WS-FLG-SIGNED-NUMBER-EDIT TO WS-EDIT-CURR-CYC-DEBIT
1528
1529 MOVE 'SSN' TO WS-EDIT-VARIABLE-NAME
1530 PERFORM 1265-EDIT-US-SSN
1531 THRU 1265-EDIT-US-SSN-EXIT
1532
1533 MOVE 'Date of Birth' TO WS-EDIT-VARIABLE-NAME
1534 MOVE ACUP-NEW-CUST-DOB-YYYY-MM-DD
1535 TO WS-EDIT-DATE-CCYYMMDD
1536 PERFORM EDIT-DATE-CCYYMMDD
1537 THRU EDIT-DATE-CCYYMMDD-EXIT
1538 MOVE WS-EDIT-DATE-FLGS TO WS-EDIT-DT-OF-BIRTH-FLGS
1539 IF WS-EDIT-DT-OF-BIRTH-ISVALID
1540 PERFORM EDIT-DATE-OF-BIRTH
1541 THRU EDIT-DATE-OF-BIRTH-EXIT
1542 MOVE WS-EDIT-DATE-FLGS TO WS-EDIT-DT-OF-BIRTH-FLGS
1543 END-IF
1544
1545 MOVE 'FICO Score' TO WS-EDIT-VARIABLE-NAME
1546 MOVE ACUP-NEW-CUST-FICO-SCORE-X
1547 TO WS-EDIT-ALPHANUM-ONLY
1548 MOVE 3 TO WS-EDIT-ALPHANUM-LENGTH
1549 PERFORM 1245-EDIT-NUM-REQD
1550 THRU 1245-EDIT-NUM-REQD-EXIT
1551 MOVE WS-EDIT-ALPHANUM-ONLY-FLAGS
1552 TO WS-EDIT-FICO-SCORE-FLGS
1553 IF FLG-FICO-SCORE-ISVALID
1554 PERFORM 1275-EDIT-FICO-SCORE
1555 THRU 1275-EDIT-FICO-SCORE-EXIT
1556 END-IF
1557 ******************************************************************
1558 * Edit names
1559 ******************************************************************
1560 MOVE 'First Name' TO WS-EDIT-VARIABLE-NAME
1561 MOVE ACUP-NEW-CUST-FIRST-NAME TO WS-EDIT-ALPHANUM-ONLY
1562 MOVE 25 TO WS-EDIT-ALPHANUM-LENGTH
1563 PERFORM 1225-EDIT-ALPHA-REQD
1564 THRU 1225-EDIT-ALPHA-REQD-EXIT
1565 MOVE WS-EDIT-ALPHA-ONLY-FLAGS
1566 TO WS-EDIT-FIRST-NAME-FLGS
1567
1568 MOVE 'Middle Name' TO WS-EDIT-VARIABLE-NAME
1569 MOVE ACUP-NEW-CUST-MIDDLE-NAME TO WS-EDIT-ALPHANUM-ONLY
1570 MOVE 25 TO WS-EDIT-ALPHANUM-LENGTH
1571 PERFORM 1235-EDIT-ALPHA-OPT
1572 THRU 1235-EDIT-ALPHA-OPT-EXIT
1573 MOVE WS-EDIT-ALPHA-ONLY-FLAGS
1574 TO WS-EDIT-MIDDLE-NAME-FLGS
1575
1576 MOVE 'Last Name' TO WS-EDIT-VARIABLE-NAME
1577 MOVE ACUP-NEW-CUST-LAST-NAME TO WS-EDIT-ALPHANUM-ONLY
1578 MOVE 25 TO WS-EDIT-ALPHANUM-LENGTH
1579 PERFORM 1225-EDIT-ALPHA-REQD
1580 THRU 1225-EDIT-ALPHA-REQD-EXIT
1581 MOVE WS-EDIT-ALPHA-ONLY-FLAGS
1582 TO WS-EDIT-LAST-NAME-FLGS
1583
1584 MOVE 'Address Line 1' TO WS-EDIT-VARIABLE-NAME
1585 MOVE ACUP-NEW-CUST-ADDR-LINE-1 TO WS-EDIT-ALPHANUM-ONLY
1586 MOVE 50 TO WS-EDIT-ALPHANUM-LENGTH
1587 PERFORM 1215-EDIT-MANDATORY
1588 THRU 1215-EDIT-MANDATORY-EXIT
1589 MOVE WS-EDIT-MANDATORY-FLAGS
1590 TO WS-EDIT-ADDRESS-LINE-1-FLGS
1591
1592 MOVE 'State' TO WS-EDIT-VARIABLE-NAME
1593 MOVE ACUP-NEW-CUST-ADDR-STATE-CD TO WS-EDIT-ALPHANUM-ONLY
1594 MOVE 2 TO WS-EDIT-ALPHANUM-LENGTH
1595 PERFORM 1225-EDIT-ALPHA-REQD
1596 THRU 1225-EDIT-ALPHA-REQD-EXIT
1597 MOVE WS-EDIT-ALPHA-ONLY-FLAGS
1598 TO WS-EDIT-STATE-FLGS
1599 IF FLG-ALPHA-ISVALID
1600 PERFORM 1270-EDIT-US-STATE-CD
1601 THRU 1270-EDIT-US-STATE-CD-EXIT
1602 END-IF
1603
1604
1605 MOVE 'Zip' TO WS-EDIT-VARIABLE-NAME
1606 MOVE ACUP-NEW-CUST-ADDR-ZIP TO WS-EDIT-ALPHANUM-ONLY
1607 MOVE 5 TO WS-EDIT-ALPHANUM-LENGTH
1608 PERFORM 1245-EDIT-NUM-REQD
1609 THRU 1245-EDIT-NUM-REQD-EXIT
1610 MOVE WS-EDIT-ALPHANUM-ONLY-FLAGS
1611 TO WS-EDIT-ZIPCODE-FLGS
1612
1613 * Address Line 2 is optional
1614 * MOVE 'Address Line 2' TO WS-EDIT-VARIABLE-NAME
1615 MOVE 'City' TO WS-EDIT-VARIABLE-NAME
1616 MOVE ACUP-NEW-CUST-ADDR-LINE-3 TO WS-EDIT-ALPHANUM-ONLY
1617 MOVE 50 TO WS-EDIT-ALPHANUM-LENGTH
1618 PERFORM 1225-EDIT-ALPHA-REQD
1619 THRU 1225-EDIT-ALPHA-REQD-EXIT
1620 MOVE WS-EDIT-ALPHA-ONLY-FLAGS
1621 TO WS-EDIT-CITY-FLGS
1622
1623 MOVE 'Country' TO WS-EDIT-VARIABLE-NAME
1624 MOVE ACUP-NEW-CUST-ADDR-COUNTRY-CD
1625 TO WS-EDIT-ALPHANUM-ONLY
1626 MOVE 3 TO WS-EDIT-ALPHANUM-LENGTH
1627 PERFORM 1225-EDIT-ALPHA-REQD
1628 THRU 1225-EDIT-ALPHA-REQD-EXIT
1629 MOVE WS-EDIT-ALPHA-ONLY-FLAGS
1630 TO WS-EDIT-COUNTRY-FLGS
1631
1632 MOVE 'Phone Number 1' TO WS-EDIT-VARIABLE-NAME
1633 MOVE ACUP-NEW-CUST-PHONE-NUM-1
1634 TO WS-EDIT-US-PHONE-NUM
1635 PERFORM 1260-EDIT-US-PHONE-NUM
1636 THRU 1260-EDIT-US-PHONE-NUM-EXIT
1637 MOVE WS-EDIT-US-PHONE-NUM-FLGS
1638 TO WS-EDIT-PHONE-NUM-1-FLGS
1639
1640 MOVE 'Phone Number 2' TO WS-EDIT-VARIABLE-NAME
1641 MOVE ACUP-NEW-CUST-PHONE-NUM-2
1642 TO WS-EDIT-US-PHONE-NUM
1643 PERFORM 1260-EDIT-US-PHONE-NUM
1644 THRU 1260-EDIT-US-PHONE-NUM-EXIT
1645 MOVE WS-EDIT-US-PHONE-NUM-FLGS
1646 TO WS-EDIT-PHONE-NUM-2-FLGS
1647
1648 MOVE 'EFT Account Id' TO WS-EDIT-VARIABLE-NAME
1649 MOVE ACUP-NEW-CUST-EFT-ACCOUNT-ID
1650 TO WS-EDIT-ALPHANUM-ONLY
1651 MOVE 10 TO WS-EDIT-ALPHANUM-LENGTH
1652 PERFORM 1245-EDIT-NUM-REQD
1653 THRU 1245-EDIT-NUM-REQD-EXIT
1654 MOVE WS-EDIT-ALPHANUM-ONLY-FLAGS
1655 TO WS-EFT-ACCOUNT-ID-FLGS
1656
1657 MOVE 'Primary Card Holder' TO WS-EDIT-VARIABLE-NAME
1658 MOVE ACUP-NEW-CUST-PRI-HOLDER-IND
1659 TO WS-EDIT-YES-NO
1660 PERFORM 1220-EDIT-YESNO
1661 THRU 1220-EDIT-YESNO-EXIT
1662 MOVE WS-EDIT-YES-NO TO WS-EDIT-PRI-CARDHOLDER
1663
1664 * Cross field edits begin here
1665 IF FLG-STATE-ISVALID
1666 AND FLG-ZIPCODE-ISVALID
1667 PERFORM 1280-EDIT-US-STATE-ZIP-CD
1668 THRU 1280-EDIT-US-STATE-ZIP-CD-EXIT
1669 END-IF
1670
1671 IF INPUT-ERROR
1672 CONTINUE
1673 ELSE
1674 SET ACUP-CHANGES-OK-NOT-CONFIRMED TO TRUE
1675 END-IF
1676 .
1677
1678 1200-EDIT-MAP-INPUTS-EXIT.
1679 EXIT
1680 .
1681 1205-COMPARE-OLD-NEW.
1682 SET NO-CHANGES-FOUND TO TRUE
1683
1684 IF ACUP-NEW-ACCT-ID-X = ACUP-OLD-ACCT-ID-X
1685 AND FUNCTION UPPER-CASE (
1686 ACUP-NEW-ACTIVE-STATUS) =
1687 FUNCTION UPPER-CASE (
1688 ACUP-OLD-ACTIVE-STATUS)
1689 AND ACUP-NEW-CURR-BAL = ACUP-OLD-CURR-BAL
1690 AND ACUP-NEW-CREDIT-LIMIT = ACUP-OLD-CREDIT-LIMIT
1691 AND ACUP-NEW-CASH-CREDIT-LIMIT = ACUP-OLD-CASH-CREDIT-LIMIT
1692 AND ACUP-NEW-OPEN-DATE = ACUP-OLD-OPEN-DATE
1693 AND ACUP-NEW-EXPIRAION-DATE = ACUP-OLD-EXPIRAION-DATE
1694 AND ACUP-NEW-REISSUE-DATE = ACUP-OLD-REISSUE-DATE
1695 AND ACUP-NEW-CURR-CYC-CREDIT = ACUP-OLD-CURR-CYC-CREDIT
1696 AND ACUP-NEW-CURR-CYC-DEBIT = ACUP-OLD-CURR-CYC-DEBIT
1697 AND FUNCTION UPPER-CASE (
1698 FUNCTION TRIM (ACUP-NEW-GROUP-ID))=
1699 FUNCTION UPPER-CASE (
1700 FUNCTION TRIM (ACUP-OLD-GROUP-ID))
1701 CONTINUE
1702 ELSE
1703 SET CHANGE-HAS-OCCURRED TO TRUE
1704 GO TO 1205-COMPARE-OLD-NEW-EXIT
1705 END-IF
1706
1707
1708 IF FUNCTION UPPER-CASE (
1709 FUNCTION TRIM (ACUP-NEW-CUST-ID-X))=
1710 FUNCTION UPPER-CASE (
1711 FUNCTION TRIM (ACUP-OLD-CUST-ID-X))
1712 AND FUNCTION UPPER-CASE (
1713 FUNCTION TRIM (ACUP-NEW-CUST-FIRST-NAME))=
1714 FUNCTION UPPER-CASE (
1715 FUNCTION TRIM (ACUP-OLD-CUST-FIRST-NAME))
1716 AND FUNCTION UPPER-CASE (
1717 FUNCTION TRIM (ACUP-NEW-CUST-MIDDLE-NAME))=
1718 FUNCTION UPPER-CASE (
1719 FUNCTION TRIM (ACUP-OLD-CUST-MIDDLE-NAME))
1720 AND FUNCTION UPPER-CASE (
1721 FUNCTION TRIM (ACUP-NEW-CUST-LAST-NAME))=
1722 FUNCTION UPPER-CASE (
1723 FUNCTION TRIM (ACUP-OLD-CUST-LAST-NAME))
1724 AND FUNCTION UPPER-CASE (
1725 FUNCTION TRIM (ACUP-NEW-CUST-ADDR-LINE-1))=
1726 FUNCTION UPPER-CASE (
1727 FUNCTION TRIM (ACUP-OLD-CUST-ADDR-LINE-1))
1728 AND FUNCTION UPPER-CASE (
1729 FUNCTION TRIM (ACUP-NEW-CUST-ADDR-LINE-2))=
1730 FUNCTION UPPER-CASE (
1731 FUNCTION TRIM (ACUP-OLD-CUST-ADDR-LINE-2))
1732 AND FUNCTION UPPER-CASE (
1733 FUNCTION TRIM (ACUP-NEW-CUST-ADDR-LINE-3))=
1734 FUNCTION UPPER-CASE (
1735 FUNCTION TRIM (ACUP-OLD-CUST-ADDR-LINE-3))
1736 AND FUNCTION UPPER-CASE (
1737 FUNCTION TRIM (ACUP-NEW-CUST-ADDR-STATE-CD))=
1738 FUNCTION UPPER-CASE (
1739 FUNCTION TRIM (ACUP-OLD-CUST-ADDR-STATE-CD))
1740 AND FUNCTION UPPER-CASE (
1741 FUNCTION TRIM (ACUP-NEW-CUST-ADDR-COUNTRY-CD))=
1742 FUNCTION UPPER-CASE (
1743 FUNCTION TRIM (ACUP-OLD-CUST-ADDR-COUNTRY-CD))
1744 AND FUNCTION UPPER-CASE (
1745 FUNCTION TRIM (ACUP-NEW-CUST-ADDR-ZIP))=
1746 FUNCTION UPPER-CASE (
1747 FUNCTION TRIM (ACUP-OLD-CUST-ADDR-ZIP))
1748 AND ACUP-NEW-CUST-PHONE-NUM-1A = ACUP-OLD-CUST-PHONE-NUM-1A
1749 AND ACUP-NEW-CUST-PHONE-NUM-1B = ACUP-OLD-CUST-PHONE-NUM-1B
1750 AND ACUP-NEW-CUST-PHONE-NUM-1C = ACUP-OLD-CUST-PHONE-NUM-1C
1751 AND ACUP-NEW-CUST-PHONE-NUM-2A = ACUP-OLD-CUST-PHONE-NUM-2A
1752 AND ACUP-NEW-CUST-PHONE-NUM-2B = ACUP-OLD-CUST-PHONE-NUM-2B
1753 AND ACUP-NEW-CUST-PHONE-NUM-2C = ACUP-OLD-CUST-PHONE-NUM-2C
1754 AND ACUP-NEW-CUST-SSN-X = ACUP-OLD-CUST-SSN-X
1755 AND FUNCTION UPPER-CASE (
1756 FUNCTION TRIM (ACUP-NEW-CUST-GOVT-ISSUED-ID ))=
1757 FUNCTION UPPER-CASE (
1758 FUNCTION TRIM (ACUP-OLD-CUST-GOVT-ISSUED-ID))
1759 AND ACUP-NEW-CUST-DOB-YYYY-MM-DD
1760 = ACUP-OLD-CUST-DOB-YYYY-MM-DD
1761 AND ACUP-NEW-CUST-EFT-ACCOUNT-ID
1762 = ACUP-OLD-CUST-EFT-ACCOUNT-ID
1763 AND FUNCTION UPPER-CASE (
1764 FUNCTION TRIM (ACUP-NEW-CUST-PRI-HOLDER-IND))=
1765 FUNCTION UPPER-CASE (
1766 FUNCTION TRIM (ACUP-OLD-CUST-PRI-HOLDER-IND))
1767 AND ACUP-NEW-CUST-FICO-SCORE-X
1768 = ACUP-OLD-CUST-FICO-SCORE-X
1769 SET NO-CHANGES-DETECTED TO TRUE
1770 ELSE
1771 SET CHANGE-HAS-OCCURRED TO TRUE
1772 GO TO 1205-COMPARE-OLD-NEW-EXIT
1773 END-IF
1774
1775 .
1776
1777 1205-COMPARE-OLD-NEW-EXIT.
1778 EXIT
1779 .
1780
1781
1782 *
1783 1210-EDIT-ACCOUNT.
1784 SET FLG-ACCTFILTER-NOT-OK TO TRUE
1785
1786 * Not supplied
1787 IF CC-ACCT-ID EQUAL LOW-VALUES
1788 OR CC-ACCT-ID EQUAL SPACES
1789 SET INPUT-ERROR TO TRUE
1790 SET FLG-ACCTFILTER-BLANK TO TRUE
1791 IF WS-RETURN-MSG-OFF
1792 SET WS-PROMPT-FOR-ACCT TO TRUE
1793 END-IF
1794 MOVE ZEROES TO CDEMO-ACCT-ID
1795 ACUP-NEW-ACCT-ID
1796 GO TO 1210-EDIT-ACCOUNT-EXIT
1797 END-IF
1798
1799 * Not numeric
1800 * Not 11 characters
1801 MOVE CC-ACCT-ID TO ACUP-NEW-ACCT-ID
1802 IF CC-ACCT-ID IS NOT NUMERIC
1803 OR CC-ACCT-ID-N EQUAL ZEROS
1804 SET INPUT-ERROR TO TRUE
1805 IF WS-RETURN-MSG-OFF
1806 STRING
1807 'Account Number if supplied must be a 11 digit'
1808 ' Non-Zero Number'
1809 DELIMITED BY SIZE
1810 INTO WS-RETURN-MSG
1811 END-IF
1812 MOVE ZEROES TO CDEMO-ACCT-ID
1813 GO TO 1210-EDIT-ACCOUNT-EXIT
1814 ELSE
1815 MOVE CC-ACCT-ID TO CDEMO-ACCT-ID
1816 SET FLG-ACCTFILTER-ISVALID TO TRUE
1817 END-IF
1818 .
1819
1820 1210-EDIT-ACCOUNT-EXIT.
1821 EXIT
1822 .
1823
1824 1215-EDIT-MANDATORY.
1825 * Initialize
1826 SET FLG-MANDATORY-NOT-OK TO TRUE
1827
1828 * Not supplied
1829 IF WS-EDIT-ALPHANUM-ONLY(1:WS-EDIT-ALPHANUM-LENGTH)
1830 EQUAL LOW-VALUES
1831 OR WS-EDIT-ALPHANUM-ONLY(1:WS-EDIT-ALPHANUM-LENGTH)
1832 EQUAL SPACES
1833 OR FUNCTION LENGTH(FUNCTION TRIM(
1834 WS-EDIT-ALPHANUM-ONLY(1:WS-EDIT-ALPHANUM-LENGTH))) = 0
1835
1836 SET INPUT-ERROR TO TRUE
1837 SET FLG-MANDATORY-BLANK TO TRUE
1838 IF WS-RETURN-MSG-OFF
1839 STRING
1840 FUNCTION TRIM(WS-EDIT-VARIABLE-NAME)
1841 ' must be supplied.'
1842 DELIMITED BY SIZE
1843 INTO WS-RETURN-MSG
1844 END-STRING
1845 END-IF
1846
1847 GO TO 1215-EDIT-MANDATORY-EXIT
1848 END-IF
1849
1850 SET FLG-MANDATORY-ISVALID TO TRUE
1851 .
1852 1215-EDIT-MANDATORY-EXIT.
1853 EXIT
1854 .
1855
1856 1220-EDIT-YESNO.
1857 * Must be Y or N
1858 * SET FLG-YES-NO-NOT-OK TO TRUE
1859 *
1860 * Not supplied
1861 IF WS-EDIT-YES-NO EQUAL LOW-VALUES
1862 OR WS-EDIT-YES-NO EQUAL SPACES
1863 OR WS-EDIT-YES-NO EQUAL ZEROS
1864 SET INPUT-ERROR TO TRUE
1865 SET FLG-YES-NO-BLANK TO TRUE
1866 IF WS-RETURN-MSG-OFF
1867 STRING
1868 FUNCTION TRIM(WS-EDIT-VARIABLE-NAME)
1869 ' must be supplied.'
1870 DELIMITED BY SIZE
1871 INTO WS-RETURN-MSG
1872 END-STRING
1873 END-IF
1874 GO TO 1220-EDIT-YESNO-EXIT
1875 END-IF
1876
1877
1878 IF FLG-YES-NO-ISVALID
1879 CONTINUE
1880 ELSE
1881 SET INPUT-ERROR TO TRUE
1882 SET FLG-YES-NO-NOT-OK TO TRUE
1883 IF WS-RETURN-MSG-OFF
1884 STRING
1885 FUNCTION TRIM(WS-EDIT-VARIABLE-NAME)
1886 ' must be Y or N.'
1887 DELIMITED BY SIZE
1888 INTO WS-RETURN-MSG
1889 END-STRING
1890 END-IF
1891 GO TO 1220-EDIT-YESNO-EXIT
1892 END-IF
1893 .
1894 1220-EDIT-YESNO-EXIT.
1895 EXIT
1896 .
1897
1898 1225-EDIT-ALPHA-REQD.
1899 * Initialize
1900 SET FLG-ALPHA-NOT-OK TO TRUE
1901
1902 * Not supplied
1903 IF WS-EDIT-ALPHANUM-ONLY(1:WS-EDIT-ALPHANUM-LENGTH)
1904 EQUAL LOW-VALUES
1905 OR WS-EDIT-ALPHANUM-ONLY(1:WS-EDIT-ALPHANUM-LENGTH)
1906 EQUAL SPACES
1907 OR FUNCTION LENGTH(FUNCTION TRIM(
1908 WS-EDIT-ALPHANUM-ONLY(1:WS-EDIT-ALPHANUM-LENGTH))) = 0
1909
1910 SET INPUT-ERROR TO TRUE
1911 SET FLG-ALPHA-BLANK TO TRUE
1912 IF WS-RETURN-MSG-OFF
1913 STRING
1914 FUNCTION TRIM(WS-EDIT-VARIABLE-NAME)
1915 ' must be supplied.'
1916 DELIMITED BY SIZE
1917 INTO WS-RETURN-MSG
1918 END-STRING
1919 END-IF
1920
1921 GO TO 1225-EDIT-ALPHA-REQD-EXIT
1922 END-IF
1923
1924 * Only Alphabets and space allowed
1925 MOVE LIT-ALL-ALPHA-FROM-X TO LIT-ALL-ALPHA-FROM
1926 INSPECT WS-EDIT-ALPHANUM-ONLY(1:WS-EDIT-ALPHANUM-LENGTH)
1927 CONVERTING LIT-ALL-ALPHA-FROM
1928 TO LIT-ALPHA-SPACES-TO
1929
1930 IF FUNCTION LENGTH(
1931 FUNCTION TRIM(
1932 WS-EDIT-ALPHANUM-ONLY(1:WS-EDIT-ALPHANUM-LENGTH)
1933 )) = 0
1934 CONTINUE
1935 ELSE
1936 SET INPUT-ERROR TO TRUE
1937 SET FLG-ALPHA-NOT-OK TO TRUE
1938 IF WS-RETURN-MSG-OFF
1939 STRING
1940 FUNCTION TRIM(WS-EDIT-VARIABLE-NAME)
1941 ' can have alphabets only.'
1942 DELIMITED BY SIZE
1943 INTO WS-RETURN-MSG
1944 END-STRING
1945 END-IF
1946 GO TO 1225-EDIT-ALPHA-REQD-EXIT
1947 END-IF
1948
1949 SET FLG-ALPHA-ISVALID TO TRUE
1950 .
1951 1225-EDIT-ALPHA-REQD-EXIT.
1952 EXIT
1953 .
1954
1955 1230-EDIT-ALPHANUM-REQD.
1956 * Initialize
1957 SET FLG-ALPHNANUM-NOT-OK TO TRUE
1958
1959 * Not supplied
1960 IF WS-EDIT-ALPHANUM-ONLY(1:WS-EDIT-ALPHANUM-LENGTH)
1961 EQUAL LOW-VALUES
1962 OR WS-EDIT-ALPHANUM-ONLY(1:WS-EDIT-ALPHANUM-LENGTH)
1963 EQUAL SPACES
1964 OR FUNCTION LENGTH(FUNCTION TRIM(
1965 WS-EDIT-ALPHANUM-ONLY(1:WS-EDIT-ALPHANUM-LENGTH))) = 0
1966
1967 SET INPUT-ERROR TO TRUE
1968 SET FLG-ALPHNANUM-BLANK TO TRUE
1969 IF WS-RETURN-MSG-OFF
1970 STRING
1971 FUNCTION TRIM(WS-EDIT-VARIABLE-NAME)
1972 ' must be supplied.'
1973 DELIMITED BY SIZE
1974 INTO WS-RETURN-MSG
1975 END-STRING
1976 END-IF
1977
1978 GO TO 1230-EDIT-ALPHANUM-REQD-EXIT
1979 END-IF
1980
1981 * Only Alphabets,numbers and space allowed
1982 MOVE LIT-ALL-ALPHANUM-FROM-X TO LIT-ALL-ALPHANUM-FROM
1983
1984 INSPECT WS-EDIT-ALPHANUM-ONLY(1:WS-EDIT-ALPHANUM-LENGTH)
1985 CONVERTING LIT-ALL-ALPHANUM-FROM
1986 TO LIT-ALPHANUM-SPACES-TO
1987
1988 IF FUNCTION LENGTH(
1989 FUNCTION TRIM(
1990 WS-EDIT-ALPHANUM-ONLY(1:WS-EDIT-ALPHANUM-LENGTH)
1991 )) = 0
1992 CONTINUE
1993 ELSE
1994 SET INPUT-ERROR TO TRUE
1995 SET FLG-ALPHNANUM-NOT-OK TO TRUE
1996 IF WS-RETURN-MSG-OFF
1997 STRING
1998 FUNCTION TRIM(WS-EDIT-VARIABLE-NAME)
1999 ' can have numbers or alphabets only.'
2000 DELIMITED BY SIZE
2001 INTO WS-RETURN-MSG
2002 END-STRING
2003 END-IF
2004 GO TO 1230-EDIT-ALPHANUM-REQD-EXIT
2005 END-IF
2006
2007 SET FLG-ALPHNANUM-ISVALID TO TRUE
2008 .
2009 1230-EDIT-ALPHANUM-REQD-EXIT.
2010 EXIT
2011 .
2012 1235-EDIT-ALPHA-OPT.
2013 * Initialize
2014 SET FLG-ALPHA-NOT-OK TO TRUE
2015
2016 * Not supplied
2017 IF WS-EDIT-ALPHANUM-ONLY(1:WS-EDIT-ALPHANUM-LENGTH)
2018 EQUAL LOW-VALUES
2019 OR WS-EDIT-ALPHANUM-ONLY(1:WS-EDIT-ALPHANUM-LENGTH)
2020 EQUAL SPACES
2021 OR FUNCTION LENGTH(FUNCTION TRIM(
2022 WS-EDIT-ALPHANUM-ONLY(1:WS-EDIT-ALPHANUM-LENGTH))) = 0
2023
2024 SET FLG-ALPHA-ISVALID TO TRUE
2025 GO TO 1235-EDIT-ALPHA-OPT-EXIT
2026 ELSE
2027 CONTINUE
2028 END-IF
2029
2030 * Only Alphabets and space allowed
2031 MOVE LIT-ALL-ALPHA-FROM-X TO LIT-ALL-ALPHA-FROM
2032 INSPECT WS-EDIT-ALPHANUM-ONLY(1:WS-EDIT-ALPHANUM-LENGTH)
2033 CONVERTING LIT-ALL-ALPHA-FROM
2034 TO LIT-ALPHA-SPACES-TO
2035
2036 IF FUNCTION LENGTH(
2037 FUNCTION TRIM(
2038 WS-EDIT-ALPHANUM-ONLY(1:WS-EDIT-ALPHANUM-LENGTH)
2039 )) = 0
2040 CONTINUE
2041 ELSE
2042 SET INPUT-ERROR TO TRUE
2043 SET FLG-ALPHA-NOT-OK TO TRUE
2044 IF WS-RETURN-MSG-OFF
2045 STRING
2046 FUNCTION TRIM(WS-EDIT-VARIABLE-NAME)
2047 ' can have alphabets only.'
2048 DELIMITED BY SIZE
2049 INTO WS-RETURN-MSG
2050 END-STRING
2051 END-IF
2052 GO TO 1235-EDIT-ALPHA-OPT-EXIT
2053 END-IF
2054
2055 SET FLG-ALPHA-ISVALID TO TRUE
2056 .
2057 1235-EDIT-ALPHA-OPT-EXIT.
2058 EXIT
2059 .
2060
2061 1240-EDIT-ALPHANUM-OPT.
2062 * Initialize
2063 SET FLG-ALPHNANUM-NOT-OK TO TRUE
2064
2065 * Not supplied, but ok as optional
2066 IF WS-EDIT-ALPHANUM-ONLY(1:WS-EDIT-ALPHANUM-LENGTH)
2067 EQUAL LOW-VALUES
2068 OR WS-EDIT-ALPHANUM-ONLY(1:WS-EDIT-ALPHANUM-LENGTH)
2069 EQUAL SPACES
2070 OR FUNCTION LENGTH(FUNCTION TRIM(
2071 WS-EDIT-ALPHANUM-ONLY(1:WS-EDIT-ALPHANUM-LENGTH))) = 0
2072 SET FLG-ALPHNANUM-ISVALID TO TRUE
2073 GO TO 1240-EDIT-ALPHANUM-OPT-EXIT
2074 ELSE
2075 CONTINUE
2076 END-IF
2077
2078 * Only Alphabets and space allowed
2079 MOVE LIT-ALL-ALPHANUM-FROM-X TO LIT-ALL-ALPHANUM-FROM
2080 INSPECT WS-EDIT-ALPHANUM-ONLY(1:WS-EDIT-ALPHANUM-LENGTH)
2081 CONVERTING LIT-ALL-ALPHANUM-FROM
2082 TO LIT-ALPHANUM-SPACES-TO
2083
2084 IF FUNCTION LENGTH(
2085 FUNCTION TRIM(
2086 WS-EDIT-ALPHANUM-ONLY(1:WS-EDIT-ALPHANUM-LENGTH)
2087 )) = 0
2088 CONTINUE
2089 ELSE
2090 SET INPUT-ERROR TO TRUE
2091 SET FLG-ALPHNANUM-NOT-OK TO TRUE
2092 IF WS-RETURN-MSG-OFF
2093 STRING
2094 FUNCTION TRIM(WS-EDIT-VARIABLE-NAME)
2095 ' can have numbers or alphabets only.'
2096 DELIMITED BY SIZE
2097 INTO WS-RETURN-MSG
2098 END-STRING
2099 END-IF
2100 GO TO 1240-EDIT-ALPHANUM-OPT-EXIT
2101 END-IF
2102
2103 SET FLG-ALPHNANUM-ISVALID TO TRUE
2104 .
2105 1240-EDIT-ALPHANUM-OPT-EXIT.
2106 EXIT
2107 .
2108
2109 1245-EDIT-NUM-REQD.
2110 * Initialize
2111 SET FLG-ALPHNANUM-NOT-OK TO TRUE
2112
2113 * Not supplied
2114 IF WS-EDIT-ALPHANUM-ONLY(1:WS-EDIT-ALPHANUM-LENGTH)
2115 EQUAL LOW-VALUES
2116 OR WS-EDIT-ALPHANUM-ONLY(1:WS-EDIT-ALPHANUM-LENGTH)
2117 EQUAL SPACES
2118 OR FUNCTION LENGTH(FUNCTION TRIM(
2119 WS-EDIT-ALPHANUM-ONLY(1:WS-EDIT-ALPHANUM-LENGTH))) = 0
2120
2121 SET INPUT-ERROR TO TRUE
2122 SET FLG-ALPHNANUM-BLANK TO TRUE
2123 IF WS-RETURN-MSG-OFF
2124 STRING
2125 FUNCTION TRIM(WS-EDIT-VARIABLE-NAME)
2126 ' must be supplied.'
2127 DELIMITED BY SIZE
2128 INTO WS-RETURN-MSG
2129 END-STRING
2130 END-IF
2131
2132 GO TO 1245-EDIT-NUM-REQD-EXIT
2133 END-IF
2134
2135 * Only all numeric allowed
2136
2137 IF WS-EDIT-ALPHANUM-ONLY(1:WS-EDIT-ALPHANUM-LENGTH)
2138 IS NUMERIC
2139 CONTINUE
2140 ELSE
2141 SET INPUT-ERROR TO TRUE
2142 SET FLG-ALPHNANUM-NOT-OK TO TRUE
2143 IF WS-RETURN-MSG-OFF
2144 STRING
2145 FUNCTION TRIM(WS-EDIT-VARIABLE-NAME)
2146 ' must be all numeric.'
2147 DELIMITED BY SIZE
2148 INTO WS-RETURN-MSG
2149 END-STRING
2150 END-IF
2151 GO TO 1245-EDIT-NUM-REQD-EXIT
2152 END-IF
2153
2154 * Must not be zero
2155
2156 IF FUNCTION NUMVAL(WS-EDIT-ALPHANUM-ONLY(1:
2157 WS-EDIT-ALPHANUM-LENGTH)) = 0
2158 SET INPUT-ERROR TO TRUE
2159 SET FLG-ALPHNANUM-NOT-OK TO TRUE
2160 IF WS-RETURN-MSG-OFF
2161 STRING
2162 FUNCTION TRIM(WS-EDIT-VARIABLE-NAME)
2163 ' must not be zero.'
2164 DELIMITED BY SIZE
2165 INTO WS-RETURN-MSG
2166 END-STRING
2167 END-IF
2168 GO TO 1245-EDIT-NUM-REQD-EXIT
2169 ELSE
2170 CONTINUE
2171 END-IF
2172
2173
2174 SET FLG-ALPHNANUM-ISVALID TO TRUE
2175 .
2176 1245-EDIT-NUM-REQD-EXIT.
2177 EXIT
2178 .
2179
2180 1250-EDIT-SIGNED-9V2.
2181 SET FLG-SIGNED-NUMBER-NOT-OK TO TRUE
2182
2183 * Not supplied
2184 IF WS-EDIT-SIGNED-NUMBER-9V2-X EQUAL LOW-VALUES
2185 OR WS-EDIT-SIGNED-NUMBER-9V2-X EQUAL SPACES
2186 SET INPUT-ERROR TO TRUE
2187 SET FLG-SIGNED-NUMBER-BLANK TO TRUE
2188 IF WS-RETURN-MSG-OFF
2189 STRING
2190 FUNCTION TRIM(WS-EDIT-VARIABLE-NAME)
2191 ' must be supplied.'
2192 DELIMITED BY SIZE
2193 INTO WS-RETURN-MSG
2194 END-STRING
2195 END-IF
2196 GO TO 1250-EDIT-SIGNED-9V2-EXIT
2197 ELSE
2198 CONTINUE
2199 END-IF
2200
2201 IF FUNCTION TEST-NUMVAL-C(WS-EDIT-SIGNED-NUMBER-9V2-X) = 0
2202 CONTINUE
2203 ELSE
2204 SET INPUT-ERROR TO TRUE
2205 SET FLG-SIGNED-NUMBER-NOT-OK TO TRUE
2206 IF WS-RETURN-MSG-OFF
2207 STRING
2208 FUNCTION TRIM(WS-EDIT-VARIABLE-NAME)
2209 ' is not valid'
2210 DELIMITED BY SIZE
2211 INTO WS-RETURN-MSG
2212 END-IF
2213 GO TO 1250-EDIT-SIGNED-9V2-EXIT
2214
2215 END-IF
2216
2217 * If we got here all edits were cleared
2218 SET FLG-SIGNED-NUMBER-ISVALID TO TRUE
2219 .
2220
2221 1250-EDIT-SIGNED-9V2-EXIT.
2222 EXIT
2223 .
2224
2225 1260-EDIT-US-PHONE-NUM.
2226
2227 * The database stores date in X(15) format (999)999-9999
2228 * 1234567890123
2229 * So we take the X(15) input into WS-EDIT-US-PHONE-NUM
2230 * and edit it
2231
2232 SET WS-EDIT-US-PHONE-IS-INVALID TO TRUE
2233 * Not mandatory to enter a phone number
2234 IF (WS-EDIT-US-PHONE-NUMA EQUAL SPACES
2235 OR WS-EDIT-US-PHONE-NUMA EQUAL LOW-VALUES)
2236 AND (WS-EDIT-US-PHONE-NUMB EQUAL SPACES
2237 OR WS-EDIT-US-PHONE-NUMB EQUAL LOW-VALUES)
2238 AND (WS-EDIT-US-PHONE-NUMA EQUAL SPACES
2239 OR WS-EDIT-US-PHONE-NUMC EQUAL LOW-VALUES)
2240 SET WS-EDIT-US-PHONE-IS-VALID TO TRUE
2241 GO TO EDIT-US-PHONE-EXIT
2242 ELSE
2243 CONTINUE
2244 END-IF
2245 .
2246 EDIT-AREA-CODE.
2247 IF WS-EDIT-US-PHONE-NUMA EQUAL SPACES
2248 OR WS-EDIT-US-PHONE-NUMA EQUAL LOW-VALUES
2249 SET INPUT-ERROR TO TRUE
2250 SET FLG-EDIT-US-PHONEA-BLANK TO TRUE
2251 IF WS-RETURN-MSG-OFF
2252 STRING
2253 FUNCTION TRIM(WS-EDIT-VARIABLE-NAME)
2254 ': Area code must be supplied.'
2255 DELIMITED BY SIZE
2256 INTO WS-RETURN-MSG
2257 END-STRING
2258 END-IF
2259 GO TO EDIT-US-PHONE-PREFIX
2260 ELSE
2261 CONTINUE
2262 END-IF
2263
2264 IF WS-EDIT-US-PHONE-NUMA IS NUMERIC
2265 CONTINUE
2266 ELSE
2267 SET INPUT-ERROR TO TRUE
2268 SET FLG-EDIT-US-PHONEA-NOT-OK TO TRUE
2269 IF WS-RETURN-MSG-OFF
2270 STRING
2271 FUNCTION TRIM(WS-EDIT-VARIABLE-NAME)
2272 ': Area code must be A 3 digit number.'
2273 DELIMITED BY SIZE
2274 INTO WS-RETURN-MSG
2275 END-STRING
2276 END-IF
2277 GO TO EDIT-US-PHONE-PREFIX
2278 END-IF
2279
2280 IF WS-EDIT-US-PHONE-NUMA-N = 0
2281 SET INPUT-ERROR TO TRUE
2282 SET FLG-EDIT-US-PHONEA-NOT-OK TO TRUE
2283 IF WS-RETURN-MSG-OFF
2284 STRING
2285 FUNCTION TRIM(WS-EDIT-VARIABLE-NAME)
2286 ': Area code cannot be zero'
2287 DELIMITED BY SIZE
2288 INTO WS-RETURN-MSG
2289 END-STRING
2290 END-IF
2291 GO TO EDIT-US-PHONE-PREFIX
2292 ELSE
2293 CONTINUE
2294 END-IF
2295
2296 MOVE FUNCTION TRIM (WS-EDIT-US-PHONE-NUMA)
2297 TO WS-US-PHONE-AREA-CODE-TO-EDIT
2298 IF VALID-GENERAL-PURP-CODE
2299 CONTINUE
2300 ELSE
2301 SET INPUT-ERROR TO TRUE
2302 SET FLG-EDIT-US-PHONEA-NOT-OK TO TRUE
2303 IF WS-RETURN-MSG-OFF
2304 STRING
2305 FUNCTION TRIM(WS-EDIT-VARIABLE-NAME)
2306 ': Not valid North America general purpose area code'
2307 DELIMITED BY SIZE
2308 INTO WS-RETURN-MSG
2309 END-STRING
2310 END-IF
2311 GO TO EDIT-US-PHONE-PREFIX
2312 END-IF
2313
2314 SET FLG-EDIT-US-PHONEA-ISVALID TO TRUE
2315 .
2316 EDIT-US-PHONE-PREFIX.
2317
2318 IF WS-EDIT-US-PHONE-NUMB EQUAL SPACES
2319 OR WS-EDIT-US-PHONE-NUMB EQUAL LOW-VALUES
2320 SET INPUT-ERROR TO TRUE
2321 SET FLG-EDIT-US-PHONEB-BLANK TO TRUE
2322 IF WS-RETURN-MSG-OFF
2323 STRING
2324 FUNCTION TRIM(WS-EDIT-VARIABLE-NAME)
2325 ': Prefix code must be supplied.'
2326 DELIMITED BY SIZE
2327 INTO WS-RETURN-MSG
2328 END-STRING
2329 END-IF
2330 GO TO EDIT-US-PHONE-LINENUM
2331 ELSE
2332 CONTINUE
2333 END-IF
2334
2335 IF WS-EDIT-US-PHONE-NUMB IS NUMERIC
2336 CONTINUE
2337 ELSE
2338 SET INPUT-ERROR TO TRUE
2339 SET FLG-EDIT-US-PHONEB-NOT-OK TO TRUE
2340 IF WS-RETURN-MSG-OFF
2341 STRING
2342 FUNCTION TRIM(WS-EDIT-VARIABLE-NAME)
2343 ': Prefix code must be A 3 digit number.'
2344 DELIMITED BY SIZE
2345 INTO WS-RETURN-MSG
2346 END-STRING
2347 END-IF
2348 GO TO EDIT-US-PHONE-LINENUM
2349 END-IF
2350
2351 IF WS-EDIT-US-PHONE-NUMB-N = 0
2352 SET INPUT-ERROR TO TRUE
2353 SET FLG-EDIT-US-PHONEB-NOT-OK TO TRUE
2354 IF WS-RETURN-MSG-OFF
2355 STRING
2356 FUNCTION TRIM(WS-EDIT-VARIABLE-NAME)
2357 ': Prefix code cannot be zero'
2358 DELIMITED BY SIZE
2359 INTO WS-RETURN-MSG
2360 END-STRING
2361 END-IF
2362 GO TO EDIT-US-PHONE-LINENUM
2363 ELSE
2364 CONTINUE
2365 END-IF
2366
2367 SET FLG-EDIT-US-PHONEB-ISVALID TO TRUE
2368 .
2369
2370 EDIT-US-PHONE-LINENUM.
2371 IF WS-EDIT-US-PHONE-NUMC EQUAL SPACES
2372 OR WS-EDIT-US-PHONE-NUMC EQUAL LOW-VALUES
2373 SET INPUT-ERROR TO TRUE
2374 SET FLG-EDIT-US-PHONEC-BLANK TO TRUE
2375 IF WS-RETURN-MSG-OFF
2376 STRING
2377 FUNCTION TRIM(WS-EDIT-VARIABLE-NAME)
2378 ': Line number code must be supplied.'
2379 DELIMITED BY SIZE
2380 INTO WS-RETURN-MSG
2381 END-STRING
2382 END-IF
2383 GO TO EDIT-US-PHONE-EXIT
2384 ELSE
2385 CONTINUE
2386 END-IF
2387
2388 IF WS-EDIT-US-PHONE-NUMC IS NUMERIC
2389 CONTINUE
2390 ELSE
2391 SET INPUT-ERROR TO TRUE
2392 SET FLG-EDIT-US-PHONEC-NOT-OK TO TRUE
2393 IF WS-RETURN-MSG-OFF
2394 STRING
2395 FUNCTION TRIM(WS-EDIT-VARIABLE-NAME)
2396 ': Line number code must be A 4 digit number.'
2397 DELIMITED BY SIZE
2398 INTO WS-RETURN-MSG
2399 END-STRING
2400 END-IF
2401 GO TO EDIT-US-PHONE-EXIT
2402 END-IF
2403
2404 IF WS-EDIT-US-PHONE-NUMC-N = 0
2405 SET INPUT-ERROR TO TRUE
2406 SET FLG-EDIT-US-PHONEC-NOT-OK TO TRUE
2407 IF WS-RETURN-MSG-OFF
2408 STRING
2409 FUNCTION TRIM(WS-EDIT-VARIABLE-NAME)
2410 ': Line number code cannot be zero'
2411 DELIMITED BY SIZE
2412 INTO WS-RETURN-MSG
2413 END-STRING
2414 END-IF
2415 GO TO EDIT-US-PHONE-EXIT
2416 ELSE
2417 CONTINUE
2418 END-IF
2419
2420
2421 SET FLG-EDIT-US-PHONEC-ISVALID TO TRUE
2422 .
2423
2424 EDIT-US-PHONE-EXIT.
2425 EXIT
2426 .
2427 1260-EDIT-US-PHONE-NUM-EXIT.
2428 EXIT
2429 .
2430
2431 1265-EDIT-US-SSN.
2432 *Format xxx-xx-xxxx
2433 *Part1 :should have 3 digits
2434 *Part2 :should have 2 digits and it should be from 01 to 99
2435 *Part3 should have 4 digits from 0001 to 9999.
2436 ******************************************************************
2437 * Edit SSN Part 1
2438 ******************************************************************
2439 MOVE 'SSN: First 3 chars' TO WS-EDIT-VARIABLE-NAME
2440 MOVE ACUP-NEW-CUST-SSN-1 TO WS-EDIT-ALPHANUM-ONLY
2441 MOVE 3 TO WS-EDIT-ALPHANUM-LENGTH
2442 PERFORM 1245-EDIT-NUM-REQD
2443 THRU 1245-EDIT-NUM-REQD-EXIT
2444 MOVE WS-EDIT-ALPHANUM-ONLY-FLAGS
2445 TO WS-EDIT-US-SSN-PART1-FLGS
2446
2447 *Part1 :should not be 000, 666, or between 900 and 999
2448 IF FLG-EDIT-US-SSN-PART1-ISVALID
2449 MOVE ACUP-NEW-CUST-SSN-1 TO WS-EDIT-US-SSN-PART1
2450 IF INVALID-SSN-PART1
2451 SET INPUT-ERROR TO TRUE
2452 SET FLG-EDIT-US-SSN-PART1-NOT-OK
2453 TO TRUE
2454 IF WS-RETURN-MSG-OFF
2455 STRING
2456 FUNCTION TRIM(WS-EDIT-VARIABLE-NAME)
2457 ': should not be 000, 666, or between 900 and 999'
2458 DELIMITED BY SIZE
2459 INTO WS-RETURN-MSG
2460 END-STRING
2461 ELSE
2462 CONTINUE
2463 END-IF
2464 END-IF
2465
2466 ******************************************************************
2467 * Edit SSN Part 2
2468 ******************************************************************
2469 MOVE 'SSN 4th & 5th chars' TO WS-EDIT-VARIABLE-NAME
2470 MOVE ACUP-NEW-CUST-SSN-2 TO WS-EDIT-ALPHANUM-ONLY
2471 MOVE 2 TO WS-EDIT-ALPHANUM-LENGTH
2472 PERFORM 1245-EDIT-NUM-REQD
2473 THRU 1245-EDIT-NUM-REQD-EXIT
2474 MOVE WS-EDIT-ALPHANUM-ONLY-FLAGS
2475 TO WS-EDIT-US-SSN-PART2-FLGS
2476
2477
2478 ******************************************************************
2479 * Edit SSN Part 3
2480 ******************************************************************
2481 MOVE 'SSN Last 4 chars' TO WS-EDIT-VARIABLE-NAME
2482 MOVE ACUP-NEW-CUST-SSN-3 TO WS-EDIT-ALPHANUM-ONLY
2483 MOVE 4 TO WS-EDIT-ALPHANUM-LENGTH
2484 PERFORM 1245-EDIT-NUM-REQD
2485 THRU 1245-EDIT-NUM-REQD-EXIT
2486 MOVE WS-EDIT-ALPHANUM-ONLY-FLAGS
2487 TO WS-EDIT-US-SSN-PART3-FLGS
2488 .
2489 1265-EDIT-US-SSN-EXIT.
2490 EXIT
2491 .
2492
2493 1270-EDIT-US-STATE-CD.
2494 MOVE ACUP-NEW-CUST-ADDR-STATE-CD TO US-STATE-CODE-TO-EDIT
2495 IF VALID-US-STATE-CODE
2496 CONTINUE
2497 ELSE
2498 SET INPUT-ERROR TO TRUE
2499 SET FLG-STATE-NOT-OK TO TRUE
2500 IF WS-RETURN-MSG-OFF
2501 STRING
2502 FUNCTION TRIM(WS-EDIT-VARIABLE-NAME)
2503 ': is not a valid state code'
2504 DELIMITED BY SIZE
2505 INTO WS-RETURN-MSG
2506 END-STRING
2507 END-IF
2508 GO TO 1270-EDIT-US-STATE-CD-EXIT
2509 END-IF
2510 .
2511 1270-EDIT-US-STATE-CD-EXIT.
2512 EXIT
2513 .
2514 1275-EDIT-FICO-SCORE.
2515 IF FICO-RANGE-IS-VALID
2516 CONTINUE
2517 ELSE
2518 SET INPUT-ERROR TO TRUE
2519 SET FLG-FICO-SCORE-NOT-OK TO TRUE
2520 IF WS-RETURN-MSG-OFF
2521 STRING
2522 FUNCTION TRIM(WS-EDIT-VARIABLE-NAME)
2523 ': should be between 300 and 850'
2524 DELIMITED BY SIZE
2525 INTO WS-RETURN-MSG
2526 END-STRING
2527 END-IF
2528 GO TO 1275-EDIT-FICO-SCORE-EXIT
2529 END-IF
2530 .
2531 1275-EDIT-FICO-SCORE-EXIT.
2532 EXIT
2533 .
2534
2535 *A crude zip code edit based on data from USPS web site
2536 1280-EDIT-US-STATE-ZIP-CD.
2537 STRING ACUP-NEW-CUST-ADDR-STATE-CD
2538 ACUP-NEW-CUST-ADDR-ZIP(1:2)
2539 DELIMITED BY SIZE
2540 INTO US-STATE-AND-FIRST-ZIP2
2541
2542 IF VALID-US-STATE-ZIP-CD2-COMBO
2543 CONTINUE
2544 ELSE
2545 SET INPUT-ERROR TO TRUE
2546 SET FLG-STATE-NOT-OK TO TRUE
2547 SET FLG-ZIPCODE-NOT-OK TO TRUE
2548 IF WS-RETURN-MSG-OFF
2549 STRING
2550 'Invalid zip code for state'
2551 DELIMITED BY SIZE
2552 INTO WS-RETURN-MSG
2553 END-STRING
2554 END-IF
2555 GO TO 1280-EDIT-US-STATE-ZIP-CD-EXIT
2556 END-IF
2557 .
2558 1280-EDIT-US-STATE-ZIP-CD-EXIT.
2559 EXIT
2560 .
2561
2562 2000-DECIDE-ACTION.
2563 EVALUATE TRUE
2564 ******************************************************************
2565 * NO DETAILS SHOWN.
2566 * SO GET THEM AND SETUP DETAIL EDIT SCREEN
2567 ******************************************************************
2568 WHEN ACUP-DETAILS-NOT-FETCHED
2569 ******************************************************************
2570 * CHANGES MADE. BUT USER CANCELS
2571 ******************************************************************
2572 WHEN CCARD-AID-PFK12
2573 IF FLG-ACCTFILTER-ISVALID
2574 SET WS-RETURN-MSG-OFF TO TRUE
2575 PERFORM 9000-READ-ACCT
2576 THRU 9000-READ-ACCT-EXIT
2577 IF FOUND-CUST-IN-MASTER
2578 SET ACUP-SHOW-DETAILS TO TRUE
2579 END-IF
2580 END-IF
2581 ******************************************************************
2582 * DETAILS SHOWN
2583 * CHECK CHANGES AND ASK CONFIRMATION IF GOOD
2584 ******************************************************************
2585 WHEN ACUP-SHOW-DETAILS
2586 IF INPUT-ERROR
2587 OR NO-CHANGES-DETECTED
2588 CONTINUE
2589 ELSE
2590 SET ACUP-CHANGES-OK-NOT-CONFIRMED TO TRUE
2591 END-IF
2592 ******************************************************************
2593 * DETAILS SHOWN
2594 * BUT INPUT EDIT ERRORS FOUND
2595 ******************************************************************
2596 WHEN ACUP-CHANGES-NOT-OK
2597 CONTINUE
2598 ******************************************************************
2599 * DETAILS EDITED , FOUND OK, CONFIRM SAVE REQUESTED
2600 * CONFIRMATION GIVEN.SO SAVE THE CHANGES
2601 ******************************************************************
2602 WHEN ACUP-CHANGES-OK-NOT-CONFIRMED
2603 AND CCARD-AID-PFK05
2604 PERFORM 9600-WRITE-PROCESSING
2605 THRU 9600-WRITE-PROCESSING-EXIT
2606 EVALUATE TRUE
2607 WHEN COULD-NOT-LOCK-ACCT-FOR-UPDATE
2608 SET ACUP-CHANGES-OKAYED-LOCK-ERROR TO TRUE
2609 WHEN LOCKED-BUT-UPDATE-FAILED
2610 SET ACUP-CHANGES-OKAYED-BUT-FAILED TO TRUE
2611 WHEN DATA-WAS-CHANGED-BEFORE-UPDATE
2612 SET ACUP-SHOW-DETAILS TO TRUE
2613 WHEN OTHER
2614 SET ACUP-CHANGES-OKAYED-AND-DONE TO TRUE
2615 END-EVALUATE
2616 ******************************************************************
2617 * DETAILS EDITED , FOUND OK, CONFIRM SAVE REQUESTED
2618 * CONFIRMATION NOT GIVEN. SO SHOW DETAILS AGAIN
2619 ******************************************************************
2620 WHEN ACUP-CHANGES-OK-NOT-CONFIRMED
2621 CONTINUE
2622 ******************************************************************
2623 * SHOW CONFIRMATION. GO BACK TO SQUARE 1
2624 ******************************************************************
2625 WHEN ACUP-CHANGES-OKAYED-AND-DONE
2626 SET ACUP-SHOW-DETAILS TO TRUE
2627 IF CDEMO-FROM-TRANID EQUAL LOW-VALUES
2628 OR CDEMO-FROM-TRANID EQUAL SPACES
2629 MOVE ZEROES TO CDEMO-ACCT-ID
2630 CDEMO-CARD-NUM
2631 MOVE LOW-VALUES TO CDEMO-ACCT-STATUS
2632 END-IF
2633 WHEN OTHER
2634 MOVE LIT-THISPGM TO ABEND-CULPRIT
2635 MOVE '0001' TO ABEND-CODE
2636 MOVE SPACES TO ABEND-REASON
2637 MOVE 'UNEXPECTED DATA SCENARIO'
2638 TO ABEND-MSG
2639 PERFORM ABEND-ROUTINE
2640 THRU ABEND-ROUTINE-EXIT
2641 END-EVALUATE
2642 .
2643 2000-DECIDE-ACTION-EXIT.
2644 EXIT
2645 .
2646
2647
2648
2649 3000-SEND-MAP.
2650 PERFORM 3100-SCREEN-INIT
2651 THRU 3100-SCREEN-INIT-EXIT
2652 PERFORM 3200-SETUP-SCREEN-VARS
2653 THRU 3200-SETUP-SCREEN-VARS-EXIT
2654 PERFORM 3250-SETUP-INFOMSG
2655 THRU 3250-SETUP-INFOMSG-EXIT
2656 PERFORM 3300-SETUP-SCREEN-ATTRS
2657 THRU 3300-SETUP-SCREEN-ATTRS-EXIT
2658 PERFORM 3390-SETUP-INFOMSG-ATTRS
2659 THRU 3390-SETUP-INFOMSG-ATTRS-EXIT
2660 PERFORM 3400-SEND-SCREEN
2661 THRU 3400-SEND-SCREEN-EXIT
2662 .
2663
2664 3000-SEND-MAP-EXIT.
2665 EXIT
2666 .
2667
2668 3100-SCREEN-INIT.
2669 MOVE LOW-VALUES TO CACTUPAO
2670
2671 MOVE FUNCTION CURRENT-DATE TO WS-CURDATE-DATA
2672
2673 MOVE CCDA-TITLE01 TO TITLE01O OF CACTUPAO
2674 MOVE CCDA-TITLE02 TO TITLE02O OF CACTUPAO
2675 MOVE LIT-THISTRANID TO TRNNAMEO OF CACTUPAO
2676 MOVE LIT-THISPGM TO PGMNAMEO OF CACTUPAO
2677
2678 MOVE FUNCTION CURRENT-DATE TO WS-CURDATE-DATA
2679
2680 MOVE WS-CURDATE-MONTH TO WS-CURDATE-MM
2681 MOVE WS-CURDATE-DAY TO WS-CURDATE-DD
2682 MOVE WS-CURDATE-YEAR(3:2) TO WS-CURDATE-YY
2683
2684 MOVE WS-CURDATE-MM-DD-YY TO CURDATEO OF CACTUPAO
2685
2686 MOVE WS-CURTIME-HOURS TO WS-CURTIME-HH
2687 MOVE WS-CURTIME-MINUTE TO WS-CURTIME-MM
2688 MOVE WS-CURTIME-SECOND TO WS-CURTIME-SS
2689
2690 MOVE WS-CURTIME-HH-MM-SS TO CURTIMEO OF CACTUPAO
2691
2692 .
2693
2694 3100-SCREEN-INIT-EXIT.
2695 EXIT
2696 .
2697
2698 3200-SETUP-SCREEN-VARS.
2699 * INITIALIZE SEARCH CRITERIA
2700 IF CDEMO-PGM-ENTER
2701 CONTINUE
2702 ELSE
2703 IF CC-ACCT-ID-N = 0
2704 AND FLG-ACCTFILTER-ISVALID
2705 MOVE LOW-VALUES TO ACCTSIDO OF CACTUPAO
2706 ELSE
2707 MOVE CC-ACCT-ID TO ACCTSIDO OF CACTUPAO
2708 END-IF
2709
2710 EVALUATE TRUE
2711 WHEN ACUP-DETAILS-NOT-FETCHED
2712 WHEN CC-ACCT-ID-N = 0
2713 PERFORM 3201-SHOW-INITIAL-VALUES
2714 THRU 3201-SHOW-INITIAL-VALUES-EXIT
2715 WHEN ACUP-SHOW-DETAILS
2716 PERFORM 3202-SHOW-ORIGINAL-VALUES
2717 THRU 3202-SHOW-ORIGINAL-VALUES-EXIT
2718 WHEN ACUP-CHANGES-MADE
2719 PERFORM 3203-SHOW-UPDATED-VALUES
2720 THRU 3203-SHOW-UPDATED-VALUES-EXIT
2721 WHEN OTHER
2722 PERFORM 3202-SHOW-ORIGINAL-VALUES
2723 THRU 3202-SHOW-ORIGINAL-VALUES-EXIT
2724 END-EVALUATE
2725 END-IF
2726 .
2727 3200-SETUP-SCREEN-VARS-EXIT.
2728 EXIT
2729 .
2730
2731 3201-SHOW-INITIAL-VALUES.
2732 MOVE LOW-VALUES TO ACSTTUSO OF CACTUPAO
2733 ACRDLIMO OF CACTUPAO
2734 *Account Limits
2735 ACURBALO OF CACTUPAO
2736 ACSHLIMO OF CACTUPAO
2737 ACRCYCRO OF CACTUPAO
2738 ACRCYDBO OF CACTUPAO
2739 *Account Dates
2740 OPNYEARO OF CACTUPAO
2741 OPNMONO OF CACTUPAO
2742 OPNDAYO OF CACTUPAO
2743 EXPYEARO OF CACTUPAO
2744 EXPMONO OF CACTUPAO
2745 EXPDAYO OF CACTUPAO
2746 RISYEARO OF CACTUPAO
2747 RISMONO OF CACTUPAO
2748 RISDAYO OF CACTUPAO
2749 AADDGRPO OF CACTUPAO
2750 *Customer data
2751 ACSTNUMO OF CACTUPAO
2752 ACTSSN1O OF CACTUPAO
2753 ACTSSN2O OF CACTUPAO
2754 ACTSSN3O OF CACTUPAO
2755 ACSTFCOO OF CACTUPAO
2756 DOBYEARO OF CACTUPAO
2757 DOBMONO OF CACTUPAO
2758 DOBDAYO OF CACTUPAO
2759 ACSFNAMO OF CACTUPAO
2760 ACSMNAMO OF CACTUPAO
2761 ACSLNAMO OF CACTUPAO
2762 *Customer address and contact info
2763 ACSADL1O OF CACTUPAO
2764 ACSADL2O OF CACTUPAO
2765 ACSCITYO OF CACTUPAO
2766 ACSSTTEO OF CACTUPAO
2767 ACSZIPCO OF CACTUPAO
2768 ACSCTRYO OF CACTUPAO
2769
2770 ACSPH1AO OF CACTUPAO
2771 ACSPH1BO OF CACTUPAO
2772 ACSPH1CO OF CACTUPAO
2773 ACSPH2AO OF CACTUPAO
2774 ACSPH2BO OF CACTUPAO
2775 ACSPH2CO OF CACTUPAO
2776
2777 *Customer other good stuff
2778 ACSGOVTO OF CACTUPAO
2779 ACSEFTCO OF CACTUPAO
2780 ACSPFLGO OF CACTUPAO
2781 .
2782
2783 3201-SHOW-INITIAL-VALUES-EXIT.
2784 EXIT
2785 .
2786
2787 3202-SHOW-ORIGINAL-VALUES.
2788
2789 MOVE LOW-VALUES TO WS-NON-KEY-FLAGS
2790
2791 SET PROMPT-FOR-CHANGES TO TRUE
2792
2793 IF FOUND-ACCT-IN-MASTER
2794 OR FOUND-CUST-IN-MASTER
2795 MOVE ACUP-OLD-ACTIVE-STATUS TO ACSTTUSO OF CACTUPAO
2796
2797 MOVE ACUP-OLD-CURR-BAL-N TO WS-EDIT-CURRENCY-9-2-F
2798 MOVE WS-EDIT-CURRENCY-9-2-F TO ACURBALO OF CACTUPAO
2799
2800 MOVE ACUP-OLD-CREDIT-LIMIT-N TO WS-EDIT-CURRENCY-9-2-F
2801 MOVE WS-EDIT-CURRENCY-9-2-F TO ACRDLIMO OF CACTUPAO
2802
2803 MOVE ACUP-OLD-CASH-CREDIT-LIMIT-N
2804 TO WS-EDIT-CURRENCY-9-2-F
2805 MOVE WS-EDIT-CURRENCY-9-2-F TO ACSHLIMO OF CACTUPAO
2806
2807 MOVE ACUP-OLD-CURR-CYC-CREDIT-N TO WS-EDIT-CURRENCY-9-2-F
2808 MOVE WS-EDIT-CURRENCY-9-2-F TO ACRCYCRO OF CACTUPAO
2809
2810 MOVE ACUP-OLD-CURR-CYC-DEBIT-N TO WS-EDIT-CURRENCY-9-2-F
2811 MOVE WS-EDIT-CURRENCY-9-2-F TO ACRCYDBO OF CACTUPAO
2812
2813 MOVE ACUP-OLD-OPEN-YEAR TO OPNYEARO OF CACTUPAO
2814 MOVE ACUP-OLD-OPEN-MON TO OPNMONO OF CACTUPAO
2815 MOVE ACUP-OLD-OPEN-DAY TO OPNDAYO OF CACTUPAO
2816
2817 MOVE ACUP-OLD-EXP-YEAR TO EXPYEARO OF CACTUPAO
2818 MOVE ACUP-OLD-EXP-MON TO EXPMONO OF CACTUPAO
2819 MOVE ACUP-OLD-EXP-DAY TO EXPDAYO OF CACTUPAO
2820
2821 MOVE ACUP-OLD-REISSUE-YEAR TO RISYEARO OF CACTUPAO
2822 MOVE ACUP-OLD-REISSUE-MON TO RISMONO OF CACTUPAO
2823 MOVE ACUP-OLD-REISSUE-DAY TO RISDAYO OF CACTUPAO
2824 MOVE ACUP-OLD-GROUP-ID TO AADDGRPO OF CACTUPAO
2825 END-IF
2826
2827 IF FOUND-CUST-IN-MASTER
2828 MOVE ACUP-OLD-CUST-ID-X TO ACSTNUMO OF CACTUPAO
2829 MOVE ACUP-OLD-CUST-SSN-X(1:3) TO ACTSSN1O OF CACTUPAO
2830 MOVE ACUP-OLD-CUST-SSN-X(4:2) TO ACTSSN2O OF CACTUPAO
2831 MOVE ACUP-OLD-CUST-SSN-X(6:4) TO ACTSSN3O OF CACTUPAO
2832 MOVE ACUP-OLD-CUST-FICO-SCORE-X TO ACSTFCOO OF CACTUPAO
2833 MOVE ACUP-OLD-CUST-DOB-YEAR TO DOBYEARO OF CACTUPAO
2834 MOVE ACUP-OLD-CUST-DOB-MON TO DOBMONO OF CACTUPAO
2835 MOVE ACUP-OLD-CUST-DOB-DAY TO DOBDAYO OF CACTUPAO
2836 MOVE ACUP-OLD-CUST-FIRST-NAME TO ACSFNAMO OF CACTUPAO
2837 MOVE ACUP-OLD-CUST-MIDDLE-NAME TO ACSMNAMO OF CACTUPAO
2838 MOVE ACUP-OLD-CUST-LAST-NAME TO ACSLNAMO OF CACTUPAO
2839 MOVE ACUP-OLD-CUST-ADDR-LINE-1 TO ACSADL1O OF CACTUPAO
2840 MOVE ACUP-OLD-CUST-ADDR-LINE-2 TO ACSADL2O OF CACTUPAO
2841 MOVE ACUP-OLD-CUST-ADDR-LINE-3 TO ACSCITYO OF CACTUPAO
2842 MOVE ACUP-OLD-CUST-ADDR-STATE-CD TO ACSSTTEO OF CACTUPAO
2843 MOVE ACUP-OLD-CUST-ADDR-ZIP TO ACSZIPCO OF CACTUPAO
2844 MOVE ACUP-OLD-CUST-ADDR-COUNTRY-CD
2845 TO ACSCTRYO OF CACTUPAO
2846 MOVE ACUP-OLD-CUST-PHONE-NUM-1(2:3)
2847 TO ACSPH1AO OF CACTUPAO
2848 MOVE ACUP-OLD-CUST-PHONE-NUM-1(6:3)
2849 TO ACSPH1BO OF CACTUPAO
2850 MOVE ACUP-OLD-CUST-PHONE-NUM-1(10:4)
2851 TO ACSPH1CO OF CACTUPAO
2852 MOVE ACUP-OLD-CUST-PHONE-NUM-2(2:3)
2853 TO ACSPH2AO OF CACTUPAO
2854 MOVE ACUP-OLD-CUST-PHONE-NUM-2(6:3)
2855 TO ACSPH2BO OF CACTUPAO
2856 MOVE ACUP-OLD-CUST-PHONE-NUM-2(10:4)
2857 TO ACSPH2CO OF CACTUPAO
2858 MOVE ACUP-OLD-CUST-GOVT-ISSUED-ID
2859 TO ACSGOVTO OF CACTUPAO
2860 MOVE ACUP-OLD-CUST-EFT-ACCOUNT-ID
2861 TO ACSEFTCO OF CACTUPAO
2862 MOVE ACUP-OLD-CUST-PRI-HOLDER-IND
2863 TO ACSPFLGO OF CACTUPAO
2864 END-IF
2865 .
2866
2867 3202-SHOW-ORIGINAL-VALUES-EXIT.
2868 EXIT
2869 .
2870 3203-SHOW-UPDATED-VALUES.
2871
2872 MOVE ACUP-NEW-ACTIVE-STATUS TO ACSTTUSO OF CACTUPAO
2873
2874 IF FLG-CRED-LIMIT-ISVALID
2875 MOVE ACUP-NEW-CREDIT-LIMIT-N TO WS-EDIT-CURRENCY-9-2-F
2876 MOVE WS-EDIT-CURRENCY-9-2-F TO ACRDLIMO OF CACTUPAO
2877 ELSE
2878 MOVE ACUP-NEW-CREDIT-LIMIT-X TO ACRDLIMO OF CACTUPAO
2879 END-IF
2880
2881 IF FLG-CASH-CREDIT-LIMIT-ISVALID
2882 MOVE ACUP-NEW-CASH-CREDIT-LIMIT-N
2883 TO WS-EDIT-CURRENCY-9-2-F
2884 MOVE WS-EDIT-CURRENCY-9-2-F TO ACSHLIMO OF CACTUPAO
2885 ELSE
2886 MOVE ACUP-NEW-CASH-CREDIT-LIMIT-X
2887 TO ACSHLIMO OF CACTUPAO
2888 END-IF
2889
2890 IF FLG-CURR-BAL-ISVALID
2891 MOVE ACUP-NEW-CURR-BAL-N TO WS-EDIT-CURRENCY-9-2-F
2892 MOVE WS-EDIT-CURRENCY-9-2-F TO ACURBALO OF CACTUPAO
2893 ELSE
2894 MOVE ACUP-NEW-CURR-BAL-X TO ACURBALO OF CACTUPAO
2895 END-IF
2896
2897 IF FLG-CURR-CYC-CREDIT-ISVALID
2898 MOVE ACUP-NEW-CURR-CYC-CREDIT-N TO WS-EDIT-CURRENCY-9-2-F
2899 MOVE WS-EDIT-CURRENCY-9-2-F TO ACRCYCRO OF CACTUPAO
2900 ELSE
2901 MOVE ACUP-NEW-CURR-CYC-CREDIT-X TO ACRCYCRO OF CACTUPAO
2902 END-IF
2903
2904 IF FLG-CURR-CYC-DEBIT-ISVALID
2905 MOVE ACUP-NEW-CURR-CYC-DEBIT-N TO WS-EDIT-CURRENCY-9-2-F
2906 MOVE WS-EDIT-CURRENCY-9-2-F TO ACRCYDBO OF CACTUPAO
2907 ELSE
2908 MOVE ACUP-NEW-CURR-CYC-DEBIT-X TO ACRCYDBO OF CACTUPAO
2909 END-IF
2910
2911 MOVE ACUP-NEW-OPEN-YEAR TO OPNYEARO OF CACTUPAO
2912 MOVE ACUP-NEW-OPEN-MON TO OPNMONO OF CACTUPAO
2913 MOVE ACUP-NEW-OPEN-DAY TO OPNDAYO OF CACTUPAO
2914
2915 MOVE ACUP-NEW-EXP-YEAR TO EXPYEARO OF CACTUPAO
2916 MOVE ACUP-NEW-EXP-MON TO EXPMONO OF CACTUPAO
2917 MOVE ACUP-NEW-EXP-DAY TO EXPDAYO OF CACTUPAO
2918 MOVE ACUP-NEW-REISSUE-YEAR TO RISYEARO OF CACTUPAO
2919 MOVE ACUP-NEW-REISSUE-MON TO RISMONO OF CACTUPAO
2920 MOVE ACUP-NEW-REISSUE-DAY TO RISDAYO OF CACTUPAO
2921 MOVE ACUP-NEW-GROUP-ID TO AADDGRPO OF CACTUPAO
2922 MOVE ACUP-NEW-CUST-ID-X TO ACSTNUMO OF CACTUPAO
2923 MOVE ACUP-NEW-CUST-SSN-1 TO ACTSSN1O OF CACTUPAO
2924 MOVE ACUP-NEW-CUST-SSN-2 TO ACTSSN2O OF CACTUPAO
2925 MOVE ACUP-NEW-CUST-SSN-3 TO ACTSSN3O OF CACTUPAO
2926 MOVE ACUP-NEW-CUST-FICO-SCORE-X TO ACSTFCOO OF CACTUPAO
2927 MOVE ACUP-NEW-CUST-DOB-YEAR TO DOBYEARO OF CACTUPAO
2928 MOVE ACUP-NEW-CUST-DOB-MON TO DOBMONO OF CACTUPAO
2929 MOVE ACUP-NEW-CUST-DOB-DAY TO DOBDAYO OF CACTUPAO
2930 MOVE ACUP-NEW-CUST-FIRST-NAME TO ACSFNAMO OF CACTUPAO
2931 MOVE ACUP-NEW-CUST-MIDDLE-NAME TO ACSMNAMO OF CACTUPAO
2932 MOVE ACUP-NEW-CUST-LAST-NAME TO ACSLNAMO OF CACTUPAO
2933 MOVE ACUP-NEW-CUST-ADDR-LINE-1 TO ACSADL1O OF CACTUPAO
2934 MOVE ACUP-NEW-CUST-ADDR-LINE-2 TO ACSADL2O OF CACTUPAO
2935 MOVE ACUP-NEW-CUST-ADDR-LINE-3 TO ACSCITYO OF CACTUPAO
2936 MOVE ACUP-NEW-CUST-ADDR-STATE-CD TO ACSSTTEO OF CACTUPAO
2937 MOVE ACUP-NEW-CUST-ADDR-ZIP TO ACSZIPCO OF CACTUPAO
2938 MOVE ACUP-NEW-CUST-ADDR-COUNTRY-CD TO ACSCTRYO OF CACTUPAO
2939 MOVE ACUP-NEW-CUST-PHONE-NUM-1A TO ACSPH1AO OF CACTUPAO
2940 MOVE ACUP-NEW-CUST-PHONE-NUM-1B TO ACSPH1BO OF CACTUPAO
2941 MOVE ACUP-NEW-CUST-PHONE-NUM-1C TO ACSPH1CO OF CACTUPAO
2942 MOVE ACUP-NEW-CUST-PHONE-NUM-2A TO ACSPH2AO OF CACTUPAO
2943 MOVE ACUP-NEW-CUST-PHONE-NUM-2B TO ACSPH2BO OF CACTUPAO
2944 MOVE ACUP-NEW-CUST-PHONE-NUM-2C TO ACSPH2CO OF CACTUPAO
2945 MOVE ACUP-NEW-CUST-GOVT-ISSUED-ID TO ACSGOVTO OF CACTUPAO
2946 MOVE ACUP-NEW-CUST-EFT-ACCOUNT-ID TO ACSEFTCO OF CACTUPAO
2947 MOVE ACUP-NEW-CUST-PRI-HOLDER-IND TO ACSPFLGO OF CACTUPAO
2948
2949 .
2950
2951 3203-SHOW-UPDATED-VALUES-EXIT.
2952 EXIT
2953 .
2954
2955 3250-SETUP-INFOMSG.
2956 * SETUP INFORMATION MESSAGE
2957 EVALUATE TRUE
2958 WHEN CDEMO-PGM-ENTER
2959 SET PROMPT-FOR-SEARCH-KEYS TO TRUE
2960 WHEN ACUP-DETAILS-NOT-FETCHED
2961 SET PROMPT-FOR-SEARCH-KEYS TO TRUE
2962 WHEN ACUP-SHOW-DETAILS
2963 SET PROMPT-FOR-CHANGES TO TRUE
2964 WHEN ACUP-CHANGES-NOT-OK
2965 SET PROMPT-FOR-CHANGES TO TRUE
2966 WHEN ACUP-CHANGES-OK-NOT-CONFIRMED
2967 SET PROMPT-FOR-CONFIRMATION TO TRUE
2968 WHEN ACUP-CHANGES-OKAYED-AND-DONE
2969 SET CONFIRM-UPDATE-SUCCESS TO TRUE
2970
2971 WHEN ACUP-CHANGES-OKAYED-LOCK-ERROR
2972 SET INFORM-FAILURE TO TRUE
2973 WHEN ACUP-CHANGES-OKAYED-BUT-FAILED
2974 SET INFORM-FAILURE TO TRUE
2975 WHEN WS-NO-INFO-MESSAGE
2976 SET PROMPT-FOR-SEARCH-KEYS TO TRUE
2977 END-EVALUATE
2978
2979 MOVE WS-INFO-MSG TO INFOMSGO OF CACTUPAO
2980
2981 MOVE WS-RETURN-MSG TO ERRMSGO OF CACTUPAO
2982 .
2983 3250-SETUP-INFOMSG-EXIT.
2984 EXIT
2985 .
2986 3300-SETUP-SCREEN-ATTRS.
2987
2988 * PROTECT ALL FIELDS
2989 PERFORM 3310-PROTECT-ALL-ATTRS
2990 THRU 3310-PROTECT-ALL-ATTRS-EXIT
2991
2992 * UNPROTECT BASED ON CONTEXT
2993 EVALUATE TRUE
2994 WHEN ACUP-DETAILS-NOT-FETCHED
2995 * Make Account Id editable
2996 MOVE DFHBMFSE TO ACCTSIDA OF CACTUPAI
2997 WHEN ACUP-SHOW-DETAILS
2998 WHEN ACUP-CHANGES-NOT-OK
2999 PERFORM 3320-UNPROTECT-FEW-ATTRS
3000 THRU 3320-UNPROTECT-FEW-ATTRS-EXIT
3001 WHEN ACUP-CHANGES-OK-NOT-CONFIRMED
3002 WHEN ACUP-CHANGES-OKAYED-AND-DONE
3003 CONTINUE
3004 WHEN OTHER
3005 MOVE DFHBMFSE TO ACCTSIDA OF CACTUPAI
3006 END-EVALUATE
3007
3008 * POSITION CURSOR - ORDER BASED ON SCREEN LOCATION
3009 EVALUATE TRUE
3010 WHEN FOUND-ACCOUNT-DATA
3011 WHEN NO-CHANGES-DETECTED
3012 MOVE -1 TO ACSTTUSL OF CACTUPAI
3013 WHEN FLG-ACCTFILTER-NOT-OK
3014 WHEN FLG-ACCTFILTER-BLANK
3015 MOVE -1 TO ACCTSIDL OF CACTUPAI
3016 * Account Status
3017 WHEN FLG-ACCT-STATUS-NOT-OK
3018 WHEN FLG-ACCT-STATUS-BLANK
3019 MOVE -1 TO ACSTTUSL OF CACTUPAI
3020 * Open Year
3021 WHEN FLG-OPEN-YEAR-NOT-OK
3022 WHEN FLG-OPEN-YEAR-BLANK
3023 MOVE -1 TO OPNYEARL OF CACTUPAI
3024 * Open Month
3025 WHEN FLG-OPEN-MONTH-NOT-OK
3026 WHEN FLG-OPEN-MONTH-BLANK
3027 MOVE -1 TO OPNMONL OF CACTUPAI
3028 * Open Day
3029 WHEN FLG-OPEN-DAY-NOT-OK
3030 WHEN FLG-OPEN-DAY-BLANK
3031 MOVE -1 TO OPNDAYL OF CACTUPAI
3032 * Credit Limit
3033 WHEN FLG-CRED-LIMIT-NOT-OK
3034 WHEN FLG-CRED-LIMIT-BLANK
3035 MOVE -1 TO ACRDLIML OF CACTUPAI
3036 * Expiry Year
3037 WHEN FLG-EXPIRY-YEAR-NOT-OK
3038 WHEN FLG-EXPIRY-YEAR-BLANK
3039 MOVE -1 TO EXPYEARL OF CACTUPAI
3040 * Expiry Month
3041 WHEN FLG-EXPIRY-MONTH-NOT-OK
3042 WHEN FLG-EXPIRY-MONTH-BLANK
3043 MOVE -1 TO EXPMONL OF CACTUPAI
3044 * Expiry Day
3045 WHEN FLG-EXPIRY-DAY-NOT-OK
3046 WHEN FLG-EXPIRY-DAY-BLANK
3047 MOVE -1 TO EXPDAYL OF CACTUPAI
3048 * Cash credit limit
3049 WHEN FLG-CASH-CREDIT-LIMIT-NOT-OK
3050 WHEN FLG-CASH-CREDIT-LIMIT-BLANK
3051 MOVE -1 TO ACSHLIML OF CACTUPAI
3052 * Reissue Year
3053 WHEN FLG-REISSUE-YEAR-NOT-OK
3054 WHEN FLG-REISSUE-YEAR-BLANK
3055 MOVE -1 TO RISYEARL OF CACTUPAI
3056 * Expiry Month
3057 WHEN FLG-REISSUE-MONTH-NOT-OK
3058 WHEN FLG-REISSUE-MONTH-BLANK
3059 MOVE -1 TO RISMONL OF CACTUPAI
3060 * Expiry Day
3061 WHEN FLG-REISSUE-DAY-NOT-OK
3062 WHEN FLG-REISSUE-DAY-BLANK
3063 MOVE -1 TO RISDAYL OF CACTUPAI
3064
3065 * Current Balance
3066 WHEN FLG-CURR-BAL-NOT-OK
3067 WHEN FLG-CURR-BAL-BLANK
3068 MOVE -1 TO ACURBALL OF CACTUPAI
3069 * Current Cycle Credit
3070 WHEN FLG-CURR-CYC-CREDIT-NOT-OK
3071 WHEN FLG-CURR-CYC-CREDIT-BLANK
3072 MOVE -1 TO ACRCYCRL OF CACTUPAI
3073 * Current Cycle Debit
3074 WHEN FLG-CURR-CYC-DEBIT-NOT-OK
3075 WHEN FLG-CURR-CYC-DEBIT-BLANK
3076 MOVE -1 TO ACRCYDBL OF CACTUPAI
3077 * SSN Part 1
3078 WHEN FLG-EDIT-US-SSN-PART1-NOT-OK
3079 WHEN FLG-EDIT-US-SSN-PART1-BLANK
3080 MOVE -1 TO ACTSSN1L OF CACTUPAI
3081 * SSN Part 2
3082 WHEN FLG-EDIT-US-SSN-PART2-NOT-OK
3083 WHEN FLG-EDIT-US-SSN-PART2-BLANK
3084 MOVE -1 TO ACTSSN2L OF CACTUPAI
3085 * SSN Part 3
3086 WHEN FLG-EDIT-US-SSN-PART3-NOT-OK
3087 WHEN FLG-EDIT-US-SSN-PART3-BLANK
3088 MOVE -1 TO ACTSSN3L OF CACTUPAI
3089 * Date of Birth Year
3090 WHEN FLG-DT-OF-BIRTH-YEAR-NOT-OK
3091 WHEN FLG-DT-OF-BIRTH-YEAR-BLANK
3092 MOVE -1 TO DOBYEARL OF CACTUPAI
3093 * Date of Birth Month
3094 WHEN FLG-DT-OF-BIRTH-MONTH-NOT-OK
3095 WHEN FLG-DT-OF-BIRTH-MONTH-BLANK
3096 MOVE -1 TO DOBMONL OF CACTUPAI
3097 * Date of Birth Day
3098 WHEN FLG-DT-OF-BIRTH-DAY-NOT-OK
3099 WHEN FLG-DT-OF-BIRTH-DAY-BLANK
3100 MOVE -1 TO DOBDAYL OF CACTUPAI
3101 * FICO Score
3102 WHEN FLG-FICO-SCORE-NOT-OK
3103 WHEN FLG-FICO-SCORE-BLANK
3104 MOVE -1 TO ACSTFCOL OF CACTUPAI
3105 * First Name
3106 WHEN FLG-FIRST-NAME-NOT-OK
3107 WHEN FLG-FIRST-NAME-BLANK
3108 MOVE -1 TO ACSFNAML OF CACTUPAI
3109 * Middle Name
3110 WHEN FLG-MIDDLE-NAME-NOT-OK
3111 MOVE -1 TO ACSMNAML OF CACTUPAI
3112 * Last Name
3113 WHEN FLG-LAST-NAME-NOT-OK
3114 WHEN FLG-LAST-NAME-BLANK
3115 MOVE -1 TO ACSLNAML OF CACTUPAI
3116 * Address Line 1
3117 WHEN FLG-ADDRESS-LINE-1-NOT-OK
3118 WHEN FLG-ADDRESS-LINE-1-BLANK
3119 MOVE -1 TO ACSADL1L OF CACTUPAI
3120 * State (appears next to Line 2 on screen before city)
3121 WHEN FLG-STATE-NOT-OK
3122 WHEN FLG-STATE-BLANK
3123 MOVE -1 TO ACSSTTEL OF CACTUPAI
3124 * Address Line 2 has no edits
3125 * Zip code
3126 WHEN FLG-ZIPCODE-NOT-OK
3127 WHEN FLG-ZIPCODE-BLANK
3128 MOVE -1 TO ACSZIPCL OF CACTUPAI
3129 * Address Line 3 (City)
3130 WHEN FLG-CITY-NOT-OK
3131 WHEN FLG-CITY-BLANK
3132 MOVE -1 TO ACSCITYL OF CACTUPAI
3133 * Country edits.
3134 WHEN FLG-COUNTRY-NOT-OK
3135 WHEN FLG-COUNTRY-BLANK
3136 MOVE -1 TO ACSCTRYL OF CACTUPAI
3137 * Phone 1
3138 WHEN FLG-PHONE-NUM-1A-NOT-OK
3139 WHEN FLG-PHONE-NUM-1A-BLANK
3140 MOVE -1 TO ACSPH1AL OF CACTUPAI
3141 WHEN FLG-PHONE-NUM-1B-NOT-OK
3142 WHEN FLG-PHONE-NUM-1B-BLANK
3143 MOVE -1 TO ACSPH1BL OF CACTUPAI
3144 WHEN FLG-PHONE-NUM-1C-NOT-OK
3145 WHEN FLG-PHONE-NUM-1C-BLANK
3146 MOVE -1 TO ACSPH1CL OF CACTUPAI
3147 * Phone 2
3148 WHEN FLG-PHONE-NUM-2A-NOT-OK
3149 WHEN FLG-PHONE-NUM-2A-BLANK
3150 MOVE -1 TO ACSPH2AL OF CACTUPAI
3151 WHEN FLG-PHONE-NUM-2B-NOT-OK
3152 WHEN FLG-PHONE-NUM-2B-BLANK
3153 MOVE -1 TO ACSPH2BL OF CACTUPAI
3154 WHEN FLG-PHONE-NUM-2C-NOT-OK
3155 WHEN FLG-PHONE-NUM-2C-BLANK
3156 MOVE -1 TO ACSPH2CL OF CACTUPAI
3157 * EFT Account Id
3158 WHEN FLG-EFT-ACCOUNT-ID-NOT-OK
3159 WHEN FLG-EFT-ACCOUNT-ID-BLANK
3160 MOVE -1 TO ACSEFTCL OF CACTUPAI
3161 * Primary Card Holder
3162 WHEN FLG-PRI-CARDHOLDER-NOT-OK
3163 WHEN FLG-PRI-CARDHOLDER-BLANK
3164 MOVE -1 TO ACSPFLGL OF CACTUPAI
3165 WHEN OTHER
3166 MOVE -1 TO ACCTSIDL OF CACTUPAI
3167 END-EVALUATE
3168
3169
3170 * SETUP COLOR
3171 IF CDEMO-LAST-MAPSET EQUAL LIT-CCLISTMAPSET
3172 MOVE DFHDFCOL TO ACCTSIDC OF CACTUPAO
3173 END-IF
3174
3175 * Account Filter
3176 IF FLG-ACCTFILTER-NOT-OK
3177 MOVE DFHRED TO ACCTSIDC OF CACTUPAO
3178 END-IF
3179
3180 IF FLG-ACCTFILTER-BLANK
3181 AND CDEMO-PGM-REENTER
3182 MOVE '*' TO ACCTSIDO OF CACTUPAO
3183 MOVE DFHRED TO ACCTSIDC OF CACTUPAO
3184 END-IF
3185
3186 IF ACUP-DETAILS-NOT-FETCHED
3187 OR FLG-ACCTFILTER-BLANK
3188 OR FLG-ACCTFILTER-NOT-OK
3189 GO TO 3300-SETUP-SCREEN-ATTRS-EXIT
3190 ELSE
3191 CONTINUE
3192 END-IF
3193
3194 ******************************************************************
3195 * Using Copy replacing to set attribs for remaining vars
3196 * Write specific code only if rules differ
3197 ******************************************************************
3198 * IF (FLG-ACCT-STATUS-NOT-OK
3199 * OR FLG-ACCT-STATUS-BLANK)
3200 * AND CDEMO-PGM-REENTER
3201 * MOVE DFHRED TO ACSTTUSC OF CACTUPAO
3202 * IF FLG-ACCT-STATUS-BLANK
3203 * MOVE '*' TO ACSTTUSO OF CACTUPAO
3204 * END-IF
3205 * END-IF
3206
3207 * Account Status
3208 COPY CSSETATY REPLACING
3209 ==(TESTVAR1)== BY ==ACCT-STATUS==
3210 ==(SCRNVAR2)== BY ==ACSTTUS==
3211 ==(MAPNAME3)== BY ==CACTUPA== .
3212
3213 * Open Year
3214 COPY CSSETATY REPLACING
3215 ==(TESTVAR1)== BY ==OPEN-YEAR==
3216 ==(SCRNVAR2)== BY ==OPNYEAR==
3217 ==(MAPNAME3)== BY ==CACTUPA== .
3218
3219 * Open Month
3220 COPY CSSETATY REPLACING
3221 ==(TESTVAR1)== BY ==OPEN-MONTH==
3222 ==(SCRNVAR2)== BY ==OPNMON==
3223 ==(MAPNAME3)== BY ==CACTUPA== .
3224
3225 * Open Day
3226 COPY CSSETATY REPLACING
3227 ==(TESTVAR1)== BY ==OPEN-DAY==
3228 ==(SCRNVAR2)== BY ==OPNDAY==
3229 ==(MAPNAME3)== BY ==CACTUPA== .
3230
3231 * Credit Limit
3232 COPY CSSETATY REPLACING
3233 ==(TESTVAR1)== BY ==CRED-LIMIT==
3234 ==(SCRNVAR2)== BY ==ACRDLIM==
3235 ==(MAPNAME3)== BY ==CACTUPA== .
3236
3237 * Expiry Year
3238 COPY CSSETATY REPLACING
3239 ==(TESTVAR1)== BY ==EXPIRY-YEAR==
3240 ==(SCRNVAR2)== BY ==EXPYEAR==
3241 ==(MAPNAME3)== BY ==CACTUPA== .
3242
3243 * Expiry Month
3244 COPY CSSETATY REPLACING
3245 ==(TESTVAR1)== BY ==EXPIRY-MONTH==
3246 ==(SCRNVAR2)== BY ==EXPMON==
3247 ==(MAPNAME3)== BY ==CACTUPA== .
3248
3249 * Expiry Day
3250 COPY CSSETATY REPLACING
3251 ==(TESTVAR1)== BY ==EXPIRY-DAY==
3252 ==(SCRNVAR2)== BY ==EXPDAY==
3253 ==(MAPNAME3)== BY ==CACTUPA== .
3254
3255 * Cash Credit Limit
3256 COPY CSSETATY REPLACING
3257 ==(TESTVAR1)== BY ==CASH-CREDIT-LIMIT==
3258 ==(SCRNVAR2)== BY ==ACSHLIM==
3259 ==(MAPNAME3)== BY ==CACTUPA== .
3260
3261 * Reissue Year
3262 COPY CSSETATY REPLACING
3263 ==(TESTVAR1)== BY ==REISSUE-YEAR==
3264 ==(SCRNVAR2)== BY ==RISYEAR==
3265 ==(MAPNAME3)== BY ==CACTUPA== .
3266
3267 * Reissue Month
3268 COPY CSSETATY REPLACING
3269 ==(TESTVAR1)== BY ==REISSUE-MONTH==
3270 ==(SCRNVAR2)== BY ==RISMON==
3271 ==(MAPNAME3)== BY ==CACTUPA== .
3272
3273 * Reissue Day
3274 COPY CSSETATY REPLACING
3275 ==(TESTVAR1)== BY ==REISSUE-DAY==
3276 ==(SCRNVAR2)== BY ==RISDAY==
3277 ==(MAPNAME3)== BY ==CACTUPA== .
3278
3279 * Current Balance
3280 COPY CSSETATY REPLACING
3281 ==(TESTVAR1)== BY ==CURR-BAL==
3282 ==(SCRNVAR2)== BY ==ACURBAL==
3283 ==(MAPNAME3)== BY ==CACTUPA== .
3284
3285 * Current Cycle Credit
3286 COPY CSSETATY REPLACING
3287 ==(TESTVAR1)== BY ==CURR-CYC-CREDIT==
3288 ==(SCRNVAR2)== BY ==ACRCYCR==
3289 ==(MAPNAME3)== BY ==CACTUPA== .
3290
3291 * Current Cycle Debit
3292 COPY CSSETATY REPLACING
3293 ==(TESTVAR1)== BY ==CURR-CYC-DEBIT==
3294 ==(SCRNVAR2)== BY ==ACRCYDB==
3295 ==(MAPNAME3)== BY ==CACTUPA== .
3296
3297 * SSN Part 1
3298 COPY CSSETATY REPLACING
3299 ==(TESTVAR1)== BY ==EDIT-US-SSN-PART1==
3300 ==(SCRNVAR2)== BY ==ACTSSN1==
3301 ==(MAPNAME3)== BY ==CACTUPA== .
3302
3303 * SSN Part 2
3304 COPY CSSETATY REPLACING
3305 ==(TESTVAR1)== BY ==EDIT-US-SSN-PART2==
3306 ==(SCRNVAR2)== BY ==ACTSSN2==
3307 ==(MAPNAME3)== BY ==CACTUPA== .
3308
3309 * SSN Part 3
3310 COPY CSSETATY REPLACING
3311 ==(TESTVAR1)== BY ==EDIT-US-SSN-PART3==
3312 ==(SCRNVAR2)== BY ==ACTSSN3==
3313 ==(MAPNAME3)== BY ==CACTUPA== .
3314
3315 * Date of Birth Year
3316 COPY CSSETATY REPLACING
3317 ==(TESTVAR1)== BY ==DT-OF-BIRTH-YEAR==
3318 ==(SCRNVAR2)== BY ==DOBYEAR==
3319 ==(MAPNAME3)== BY ==CACTUPA== .
3320
3321 * Date of Birth Month
3322 COPY CSSETATY REPLACING
3323 ==(TESTVAR1)== BY ==DT-OF-BIRTH-MONTH==
3324 ==(SCRNVAR2)== BY ==DOBMON==
3325 ==(MAPNAME3)== BY ==CACTUPA== .
3326
3327 * Date of Birth Day
3328 COPY CSSETATY REPLACING
3329 ==(TESTVAR1)== BY ==DT-OF-BIRTH-DAY==
3330 ==(SCRNVAR2)== BY ==DOBDAY==
3331 ==(MAPNAME3)== BY ==CACTUPA== .
3332
3333 * FICO Score
3334 COPY CSSETATY REPLACING
3335 ==(TESTVAR1)== BY ==FICO-SCORE==
3336 ==(SCRNVAR2)== BY ==ACSTFCO==
3337 ==(MAPNAME3)== BY ==CACTUPA== .
3338
3339 * First Name
3340 COPY CSSETATY REPLACING
3341 ==(TESTVAR1)== BY ==FIRST-NAME==
3342 ==(SCRNVAR2)== BY ==ACSFNAM==
3343 ==(MAPNAME3)== BY ==CACTUPA== .
3344
3345 * Middle Name (no edits coded)
3346 COPY CSSETATY REPLACING
3347 ==(TESTVAR1)== BY ==MIDDLE-NAME==
3348 ==(SCRNVAR2)== BY ==ACSMNAM==
3349 ==(MAPNAME3)== BY ==CACTUPA== .
3350
3351 * Last Name
3352 COPY CSSETATY REPLACING
3353 ==(TESTVAR1)== BY ==LAST-NAME==
3354 ==(SCRNVAR2)== BY ==ACSLNAM==
3355 ==(MAPNAME3)== BY ==CACTUPA== .
3356
3357 * Address Line 1
3358 COPY CSSETATY REPLACING
3359 ==(TESTVAR1)== BY ==ADDRESS-LINE-1==
3360 ==(SCRNVAR2)== BY ==ACSADL1==
3361 ==(MAPNAME3)== BY ==CACTUPA== .
3362
3363 * State
3364 COPY CSSETATY REPLACING
3365 ==(TESTVAR1)== BY ==STATE==
3366 ==(SCRNVAR2)== BY ==ACSSTTE==
3367 ==(MAPNAME3)== BY ==CACTUPA== .
3368
3369 * Address Line 2 (NO EDITS CODED AS YET)
3370 COPY CSSETATY REPLACING
3371 ==(TESTVAR1)== BY ==ADDRESS-LINE-2==
3372 ==(SCRNVAR2)== BY ==ACSADL2==
3373 ==(MAPNAME3)== BY ==CACTUPA== .
3374
3375 * State
3376 COPY CSSETATY REPLACING
3377 ==(TESTVAR1)== BY ==ZIPCODE==
3378 ==(SCRNVAR2)== BY ==ACSZIPC==
3379 ==(MAPNAME3)== BY ==CACTUPA== .
3380
3381 * City
3382 COPY CSSETATY REPLACING
3383 ==(TESTVAR1)== BY ==CITY==
3384 ==(SCRNVAR2)== BY ==ACSCITY==
3385 ==(MAPNAME3)== BY ==CACTUPA== .
3386
3387 * Country
3388 COPY CSSETATY REPLACING
3389 ==(TESTVAR1)== BY ==COUNTRY==
3390 ==(SCRNVAR2)== BY ==ACSCTRY==
3391 ==(MAPNAME3)== BY ==CACTUPA== .
3392
3393 * Phone 1 Area Code
3394 COPY CSSETATY REPLACING
3395 ==(TESTVAR1)== BY ==PHONE-NUM-1A==
3396 ==(SCRNVAR2)== BY ==ACSPH1A==
3397 ==(MAPNAME3)== BY ==CACTUPA== .
3398
3399 * Phone 1 Prefix
3400 COPY CSSETATY REPLACING
3401 ==(TESTVAR1)== BY ==PHONE-NUM-1B==
3402 ==(SCRNVAR2)== BY ==ACSPH1B==
3403 ==(MAPNAME3)== BY ==CACTUPA== .
3404 * Phone 1 Line number
3405 COPY CSSETATY REPLACING
3406 ==(TESTVAR1)== BY ==PHONE-NUM-1C==
3407 ==(SCRNVAR2)== BY ==ACSPH1C==
3408 ==(MAPNAME3)== BY ==CACTUPA== .
3409
3410 * Phone 2 Area Code
3411 COPY CSSETATY REPLACING
3412 ==(TESTVAR1)== BY ==PHONE-NUM-2A==
3413 ==(SCRNVAR2)== BY ==ACSPH2A==
3414 ==(MAPNAME3)== BY ==CACTUPA== .
3415
3416 * Phone 2 Prefix
3417 COPY CSSETATY REPLACING
3418 ==(TESTVAR1)== BY ==PHONE-NUM-2B==
3419 ==(SCRNVAR2)== BY ==ACSPH2B==
3420 ==(MAPNAME3)== BY ==CACTUPA== .
3421 * Phone 2 Line number
3422 COPY CSSETATY REPLACING
3423 ==(TESTVAR1)== BY ==PHONE-NUM-2C==
3424 ==(SCRNVAR2)== BY ==ACSPH2C==
3425 ==(MAPNAME3)== BY ==CACTUPA== .
3426 * EFT Account Id
3427 COPY CSSETATY REPLACING
3428 ==(TESTVAR1)== BY ==PRI-CARDHOLDER==
3429 ==(SCRNVAR2)== BY ==ACSPFLG==
3430 ==(MAPNAME3)== BY ==CACTUPA== .
3431 * Primary Card Holder
3432 COPY CSSETATY REPLACING
3433 ==(TESTVAR1)== BY ==EFT-ACCOUNT-ID==
3434 ==(SCRNVAR2)== BY ==ACSEFTC==
3435 ==(MAPNAME3)== BY ==CACTUPA== .
3436 .
3437 3300-SETUP-SCREEN-ATTRS-EXIT.
3438 EXIT
3439 .
3440
3441 3310-PROTECT-ALL-ATTRS.
3442 MOVE DFHBMPRF TO ACCTSIDA OF CACTUPAI
3443 ACSTTUSA OF CACTUPAI
3444 *Account Limits
3445 ACRDLIMA OF CACTUPAI
3446 ACSHLIMA OF CACTUPAI
3447 ACURBALA OF CACTUPAI
3448 ACRCYCRA OF CACTUPAI
3449 ACRCYDBA OF CACTUPAI
3450 *Account dates
3451 OPNYEARA OF CACTUPAI
3452 OPNMONA OF CACTUPAI
3453 OPNDAYA OF CACTUPAI
3454 EXPYEARA OF CACTUPAI
3455 EXPMONA OF CACTUPAI
3456 EXPDAYA OF CACTUPAI
3457 RISYEARA OF CACTUPAI
3458 RISMONA OF CACTUPAI
3459 RISDAYA OF CACTUPAI
3460
3461 AADDGRPA OF CACTUPAI
3462 *Customer data
3463 ACSTNUMA OF CACTUPAI
3464 ACTSSN1A OF CACTUPAI
3465 ACTSSN2A OF CACTUPAI
3466 ACTSSN3A OF CACTUPAI
3467 ACSTFCOA OF CACTUPAI
3468 *Date of Birth
3469 DOBYEARA OF CACTUPAI
3470 DOBMONA OF CACTUPAI
3471 DOBDAYA OF CACTUPAI
3472
3473 ACSFNAMA OF CACTUPAI
3474 ACSMNAMA OF CACTUPAI
3475 ACSLNAMA OF CACTUPAI
3476 *Address
3477 ACSADL1A OF CACTUPAI
3478 ACSADL2A OF CACTUPAI
3479 ACSCITYA OF CACTUPAI
3480 ACSSTTEA OF CACTUPAI
3481 ACSZIPCA OF CACTUPAI
3482 ACSCTRYA OF CACTUPAI
3483
3484 ACSPH1AA OF CACTUPAI
3485 ACSPH1BA OF CACTUPAI
3486 ACSPH1CA OF CACTUPAI
3487 ACSPH2AA OF CACTUPAI
3488 ACSPH2BA OF CACTUPAI
3489 ACSPH2CA OF CACTUPAI
3490
3491 ACSGOVTA OF CACTUPAI
3492 ACSEFTCA OF CACTUPAI
3493 ACSPFLGA OF CACTUPAI
3494 INFOMSGA OF CACTUPAI
3495 .
3496 3310-PROTECT-ALL-ATTRS-EXIT.
3497 EXIT
3498 .
3499
3500 3320-UNPROTECT-FEW-ATTRS.
3501
3502 MOVE DFHBMFSE TO ACSTTUSA OF CACTUPAI
3503 *Account Limits
3504 ACRDLIMA OF CACTUPAI
3505 ACSHLIMA OF CACTUPAI
3506 ACURBALA OF CACTUPAI
3507 ACRCYCRA OF CACTUPAI
3508 ACRCYDBA OF CACTUPAI
3509 *Account dates
3510 *Open Date
3511 OPNYEARA OF CACTUPAI
3512 OPNMONA OF CACTUPAI
3513 OPNDAYA OF CACTUPAI
3514 *Expiry date
3515 EXPYEARA OF CACTUPAI
3516 EXPMONA OF CACTUPAI
3517 EXPDAYA OF CACTUPAI
3518 *Reissue date
3519 RISYEARA OF CACTUPAI
3520 RISMONA OF CACTUPAI
3521 RISDAYA OF CACTUPAI
3522 *Date of Birth
3523 DOBYEARA OF CACTUPAI
3524 DOBMONA OF CACTUPAI
3525 DOBDAYA OF CACTUPAI
3526
3527
3528
3529 AADDGRPA OF CACTUPAI
3530 *Customer data
3531 MOVE DFHBMPRF TO ACSTNUMA OF CACTUPAI
3532 MOVE DFHBMFSE TO ACTSSN1A OF CACTUPAI
3533 ACTSSN2A OF CACTUPAI
3534 ACTSSN3A OF CACTUPAI
3535 ACSTFCOA OF CACTUPAI
3536
3537 ACSFNAMA OF CACTUPAI
3538 ACSMNAMA OF CACTUPAI
3539 ACSLNAMA OF CACTUPAI
3540 *Address
3541 ACSADL1A OF CACTUPAI
3542 ACSADL2A OF CACTUPAI
3543 ACSCITYA OF CACTUPAI
3544 ACSSTTEA OF CACTUPAI
3545 ACSZIPCA OF CACTUPAI
3546 *Since most of the edits are USA specific protected country
3547 MOVE DFHBMPRF TO ACSCTRYA OF CACTUPAI
3548
3549 MOVE DFHBMFSE TO ACSPH1AA OF CACTUPAI
3550 ACSPH1BA OF CACTUPAI
3551 ACSPH1CA OF CACTUPAI
3552
3553 MOVE DFHBMFSE TO ACSPH2AA OF CACTUPAI
3554 ACSPH2BA OF CACTUPAI
3555 ACSPH2CA OF CACTUPAI
3556
3557 ACSGOVTA OF CACTUPAI
3558 ACSEFTCA OF CACTUPAI
3559 ACSPFLGA OF CACTUPAI
3560 MOVE DFHBMPRF TO INFOMSGA OF CACTUPAI
3561 .
3562 3320-UNPROTECT-FEW-ATTRS-EXIT.
3563 EXIT
3564 .
3565
3566 3390-SETUP-INFOMSG-ATTRS.
3567 IF WS-NO-INFO-MESSAGE
3568 MOVE DFHBMDAR TO INFOMSGA OF CACTUPAI
3569 ELSE
3570 MOVE DFHBMASB TO INFOMSGA OF CACTUPAI
3571 END-IF
3572
3573 IF ACUP-CHANGES-MADE
3574 AND NOT ACUP-CHANGES-OKAYED-AND-DONE
3575 MOVE DFHBMASB TO FKEY12A OF CACTUPAI
3576 END-IF
3577
3578 IF PROMPT-FOR-CONFIRMATION
3579 MOVE DFHBMASB TO FKEY05A OF CACTUPAI
3580 MOVE DFHBMASB TO FKEY12A OF CACTUPAI
3581 END-IF
3582
3583 .
3584 3390-SETUP-INFOMSG-ATTRS-EXIT.
3585 EXIT
3586 .
3587
3588
3589 3400-SEND-SCREEN.
3590
3591 MOVE LIT-THISMAPSET TO CCARD-NEXT-MAPSET
3592 MOVE LIT-THISMAP TO CCARD-NEXT-MAP
3593
3594 EXEC CICS SEND MAP(CCARD-NEXT-MAP)
3595 MAPSET(CCARD-NEXT-MAPSET)
3596 FROM(CACTUPAO)
3597 CURSOR
3598 ERASE
3599 FREEKB
3600 RESP(WS-RESP-CD)
3601 END-EXEC
3602 .
3603 3400-SEND-SCREEN-EXIT.
3604 EXIT
3605 .
3606
3607
3608 9000-READ-ACCT.
3609
3610 INITIALIZE ACUP-OLD-DETAILS
3611
3612 SET WS-NO-INFO-MESSAGE TO TRUE
3613
3614 MOVE CC-ACCT-ID TO ACUP-OLD-ACCT-ID
3615 WS-CARD-RID-ACCT-ID
3616
3617 PERFORM 9200-GETCARDXREF-BYACCT
3618 THRU 9200-GETCARDXREF-BYACCT-EXIT
3619
3620 IF FLG-ACCTFILTER-NOT-OK
3621 GO TO 9000-READ-ACCT-EXIT
3622 END-IF
3623
3624 PERFORM 9300-GETACCTDATA-BYACCT
3625 THRU 9300-GETACCTDATA-BYACCT-EXIT
3626
3627 IF DID-NOT-FIND-ACCT-IN-ACCTDAT
3628 GO TO 9000-READ-ACCT-EXIT
3629 END-IF
3630
3631 MOVE CDEMO-CUST-ID TO WS-CARD-RID-CUST-ID
3632
3633 PERFORM 9400-GETCUSTDATA-BYCUST
3634 THRU 9400-GETCUSTDATA-BYCUST-EXIT
3635
3636 IF DID-NOT-FIND-CUST-IN-CUSTDAT
3637 GO TO 9000-READ-ACCT-EXIT
3638 END-IF
3639
3640
3641
3642 PERFORM 9500-STORE-FETCHED-DATA
3643 THRU 9500-STORE-FETCHED-DATA-EXIT
3644 .
3645
3646
3647 9000-READ-ACCT-EXIT.
3648 EXIT
3649 .
3650 9200-GETCARDXREF-BYACCT.
3651
3652 * Read the Card file. Access via alternate index ACCTID
3653 *
3654 EXEC CICS READ
3655 DATASET (LIT-CARDXREFNAME-ACCT-PATH)
3656 RIDFLD (WS-CARD-RID-ACCT-ID-X)
3657 KEYLENGTH (LENGTH OF WS-CARD-RID-ACCT-ID-X)
3658 INTO (CARD-XREF-RECORD)
3659 LENGTH (LENGTH OF CARD-XREF-RECORD)
3660 RESP (WS-RESP-CD)
3661 RESP2 (WS-REAS-CD)
3662 END-EXEC
3663
3664 EVALUATE WS-RESP-CD
3665 WHEN DFHRESP(NORMAL)
3666 MOVE XREF-CUST-ID TO CDEMO-CUST-ID
3667 MOVE XREF-CARD-NUM TO CDEMO-CARD-NUM
3668 WHEN DFHRESP(NOTFND)
3669 SET INPUT-ERROR TO TRUE
3670 SET FLG-ACCTFILTER-NOT-OK TO TRUE
3671 IF WS-RETURN-MSG-OFF
3672 MOVE WS-RESP-CD TO ERROR-RESP
3673 MOVE WS-REAS-CD TO ERROR-RESP2
3674 STRING
3675 'Account:'
3676 WS-CARD-RID-ACCT-ID-X
3677 ' not found in'
3678 ' Cross ref file. Resp:'
3679 ERROR-RESP
3680 ' Reas:'
3681 ERROR-RESP2
3682 DELIMITED BY SIZE
3683 INTO WS-RETURN-MSG
3684 END-STRING
3685 END-IF
3686 WHEN OTHER
3687 SET INPUT-ERROR TO TRUE
3688 SET FLG-ACCTFILTER-NOT-OK TO TRUE
3689 MOVE 'READ' TO ERROR-OPNAME
3690 MOVE LIT-CARDXREFNAME-ACCT-PATH TO ERROR-FILE
3691 MOVE WS-RESP-CD TO ERROR-RESP
3692 MOVE WS-REAS-CD TO ERROR-RESP2
3693 MOVE WS-FILE-ERROR-MESSAGE TO WS-RETURN-MSG
3694 * WS-LONG-MSG
3695 * PERFORM SEND-LONG-TEXT
3696 END-EVALUATE
3697 .
3698 9200-GETCARDXREF-BYACCT-EXIT.
3699 EXIT
3700 .
3701 9300-GETACCTDATA-BYACCT.
3702
3703 EXEC CICS READ
3704 DATASET (LIT-ACCTFILENAME)
3705 RIDFLD (WS-CARD-RID-ACCT-ID-X)
3706 KEYLENGTH (LENGTH OF WS-CARD-RID-ACCT-ID-X)
3707 INTO (ACCOUNT-RECORD)
3708 LENGTH (LENGTH OF ACCOUNT-RECORD)
3709 RESP (WS-RESP-CD)
3710 RESP2 (WS-REAS-CD)
3711 END-EXEC
3712
3713 EVALUATE WS-RESP-CD
3714 WHEN DFHRESP(NORMAL)
3715 SET FOUND-ACCT-IN-MASTER TO TRUE
3716 WHEN DFHRESP(NOTFND)
3717 SET INPUT-ERROR TO TRUE
3718 SET FLG-ACCTFILTER-NOT-OK TO TRUE
3719 * SET DID-NOT-FIND-ACCT-IN-ACCTDAT TO TRUE
3720 IF WS-RETURN-MSG-OFF
3721 MOVE WS-RESP-CD TO ERROR-RESP
3722 MOVE WS-REAS-CD TO ERROR-RESP2
3723 STRING
3724 'Account:'
3725 WS-CARD-RID-ACCT-ID-X
3726 ' not found in'
3727 ' Acct Master file.Resp:'
3728 ERROR-RESP
3729 ' Reas:'
3730 ERROR-RESP2
3731 DELIMITED BY SIZE
3732 INTO WS-RETURN-MSG
3733 END-STRING
3734 END-IF
3735 *
3736 WHEN OTHER
3737 SET INPUT-ERROR TO TRUE
3738 SET FLG-ACCTFILTER-NOT-OK TO TRUE
3739 MOVE 'READ' TO ERROR-OPNAME
3740 MOVE LIT-ACCTFILENAME TO ERROR-FILE
3741 MOVE WS-RESP-CD TO ERROR-RESP
3742 MOVE WS-REAS-CD TO ERROR-RESP2
3743 MOVE WS-FILE-ERROR-MESSAGE TO WS-RETURN-MSG
3744 * WS-LONG-MSG
3745 * PERFORM SEND-LONG-TEXT
3746 END-EVALUATE
3747 .
3748 9300-GETACCTDATA-BYACCT-EXIT.
3749 EXIT
3750 .
3751
3752 9400-GETCUSTDATA-BYCUST.
3753 EXEC CICS READ
3754 DATASET (LIT-CUSTFILENAME)
3755 RIDFLD (WS-CARD-RID-CUST-ID-X)
3756 KEYLENGTH (LENGTH OF WS-CARD-RID-CUST-ID-X)
3757 INTO (CUSTOMER-RECORD)
3758 LENGTH (LENGTH OF CUSTOMER-RECORD)
3759 RESP (WS-RESP-CD)
3760 RESP2 (WS-REAS-CD)
3761 END-EXEC
3762
3763 EVALUATE WS-RESP-CD
3764 WHEN DFHRESP(NORMAL)
3765 SET FOUND-CUST-IN-MASTER TO TRUE
3766 WHEN DFHRESP(NOTFND)
3767 SET INPUT-ERROR TO TRUE
3768 SET FLG-CUSTFILTER-NOT-OK TO TRUE
3769 * SET DID-NOT-FIND-CUST-IN-CUSTDAT TO TRUE
3770 MOVE WS-RESP-CD TO ERROR-RESP
3771 MOVE WS-REAS-CD TO ERROR-RESP2
3772 IF WS-RETURN-MSG-OFF
3773 STRING
3774 'CustId:'
3775 WS-CARD-RID-CUST-ID-X
3776 ' not found'
3777 ' in customer master.Resp: '
3778 ERROR-RESP
3779 ' REAS:'
3780 ERROR-RESP2
3781 DELIMITED BY SIZE
3782 INTO WS-RETURN-MSG
3783 END-STRING
3784 END-IF
3785 WHEN OTHER
3786 SET INPUT-ERROR TO TRUE
3787 SET FLG-CUSTFILTER-NOT-OK TO TRUE
3788 MOVE 'READ' TO ERROR-OPNAME
3789 MOVE LIT-CUSTFILENAME TO ERROR-FILE
3790 MOVE WS-RESP-CD TO ERROR-RESP
3791 MOVE WS-REAS-CD TO ERROR-RESP2
3792 MOVE WS-FILE-ERROR-MESSAGE TO WS-RETURN-MSG
3793 * WS-LONG-MSG
3794 * PERFORM SEND-LONG-TEXT
3795 END-EVALUATE
3796 .
3797 9400-GETCUSTDATA-BYCUST-EXIT.
3798 EXIT
3799 .
3800
3801 9500-STORE-FETCHED-DATA.
3802
3803 * Store Context in Commarea
3804 *
3805 MOVE ACCT-ID TO CDEMO-ACCT-ID
3806 MOVE CUST-ID TO CDEMO-CUST-ID
3807 MOVE CUST-FIRST-NAME TO CDEMO-CUST-FNAME
3808 MOVE CUST-MIDDLE-NAME TO CDEMO-CUST-MNAME
3809 MOVE CUST-LAST-NAME TO CDEMO-CUST-LNAME
3810 MOVE ACCT-ACTIVE-STATUS TO CDEMO-ACCT-STATUS
3811 MOVE XREF-CARD-NUM TO CDEMO-CARD-NUM
3812
3813 INITIALIZE ACUP-OLD-DETAILS
3814 ******************************************************************
3815 * Account Master data
3816 ******************************************************************
3817 MOVE ACCT-ID TO ACUP-OLD-ACCT-ID
3818 * Active Status
3819 MOVE ACCT-ACTIVE-STATUS TO ACUP-OLD-ACTIVE-STATUS
3820 * Current Balance
3821 MOVE ACCT-CURR-BAL TO ACUP-OLD-CURR-BAL-N
3822 * Credit Limit
3823 MOVE ACCT-CREDIT-LIMIT TO ACUP-OLD-CREDIT-LIMIT-N
3824 * Cash Limit
3825 MOVE ACCT-CASH-CREDIT-LIMIT TO ACUP-OLD-CASH-CREDIT-LIMIT-N
3826 * Current Cycle Credit
3827 MOVE ACCT-CURR-CYC-CREDIT TO ACUP-OLD-CURR-CYC-CREDIT-N
3828 * Current Cycle Debit
3829 MOVE ACCT-CURR-CYC-DEBIT TO ACUP-OLD-CURR-CYC-DEBIT-N
3830 * Open date
3831 * MOVE ACCT-OPEN-DATE TO ACUP-OLD-OPEN-DATE
3832 MOVE ACCT-OPEN-DATE(1:4) TO ACUP-OLD-OPEN-YEAR
3833 MOVE ACCT-OPEN-DATE(6:2) TO ACUP-OLD-OPEN-MON
3834 MOVE ACCT-OPEN-DATE(9:2) TO ACUP-OLD-OPEN-DAY
3835 * Expiry date
3836 * MOVE ACCT-EXPIRAION-DATE TO ACUP-OLD-EXPIRAION-DATE
3837 MOVE ACCT-EXPIRAION-DATE(1:4) TO ACUP-OLD-EXP-YEAR
3838 MOVE ACCT-EXPIRAION-DATE(6:2) TO ACUP-OLD-EXP-MON
3839 MOVE ACCT-EXPIRAION-DATE(9:2) TO ACUP-OLD-EXP-DAY
3840
3841 * Reissue date
3842 * MOVE ACCT-REISSUE-DATE TO ACUP-OLD-REISSUE-DATE
3843 MOVE ACCT-REISSUE-DATE(1:4) TO ACUP-OLD-REISSUE-YEAR
3844 MOVE ACCT-REISSUE-DATE(6:2) TO ACUP-OLD-REISSUE-MON
3845 MOVE ACCT-REISSUE-DATE(9:2) TO ACUP-OLD-REISSUE-DAY
3846 * Account Group
3847 MOVE ACCT-GROUP-ID TO ACUP-OLD-GROUP-ID
3848 ******************************************************************
3849 * Customer Master data
3850 ******************************************************************
3851 *Customer Id (actually not editable)
3852 MOVE CUST-ID TO ACUP-OLD-CUST-ID
3853 *Social Security Number
3854 MOVE CUST-SSN TO ACUP-OLD-CUST-SSN
3855 *Date of birth
3856 * MOVE CUST-DOB-YYYY-MM-DD TO ACUP-OLD-CUST-DOB-YYYY-MM-DD
3857 MOVE CUST-DOB-YYYY-MM-DD(1:4) TO ACUP-OLD-CUST-DOB-YEAR
3858 MOVE CUST-DOB-YYYY-MM-DD(6:2) TO ACUP-OLD-CUST-DOB-MON
3859 MOVE CUST-DOB-YYYY-MM-DD(9:2) TO ACUP-OLD-CUST-DOB-DAY
3860 *FICO
3861 MOVE CUST-FICO-CREDIT-SCORE TO ACUP-OLD-CUST-FICO-SCORE
3862 *First Name
3863 MOVE CUST-FIRST-NAME TO ACUP-OLD-CUST-FIRST-NAME
3864 *Middle Name
3865 MOVE CUST-MIDDLE-NAME TO ACUP-OLD-CUST-MIDDLE-NAME
3866 *Last Name
3867 MOVE CUST-LAST-NAME TO ACUP-OLD-CUST-LAST-NAME
3868 *Address
3869 MOVE CUST-ADDR-LINE-1 TO ACUP-OLD-CUST-ADDR-LINE-1
3870 MOVE CUST-ADDR-LINE-2 TO ACUP-OLD-CUST-ADDR-LINE-2
3871 MOVE CUST-ADDR-LINE-3 TO ACUP-OLD-CUST-ADDR-LINE-3
3872 MOVE CUST-ADDR-STATE-CD TO ACUP-OLD-CUST-ADDR-STATE-CD
3873 MOVE CUST-ADDR-COUNTRY-CD TO
3874 ACUP-OLD-CUST-ADDR-COUNTRY-CD
3875 MOVE CUST-ADDR-ZIP TO ACUP-OLD-CUST-ADDR-ZIP
3876 MOVE CUST-PHONE-NUM-1 TO ACUP-OLD-CUST-PHONE-NUM-1
3877 MOVE CUST-PHONE-NUM-2 TO ACUP-OLD-CUST-PHONE-NUM-2
3878 *Government Id
3879 MOVE CUST-GOVT-ISSUED-ID TO ACUP-OLD-CUST-GOVT-ISSUED-ID
3880 *EFT Code
3881 MOVE CUST-EFT-ACCOUNT-ID TO ACUP-OLD-CUST-EFT-ACCOUNT-ID
3882 *Primary Holder Indicator
3883 MOVE CUST-PRI-CARD-HOLDER-IND TO ACUP-OLD-CUST-PRI-HOLDER-IND
3884 .
3885 9500-STORE-FETCHED-DATA-EXIT.
3886 EXIT
3887 .
3888 9600-WRITE-PROCESSING.
3889
3890 * Read the account file for update
3891
3892 MOVE CC-ACCT-ID TO WS-CARD-RID-ACCT-ID
3893
3894 EXEC CICS READ
3895 FILE (LIT-ACCTFILENAME)
3896 UPDATE
3897 RIDFLD (WS-CARD-RID-ACCT-ID-X)
3898 KEYLENGTH (LENGTH OF WS-CARD-RID-ACCT-ID-X)
3899 INTO (ACCOUNT-RECORD)
3900 LENGTH (LENGTH OF ACCOUNT-RECORD)
3901 RESP (WS-RESP-CD)
3902 RESP2 (WS-REAS-CD)
3903 END-EXEC
3904 *****************************************************************
3905 * Could we lock the account record ?
3906 *****************************************************************
3907 IF WS-RESP-CD EQUAL TO DFHRESP(NORMAL)
3908 CONTINUE
3909 ELSE
3910 SET INPUT-ERROR TO TRUE
3911 IF WS-RETURN-MSG-OFF
3912 SET COULD-NOT-LOCK-ACCT-FOR-UPDATE TO TRUE
3913 END-IF
3914 GO TO 9600-WRITE-PROCESSING-EXIT
3915 END-IF
3916
3917 * Read the customer file for update
3918
3919 MOVE CDEMO-CUST-ID TO WS-CARD-RID-CUST-ID
3920
3921 EXEC CICS READ
3922 FILE (LIT-CUSTFILENAME)
3923 UPDATE
3924 RIDFLD (WS-CARD-RID-CUST-ID-X)
3925 KEYLENGTH (LENGTH OF WS-CARD-RID-CUST-ID-X)
3926 INTO (CUSTOMER-RECORD)
3927 LENGTH (LENGTH OF CUSTOMER-RECORD)
3928 RESP (WS-RESP-CD)
3929 RESP2 (WS-REAS-CD)
3930 END-EXEC
3931 *****************************************************************
3932 * Could we lock the customer record ?
3933 *****************************************************************
3934 IF WS-RESP-CD EQUAL TO DFHRESP(NORMAL)
3935 CONTINUE
3936 ELSE
3937 SET INPUT-ERROR TO TRUE
3938 IF WS-RETURN-MSG-OFF
3939 SET COULD-NOT-LOCK-CUST-FOR-UPDATE TO TRUE
3940 END-IF
3941 GO TO 9600-WRITE-PROCESSING-EXIT
3942 END-IF
3943
3944 *****************************************************************
3945 * Did someone change the record while we were out ?
3946 *****************************************************************
3947 PERFORM 9700-CHECK-CHANGE-IN-REC
3948 THRU 9700-CHECK-CHANGE-IN-REC-EXIT
3949
3950 IF DATA-WAS-CHANGED-BEFORE-UPDATE
3951 GO TO 9600-WRITE-PROCESSING-EXIT
3952 END-IF
3953 *****************************************************************
3954 * Prepare the update
3955 *****************************************************************
3956 INITIALIZE ACCT-UPDATE-RECORD
3957 ******************************************************************
3958 * Account Master data
3959 ******************************************************************
3960 MOVE ACUP-NEW-ACCT-ID TO ACCT-UPDATE-ID
3961 * Active Status
3962 MOVE ACUP-NEW-ACTIVE-STATUS TO ACCT-UPDATE-ACTIVE-STATUS
3963 * Current Balance
3964 MOVE ACUP-NEW-CURR-BAL-N TO ACCT-UPDATE-CURR-BAL
3965 * Credit Limit
3966 MOVE ACUP-NEW-CREDIT-LIMIT-N TO ACCT-UPDATE-CREDIT-LIMIT
3967 * Cash Limit
3968 MOVE ACUP-NEW-CASH-CREDIT-LIMIT-N
3969 TO ACCT-UPDATE-CASH-CREDIT-LIMIT
3970 * Current Cycle Credit
3971 MOVE ACUP-NEW-CURR-CYC-CREDIT-N
3972 TO ACCT-UPDATE-CURR-CYC-CREDIT
3973 * Current Cycle Debit
3974 MOVE ACUP-NEW-CURR-CYC-DEBIT-N TO ACCT-UPDATE-CURR-CYC-DEBIT
3975 * Open date
3976 STRING ACUP-NEW-OPEN-YEAR
3977 '-'
3978 ACUP-NEW-OPEN-MON
3979 '-'
3980 ACUP-NEW-OPEN-DAY
3981 DELIMITED BY SIZE
3982 INTO ACCT-UPDATE-OPEN-DATE
3983 * Expiry date
3984 STRING ACUP-NEW-EXP-YEAR
3985 '-'
3986 ACUP-NEW-EXP-MON
3987 '-'
3988 ACUP-NEW-EXP-DAY
3989 DELIMITED BY SIZE
3990 INTO ACCT-UPDATE-EXPIRAION-DATE
3991
3992 * Reissue date
3993 MOVE ACCT-REISSUE-DATE TO ACCT-UPDATE-REISSUE-DATE
3994 STRING ACUP-NEW-REISSUE-YEAR
3995 '-'
3996 ACUP-NEW-REISSUE-MON
3997 '-'
3998 ACUP-NEW-REISSUE-DAY
3999 DELIMITED BY SIZE
4000 INTO ACCT-UPDATE-REISSUE-DATE
4001 * Account Group
4002 MOVE ACUP-NEW-GROUP-ID TO ACCT-UPDATE-GROUP-ID
4003
4004 ******************************************************************
4005 * Customer data
4006 ******************************************************************
4007 INITIALIZE CUST-UPDATE-RECORD
4008
4009 MOVE ACUP-NEW-CUST-ID TO CUST-UPDATE-ID
4010 MOVE ACUP-NEW-CUST-FIRST-NAME
4011 TO CUST-UPDATE-FIRST-NAME
4012 MOVE ACUP-NEW-CUST-MIDDLE-NAME
4013 TO CUST-UPDATE-MIDDLE-NAME
4014 MOVE ACUP-NEW-CUST-LAST-NAME TO CUST-UPDATE-LAST-NAME
4015 MOVE ACUP-NEW-CUST-ADDR-LINE-1
4016 TO CUST-UPDATE-ADDR-LINE-1
4017 MOVE ACUP-NEW-CUST-ADDR-LINE-2
4018 TO CUST-UPDATE-ADDR-LINE-2
4019 MOVE ACUP-NEW-CUST-ADDR-LINE-3
4020 TO CUST-UPDATE-ADDR-LINE-3
4021 MOVE ACUP-NEW-CUST-ADDR-STATE-CD
4022 TO CUST-UPDATE-ADDR-STATE-CD
4023 MOVE ACUP-NEW-CUST-ADDR-COUNTRY-CD
4024 TO CUST-UPDATE-ADDR-COUNTRY-CD
4025 MOVE ACUP-NEW-CUST-ADDR-ZIP TO CUST-UPDATE-ADDR-ZIP
4026
4027 STRING '(',
4028 ACUP-NEW-CUST-PHONE-NUM-1A,
4029 ')',
4030 ACUP-NEW-CUST-PHONE-NUM-1B,
4031 '-',
4032 ACUP-NEW-CUST-PHONE-NUM-1C
4033 DELIMITED BY SIZE INTO CUST-UPDATE-PHONE-NUM-1
4034
4035 STRING '(',
4036 ACUP-NEW-CUST-PHONE-NUM-2A,
4037 ')',
4038 ACUP-NEW-CUST-PHONE-NUM-2B,
4039 '-',
4040 ACUP-NEW-CUST-PHONE-NUM-2C
4041 DELIMITED BY SIZE INTO CUST-UPDATE-PHONE-NUM-2
4042
4043
4044 MOVE ACUP-NEW-CUST-SSN TO CUST-UPDATE-SSN
4045 MOVE ACUP-NEW-CUST-GOVT-ISSUED-ID
4046 TO CUST-UPDATE-GOVT-ISSUED-ID
4047 STRING ACUP-NEW-CUST-DOB-YEAR
4048 '-'
4049 ACUP-NEW-CUST-DOB-MON
4050 '-'
4051 ACUP-NEW-CUST-DOB-DAY
4052 DELIMITED BY SIZE INTO CUST-UPDATE-DOB-YYYY-MM-DD
4053
4054 MOVE ACUP-NEW-CUST-EFT-ACCOUNT-ID
4055 TO CUST-UPDATE-EFT-ACCOUNT-ID
4056 MOVE ACUP-NEW-CUST-PRI-HOLDER-IND
4057 TO CUST-UPDATE-PRI-CARD-IND
4058 MOVE ACUP-NEW-CUST-FICO-SCORE TO
4059 CUST-UPDATE-FICO-CREDIT-SCORE
4060 *****************************************************************
4061 * Update account *
4062 *****************************************************************
4063
4064
4065 EXEC CICS
4066 REWRITE FILE(LIT-ACCTFILENAME)
4067 FROM(ACCT-UPDATE-RECORD)
4068 LENGTH(LENGTH OF ACCT-UPDATE-RECORD)
4069 RESP (WS-RESP-CD)
4070 RESP2 (WS-REAS-CD)
4071 END-EXEC.
4072 *
4073 *****************************************************************
4074 * Did account update succeed ? *
4075 *****************************************************************
4076 IF WS-RESP-CD EQUAL TO DFHRESP(NORMAL)
4077 CONTINUE
4078 ELSE
4079 SET LOCKED-BUT-UPDATE-FAILED TO TRUE
4080 GO TO 9600-WRITE-PROCESSING-EXIT
4081 END-IF
4082 *****************************************************************
4083 * Update customer *
4084 *****************************************************************
4085 EXEC CICS
4086 REWRITE FILE(LIT-CUSTFILENAME)
4087 FROM(CUST-UPDATE-RECORD)
4088 LENGTH(LENGTH OF CUST-UPDATE-RECORD)
4089 RESP (WS-RESP-CD)
4090 RESP2 (WS-REAS-CD)
4091 END-EXEC.
4092 *****************************************************************
4093 * Did customer update succeed ? *
4094 *****************************************************************
4095 IF WS-RESP-CD EQUAL TO DFHRESP(NORMAL)
4096 CONTINUE
4097 ELSE
4098 SET LOCKED-BUT-UPDATE-FAILED TO TRUE
4099 EXEC CICS
4100 SYNCPOINT ROLLBACK
4101 END-EXEC
4102 GO TO 9600-WRITE-PROCESSING-EXIT
4103 END-IF
4104 .
4105 9600-WRITE-PROCESSING-EXIT.
4106 EXIT
4107 .
4108
4109 9700-CHECK-CHANGE-IN-REC.
4110
4111
4112 ******************************************************************
4113 * Account Master data
4114 ******************************************************************
4115 IF ACCT-ACTIVE-STATUS EQUAL ACUP-OLD-ACTIVE-STATUS
4116 * Current Balance
4117 AND ACCT-CURR-BAL EQUAL ACUP-OLD-CURR-BAL-N
4118 * Credit Limit
4119 AND ACCT-CREDIT-LIMIT EQUAL ACUP-OLD-CREDIT-LIMIT-N
4120 * Cash Limit
4121 AND ACCT-CASH-CREDIT-LIMIT EQUAL ACUP-OLD-CASH-CREDIT-LIMIT-N
4122 * Current Cycle Credit
4123 AND ACCT-CURR-CYC-CREDIT EQUAL ACUP-OLD-CURR-CYC-CREDIT-N
4124 * Current Cycle Debit
4125 AND ACCT-CURR-CYC-DEBIT EQUAL ACUP-OLD-CURR-CYC-DEBIT-N
4126 * Open date
4127 AND ACCT-OPEN-DATE(1:4) EQUAL ACUP-OLD-OPEN-YEAR
4128 AND ACCT-OPEN-DATE(6:2) EQUAL ACUP-OLD-OPEN-MON
4129 AND ACCT-OPEN-DATE(9:2) EQUAL ACUP-OLD-OPEN-DAY
4130 * Expiry date
4131 AND ACCT-EXPIRAION-DATE(1:4)EQUAL ACUP-OLD-EXP-YEAR
4132 AND ACCT-EXPIRAION-DATE(6:2)EQUAL ACUP-OLD-EXP-MON
4133 AND ACCT-EXPIRAION-DATE(9:2)EQUAL ACUP-OLD-EXP-DAY
4134 * Reissue date
4135 AND ACCT-REISSUE-DATE(1:4) EQUAL ACUP-OLD-REISSUE-YEAR
4136 AND ACCT-REISSUE-DATE(6:2) EQUAL ACUP-OLD-REISSUE-MON
4137 AND ACCT-REISSUE-DATE(9:2) EQUAL ACUP-OLD-REISSUE-DAY
4138 * Account Group
4139 AND FUNCTION LOWER-CASE (ACCT-GROUP-ID) EQUAL
4140 FUNCTION LOWER-CASE (ACUP-OLD-GROUP-ID)
4141 CONTINUE
4142 ELSE
4143 SET DATA-WAS-CHANGED-BEFORE-UPDATE TO TRUE
4144 GO TO 9600-WRITE-PROCESSING-EXIT
4145 END-IF
4146
4147 ******************************************************************
4148 * Customer data - Split into 2 IFs for easier reading
4149 * And maybe put logic to update only 1 file if only date
4150 * pertaining to one of them is updated
4151 ******************************************************************
4152 IF FUNCTION UPPER-CASE (CUST-FIRST-NAME ) EQUAL
4153 FUNCTION UPPER-CASE (ACUP-OLD-CUST-FIRST-NAME )
4154 AND FUNCTION UPPER-CASE (CUST-MIDDLE-NAME ) EQUAL
4155 FUNCTION UPPER-CASE (ACUP-OLD-CUST-MIDDLE-NAME)
4156 AND FUNCTION UPPER-CASE (CUST-LAST-NAME ) EQUAL
4157 FUNCTION UPPER-CASE (ACUP-OLD-CUST-LAST-NAME )
4158 AND FUNCTION UPPER-CASE (CUST-ADDR-LINE-1 ) EQUAL
4159 FUNCTION UPPER-CASE (ACUP-OLD-CUST-ADDR-LINE-1)
4160 AND FUNCTION UPPER-CASE (CUST-ADDR-LINE-2 ) EQUAL
4161 FUNCTION UPPER-CASE (ACUP-OLD-CUST-ADDR-LINE-2)
4162 AND FUNCTION UPPER-CASE (CUST-ADDR-LINE-3 ) EQUAL
4163 FUNCTION UPPER-CASE (ACUP-OLD-CUST-ADDR-LINE-3)
4164 AND FUNCTION UPPER-CASE (CUST-ADDR-STATE-CD ) EQUAL
4165 FUNCTION UPPER-CASE (ACUP-OLD-CUST-ADDR-STATE-CD)
4166 AND FUNCTION UPPER-CASE (CUST-ADDR-COUNTRY-CD ) EQUAL
4167 FUNCTION UPPER-CASE (ACUP-OLD-CUST-ADDR-COUNTRY-CD )
4168 AND CUST-ADDR-ZIP EQUAL ACUP-OLD-CUST-ADDR-ZIP
4169 AND CUST-PHONE-NUM-1 EQUAL ACUP-OLD-CUST-PHONE-NUM-1
4170 AND CUST-PHONE-NUM-2 EQUAL ACUP-OLD-CUST-PHONE-NUM-2
4171 AND CUST-SSN EQUAL ACUP-OLD-CUST-SSN
4172 AND FUNCTION UPPER-CASE (CUST-GOVT-ISSUED-ID ) EQUAL
4173 FUNCTION UPPER-CASE (ACUP-OLD-CUST-GOVT-ISSUED-ID )
4174 AND CUST-DOB-YYYY-MM-DD (1:4) EQUAL
4175 ACUP-OLD-CUST-DOB-YYYY-MM-DD (1:4)
4176 AND CUST-DOB-YYYY-MM-DD (6:2) EQUAL
4177 ACUP-OLD-CUST-DOB-YYYY-MM-DD (5:2)
4178 AND CUST-DOB-YYYY-MM-DD (9:2) EQUAL
4179 ACUP-OLD-CUST-DOB-YYYY-MM-DD (7:2)
4180
4181 AND CUST-EFT-ACCOUNT-ID EQUAL
4182 ACUP-OLD-CUST-EFT-ACCOUNT-ID
4183 AND CUST-PRI-CARD-HOLDER-IND
4184 EQUAL
4185 ACUP-OLD-CUST-PRI-HOLDER-IND
4186 AND CUST-FICO-CREDIT-SCORE EQUAL ACUP-OLD-CUST-FICO-SCORE
4187 CONTINUE
4188 ELSE
4189 SET DATA-WAS-CHANGED-BEFORE-UPDATE TO TRUE
4190 GO TO 9600-WRITE-PROCESSING-EXIT
4191 END-IF
4192 .
4193 9700-CHECK-CHANGE-IN-REC-EXIT.
4194 EXIT
4195 .
4196 ******************************************************************
4197 *Common code to store PFKey
4198 ******************************************************************
4199 COPY 'CSSTRPFY'
4200 .
4201
4202
4203 ABEND-ROUTINE.
4204
4205 IF ABEND-MSG EQUAL LOW-VALUES
4206 MOVE 'UNEXPECTED ABEND OCCURRED.' TO ABEND-MSG
4207 END-IF
4208
4209 MOVE LIT-THISPGM TO ABEND-CULPRIT
4210
4211 EXEC CICS SEND
4212 FROM (ABEND-DATA)
4213 LENGTH(LENGTH OF ABEND-DATA)
4214 NOHANDLE
4215 ERASE
4216 END-EXEC
4217
4218 EXEC CICS HANDLE ABEND
4219 CANCEL
4220 END-EXEC
4221
4222 EXEC CICS ABEND
4223 ABCODE('9999')
4224 END-EXEC
4225 .
4226 ABEND-ROUTINE-EXIT.
4227 EXIT
4228 .
4229 ******************************************************************
4230 * Common Date Routines
4231 ******************************************************************
4232 COPY CSUTLDPY
4233 .
4234 *
4235 * Ver: CardDemo_v1.0-15-g27d6c6f-68 Date: 2022-07-19 23:12:32 CDT
4236 *