MFmainframe-rea
WS carddemo · 26f629ef

cobol · 1026 lines · sha256 224856ce6ef1b741 · guides at columns 7 and 72app/app-authorization-ims-db2-mq/cbl/COPAUA0C.cbl

1 ******************************************************************
2 * Program : COPAUA0C.CBL
3 * Application : CardDemo - Authorization Module
4 * Type : CICS COBOL IMS MQ Program
5 * Function : Card Authorization Decision Program
6 ******************************************************************
7 * Copyright Amazon.com, Inc. or its affiliates.
8 * All Rights Reserved.
9 *
10 * Licensed under the Apache License, Version 2.0 (the "License").
11 * You may not use this file except in compliance with the License.
12 * You may obtain a copy of the License at
13 *
14 * http://www.apache.org/licenses/LICENSE-2.0
15 *
16 * Unless required by applicable law or agreed to in writing,
17 * software distributed under the License is distributed on an
18 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
19 * either express or implied. See the License for the specific
20 * language governing permissions and limitations under the License
21 ******************************************************************
22 IDENTIFICATION DIVISION.
23 PROGRAM-ID. COPAUA0C.
24 AUTHOR. SOUMA GHOSH.
25
26 ENVIRONMENT DIVISION.
27 CONFIGURATION SECTION.
28
29 DATA DIVISION.
30 WORKING-STORAGE SECTION.
31
32 01 WS-VARIABLES.
33 05 WS-PGM-AUTH PIC X(08) VALUE 'COPAUA0C'.
34 05 WS-CICS-TRANID PIC X(04) VALUE 'CP00'.
35 05 WS-ACCTFILENAME PIC X(8) VALUE 'ACCTDAT '.
36 05 WS-CUSTFILENAME PIC X(8) VALUE 'CUSTDAT '.
37 05 WS-CARDFILENAME PIC X(8) VALUE 'CARDDAT '.
38 05 WS-CARDFILENAME-ACCT-PATH PIC X(8) VALUE 'CARDAIX '.
39 05 WS-CCXREF-FILE PIC X(08) VALUE 'CCXREF '.
40 05 WS-REQSTS-PROCESS-LIMIT PIC S9(4) COMP VALUE 500.
41
42 05 WS-MSG-PROCESSED PIC S9(4) COMP VALUE ZERO.
43 05 WS-REQUEST-QNAME PIC X(48).
44 05 WS-REPLY-QNAME PIC X(48).
45 05 WS-SAVE-CORRELID PIC X(24).
46 05 WS-RESP-LENGTH PIC S9(4) VALUE 1.
47 05 WS-RESP-CD PIC S9(09) COMP VALUE ZEROS.
48 05 WS-REAS-CD PIC S9(09) COMP VALUE ZEROS.
49
50 05 WS-ABS-TIME PIC S9(15) COMP-3 VALUE 0.
51 05 WS-CUR-DATE-X6 PIC X(06) VALUE SPACES.
52 05 WS-CUR-TIME-X6 PIC X(06) VALUE SPACES.
53 05 WS-CUR-TIME-N6 PIC 9(06) VALUE ZERO.
54 05 WS-CUR-TIME-MS PIC S9(08) COMP.
55 05 WS-YYDDD PIC 9(05).
56 05 WS-TIME-WITH-MS PIC S9(09) COMP-3.
57 05 WS-OPTIONS PIC S9(9) BINARY.
58 05 WS-COMPCODE PIC S9(9) BINARY.
59 05 WS-REASON PIC S9(9) BINARY.
60 05 WS-WAIT-INTERVAL PIC S9(9) BINARY.
61 05 WS-CODE-DISPLAY PIC 9(9).
62 05 WS-AVAILABLE-AMT PIC S9(09)V99 COMP-3.
63 05 WS-TRANSACTION-AMT-AN PIC X(13).
64 05 WS-TRANSACTION-AMT PIC S9(10)V99.
65 05 WS-APPROVED-AMT PIC S9(10)V99.
66 05 WS-APPROVED-AMT-DIS PIC -zzzzzzzzz9.99.
67 05 WS-TRIGGER-DATA PIC X(64).
68
69 ******************************************************************
70 * File and data Handling
71 ******************************************************************
72 05 WS-XREF-RID.
73 10 WS-CARD-RID-CARDNUM PIC X(16).
74 10 WS-CARD-RID-CUST-ID PIC 9(09).
75 10 WS-CARD-RID-CUST-ID-X REDEFINES
76 WS-CARD-RID-CUST-ID PIC X(09).
77 10 WS-CARD-RID-ACCT-ID PIC 9(11).
78 10 WS-CARD-RID-ACCT-ID-X REDEFINES
79 WS-CARD-RID-ACCT-ID PIC X(11).
80
81 01 WS-IMS-VARIABLES.
82 05 PSB-NAME PIC X(8) VALUE 'PSBPAUTB'.
83 05 PCB-OFFSET.
84 10 PAUT-PCB-NUM PIC S9(4) COMP VALUE +1.
85 05 IMS-RETURN-CODE PIC X(02).
86 88 STATUS-OK VALUE ' ', 'FW'.
87 88 SEGMENT-NOT-FOUND VALUE 'GE'.
88 88 DUPLICATE-SEGMENT-FOUND VALUE 'II'.
89 88 WRONG-PARENTAGE VALUE 'GP'.
90 88 END-OF-DB VALUE 'GB'.
91 88 DATABASE-UNAVAILABLE VALUE 'BA'.
92 88 PSB-SCHEDULED-MORE-THAN-ONCE VALUE 'TC'.
93 88 COULD-NOT-SCHEDULE-PSB VALUE 'TE'.
94 88 RETRY-CONDITION VALUE 'BA', 'FH', 'TE'.
95 05 WS-IMS-PSB-SCHD-FLG PIC X(1).
96 88 IMS-PSB-SCHD VALUE 'Y'.
97 88 IMS-PSB-NOT-SCHD VALUE 'N'.
98
99 01 W01-HCONN-REQUEST PIC S9(9) BINARY VALUE ZERO.
100 01 W01-HOBJ-REQUEST PIC S9(9) BINARY.
101 01 W01-BUFFLEN PIC S9(9) BINARY.
102 01 W01-DATALEN PIC S9(9) BINARY.
103 01 W01-GET-BUFFER PIC X(500).
104
105 01 W02-HCONN-REPLY PIC S9(9) BINARY VALUE ZERO.
106 01 W02-BUFFLEN PIC S9(9) BINARY.
107 01 W02-DATALEN PIC S9(9) BINARY.
108 01 W02-PUT-BUFFER PIC X(200).
109
110 01 WS-SWITCHES.
111 05 WS-AUTH-RESP-FLG PIC X(01).
112 88 AUTH-RESP-APPROVED VALUE 'A'.
113 88 AUTH-RESP-DECLINED VALUE 'D'.
114 05 WS-MSG-LOOP-FLG PIC X(01) VALUE 'N'.
115 88 WS-LOOP-END VALUE 'E'.
116 05 WS-MSG-AVAILABLE-FLG PIC X(01) VALUE 'M'.
117 88 NO-MORE-MSG-AVAILABLE VALUE 'N'.
118 88 MORE-MSG-AVAILABLE VALUE 'M'.
119 05 WS-REQUEST-MQ-FLG PIC X(01) VALUE 'C'.
120 88 WS-REQUEST-MQ-OPEN VALUE 'O'.
121 88 WS-REQUEST-MQ-CLSE VALUE 'C'.
122 05 WS-REPLY-MQ-FLG PIC X(01) VALUE 'C'.
123 88 WS-REPLY-MQ-OPEN VALUE 'O'.
124 88 WS-REPLY-MQ-CLSE VALUE 'C'.
125 05 WS-XREF-READ-FLG PIC X(1).
126 88 CARD-NFOUND-XREF VALUE 'N'.
127 88 CARD-FOUND-XREF VALUE 'Y'.
128 05 WS-ACCT-MASTER-READ-FLG PIC X(1).
129 88 FOUND-ACCT-IN-MSTR VALUE 'Y'.
130 88 NFOUND-ACCT-IN-MSTR VALUE 'N'.
131 05 WS-CUST-MASTER-READ-FLG PIC X(1).
132 88 FOUND-CUST-IN-MSTR VALUE 'Y'.
133 88 NFOUND-CUST-IN-MSTR VALUE 'N'.
134 05 WS-PAUT-SMRY-SEG-FLG PIC X(1).
135 88 FOUND-PAUT-SMRY-SEG VALUE 'Y'.
136 88 NFOUND-PAUT-SMRY-SEG VALUE 'N'.
137 05 WS-DECLINE-FLG PIC X(1).
138 88 APPROVE-AUTH VALUE 'A'.
139 88 DECLINE-AUTH VALUE 'D'.
140 05 WS-DECLINE-REASON-FLG PIC X(1).
141 88 INSUFFICIENT-FUND VALUE 'I'.
142 88 CARD-NOT-ACTIVE VALUE 'A'.
143 88 ACCOUNT-CLOSED VALUE 'C'.
144 88 CARD-FRAUD VALUE 'F'.
145 88 MERCHANT-FRAUD VALUE 'M'.
146
147
148 01 MQM-OD-REQUEST.
149 COPY CMQODV.
150
151 01 MQM-MD-REQUEST.
152 COPY CMQMDV.
153
154 01 MQM-OD-REPLY.
155 COPY CMQODV.
156
157 01 MQM-MD-REPLY.
158 COPY CMQMDV.
159
160 01 MQM-CONSTANTS.
161 COPY CMQV.
162
163 01 MQM-TRIGGER-DATA.
164 COPY CMQTML.
165
166 01 MQM-PUT-MESSAGE-OPTIONS.
167 COPY CMQPMOV.
168
169 01 MQM-GET-MESSAGE-OPTIONS.
170 COPY CMQGMOV.
171
172 *----------------------------------------------------------------*
173 * STAGING COPYBOOKS
174 *----------------------------------------------------------------*
175
176 *- PENDING AUTHORIZATION REQUEST LAYOUT
177 01 PENDING-AUTH-REQUEST.
178 COPY CCPAURQY.
179
180 *- PENDING AUTHORIZATION RESPONSE LAYOUT
181 01 PENDING-AUTH-RESPONSE.
182 COPY CCPAURLY.
183
184 *- APPLICTION ERROR LOG LAYOUT
185 COPY CCPAUERY.
186
187 *----------------------------------------------------------------*
188 * IMS SEGMENT LAYOUT
189 *----------------------------------------------------------------*
190
191 *- PENDING AUTHORIZATION SUMMARY SEGMENT - ROOT
192 01 PENDING-AUTH-SUMMARY.
193 COPY CIPAUSMY.
194
195 *- PENDING AUTHORIZATION DETAILS SEGMENT - CHILD
196 01 PENDING-AUTH-DETAILS.
197 COPY CIPAUDTY.
198
199 *----------------------------------------------------------------*
200 *DATASET LAYOUTS
201 *----------------------------------------------------------------*
202 *- CARD XREF LAYOUT
203 COPY CVACT03Y.
204
205 *- ACCT RECORD LAYOUT
206 COPY CVACT01Y.
207
208 *- CUSTOMER LAYOUT
209 COPY CVCUS01Y.
210
211 * ------------------------------------------------------------- *
212 LINKAGE SECTION.
213 * ------------------------------------------------------------- *
214 01 DFHCOMMAREA.
215 05 LK-COMMAREA PIC X(4096).
216
217 * ------------------------------------------------------------- *
218 PROCEDURE DIVISION.
219 * ------------------------------------------------------------- *
220 MAIN-PARA.
221
222 PERFORM 1000-INITIALIZE THRU 1000-EXIT
223 PERFORM 2000-MAIN-PROCESS THRU 2000-EXIT
224 PERFORM 9000-TERMINATE THRU 9000-EXIT
225
226 EXEC CICS RETURN
227 END-EXEC.
228
229 * ------------------------------------------------------------- *
230 1000-INITIALIZE.
231 * ------------------------------------------------------------- *
232 *
233 EXEC CICS RETRIEVE
234 INTO(MQTM)
235 NOHANDLE
236 END-EXEC
237 IF EIBRESP = DFHRESP(NORMAL)
238 MOVE MQTM-QNAME TO WS-REQUEST-QNAME
239 MOVE MQTM-TRIGGERDATA TO WS-TRIGGER-DATA
240 END-IF
241
242 MOVE 5000 TO WS-WAIT-INTERVAL
243
244 PERFORM 1100-OPEN-REQUEST-QUEUE THRU 1100-EXIT
245
246 PERFORM 3100-READ-REQUEST-MQ THRU 3100-EXIT
247 .
248 *
249 1000-EXIT.
250 EXIT.
251 *
252 * ------------------------------------------------------------- *
253 * OPEN THE REQUEST QUEUE *
254 * ------------------------------------------_------------------ *
255 1100-OPEN-REQUEST-QUEUE.
256 *
257 MOVE MQOT-Q TO MQOD-OBJECTTYPE OF MQM-OD-REQUEST
258 MOVE WS-REQUEST-QNAME TO MQOD-OBJECTNAME OF MQM-OD-REQUEST
259 *
260 COMPUTE WS-OPTIONS = MQOO-INPUT-SHARED
261 *
262 CALL 'MQOPEN' USING W01-HCONN-REQUEST
263 MQM-OD-REQUEST
264 WS-OPTIONS
265 W01-HOBJ-REQUEST
266 WS-COMPCODE
267 WS-REASON
268 END-CALL
269 *
270 IF WS-COMPCODE = MQCC-OK
271 SET WS-REQUEST-MQ-OPEN TO TRUE
272 ELSE
273 MOVE 'M001' TO ERR-LOCATION
274 SET ERR-CRITICAL TO TRUE
275 SET ERR-MQ TO TRUE
276 MOVE WS-COMPCODE TO WS-CODE-DISPLAY
277 MOVE WS-CODE-DISPLAY TO ERR-CODE-1
278 MOVE WS-REASON TO WS-CODE-DISPLAY
279 MOVE WS-CODE-DISPLAY TO ERR-CODE-2
280 MOVE 'REQ MQ OPEN ERROR'
281 TO ERR-MESSAGE
282 PERFORM 9500-LOG-ERROR
283 END-IF
284 .
285 *
286 1100-EXIT.
287 EXIT.
288 *
289 * ------------------------------------------------------------- *
290 * SCHEDULE PSB * 08470000
291 * ------------------------------------------------------------- *
292 1200-SCHEDULE-PSB. 08490000
293 EXEC DLI SCHD
294 PSB((PSB-NAME))
295 NODHABEND
296 END-EXEC
297 MOVE DIBSTAT TO IMS-RETURN-CODE
298 IF PSB-SCHEDULED-MORE-THAN-ONCE
299 EXEC DLI TERM
300 END-EXEC
301
302 EXEC DLI SCHD
303 PSB((PSB-NAME))
304 NODHABEND
305 END-EXEC
306 MOVE DIBSTAT TO IMS-RETURN-CODE
307 END-IF
308 IF STATUS-OK
309 SET IMS-PSB-SCHD TO TRUE
310 ELSE
311 MOVE 'I001' TO ERR-LOCATION
312 SET ERR-CRITICAL TO TRUE
313 SET ERR-IMS TO TRUE
314 MOVE IMS-RETURN-CODE TO ERR-CODE-1
315 MOVE 'IMS SCHD FAILED' TO ERR-MESSAGE
316 PERFORM 9500-LOG-ERROR
317 END-IF
318 .
319 1200-EXIT.
320 EXIT
321 .
322 * ------------------------------------------------------------- *
323 2000-MAIN-PROCESS.
324 * ------------------------------------------------------------- *
325 *
326 PERFORM UNTIL NO-MORE-MSG-AVAILABLE OR WS-LOOP-END
327
328 PERFORM 2100-EXTRACT-REQUEST-MSG THRU 2100-EXIT
329
330 PERFORM 5000-PROCESS-AUTH THRU 5000-EXIT
331
332 ADD 1 TO WS-MSG-PROCESSED
333
334 EXEC CICS
335 SYNCPOINT
336 END-EXEC
337 SET IMS-PSB-NOT-SCHD TO TRUE
338
339 IF WS-MSG-PROCESSED > WS-REQSTS-PROCESS-LIMIT
340 SET WS-LOOP-END TO TRUE
341 ELSE
342 PERFORM 3100-READ-REQUEST-MQ THRU 3100-EXIT
343 END-IF
344 END-PERFORM
345 .
346 *
347 2000-EXIT.
348 EXIT.
349 *
350 * ------------------------------------------------------------- *
351 2100-EXTRACT-REQUEST-MSG.
352 * ------------------------------------------------------------- *
353 *
354 UNSTRING W01-GET-BUFFER(1:W01-DATALEN)
355 DELIMITED BY ','
356 INTO PA-RQ-AUTH-DATE
357 PA-RQ-AUTH-TIME
358 PA-RQ-CARD-NUM
359 PA-RQ-AUTH-TYPE
360 PA-RQ-CARD-EXPIRY-DATE
361 PA-RQ-MESSAGE-TYPE
362 PA-RQ-MESSAGE-SOURCE
363 PA-RQ-PROCESSING-CODE
364 WS-TRANSACTION-AMT-AN
365 PA-RQ-MERCHANT-CATAGORY-CODE
366 PA-RQ-ACQR-COUNTRY-CODE
367 PA-RQ-POS-ENTRY-MODE
368 PA-RQ-MERCHANT-ID
369 PA-RQ-MERCHANT-NAME
370 PA-RQ-MERCHANT-CITY
371 PA-RQ-MERCHANT-STATE
372 PA-RQ-MERCHANT-ZIP
373 PA-RQ-TRANSACTION-ID
374 END-UNSTRING
375
376 COMPUTE PA-RQ-TRANSACTION-AMT =
377 FUNCTION NUMVAL(WS-TRANSACTION-AMT-AN)
378
379 MOVE PA-RQ-TRANSACTION-AMT TO WS-TRANSACTION-AMT
380 .
381 *
382 2100-EXIT.
383 EXIT.
384 *
385 * ------------------------------------------------------------- *
386 3100-READ-REQUEST-MQ.
387 * ------------------------------------------------------------- *
388 *
389 COMPUTE MQGMO-OPTIONS = MQGMO-NO-SYNCPOINT + MQGMO-WAIT
390 + MQGMO-CONVERT
391 + MQGMO-FAIL-IF-QUIESCING
392
393 MOVE WS-WAIT-INTERVAL TO MQGMO-WAITINTERVAL
394
395 MOVE MQMI-NONE TO MQMD-MSGID OF MQM-MD-REQUEST
396 MOVE MQCI-NONE TO MQMD-CORRELID OF MQM-MD-REQUEST
397 MOVE MQFMT-STRING TO MQMD-FORMAT OF MQM-MD-REQUEST
398 MOVE LENGTH OF W01-GET-BUFFER TO W01-BUFFLEN
399
400 CALL 'MQGET' USING W01-HCONN-REQUEST
401 W01-HOBJ-REQUEST
402 MQM-MD-REQUEST
403 MQM-GET-MESSAGE-OPTIONS
404 W01-BUFFLEN
405 W01-GET-BUFFER
406 W01-DATALEN
407 WS-COMPCODE
408 WS-REASON
409 END-CALL
410 IF WS-COMPCODE = MQCC-OK
411 MOVE MQMD-CORRELID OF MQM-MD-REQUEST
412 TO WS-SAVE-CORRELID
413 MOVE MQMD-REPLYTOQ OF MQM-MD-REQUEST
414 TO WS-REPLY-QNAME
415 ELSE
416 IF WS-REASON = MQRC-NO-MSG-AVAILABLE
417 SET NO-MORE-MSG-AVAILABLE TO TRUE
418 ELSE
419 MOVE 'M003' TO ERR-LOCATION
420 SET ERR-CRITICAL TO TRUE
421 SET ERR-CICS TO TRUE
422 MOVE WS-COMPCODE TO WS-CODE-DISPLAY
423 MOVE WS-CODE-DISPLAY TO ERR-CODE-1
424 MOVE WS-REASON TO WS-CODE-DISPLAY
425 MOVE WS-CODE-DISPLAY TO ERR-CODE-2
426 MOVE 'FAILED TO READ REQUEST MQ'
427 TO ERR-MESSAGE
428 MOVE PA-CARD-NUM TO ERR-EVENT-KEY
429 PERFORM 9500-LOG-ERROR
430 END-IF
431 END-IF
432 .
433 *
434 3100-EXIT.
435 EXIT.
436 *
437 * ------------------------------------------------------------- *
438 5000-PROCESS-AUTH.
439 * ------------------------------------------------------------- *
440 *
441 SET APPROVE-AUTH TO TRUE
442
443 PERFORM 1200-SCHEDULE-PSB THRU 1200-EXIT
444
445 SET CARD-FOUND-XREF TO TRUE
446 SET FOUND-ACCT-IN-MSTR TO TRUE
447
448 PERFORM 5100-READ-XREF-RECORD THRU 5100-EXIT
449
450 IF CARD-FOUND-XREF
451 PERFORM 5200-READ-ACCT-RECORD THRU 5200-EXIT
452 PERFORM 5300-READ-CUST-RECORD THRU 5300-EXIT
453
454 PERFORM 5500-READ-AUTH-SUMMRY THRU 5500-EXIT
455
456 PERFORM 5600-READ-PROFILE-DATA THRU 5600-EXIT
457 END-IF
458
459 PERFORM 6000-MAKE-DECISION THRU 6000-EXIT
460
461 PERFORM 7100-SEND-RESPONSE THRU 7100-EXIT
462
463 IF CARD-FOUND-XREF
464 PERFORM 8000-WRITE-AUTH-TO-DB THRU 8000-EXIT
465 END-IF
466 .
467 *
468 5000-EXIT.
469 EXIT.
470 *
471 * ------------------------------------------------------------- *
472 5100-READ-XREF-RECORD.
473 * ------------------------------------------------------------- *
474 *
475 MOVE PA-RQ-CARD-NUM TO XREF-CARD-NUM
476
477 EXEC CICS READ
478 DATASET (WS-CCXREF-FILE)
479 INTO (CARD-XREF-RECORD)
480 LENGTH (LENGTH OF CARD-XREF-RECORD)
481 RIDFLD (XREF-CARD-NUM)
482 KEYLENGTH (LENGTH OF XREF-CARD-NUM)
483 RESP (WS-RESP-CD)
484 RESP2 (WS-REAS-CD)
485 END-EXEC
486
487 EVALUATE WS-RESP-CD
488 WHEN DFHRESP(NORMAL)
489 SET CARD-FOUND-XREF TO TRUE
490 WHEN DFHRESP(NOTFND)
491 SET CARD-NFOUND-XREF TO TRUE
492 SET NFOUND-ACCT-IN-MSTR TO TRUE
493
494 MOVE 'A001' TO ERR-LOCATION
495 SET ERR-WARNING TO TRUE
496 SET ERR-APP TO TRUE
497 MOVE 'CARD NOT FOUND IN XREF'
498 TO ERR-MESSAGE
499 MOVE XREF-CARD-NUM TO ERR-EVENT-KEY
500 PERFORM 9500-LOG-ERROR
501 WHEN OTHER
502 MOVE 'C001' TO ERR-LOCATION
503 SET ERR-CRITICAL TO TRUE
504 SET ERR-CICS TO TRUE
505 MOVE WS-RESP-CD TO WS-CODE-DISPLAY
506 MOVE WS-CODE-DISPLAY TO ERR-CODE-1
507 MOVE WS-REAS-CD TO WS-CODE-DISPLAY
508 MOVE WS-CODE-DISPLAY TO ERR-CODE-2
509 MOVE 'FAILED TO READ XREF FILE'
510 TO ERR-MESSAGE
511 MOVE XREF-CARD-NUM TO ERR-EVENT-KEY
512 PERFORM 9500-LOG-ERROR
513 END-EVALUATE
514 .
515 *
516 5100-EXIT.
517 EXIT.
518 *
519 * ------------------------------------------------------------- *
520 5200-READ-ACCT-RECORD.
521 * ------------------------------------------------------------- *
522 *
523 MOVE XREF-ACCT-ID TO WS-CARD-RID-ACCT-ID
524
525 EXEC CICS READ
526 DATASET (WS-ACCTFILENAME)
527 RIDFLD (WS-CARD-RID-ACCT-ID-X)
528 KEYLENGTH (LENGTH OF WS-CARD-RID-ACCT-ID-X)
529 INTO (ACCOUNT-RECORD)
530 LENGTH (LENGTH OF ACCOUNT-RECORD)
531 RESP (WS-RESP-CD)
532 RESP2 (WS-REAS-CD)
533 END-EXEC
534
535 EVALUATE WS-RESP-CD
536 WHEN DFHRESP(NORMAL)
537 SET FOUND-ACCT-IN-MSTR TO TRUE
538 WHEN DFHRESP(NOTFND)
539 SET NFOUND-ACCT-IN-MSTR TO TRUE
540
541 MOVE 'A002' TO ERR-LOCATION
542 SET ERR-WARNING TO TRUE
543 SET ERR-APP TO TRUE
544 MOVE 'ACCT NOT FOUND IN XREF'
545 TO ERR-MESSAGE
546 MOVE WS-CARD-RID-ACCT-ID-X TO ERR-EVENT-KEY
547 PERFORM 9500-LOG-ERROR
548 *
549 WHEN OTHER
550 MOVE 'C002' TO ERR-LOCATION
551 SET ERR-CRITICAL TO TRUE
552 SET ERR-CICS TO TRUE
553 MOVE WS-RESP-CD TO WS-CODE-DISPLAY
554 MOVE WS-CODE-DISPLAY TO ERR-CODE-1
555 MOVE WS-REAS-CD TO WS-CODE-DISPLAY
556 MOVE WS-CODE-DISPLAY TO ERR-CODE-2
557 MOVE 'FAILED TO READ ACCT FILE'
558 TO ERR-MESSAGE
559 MOVE WS-CARD-RID-ACCT-ID-X TO ERR-EVENT-KEY
560 PERFORM 9500-LOG-ERROR
561 END-EVALUATE
562 .
563 *
564 5200-EXIT.
565 EXIT.
566 *
567 * ------------------------------------------------------------- *
568 5300-READ-CUST-RECORD.
569 * ------------------------------------------------------------- *
570 *
571 MOVE XREF-CUST-ID TO WS-CARD-RID-CUST-ID
572
573 EXEC CICS READ
574 DATASET (WS-CUSTFILENAME)
575 RIDFLD (WS-CARD-RID-CUST-ID-X)
576 KEYLENGTH (LENGTH OF WS-CARD-RID-CUST-ID-X)
577 INTO (CUSTOMER-RECORD)
578 LENGTH (LENGTH OF CUSTOMER-RECORD)
579 RESP (WS-RESP-CD)
580 RESP2 (WS-REAS-CD)
581 END-EXEC
582
583 EVALUATE WS-RESP-CD
584 WHEN DFHRESP(NORMAL)
585 SET FOUND-CUST-IN-MSTR TO TRUE
586 WHEN DFHRESP(NOTFND)
587 SET NFOUND-CUST-IN-MSTR TO TRUE
588
589 MOVE 'A003' TO ERR-LOCATION
590 SET ERR-WARNING TO TRUE
591 SET ERR-APP TO TRUE
592 MOVE 'CUST NOT FOUND IN XREF'
593 TO ERR-MESSAGE
594 MOVE WS-CARD-RID-CUST-ID TO ERR-EVENT-KEY
595 PERFORM 9500-LOG-ERROR
596 *
597 WHEN OTHER
598 MOVE 'C003' TO ERR-LOCATION
599 SET ERR-CRITICAL TO TRUE
600 SET ERR-CICS TO TRUE
601 MOVE WS-RESP-CD TO WS-CODE-DISPLAY
602 MOVE WS-CODE-DISPLAY TO ERR-CODE-1
603 MOVE WS-REAS-CD TO WS-CODE-DISPLAY
604 MOVE WS-CODE-DISPLAY TO ERR-CODE-2
605 MOVE 'FAILED TO READ CUST FILE'
606 TO ERR-MESSAGE
607 MOVE WS-CARD-RID-CUST-ID TO ERR-EVENT-KEY
608 PERFORM 9500-LOG-ERROR
609 END-EVALUATE
610 .
611 *
612 5300-EXIT.
613 EXIT.
614 *
615 * ------------------------------------------------------------- *
616 5500-READ-AUTH-SUMMRY.
617 * ------------------------------------------------------------- *
618 *
619 MOVE XREF-ACCT-ID TO PA-ACCT-ID
620 EXEC DLI GU USING PCB(PAUT-PCB-NUM)
621 SEGMENT (PAUTSUM0)
622 INTO (PENDING-AUTH-SUMMARY)
623 WHERE (ACCNTID = PA-ACCT-ID)
624 END-EXEC
625
626 MOVE DIBSTAT TO IMS-RETURN-CODE
627 EVALUATE TRUE
628 WHEN STATUS-OK
629 SET FOUND-PAUT-SMRY-SEG TO TRUE
630 WHEN SEGMENT-NOT-FOUND
631 SET NFOUND-PAUT-SMRY-SEG TO TRUE
632 WHEN OTHER
633 MOVE 'I002' TO ERR-LOCATION
634 SET ERR-CRITICAL TO TRUE
635 SET ERR-IMS TO TRUE
636 MOVE IMS-RETURN-CODE TO ERR-CODE-1
637 MOVE 'IMS GET SUMMARY FAILED' TO ERR-MESSAGE
638 MOVE PA-CARD-NUM TO ERR-EVENT-KEY
639 PERFORM 9500-LOG-ERROR
640 END-EVALUATE
641 .
642 *
643 5500-EXIT.
644 EXIT.
645 *
646 * ------------------------------------------------------------- *
647 5600-READ-PROFILE-DATA.
648 * ------------------------------------------------------------- *
649 *
650 CONTINUE
651 .
652 *
653 5600-EXIT.
654 EXIT.
655 *
656 * ------------------------------------------------------------- *
657 6000-MAKE-DECISION.
658 * ------------------------------------------------------------- *
659 *
660 MOVE PA-RQ-CARD-NUM TO PA-RL-CARD-NUM
661 MOVE PA-RQ-TRANSACTION-ID TO PA-RL-TRANSACTION-ID
662 MOVE PA-RQ-AUTH-TIME TO PA-RL-AUTH-ID-CODE
663
664 *- Decline Auth if Above Limit; If no AUTH summary, use ACT data
665 IF FOUND-PAUT-SMRY-SEG
666 COMPUTE WS-AVAILABLE-AMT = PA-CREDIT-LIMIT
667 - PA-CREDIT-BALANCE
668 IF WS-TRANSACTION-AMT > WS-AVAILABLE-AMT
669 SET DECLINE-AUTH TO TRUE
670 SET INSUFFICIENT-FUND TO TRUE
671 END-IF
672 ELSE
673 IF FOUND-ACCT-IN-MSTR
674 COMPUTE WS-AVAILABLE-AMT = ACCT-CREDIT-LIMIT
675 - ACCT-CURR-BAL
676 IF WS-TRANSACTION-AMT > WS-AVAILABLE-AMT
677 SET DECLINE-AUTH TO TRUE
678 SET INSUFFICIENT-FUND TO TRUE
679 END-IF
680 ELSE
681 SET DECLINE-AUTH TO TRUE
682 END-IF
683 END-IF
684
685 IF DECLINE-AUTH
686 SET AUTH-RESP-DECLINED TO TRUE
687
688 MOVE '05' TO PA-RL-AUTH-RESP-CODE
689 MOVE 0 TO PA-RL-APPROVED-AMT
690 WS-APPROVED-AMT
691 ELSE
692 SET AUTH-RESP-APPROVED TO TRUE
693 MOVE '00' TO PA-RL-AUTH-RESP-CODE
694 MOVE PA-RQ-TRANSACTION-AMT TO PA-RL-APPROVED-AMT
695 WS-APPROVED-AMT
696 END-IF
697
698 MOVE '0000' TO PA-RL-AUTH-RESP-REASON
699 IF AUTH-RESP-DECLINED
700 EVALUATE TRUE
701 WHEN CARD-NFOUND-XREF
702 WHEN NFOUND-ACCT-IN-MSTR
703 WHEN NFOUND-CUST-IN-MSTR
704 MOVE '3100' TO PA-RL-AUTH-RESP-REASON
705 WHEN INSUFFICIENT-FUND
706 MOVE '4100' TO PA-RL-AUTH-RESP-REASON
707 WHEN CARD-NOT-ACTIVE
708 MOVE '4200' TO PA-RL-AUTH-RESP-REASON
709 WHEN ACCOUNT-CLOSED
710 MOVE '4300' TO PA-RL-AUTH-RESP-REASON
711 WHEN CARD-FRAUD
712 MOVE '5100' TO PA-RL-AUTH-RESP-REASON
713 WHEN MERCHANT-FRAUD
714 MOVE '5200' TO PA-RL-AUTH-RESP-REASON
715 WHEN OTHER
716 MOVE '9000' TO PA-RL-AUTH-RESP-REASON
717 END-EVALUATE
718 END-IF
719
720 MOVE WS-APPROVED-AMT TO WS-APPROVED-AMT-DIS
721
722 STRING PA-RL-CARD-NUM ','
723 PA-RL-TRANSACTION-ID ','
724 PA-RL-AUTH-ID-CODE ','
725 PA-RL-AUTH-RESP-CODE ','
726 PA-RL-AUTH-RESP-REASON ','
727 WS-APPROVED-AMT-DIS ','
728 DELIMITED BY SIZE
729 INTO W02-PUT-BUFFER
730 WITH POINTER WS-RESP-LENGTH
731 END-STRING
732 .
733 *
734 6000-EXIT.
735 EXIT.
736 *
737 * ------------------------------------------------------------- *
738 7100-SEND-RESPONSE.
739 * ------------------------------------------------------------- *
740 *
741 MOVE MQOT-Q TO MQOD-OBJECTTYPE OF MQM-OD-REPLY
742 MOVE WS-REPLY-QNAME TO MQOD-OBJECTNAME OF MQM-OD-REPLY
743 *
744 MOVE MQMT-REPLY TO MQMD-MSGTYPE OF MQM-MD-REPLY
745 MOVE WS-SAVE-CORRELID TO MQMD-CORRELID OF MQM-MD-REPLY
746 MOVE MQMI-NONE TO MQMD-MSGID OF MQM-MD-REPLY
747 MOVE SPACES TO MQMD-REPLYTOQ OF MQM-MD-REPLY
748 MOVE SPACES TO MQMD-REPLYTOQMGR OF MQM-MD-REPLY
749 MOVE MQPER-NOT-PERSISTENT TO MQMD-PERSISTENCE OF MQM-MD-REPLY
750 MOVE 50 TO MQMD-EXPIRY OF MQM-MD-REPLY
751 MOVE MQFMT-STRING TO MQMD-FORMAT OF MQM-MD-REPLY
752
753 COMPUTE MQPMO-OPTIONS = MQPMO-NO-SYNCPOINT +
754 MQPMO-DEFAULT-CONTEXT
755
756 MOVE WS-RESP-LENGTH TO W02-BUFFLEN
757 *
758 CALL 'MQPUT1' USING W02-HCONN-REPLY
759 MQM-OD-REPLY
760 MQM-MD-REPLY
761 MQM-PUT-MESSAGE-OPTIONS
762 W02-BUFFLEN
763 W02-PUT-BUFFER
764 WS-COMPCODE
765 WS-REASON
766 END-CALL
767 IF WS-COMPCODE NOT = MQCC-OK
768 MOVE 'M004' TO ERR-LOCATION
769 SET ERR-CRITICAL TO TRUE
770 SET ERR-MQ TO TRUE
771 MOVE WS-COMPCODE TO WS-CODE-DISPLAY
772 MOVE WS-CODE-DISPLAY TO ERR-CODE-1
773 MOVE WS-REASON TO WS-CODE-DISPLAY
774 MOVE WS-CODE-DISPLAY TO ERR-CODE-2
775 MOVE 'FAILED TO PUT ON REPLY MQ'
776 TO ERR-MESSAGE
777 MOVE PA-CARD-NUM TO ERR-EVENT-KEY
778 PERFORM 9500-LOG-ERROR
779 END-IF
780 .
781 *
782 7100-EXIT.
783 EXIT.
784 *
785 * ------------------------------------------------------------- *
786 8000-WRITE-AUTH-TO-DB.
787 * ------------------------------------------------------------- *
788 *
789
790 PERFORM 8400-UPDATE-SUMMARY THRU 8400-EXIT
791 PERFORM 8500-INSERT-AUTH THRU 8500-EXIT
792 .
793 *
794 8000-EXIT.
795 EXIT.
796 *
797 * ------------------------------------------------------------- *
798 8400-UPDATE-SUMMARY.
799 * ------------------------------------------------------------- *
800 *
801 IF NFOUND-PAUT-SMRY-SEG
802 INITIALIZE PENDING-AUTH-SUMMARY
803 REPLACING NUMERIC DATA BY ZERO
804
805 MOVE XREF-ACCT-ID TO PA-ACCT-ID
806 MOVE XREF-CUST-ID TO PA-CUST-ID
807
808 END-IF
809
810 MOVE ACCT-CREDIT-LIMIT TO PA-CREDIT-LIMIT
811 MOVE ACCT-CASH-CREDIT-LIMIT TO PA-CASH-LIMIT
812
813 IF AUTH-RESP-APPROVED
814 ADD 1 TO PA-APPROVED-AUTH-CNT
815 ADD WS-APPROVED-AMT TO PA-APPROVED-AUTH-AMT
816
817 ADD WS-APPROVED-AMT TO PA-CREDIT-BALANCE
818 MOVE 0 TO PA-CASH-BALANCE
819 ELSE
820 ADD 1 TO PA-DECLINED-AUTH-CNT
821 ADD PA-TRANSACTION-AMT TO PA-DECLINED-AUTH-AMT
822 END-IF
823
824 IF FOUND-PAUT-SMRY-SEG
825 EXEC DLI REPL USING PCB(PAUT-PCB-NUM)
826 SEGMENT (PAUTSUM0)
827 FROM (PENDING-AUTH-SUMMARY)
828 END-EXEC
829 ELSE
830 EXEC DLI ISRT USING PCB(PAUT-PCB-NUM)
831 SEGMENT (PAUTSUM0)
832 FROM (PENDING-AUTH-SUMMARY)
833 END-EXEC
834 END-IF
835 MOVE DIBSTAT TO IMS-RETURN-CODE
836
837 IF STATUS-OK
838 CONTINUE
839 ELSE
840 MOVE 'I003' TO ERR-LOCATION
841 SET ERR-CRITICAL TO TRUE
842 SET ERR-IMS TO TRUE
843 MOVE IMS-RETURN-CODE TO ERR-CODE-1
844 MOVE 'IMS UPDATE SUMRY FAILED' TO ERR-MESSAGE
845 MOVE PA-CARD-NUM TO ERR-EVENT-KEY
846 PERFORM 9500-LOG-ERROR
847 END-IF
848 .
849 *
850 8400-EXIT.
851 EXIT.
852 *
853 * ------------------------------------------------------------- *
854 8500-INSERT-AUTH.
855 * ------------------------------------------------------------- *
856 *
857 EXEC CICS ASKTIME NOHANDLE
858 ABSTIME(WS-ABS-TIME)
859 END-EXEC
860
861 EXEC CICS FORMATTIME
862 ABSTIME(WS-ABS-TIME)
863 YYDDD(WS-CUR-DATE-X6)
864 TIME(WS-CUR-TIME-X6)
865 MILLISECONDS(WS-CUR-TIME-MS)
866 END-EXEC
867
868 MOVE WS-CUR-DATE-X6(1:5) TO WS-YYDDD
869 MOVE WS-CUR-TIME-X6 TO WS-CUR-TIME-N6
870
871 COMPUTE WS-TIME-WITH-MS = (WS-CUR-TIME-N6 * 1000) +
872 WS-CUR-TIME-MS
873
874 COMPUTE PA-AUTH-DATE-9C = 99999 - WS-YYDDD
875 COMPUTE PA-AUTH-TIME-9C = 999999999 - WS-TIME-WITH-MS
876
877 MOVE PA-RQ-AUTH-DATE TO PA-AUTH-ORIG-DATE
878 MOVE PA-RQ-AUTH-TIME TO PA-AUTH-ORIG-TIME
879 MOVE PA-RQ-CARD-NUM TO PA-CARD-NUM
880 MOVE PA-RQ-AUTH-TYPE TO PA-AUTH-TYPE
881 MOVE PA-RQ-CARD-EXPIRY-DATE TO PA-CARD-EXPIRY-DATE
882 MOVE PA-RQ-MESSAGE-TYPE TO PA-MESSAGE-TYPE
883 MOVE PA-RQ-MESSAGE-SOURCE TO PA-MESSAGE-SOURCE
884 MOVE PA-RQ-PROCESSING-CODE TO PA-PROCESSING-CODE
885 MOVE PA-RQ-TRANSACTION-AMT TO PA-TRANSACTION-AMT
886 MOVE PA-RQ-MERCHANT-CATAGORY-CODE
887 TO PA-MERCHANT-CATAGORY-CODE
888 MOVE PA-RQ-ACQR-COUNTRY-CODE TO PA-ACQR-COUNTRY-CODE
889 MOVE PA-RQ-POS-ENTRY-MODE TO PA-POS-ENTRY-MODE
890 MOVE PA-RQ-MERCHANT-ID TO PA-MERCHANT-ID
891 MOVE PA-RQ-MERCHANT-NAME TO PA-MERCHANT-NAME
892 MOVE PA-RQ-MERCHANT-CITY TO PA-MERCHANT-CITY
893 MOVE PA-RQ-MERCHANT-STATE TO PA-MERCHANT-STATE
894 MOVE PA-RQ-MERCHANT-ZIP TO PA-MERCHANT-ZIP
895 MOVE PA-RQ-TRANSACTION-ID TO PA-TRANSACTION-ID
896
897 MOVE PA-RL-AUTH-ID-CODE TO PA-AUTH-ID-CODE
898 MOVE PA-RL-AUTH-RESP-CODE TO PA-AUTH-RESP-CODE
899 MOVE PA-RL-AUTH-RESP-REASON TO PA-AUTH-RESP-REASON
900 MOVE PA-RL-APPROVED-AMT TO PA-APPROVED-AMT
901
902 IF AUTH-RESP-APPROVED
903 SET PA-MATCH-PENDING TO TRUE
904 ELSE
905 SET PA-MATCH-AUTH-DECLINED TO TRUE
906 END-IF
907
908 MOVE SPACE TO PA-AUTH-FRAUD
909 PA-FRAUD-RPT-DATE
910
911 MOVE XREF-ACCT-ID TO PA-ACCT-ID
912
913 EXEC DLI ISRT USING PCB(PAUT-PCB-NUM)
914 SEGMENT (PAUTSUM0)
915 WHERE (ACCNTID = PA-ACCT-ID)
916 SEGMENT (PAUTDTL1)
917 FROM (PENDING-AUTH-DETAILS)
918 SEGLENGTH (LENGTH OF PENDING-AUTH-DETAILS)
919 END-EXEC
920 MOVE DIBSTAT TO IMS-RETURN-CODE
921
922 IF STATUS-OK
923 CONTINUE
924 ELSE
925 MOVE 'I004' TO ERR-LOCATION
926 SET ERR-CRITICAL TO TRUE
927 SET ERR-IMS TO TRUE
928 MOVE IMS-RETURN-CODE TO ERR-CODE-1
929 MOVE 'IMS INSERT DETL FAILED' TO ERR-MESSAGE
930 MOVE PA-CARD-NUM TO ERR-EVENT-KEY
931 PERFORM 9500-LOG-ERROR
932 END-IF
933 .
934 *
935 8500-EXIT.
936 EXIT.
937 *
938
939 * ------------------------------------------------------------- *
940 9000-TERMINATE.
941 * ------------------------------------------------------------- *
942 *
943 IF IMS-PSB-SCHD
944 EXEC DLI TERM END-EXEC
945 END-IF
946
947 PERFORM 9100-CLOSE-REQUEST-QUEUE THRU 9100-EXIT
948 .
949 *
950 9000-EXIT.
951 EXIT.
952 * ------------------------------------------------------------- *
953 9100-CLOSE-REQUEST-QUEUE.
954 * ------------------------------------------------------------ *
955 IF WS-REQUEST-MQ-OPEN
956 CALL 'MQCLOSE' USING W01-HCONN-REQUEST
957 W01-HOBJ-REQUEST
958 MQCO-NONE
959 WS-COMPCODE
960 WS-REASON
961 END-CALL
962 *
963 IF WS-COMPCODE = MQCC-OK
964 SET WS-REQUEST-MQ-CLSE TO TRUE
965 ELSE
966 MOVE 'M005' TO ERR-LOCATION
967 SET ERR-WARNING TO TRUE
968 SET ERR-MQ TO TRUE
969 MOVE WS-COMPCODE TO WS-CODE-DISPLAY
970 MOVE WS-CODE-DISPLAY TO ERR-CODE-1
971 MOVE WS-REASON TO WS-CODE-DISPLAY
972 MOVE WS-CODE-DISPLAY TO ERR-CODE-2
973 MOVE 'FAILED TO CLOSE REQUEST MQ'
974 TO ERR-MESSAGE
975 PERFORM 9500-LOG-ERROR
976 END-IF
977 END-IF.
978 *
979 9100-EXIT.
980 EXIT.
981 *
982 * ------------------------------------------------------------- *
983 9500-LOG-ERROR.
984 * ------------------------------------------------------------ *
985
986 EXEC CICS ASKTIME NOHANDLE
987 ABSTIME(WS-ABS-TIME)
988 END-EXEC
989
990 EXEC CICS FORMATTIME
991 ABSTIME(WS-ABS-TIME)
992 YYMMDD(WS-CUR-DATE-X6)
993 TIME(WS-CUR-TIME-X6)
994 END-EXEC
995
996 MOVE WS-CICS-TRANID TO ERR-APPLICATION
997 MOVE WS-PGM-AUTH TO ERR-PROGRAM
998 MOVE WS-CUR-DATE-X6 TO ERR-DATE
999 MOVE WS-CUR-TIME-X6 TO ERR-TIME
1000
1001 EXEC CICS WRITEQ
1002 TD QUEUE('CSSL')
1003 FROM (ERROR-LOG-RECORD)
1004 LENGTH (LENGTH OF ERROR-LOG-RECORD)
1005 NOHANDLE
1006 END-EXEC
1007
1008 IF ERR-CRITICAL
1009 PERFORM 9990-END-ROUTINE
1010 END-IF
1011 .
1012 9500-EXIT.
1013 EXIT.
1014 *
1015 * ------------------------------------------------------------- *
1016 9990-END-ROUTINE.
1017 * ------------------------------------------------------------ *
1018
1019 PERFORM 9000-TERMINATE
1020
1021 EXEC CICS RETURN
1022 END-EXEC
1023 .
1024 9990-EXIT.
1025 EXIT.
1026 *