000001 IDENTIFICATION DIVISION. 000002 PROGRAM-ID. VALCARS8. 000003 AUTHOR. CVV. 000004 000005 ENVIRONMENT DIVISION. 000006 INPUT-OUTPUT SECTION. 000007 FILE-CONTROL. 000008 SELECT RENTAL-FILE ASSIGN TO SYSIN 000009 ORGANIZATION IS LINE SEQUENTIAL. 000010 SELECT VALID-RENTAL-FILE ASSIGN TO SYSOUT 000011 ORGANIZATION IS LINE SEQUENTIAL. 000012 SELECT ERROR-FILE ASSIGN TO SYSPRINT 000013 ORGANIZATION IS LINE SEQUENTIAL. 000014 000015 DATA DIVISION. 000016 FILE SECTION. 000017 FD RENTAL-FILE 000018 RECORD CONTAINS 56 CHARACTERS. 000019 01 RENTAL-RECORD. 000020 05 REN-CONTRACT-NO PIC 9(6). 000021 05 REN-NAME. 000022 10 REN-LAST-NAME PIC X(15). 000023 10 REN-FIRST-NAME PIC X(10). 000024 10 REN-INITIAL PIC X. 000025 05 REN-RETURNED-DATE. 000026 10 REN-RETURNED-YEAR PIC 9(2). 000027 10 REN-RETURNED-MONTH PIC 9(2). 000028 88 VALID-MONTHS VALUES 1 THRU 12. 000029 88 FEBRUARY VALUE 2. 000030 88 30-DAY-MONTH VALUES 4 6 9 11. 000031 88 31-DAY-MONTH VALUES 1 3 5 7 8 10 12. 000032 10 REN-RETURNED-DAY PIC 9(2). 000033 05 REN-CAR-TYPE PIC X. 000034 88 VALID-CAR-TYPES VALUES 'E' 'C' 'M' 'F' 'L'. 000035 05 REN-DAYS-RENTED PIC 99. 000036 88 ZERO-DAYS-RENTED VALUE 0. 000037 88 VALID-DAYS-RENTED VALUES 1 THRU 35. 000038 05 REN-MILEAGE. 000039 10 REN-MILES-IN PIC 9(6). 000040 10 REN-MILES-OUT PIC 9(6). 000041 10 REN-MILEAGE-RATE PIC 99. 000042 88 VALID-MILEAGE-RATES VALUES 00 THRU 50. 000043 05 REN-INSURANCE PIC X. 000044 88 VALID-INSURANCE VALUES 'Y' 'N'. 000045 000046 FD VALID-RENTAL-FILE 000047 RECORD CONTAINS 56 CHARACTERS. 000048 01 VALID-RENTAL-RECORD PIC X(56). 000049 000050 FD ERROR-FILE 000051 RECORD CONTAINS 132 CHARACTERS. 000052 01 ERROR-RECORD PIC X(132). 000053 000054 WORKING-STORAGE SECTION. 000055 01 PROGRAM-SWITCHES. 000056 05 NO-DATA-REMAINS-SWITCH PIC XXX VALUE SPACES. 000057 88 NO-DATA-REMAINS VALUE 'NO'. 000058 05 VALID-RECORD-SWITCH PIC X(3). 000059 88 VALID-RECORD VALUE 'YES'. 000060 000061 01 VALIDATION-CONSTANTS-AND-CALCS. 000062 05 MILES-PER-DAY-FACTOR PIC 99 VALUE 10. 000063 05 EXPECTED-MILES PIC 9(6). 000064 05 ACTUAL-MILES PIC 9(6). 000065 000066 01 ERROR-REASONS. 000067 05 NON-NUMERIC-CONTRACT-MSG PIC X(40) 000068 VALUE 'NON-NUMERIC CONTRACT NUMBER'. 000069 05 LAST-NAME-MSG PIC X(40) 000070 VALUE 'MISSING LAST NAME'. 000071 05 FIRST-NAME-MSG PIC X(40) 000072 VALUE 'MISSING FIRST NAME'. 000073 05 INITIAL-MSG PIC X(40) 000074 VALUE 'NON ALPHABETIC INITIAL'. 000075 05 CAR-TYPE-MSG PIC X(40) 000076 VALUE 'CAR TYPE MUST BE: E, C, M, F, OR L'. 000077 05 MONTH-MSG PIC X(40) 000078 VALUE 'MONTH MUST BE BETWEEN 1 AND 12'. 000079 05 DAY-MSG PIC X(40) 000080 VALUE 'INVALID DAY'. 000081 05 FUTURE-DATE-MSG PIC X(40) 000082 VALUE 'DATE HAS NOT YET OCCURRED'. 000083 05 NON-NUM-DAYS-RENTED-MSG PIC X(40) 000084 VALUE 'DAYS RENTED MUST BE NUMERIC'. 000085 05 ZERO-DAYS-MSG PIC X(40) 000086 VALUE 'DAYS RENTED MUST BE > ZERO'. 000087 05 LEASING-MSG PIC X(40) 000088 VALUE 'REFER TO LONG-TERM LEASING'. 000089 05 NON-NUM-MILES-IN-MSG PIC X(40) 000090 VALUE 'NON-NUMERIC MILES IN'. 000091 05 NON-NUM-MILES-OUT-MSG PIC X(40) 000092 VALUE 'NON-NUMERIC MILES OUT'. 000093 05 LESS-THAN-MILES-MSG PIC X(40) 000094 VALUE 'MILEAGE IN LESS THAN MILEAGE OUT' . 000095 05 INVALID-MILES-MSG PIC X(40) 000096 VALUE 'MILES DRIVEN UNREASONABLY LOW'. 000097 05 NON-NUM-RATE-MSG PIC X(40) 000098 VALUE 'NON-NUMERIC MILEAGE RATE'. 000099 05 MILEAGE-RATE-MSG PIC X(40) 000100 VALUE 'MILEAGE RATE OUT OF RANGE'. 000101 05 INSURANCE-MSG PIC X(40) 000102 VALUE 'INSURANCE CODE MUST BE Y OR N'. 000103 000104 01 TODAYS-DATE. 000105 05 TODAYS-YEAR PIC 99. 000106 05 TODAYS-MONTH PIC 99. 000107 05 TODAYS-DAY PIC 99. 000108 000109 01 HEADING-ERROR-LINE-ONE. 000110 05 FILLER PIC X(26) VALUE SPACES. 000111 05 FILLER PIC X(19) 000112 VALUE 'ERROR REPORT AS OF '. 000113 05 HDG-DATE. 000114 10 HDG-MONTH PIC 99/. 000115 10 HDG-DAY PIC 99/. 000116 10 HDG-YEAR PIC 99. 000117 05 FILLER PIC X(79) VALUE SPACES. 000118 000119 01 HEADING-ERROR-LINE-TWO. 000120 05 FILLER PIC X(10) VALUE 'CONTRACT #'. 000121 05 FILLER PIC XX VALUE SPACES. 000122 05 FILLER PIC X(9) VALUE 'LAST NAME'. 000123 05 FILLER PIC X(8) VALUE SPACES. 000124 05 FILLER PIC X(21) 000125 VALUE 'ERROR MESSAGE & FIELD'. 000126 05 FILLER PIC X(21) VALUE SPACES. 000127 05 FILLER PIC X(8) VALUE 'CONTENTS'. 000128 05 FILLER PIC X(46) VALUE SPACES. 000129 000130 01 ERROR-LINE. 000131 05 FILLER PIC XX VALUE SPACES. 000132 05 ERR-CONTRACT-NO PIC 9(6). 000133 05 FILLER PIC X(4) VALUE SPACES. 000134 05 ERR-LAST-NAME PIC X(15). 000135 05 FILLER PIC XX VALUE SPACES. 000136 05 ERR-MESSAGE PIC X(40). 000137 05 FILLER PIC XX VALUE SPACES. 000138 05 ERR-CONTENTS PIC X(23). 000139 05 FILLER PIC X(38) VALUE SPACES. 000140 000141 01 ERROR-DETAILS. 000142 05 ERR-MILES-IN-OUT. 000143 10 FILLER PIC X(4) VALUE 'IN: '. 000144 10 ERR-MILES-IN PIC 9(6). 000145 10 FILLER PIC X(6) VALUE ' OUT: '. 000146 10 ERR-MILES-OUT PIC 9(6). 000147 05 ERR-RETURNED-DATE. 000148 10 ERR-RETURNED-MONTH-DAY. 000149 15 ERR-RETURNED-MONTH PIC 99. 000150 15 ERR-RETURNED-DAY PIC /99. 000151 10 ERR-RETURNED-YEAR PIC /99. 000152 05 ERR-EXPECTED-MILES. 000153 10 FILLER PIC X(6) VALUE 'DAYS: '. 000154 10 ERR-DAYS-RENTED PIC 99. 000155 10 FILLER PIC X(9) VALUE ' MILES: '. 000156 10 ERR-MILES PIC 9(6). 000157 000158 PROCEDURE DIVISION. 000159 000-CREATE-VALID-RENTAL-FILE. 000160 OPEN INPUT RENTAL-FILE 000161 OUTPUT VALID-RENTAL-FILE 000162 ERROR-FILE. 000163 PERFORM 100-GET-TODAYS-DATE. 000164 PERFORM 200-WRITE-ERROR-HEADINGS. 000165 PERFORM 300-READ-RENTAL-RECORD. 000166 PERFORM 400-PROCESS-RENTAL-RECORDS 000167 UNTIL NO-DATA-REMAINS. 000168 CLOSE RENTAL-FILE 000169 VALID-RENTAL-FILE 000170 ERROR-FILE 000171 STOP RUN. 000172 000173 100-GET-TODAYS-DATE. 000174 ACCEPT TODAYS-DATE FROM DATE. 000175 MOVE TODAYS-MONTH TO HDG-MONTH. 000176 MOVE TODAYS-DAY TO HDG-DAY. 000177 MOVE TODAYS-YEAR TO HDG-YEAR. 000178 000179 200-WRITE-ERROR-HEADINGS. 000180 MOVE HEADING-ERROR-LINE-ONE TO ERROR-RECORD. 000181 WRITE ERROR-RECORD 000182 AFTER ADVANCING PAGE. 000183 MOVE HEADING-ERROR-LINE-TWO TO ERROR-RECORD 000184 WRITE ERROR-RECORD 000185 AFTER ADVANCING 2 LINES. 000186 MOVE SPACES TO ERROR-RECORD. 000187 WRITE ERROR-RECORD. 000188 000189 300-READ-RENTAL-RECORD. 000190 READ RENTAL-FILE 000191 AT END MOVE 'NO' TO NO-DATA-REMAINS-SWITCH 000192 END-READ. 000193 000194 400-PROCESS-RENTAL-RECORDS. 000195 MOVE 'YES' TO VALID-RECORD-SWITCH. 000196 PERFORM 500-VALIDATE-RENTAL-RECORD. 000197 PERFORM 600-WRITE-VALID-RECORD. 000198 PERFORM 300-READ-RENTAL-RECORD. 000199 000200 500-VALIDATE-RENTAL-RECORD. 000201 PERFORM 510-VALIDATE-CONTRACT-NO. 000202 PERFORM 520-VALIDATE-NAME. 000203 PERFORM 530-VALIDATE-CAR-TYPE. 000204 PERFORM 540-VALIDATE-DATE-RETURNED. 000205 PERFORM 550-VALIDATE-DAYS-RENTED. 000206 PERFORM 560-VALIDATE-MILES-DRIVEN 000207 PERFORM 570-VALIDATE-MILEAGE-RATE. 000208 PERFORM 580-VALIDATE-INSURANCE. 000209 000210 510-VALIDATE-CONTRACT-NO. 000211 IF REN-CONTRACT-NO NOT NUMERIC 000212 MOVE NON-NUMERIC-CONTRACT-MSG TO ERR-MESSAGE 000213 MOVE REN-CONTRACT-NO TO ERR-CONTENTS 000214 PERFORM 599-WRITE-ERROR-LINE 000215 END-IF. 000216 000217 520-VALIDATE-NAME. 000218 IF REN-LAST-NAME = SPACES 000219 MOVE LAST-NAME-MSG TO ERR-MESSAGE 000220 MOVE SPACES TO ERR-CONTENTS 000221 PERFORM 599-WRITE-ERROR-LINE 000222 END-IF. 000223 IF REN-FIRST-NAME = SPACES 000224 MOVE FIRST-NAME-MSG TO ERR-MESSAGE 000225 MOVE SPACES TO ERR-CONTENTS 000226 PERFORM 599-WRITE-ERROR-LINE 000227 END-IF. 000228 IF REN-INITIAL NOT ALPHABETIC 000229 MOVE INITIAL-MSG TO ERR-MESSAGE 000230 MOVE REN-INITIAL TO ERR-CONTENTS 000231 PERFORM 599-WRITE-ERROR-LINE 000232 END-IF. 000233 000234 530-VALIDATE-CAR-TYPE. 000235 IF NOT VALID-CAR-TYPES 000236 MOVE CAR-TYPE-MSG TO ERR-MESSAGE 000237 MOVE REN-CAR-TYPE TO ERR-CONTENTS 000238 PERFORM 599-WRITE-ERROR-LINE 000239 END-IF. 000240 000241 540-VALIDATE-DATE-RETURNED. 000242 IF VALID-MONTHS 000243 IF 30-DAY-MONTH AND REN-RETURNED-DAY <= 30 OR 000244 31-DAY-MONTH AND REN-RETURNED-DAY <= 31 OR 000245 FEBRUARY AND REN-RETURNED-DAY <= 29 000246 IF REN-RETURNED-DATE > TODAYS-DATE 000247 MOVE FUTURE-DATE-MSG TO ERR-MESSAGE 000248 MOVE REN-RETURNED-MONTH TO ERR-RETURNED-MONTH 000249 MOVE REN-RETURNED-DAY TO ERR-RETURNED-DAY 000250 MOVE REN-RETURNED-YEAR TO ERR-RETURNED-YEAR 000251 MOVE ERR-RETURNED-DATE TO ERR-CONTENTS 000252 PERFORM 599-WRITE-ERROR-LINE 000253 END-IF 000254 ELSE 000255 MOVE DAY-MSG TO ERR-MESSAGE 000256 MOVE REN-RETURNED-MONTH TO ERR-RETURNED-MONTH 000257 MOVE REN-RETURNED-DAY TO ERR-RETURNED-DAY 000258 MOVE ERR-RETURNED-MONTH-DAY TO ERR-CONTENTS 000259 PERFORM 599-WRITE-ERROR-LINE 000260 END-IF 000261 ELSE 000262 MOVE MONTH-MSG TO ERR-MESSAGE 000263 MOVE REN-RETURNED-MONTH TO ERR-CONTENTS 000264 PERFORM 599-WRITE-ERROR-LINE 000265 END-IF. 000266 000267 550-VALIDATE-DAYS-RENTED. 000268 IF REN-DAYS-RENTED NOT NUMERIC 000269 MOVE NON-NUM-DAYS-RENTED-MSG TO ERR-MESSAGE 000270 MOVE REN-DAYS-RENTED TO ERR-CONTENTS 000271 PERFORM 599-WRITE-ERROR-LINE 000272 ELSE 000273 IF ZERO-DAYS-RENTED 000274 MOVE ZERO-DAYS-MSG TO ERR-MESSAGE 000275 MOVE REN-DAYS-RENTED TO ERR-CONTENTS 000276 PERFORM 599-WRITE-ERROR-LINE 000277 ELSE 000278 IF NOT VALID-DAYS-RENTED 000279 MOVE LEASING-MSG TO ERR-MESSAGE 000280 MOVE REN-DAYS-RENTED TO ERR-CONTENTS 000281 PERFORM 599-WRITE-ERROR-LINE 000282 END-IF 000283 END-IF 000284 END-IF. 000285 000286 560-VALIDATE-MILES-DRIVEN. 000287 IF REN-MILES-IN NOT NUMERIC 000288 MOVE NON-NUM-MILES-IN-MSG TO ERR-MESSAGE 000289 MOVE REN-MILES-IN TO ERR-CONTENTS 000290 PERFORM 599-WRITE-ERROR-LINE 000291 ELSE 000292 IF REN-MILES-OUT NOT NUMERIC 000293 MOVE NON-NUM-MILES-OUT-MSG TO ERR-MESSAGE 000294 MOVE REN-MILES-OUT TO ERR-CONTENTS 000295 PERFORM 599-WRITE-ERROR-LINE 000296 ELSE 000297 IF REN-MILES-IN < REN-MILES-OUT 000298 MOVE LESS-THAN-MILES-MSG TO ERR-MESSAGE 000299 MOVE REN-MILES-IN TO ERR-MILES-IN 000300 MOVE REN-MILES-OUT TO ERR-MILES-OUT 000301 MOVE ERR-MILES-IN-OUT TO ERR-CONTENTS 000302 PERFORM 599-WRITE-ERROR-LINE 000303 ELSE 000304 COMPUTE EXPECTED-MILES = 000305 MILES-PER-DAY-FACTOR * REN-DAYS-RENTED 000306 SIZE ERROR DISPLAY 'SIZE ERROR EXPECT MILES' 000307 END-COMPUTE 000308 COMPUTE ACTUAL-MILES = 000309 REN-MILES-IN - REN-MILES-OUT 000310 SIZE ERROR DISPLAY 'SIZE ERROR ACTUAL MILES' 000311 END-COMPUTE 000312 IF ACTUAL-MILES < EXPECTED-MILES 000313 MOVE INVALID-MILES-MSG TO ERR-MESSAGE 000314 MOVE REN-DAYS-RENTED TO ERR-DAYS-RENTED 000315 MOVE ACTUAL-MILES TO ERR-MILES 000316 MOVE ERR-EXPECTED-MILES TO ERR-CONTENTS 000317 PERFORM 599-WRITE-ERROR-LINE 000318 END-IF 000319 END-IF 000320 END-IF 000321 END-IF. 000322 000323 570-VALIDATE-MILEAGE-RATE. 000324 IF REN-MILEAGE-RATE NOT NUMERIC 000325 MOVE NON-NUM-RATE-MSG TO ERR-MESSAGE 000326 MOVE REN-MILEAGE-RATE TO ERR-CONTENTS 000327 PERFORM 599-WRITE-ERROR-LINE 000328 ELSE 000329 IF NOT VALID-MILEAGE-RATES 000330 MOVE MILEAGE-RATE-MSG TO ERR-MESSAGE 000331 MOVE REN-MILEAGE-RATE TO ERR-CONTENTS 000332 PERFORM 599-WRITE-ERROR-LINE 000333 END-IF 000334 END-IF. 000335 000336 580-VALIDATE-INSURANCE. 000337 IF NOT VALID-INSURANCE 000338 MOVE INSURANCE-MSG TO ERR-MESSAGE 000339 MOVE REN-INSURANCE TO ERR-CONTENTS 000340 PERFORM 599-WRITE-ERROR-LINE 000341 END-IF. 000342 000343 599-WRITE-ERROR-LINE. 000344 MOVE 'NO ' TO VALID-RECORD-SWITCH. 000345 MOVE REN-CONTRACT-NO TO ERR-CONTRACT-NO. 000346 MOVE REN-LAST-NAME TO ERR-LAST-NAME. 000347 MOVE ERROR-LINE TO ERROR-RECORD. 000348 WRITE ERROR-RECORD. 000349 000350 600-WRITE-VALID-RECORD. 000351 IF VALID-RECORD 000352 MOVE RENTAL-RECORD TO VALID-RENTAL-RECORD 000353 WRITE VALID-RENTAL-RECORD 000354 ELSE 000355 MOVE SPACES TO ERROR-RECORD 000356 WRITE ERROR-RECORD 000357 END-IF.