Since I've been posting many of my nostalgic 370 Assembler & PeopleSoft works I have the opportunity to combine the two from a single project I worked on.
In 1995, while at GE Capital TIP/Space, I was the lead developer in the implementation of PeopleSoft HRMS/Payroll 4.0 (and Payroll Interface to ADP). Our existing HRMS System was a network database called Repertoire (also referred to as Advanced Revelation) which used R/Basic scripting. Database, network access & reporting was very slow. For the data conversion I decided to create very simple R/Basic extracts from Repertoire & transfer them to the mainframe for processing (Assembler). From there they could be loaded into PeopleSoft via Import Manager.
PeopleSoft HRMS/Payroll 4.0 Conversion
The TDHRxxxx R/Basic Scripts create the initial extracts. TDPSxxx 370 Assembler processes manipulate the data. Import Manager loads the transformed data into PeopleSoft.
Additional Assembler Subroutines for Common Data Transformations:
PROGRAM DESCRIPTION PROGRAM DESCRIPTION
******** *********************************** ******** ***********************************
TDPSAMT ORACLE AMOUNT CONVERSION TDPSLST LAST NAME ISOLATION
TDPSCMP COMPANY CODE CONVERSION TDPSNAM EMPLOYEE NAME CONVERSION
TDPSCON CONTACT RELATION CONVERSION TDPSPLN BENEFIT PLAN CONVERSION
TDPSDAT ORACLE DATE CONVERSION TDPSPOL POLICY# PLAN TYPE CONVERSION
TDPSDEP DEPENDENT NAME CONVERSION TDPSREG REG/TEMP CONVERSION
TDPSEDU EDUCATION CODE CONVERSION TDPSREL DEPENDENT RELATION CONVERSION
TDPSEMP EMPLOYEE NUMBER CONVERSION TDPSSTT STATE/PROVINCE VALIDATION
TDPSEST ESTABLISHMENT ID CONVERSION TDPSTTL POSITION TITLE CONVERSION
TDPSGRP PAY GROUP CONVERSION TDPSTYP TYPE/STATUS CONVERSION
TDPSHIR HIREDATE CONVERSION
******** *********************************** ******** ***********************************
I always build common re-useable libraries to eliminate redundancy & maintain integrity.
Job History Conversion - TDHR007 / TDPS007
Job History is probably the most interesting since it requires the most manipulation.
An employee can have multiple extract records that reflects their history with the company. Each record may contain a segment representing Salary, Job Position, Department and Status history. The multi-value history fields are not sorted & are spread out randomly within the employees extract records. Organizing the data within Revelation via R/Basic is counter productive - the language is inferior & runs very slow. For me, developing on the mainframe with ASM370 is simple & very fast.
Below is the Employee Control Break Routine. All data is stored in a table & manipulated once all records for an employee have been read. I construct the matrix very precisely by untangling the unrelated segments & placing them in logical positions. Then I sort all data at once, fixing positions, error checking & adjusting same day segment activity. When all is well the records are formatted for use by Import Manager & written to the output file.
***********************************************************************
* EMPLOYEE BREAK *
***********************************************************************
DC F'0' RETURN ADDRESS SAVE AREA
CBREAK EQU *
ST 6,*-4 SAVE RETURN ADDRESS
*
CLI PEMP,C'$' 1ST TIME THROUGH ???
BE CBREAK1 YES - BYPASS BREAK
*
BAL 6,SRTTAB SORT HISTORY TABLE
BAL 6,FIXTAB FIX SEQ#/POSITIONS
BAL 6,FRSTLN ADJUST FIRST ENTRY
BAL 6,ERRCHK ERROR CHECK ROUTINE
BAL 6,ADJTAB ADJUST SAME-DAY SEGMENTS
BAL 6,HIRFIX PRIOR HISTORY TEST
BAL 6,STATIC CONVERT STATIC DATA
*
LA 9,TABLE LOAD TABLE ADDRESS
CBREAKO EQU *
CLI 0(9),X'FF' END OF TABLE ???
BE CBREAK1 YES - EXIT ROUTINE
CLC TDATE,EMPTY END OF ENTRIES ???
BE CBREAK1 YES - EXIT ROUTINE
*
BAL 6,CLEAR CLEAR RECORD AREA(S)
BAL 6,CNVREC BUILD CONVERSION RECORD
BAL 6,AUDREC BUILD AUDIT RECORD
*
LA 9,TLEN(,9) BUMP TABLE POINTER
B CBREAKO PROCESS NEXT ENTRY
CBREAK1 EQU *
BAL 6,CLRTAB CLEAR HISTORY TABLE
*
LA 5,ISALARY LOAD SALARY AMOUNT
BAL 6,PAYFRQ VALIDATE PAY FREQUENCY
*
CLC IPOSPSP,ZEROES PS POS NBR-P ZEROES ???
BNE *+10 NO - CONTINUE PLEASE
MVC IPOSPSP,BLANKS YES - REPLACE WITH BLANKS
*
CLC IPOSPSE,ZEROES PS POS NBR-E ZEROES ???
BNE *+10 NO - CONTINUE PLEASE
MVC IPOSPSE,BLANKS YES - REPLACE WITH BLANKS
*
CLC IRECENT,BLANKS RECENT HIRE MISSING ???
BNE *+10 NO - CONTINUE PLEASE
MVC IRECENT,IHIRE YES - SET TO HIRE DATE
*
MVC PDATA,IDATA RESET EMPLOYEE DATA
*
OC ISALMAX,ZEROES TURN ON ALL ZONE BITS
OC IJOBMAX,ZEROES TURN ON ALL ZONE BITS
OC IDEPMAX,ZEROES TURN ON ALL ZONE BITS
OC ISTAMAX,ZEROES TURN ON ALL ZONE BITS
PACK PSALMAX,ISALMAX SALARY - MAXIMUM SEQUENCE
PACK PJOBMAX,IJOBMAX JOB - MAXIMUM SEQUENCE
PACK PDEPMAX,IDEPMAX DEPT - MAXIMUM SEQUENCE
PACK PSTAMAX,ISTAMAX STATUS - MAXIMUM SEQUENCE
CBREAKX EQU *
L 6,CBREAK-4 RESTORE LINK REGISTER
BR 6 BRANCH ON LINK REGISTER
***********************************************************************
Below is my sort routine for the array. Just a simple Bubble Sort...
***********************************************************************
* SORT HISTORY TABLE *
***********************************************************************
DC F'0' RETURN ADDRESS SAVE AREA
SRTTAB EQU *
ST 6,*-4 SAVE RETURN ADDRESS
*
MVC TRACE(6),=C'START ' SET TRACE DESCRIPTION
BAL 6,TRCTAB WRITE TRACE TABLE
*
LA 4,TABLE INIT LO PTR - 1ST ENTRY
LA 5,TLEN(,4) INIT HI PTR - 2ND ENTRY
SORTIT EQU *
CLC 0(12,4),0(5) IS LO ENTRY > HI ENTRY ??
BNH BUMPHI NO - BUMP HI PTR
XC 0(TLEN,4),0(5) YES - ISOLATE UNIQUE BITS
XC 0(TLEN,5),0(4) REPLACE LO WITH HI ENTRY
XC 0(TLEN,4),0(5) REPLACE HI WITH LO ENTRY
BUMPHI EQU *
LA 5,TLEN(,5) BUMP HI POINTER
C 5,TLAST HI POINTER PAST LIMIT ??
BNH SORTIT NO - COMPARE AGAIN
BUMPLO EQU *
LA 4,TLEN(,4) YES - BUMP LO POINTER
LA 5,TLEN(,4) RESET HI PTR = LO + 1
C 4,TLAST LO POINTER PAST LIMIT ??
BL SORTIT NO - KEEP SORTING
*
MVC TRACE(6),=C'SRTTAB' SET TRACE DESCRIPTION
BAL 6,TRCTAB WRITE TRACE TABLE
SRTTABX EQU *
L 6,SRTTAB-4 RESTORE LINK REGISTER
BR 6 BRANCH ON LINK REGISTER
***********************************************************************
Repertoire Human Resource System - Job History Extract
Repertoire is a DOS-based HR System that uses an Advanced Revelation Database & the R/Basic language to access data. Running processes, even simple ones, can be very slow on the network (circa 1995). This is a portion of the Job History Extract Module. The data uses a combination of Single Value & Multi Value fields to formulate the output records. The history data for various segments - Salary, Job, Department & Status - is not sorted properly within the system. That's fine. All complex manipulation, validation & sorting is performed afterwards by the Assembler module. R/Basic is used stricty for extracting raw data - nothing more.
***********************************************************************
* *
* MODULE: TDHR007.CONV *
* AUTHOR: TONY DELIA. *
* DATE: 06/09/95. *
* DESC: H/R PEOPLE-SOFT CONVERSION PROGRAM 007. *
* CONV: HISTORY DATA. *
* *
***********************************************************************
<SNIP>...
***********************************************************************
* BUILD CONVERSION RECORD - SINGLE VALUES *
***********************************************************************
CONV.INIT:
MV = 1
CONV.REC(1) = XLATE('EMP',ID,'EMP.NO','X') 'L#8'
CONV.REC(2) = EMP.REC<POS.EMP.COMPANY.NO> 'L#3'
CONV.REC(3) = MV 'R#3'
CONV.REC(4) = MV.MAX 'R#3'
CONV.REC(5) = EMP.REC<POS.EMP.REG.TEMP> 'L#1'
CONV.REC(6) = EMP.REC<POS.EMP.EMP.TYPE> 'L#1'
CONV.REC(7) = EMP.REC<POS.EMP.DEPT.NO> 'L#6'
CONV.REC(8) = OCONV(EMP.REC<POS.EMP.NEXT.SAL.DATE>,"D/J") 'L#10'
CONV.REC(9) = EMP.REC<POS.EMP.GE.POSITION> 'L#5'
CONV.REC(10) = EMP.REC<POS.EMP.POSITION.NO> 'L#10'
POS.KEY = EMP.REC<POS.EMP.POSITION.NO>
CONV.REC(11) = XLATE('EMP',ID,'PS.POSITION.NBR','X') 'R(0)#8'
CONV.REC(12) = XLATE('POS.TABLE',POS.KEY,'PS.POSITION.NBR','X') 'R(0)#8'
CONV.REC(13) = EMP.REC<POS.EMP.STATUS> 'L#1'
CONV.REC(14) = EMP.REC<POS.EMP.SALARY> 'R#10'
CONV.REC(15) = XLATE('EMP',ID,'RATE','X') 'L#1'
CONV.REC(16) = EMP.REC<POS.EMP.JOB.NO> 'L#6'
CONV.REC(17) = XLATE('EMP',ID,'JOB1','X') 'L#10'
GE.KEY = EMP.REC<POS.EMP.GE.POSITION>
CONV.REC(18) = XLATE('USER.TABLE1',GE.KEY,'CUSTOM1','X') 'L#25'
CONV.REC(19) = OCONV(EMP.REC<POS.EMP.HIRE.DATE>,"D/J") 'L#10'
CONV.REC(20) = OCONV(EMP.REC<POS.EMP.MOST.RECENT.HIRE>,"D/J") 'L#10'
RETURN
***********************************************************************
* BUILD CONVERSION RECORD - MULTI VALUES *
***********************************************************************
CONV.LINE:
CONV.REC(3) = MV 'R#3'
CONV.REC(21) = MV.MX1 'R#3'
CONV.REC(22) = OCONV(EMP.REC<POS.EMP.SALARY.DATES,MV>,"D/J") 'L#10'
CONV.REC(23) = EMP.REC<POS.EMP.SALARIES,MV> 'R#10'
CONV.REC(24) = EMP.REC<POS.EMP.RATES,MV> 'L#2'
CONV.REC(25) = EMP.REC<POS.EMP.INC.AMTS,MV> 'R#10'
CONV.REC(26) = EMP.REC<POS.EMP.INC.PERCENTS,MV> 'R#10'
CONV.REC(27) = EMP.REC<POS.EMP.INC.CODES,MV> 'L#3'
CONV.REC(28) = MV.MX2 'R#3'
CONV.REC(29) = OCONV(EMP.REC<POS.EMP.JOB.DATES,MV>,"D/J") 'L#10'
CONV.REC(30) = EMP.REC<POS.EMP.JOB.NOS,MV> 'L#8'
CONV.REC(31) = EMP.REC<POS.EMP.JOB.TITLES,MV> 'L#25'
JOB.KEY = EMP.REC<POS.EMP.JOB.NOS,MV>
CONV.REC(32) = XLATE('JOB.TABLE',JOB.KEY,'GRADE','X') 'R(0)#4'
CONV.REC(33) = EMP.REC<POS.EMP.JOB.CODES,MV> 'L#3'
CONV.REC(34) = XLATE('JOB.TABLE',JOB.KEY,'JOB1','X') 'L#10'
CONV.REC(35) = EMP.REC<POS.EMP.GE.POSITIONS,MV> 'L#4'
GE.KEY = EMP.REC<POS.EMP.GE.POSITIONS,MV>
CONV.REC(36) = XLATE('USER.TABLE1',GE.KEY,'CUSTOM1','X') 'L#25'
CONV.REC(37) = MV.MX3 'R#3'
CONV.REC(38) = OCONV(EMP.REC<POS.EMP.DEPT.DATES,MV>,"D/J") 'L#10'
CONV.REC(39) = EMP.REC<POS.EMP.DEPT.NOS,MV> 'L#8'
CONV.REC(40) = EMP.REC<POS.EMP.DEPT.NAMES,MV> 'L#20'
DEP.KEY = EMP.REC<POS.EMP.DEPT.NOS,MV>
CONV.REC(41) = XLATE('DEPT.TABLE',DEP.KEY,'PS.DEPT.NO','X') 'R(0)#6'
CONV.REC(42) = XLATE('DEPT.TABLE',DEP.KEY,'LOCATION','X') 'L#6'
CONV.REC(43) = MV.MX4 'R#3'
CONV.REC(44) = OCONV(EMP.REC<POS.EMP.STATUS.DATES,MV>,"D/J") 'L#10'
CONV.REC(45) = EMP.REC<POS.EMP.STATUS.CODES,MV> 'L#3'
CONV.REC(46) = EMP.REC<POS.EMP.REASON.CODES,MV> 'R#3'
DOS.LINE = ''
FOR X = 1 TO CONV.MAX
DOS.LINE := CONV.REC(X)
NEXT X
DOS.REC<-1> = DOS.LINE
RETURN
***********************************************************************
<SNIP>
Back to the TDPS007 Assembler Program - this is the Input Record Layout.
***********************************************************************
* H/R CONVERSION RECORD - INPUT *
***********************************************************************
IREC DS 0CL400 H/R CONVERSION RECORD
IDATA DS 0CL(IDATAX-IEMP) DATA - START SEGMENT
IEMP DC CL8'000000' EMPLOYEE ID NUMBER
ICO DC CL3' ' COMPANY CODE
ISEQ DC CL3' ' SEQUENCE
IMAX DC CL3' ' MAXIMUM SEQUENCE
IREG DC CL1' ' REG/TEMP/FULL/PART
ITYPE DC CL1' ' TYPE (EXEMPT/NON-EXEMPT)
IDEPT DC CL6' ' DEPARTMENT
INXTPRF DC CL10'YYYY-MM-DD' NEXT REVIEW DATE
IPOSGE DC CL5' ' GE POSITION NUMBER
IPOSNO DC CL10' ' POSITION NUMBER
IPOSPSE DC CL8' ' PS POSITION NUMBER-E (EMP)
IPOSPSP DC CL8' ' PS POSITION NUMBER-P (POS)
ISTAT DC CL1' ' CURRENT STATUS CODE
ISALARY DC CL10'-ZZZZZZZ99' CURRENT SALARY AMOUNT
IRATE DC CL1' ' CURRENT RATE CODE (A/H)
IJOB# DC CL6' ' CURRENT JOB NUMBER
IJOB#1 DC CL10' ' CURRENT JOB 1
ICUSTOM DC CL25' ' CURRENT CUSTOM USER.TAB1
IHIRE DC CL10'YYYY-MM-DD' HIRE DATE
IRECENT DC CL10'YYYY-MM-DD' MOST RECENT HIRE DATE
IDATAX EQU * DATA - END SEGMENT
*
ISALSEG DS 0CL(ISALX-ISALMAX) SALARY - START SEGMENT
ISALMAX DC CL3' ' SALARY - MAXIMUM SEQUENCE
ISALDATE DC CL10'YYYY-MM-DD' SALARY - DATE
ISALAMT DC CL10'-ZZZZZZZ99' SALARY - AMOUNT
ISALRATE DC CL2' ' SALARY - RATES
ISALINCR DC CL10'-ZZZZZZZ99' SALARY - INCR.AMOUNT
ISALPCTG DC CL10'-ZZZZZZZ99' SALARY - INCR.PERCENT
ISALCODE DC CL3' ' SALARY - INCR.CODE
ISALX EQU * SALARY - END SEGMENT
*
IJOBSEG DS 0CL(IJOBX-IJOBMAX) JOB - START SEGMENT
IJOBMAX DC CL3' ' JOB - MAXIMUM SEQUENCE
IJOBDATE DC CL10'YYYY-MM-DD' JOB - DATE
IJOBNO DC CL8' ' JOB - NUMBER
IJOBTTL DC CL25' ' JOB - TITLE
IJOBGRD DC CL4' ' JOB - GRADES
IJOBCODE DC CL3' ' JOB - CODE
IJOB1 DC CL10' ' JOB - JOB1
IJOBGE DC CL4' ' JOB - GE POSITION
IJOBCUS DC CL25' ' JOB - CUSTOM USER.TAB1
IJOBX EQU * JOB - END SEGMENT
*
IDEPSEG DS 0CL(IDEPX-IDEPMAX) DEPT - START SEGMENT
IDEPMAX DC CL3' ' DEPT - MAXIMUM SEQUENCE
IDEPDATE DC CL10'YYYY-MM-DD' DEPT - DATE
IDEPNO DC CL8' ' DEPT - NUMBER
IDEPNAME DC CL20' ' DEPT - NAME
IDEPPS DC CL6' ' DEPT - PS DEPT NO
IDEPLOC DC CL6' ' DEPT - LOCATION
IDEPX EQU * DEPT - END SEGMENT
*
ISTASEG DS 0CL(ISTAX-ISTAMAX) STATUS - START SEGMENT
ISTAMAX DC CL3' ' STATUS - MAXIMUM SEQUENCE
ISTADATE DC CL10'YYYY-MM-DD' STATUS - DATE
ISTACODE DC CL3' ' STATUS - CODE
ISTAREAS DC CL3' ' STATUS - REASON
ISTAX EQU * STATUS - END SEGMENT
*
IFILL DS CL(L'IREC-(*-IREC)) FILLER
***********************************************************************
All the conversion programs follow the same high coding standards despite developing these rapidly. I was committed to many other projects during this time including company acquisitions.
JCL - Running the Conversion Jobs
//*********************************************************************
//* PEOPLESOFT CONVERSION 007 *
//*********************************************************************
//TDPS007 EXEC PGM=TDPS007,PARM='YYYY/MM/DD'
//STEPLIB DD DISP=SHR,DSN=G1TT00AT.LOAD.LIB
//SYSOUT DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSUDUMP DD SYSOUT=*
//PRINTER DD SYSOUT=*
//CARDIN DD DISP=SHR,DSN=G1TTTDT.HR00.EMPNO
//STDWKI DD DISP=OLD,DSN=G1TTTDT.HR07.INPUT
//STDWKO DD DISP=OLD,DSN=G1TTTDT.HR07.OUTPUT,
// DCB=(RECFM=FB,LRECL=400,BLKSIZE=24000)
//STDWKA DD DISP=OLD,DSN=G1TTTDT.HR07.AUDIT,
// DCB=(RECFM=FB,LRECL=400,BLKSIZE=24000)
//STDWKT DD DUMMY,DCB=BLKSIZE=300
//*********************************************************************
The JCL Step to run the TDPS007 Job History Conversion is above. It's a portion of several JCL streams ($STEP1 thru $STEP5) that handle all the conversion, import & reporting functions. When one stream completes it kicks off the next one. All conversion functionality is performed by a single SUBMIT job command - with the exception of PeopleSoft Import Manager.
Complete Assembler Program - TDPS007 - Job History Conversion
TITLE 'TDPS007 - H/R PEOPLESOFT CONVERSION 007 // DELIA'
***********************************************************************
* *
* MODULE: TDPS007. *
* AUTHOR: TONY DELIA. *
* DATE: 07/25/95. *
* DESC: H/R PEOPLESOFT CONVERSION 007. *
* CONV: HISTORY DATA. *
* *
***********************************************************************
EJECT
***********************************************************************
* T D P S 0 0 7 P R O G R A M *
***********************************************************************
TDPS007 SETUP REGS=(12,11,10) BEGIN PROGRAM
***********************************************************************
* MAINLINE PROCEDURE *
***********************************************************************
PRINT NOGEN
USING TDSECT,9 USING TABLE DSECT
BAL 6,GETPARM GET PARM INFORMATION
OPEN (STDWKI,(INPUT)) OPEN INPUT FILE
OPEN (STDWKA,(OUTPUT)) OPEN AUDIT FILE
OPEN (STDWKO,(OUTPUT)) OPEN OUTPUT FILE
OPEN (STDWKT,(OUTPUT)) OPEN TRACE FILE
GETI EQU *
GET STDWKI,IREC READ INPUT RECORD
*
CLC IEMP,PEMP EMPLOYEE BREAK ???
BE *+8 NO - ENTER TABLE ENTRY
BAL 6,CBREAK YES - PROCESS BREAK
ACCUM EQU *
BAL 6,UPDTAB UPDATE HISTORY TABLE
B GETI READ NEXT RECORD
EOFI EQU *
BAL 6,CBREAK PROCESS FINAL BREAK
CLOSE STDWKI CLOSE INPUT FILE
CLOSE STDWKA CLOSE AUDIT FILE
CLOSE STDWKO CLOSE OUTPUT FILE
CLOSE STDWKT CLOSE TRACE FILE
B RETURN EXIT PROGRAM PLEASE
***********************************************************************
EJECT
***********************************************************************
* UPDATE HISTORY TABLE *
***********************************************************************
DC F'0' RETURN ADDRESS SAVE AREA
UPDTAB EQU *
ST 6,*-4 SAVE RETURN ADDRESS
*
CLC IJOBGRD,ZEROES JOB GRADE ZEROES ???
BNE *+10 NO - CONTINUE PLEASE
MVC IJOBGRD,BLANKS YES - REPLACE WITH BLANKS
*
CLC IDEPPS,ZEROES PS DEPT# ZEROES ???
BNE *+10 NO - CONTINUE PLEASE
MVC IDEPPS,BLANKS YES - REPLACE WITH BLANKS
*
PACK WSEQ,ISEQ PACK SEQUENCE NUMBER
UPDSAL EQU *
CP PSALMAX,WSEQ PAST MAXIMUM ENTRIES ???
BL UPDJOB YES - TEST NEXT SEGMENT
CLC ISALDATE,BLANKS SEGMENT DATE BLANK ???
BE UPDJOB YES - TEST NEXT SEGMENT
LA 5,ISALAMT LOAD SALARY AMOUNT
BAL 6,PAYFRQ VALIDATE PAY FREQUENCY
MVI WBITS,@SAL SET SEGMENT BITS
MVC WDATE,ISALDATE SET DATE FIELD
BAL 6,FNDTAB FIND TABLE POSITION
MVC TSALSEG,ISALSEG MOVE SEGMENT TO TABLE
UPDJOB EQU *
CP PJOBMAX,WSEQ PAST MAXIMUM ENTRIES ???
BL UPDDEP YES - TEST NEXT SEGMENT
CLC IJOBDATE,BLANKS SEGMENT DATE BLANK ???
BE UPDDEP YES - TEST NEXT SEGMENT
MVI WBITS,@JOB SET SEGMENT BITS
MVC WDATE,IJOBDATE SET DATE FIELD
BAL 6,FNDTAB FIND TABLE POSITION
MVC TJOBSEG,IJOBSEG MOVE SEGMENT TO TABLE
UPDDEP EQU *
CP PDEPMAX,WSEQ PAST MAXIMUM ENTRIES ???
BL UPDSTA YES - TEST NEXT SEGMENT
CLC IDEPDATE,BLANKS SEGMENT DATE BLANK ???
BE UPDSTA YES - TEST NEXT SEGMENT
MVI WBITS,@DEP SET SEGMENT BITS
MVC WDATE,IDEPDATE SET DATE FIELD
BAL 6,FNDTAB FIND TABLE POSITION
MVC TDEPSEG,IDEPSEG MOVE SEGMENT TO TABLE
UPDSTA EQU *
CP PSTAMAX,WSEQ PAST MAXIMUM ENTRIES ???
BL UPDTABX YES - EXIT ROUTINE PLEASE
CLC ISTADATE,BLANKS SEGMENT DATE BLANK ???
BE UPDTABX YES - TEST NEXT SEGMENT
MVI WBITS,@STA SET SEGMENT BITS
MVC WDATE,ISTADATE SET DATE FIELD
BAL 6,FNDTAB FIND TABLE POSITION
MVC TSTASEG,ISTASEG MOVE SEGMENT TO TABLE
UPDTABX EQU *
L 6,UPDTAB-4 RESTORE LINK REGISTER
BR 6 BRANCH ON LINK REGISTER
***********************************************************************
EJECT
***********************************************************************
* FIND/CREATE TABLE ENTRY *
***********************************************************************
DC F'0' RETURN ADDRESS SAVE AREA
FNDTAB EQU *
ST 6,*-4 SAVE RETURN ADDRESS
*
ZAP WCTR,=P'99' INIT SEQUENCE COUNTER
XC HALF,HALF INIT HALF-WORD
MVC HALF+1(1),WBITS MOVE SEGMENT BITS
*
LA 9,TABLE LOAD TABLE ADDRESS
FNDLOOP EQU *
CLI 0(9),X'FF' END OF TABLE ???
BE ABEND1 YES - ABEND PLEASE
*
CLC TDATE,EMPTY EMPTY POSITION ???
BE FNDNEW YES - CREATE ENTRY
CLC TDATE,WDATE DATE MATCH ???
BNE FNDNXT NO - BUMP TABLE POINTER
*
LH 2,HALF LOAD SEGMENT BITS
EX 2,FNDMSK SEGMENT LOADED ???
BNO FNDHIT NO - CREATE NEW ENTRY
ZAP WCTR,TSEQ YES - SAVE SEQUENCE NUMBER
SP WCTR,=P'1' DECREMENT SEQUENCE COUNTER
FNDNXT EQU *
LA 9,TLEN(,9) BUMP TABLE POINTER
B FNDLOOP TEST NEXT ENTRY
FNDNEW EQU *
MVC TDATE,WDATE CREATE NEW ENTRY
ZAP TSEQ,WCTR SET SEQUENCE NUMBER
FNDHIT EQU *
OC TBITS,WBITS SET SEGMENT BITS
FNDTABX EQU *
L 6,FNDTAB-4 RESTORE LINK REGISTER
BR 6 BRANCH ON LINK REGISTER
***********************************************************************
FNDMSK TM TBITS,X'00' SEGMENT BITS (TM INSTR)
***********************************************************************
EJECT
***********************************************************************
* EMPLOYEE BREAK *
***********************************************************************
DC F'0' RETURN ADDRESS SAVE AREA
CBREAK EQU *
ST 6,*-4 SAVE RETURN ADDRESS
*
CLI PEMP,C'$' 1ST TIME THROUGH ???
BE CBREAK1 YES - BYPASS BREAK
*
BAL 6,SRTTAB SORT HISTORY TABLE
BAL 6,FIXTAB FIX SEQ#/POSITIONS
BAL 6,FRSTLN ADJUST FIRST ENTRY
BAL 6,ERRCHK ERROR CHECK ROUTINE
BAL 6,ADJTAB ADJUST SAME-DAY SEGMENTS
BAL 6,HIRFIX PRIOR HISTORY TEST
BAL 6,STATIC CONVERT STATIC DATA
*
LA 9,TABLE LOAD TABLE ADDRESS
CBREAKO EQU *
CLI 0(9),X'FF' END OF TABLE ???
BE CBREAK1 YES - EXIT ROUTINE
CLC TDATE,EMPTY END OF ENTRIES ???
BE CBREAK1 YES - EXIT ROUTINE
*
BAL 6,CLEAR CLEAR RECORD AREA(S)
BAL 6,CNVREC BUILD CONVERSION RECORD
BAL 6,AUDREC BUILD AUDIT RECORD
*
LA 9,TLEN(,9) BUMP TABLE POINTER
B CBREAKO PROCESS NEXT ENTRY
CBREAK1 EQU *
BAL 6,CLRTAB CLEAR HISTORY TABLE
*
LA 5,ISALARY LOAD SALARY AMOUNT
BAL 6,PAYFRQ VALIDATE PAY FREQUENCY
*
CLC IPOSPSP,ZEROES PS POS NBR-P ZEROES ???
BNE *+10 NO - CONTINUE PLEASE
MVC IPOSPSP,BLANKS YES - REPLACE WITH BLANKS
*
CLC IPOSPSE,ZEROES PS POS NBR-E ZEROES ???
BNE *+10 NO - CONTINUE PLEASE
MVC IPOSPSE,BLANKS YES - REPLACE WITH BLANKS
*
CLC IRECENT,BLANKS RECENT HIRE MISSING ???
BNE *+10 NO - CONTINUE PLEASE
MVC IRECENT,IHIRE YES - SET TO HIRE DATE
*
MVC PDATA,IDATA RESET EMPLOYEE DATA
*
OC ISALMAX,ZEROES TURN ON ALL ZONE BITS
OC IJOBMAX,ZEROES TURN ON ALL ZONE BITS
OC IDEPMAX,ZEROES TURN ON ALL ZONE BITS
OC ISTAMAX,ZEROES TURN ON ALL ZONE BITS
PACK PSALMAX,ISALMAX SALARY - MAXIMUM SEQUENCE
PACK PJOBMAX,IJOBMAX JOB - MAXIMUM SEQUENCE
PACK PDEPMAX,IDEPMAX DEPT - MAXIMUM SEQUENCE
PACK PSTAMAX,ISTAMAX STATUS - MAXIMUM SEQUENCE
CBREAKX EQU *
L 6,CBREAK-4 RESTORE LINK REGISTER
BR 6 BRANCH ON LINK REGISTER
***********************************************************************
EJECT
***********************************************************************
* SORT HISTORY TABLE *
***********************************************************************
DC F'0' RETURN ADDRESS SAVE AREA
SRTTAB EQU *
ST 6,*-4 SAVE RETURN ADDRESS
*
MVC TRACE(6),=C'START ' SET TRACE DESCRIPTION
BAL 6,TRCTAB WRITE TRACE TABLE
*
LA 4,TABLE INIT LO PTR - 1ST ENTRY
LA 5,TLEN(,4) INIT HI PTR - 2ND ENTRY
SORTIT EQU *
CLC 0(12,4),0(5) IS LO ENTRY > HI ENTRY ??
BNH BUMPHI NO - BUMP HI PTR
XC 0(TLEN,4),0(5) YES - ISOLATE UNIQUE BITS
XC 0(TLEN,5),0(4) REPLACE LO WITH HI ENTRY
XC 0(TLEN,4),0(5) REPLACE HI WITH LO ENTRY
BUMPHI EQU *
LA 5,TLEN(,5) BUMP HI POINTER
C 5,TLAST HI POINTER PAST LIMIT ??
BNH SORTIT NO - COMPARE AGAIN
BUMPLO EQU *
LA 4,TLEN(,4) YES - BUMP LO POINTER
LA 5,TLEN(,4) RESET HI PTR = LO + 1
C 4,TLAST LO POINTER PAST LIMIT ??
BL SORTIT NO - KEEP SORTING
*
MVC TRACE(6),=C'SRTTAB' SET TRACE DESCRIPTION
BAL 6,TRCTAB WRITE TRACE TABLE
SRTTABX EQU *
L 6,SRTTAB-4 RESTORE LINK REGISTER
BR 6 BRANCH ON LINK REGISTER
***********************************************************************
EJECT
***********************************************************************
* FIX SEQUENCE NUMBERS/JOB POSITIONS *
***********************************************************************
DC F'0' RETURN ADDRESS SAVE AREA
FIXTAB EQU *
ST 6,*-4 SAVE RETURN ADDRESS
*
ZAP WCTR,=P'0' INIT ADJUSTMENT COUNT
LA 9,TABLE LOAD TABLE ADDRESS
LA 8,POSTAB LOAD POSITION ADDRESS
FIXLP1 EQU *
CLI TDATE,X'FF' END OF TABLE ???
BE FIXLP2 YES - MAKE ADJUSTMENTS
CLC TDATE,EMPTY EMPTY TABLE SLOT ???
BE FIXLP2 YES - MAKE ADJUSTMENTS
TM TBITS,@JOB JOB SEGMENT ???
BNO FIXBP1 NO - CONTINUE PLEASE
*
CLC TJOBGE,BLANKS MISSING POSITION ???
BE FIXBP1 YES - BYPASS POSITION
AP WCTR,=P'1' INCREMENT POSITIONS
MVC 0(4,8),TJOBGE MOVE POSITION NUMBER
MVI 4(8),C' ' INIT POSITION SOURCE
MVC 5(25,8),TJOBCUS MOVE POSITION TITLE
LA 8,30(,8) BUMP POSITION POINTER
FIXBP1 EQU *
LA 9,TLEN(,9) BUMP TABLE POINTER
B FIXLP1 TEST NEXT TABLE ENTRY
FIXLP2 EQU *
CP WCTR,PJOBMAX MAXIMUM JOB SEGMENTS ???
BNL FIXGO3 YES - REALIGN POSITIONS
AP WCTR,=P'1' INCREMENT POSITIONS
MVC 0(4,8),PPOSGE MOVE CURRENT POSITION
MVI 4(8),C'*' MOVE POSITION SOURCE
MVC 5(25,8),PCUSTOM MOVE CURRENT TITLE
LA 8,30(,8) BUMP POSITION POINTER
B FIXLP2 ADJUST NEXT POSITION
FIXGO3 EQU *
ZAP WCTR,=P'0' INIT EFFECTIVE SEQUENCE
MVC WDATE,=10X'AA' INIT PREVIOUS DATE
LA 9,TABLE LOAD TABLE ADDRESS
LA 8,POSTAB LOAD POSITION ADDRESS
FIXLP3 EQU *
CLI TDATE,X'FF' END OF TABLE ???
BE FIXTABT YES - EXIT ROUTINE
CLC TDATE,EMPTY EMPTY TABLE SLOT ???
BE FIXTABT YES - EXIT ROUTINE
TM TBITS,@JOB JOB SEGMENT ???
BNO FIXBP3 NO - CONTINUE PLEASE
*
MVC TJOBGE,0(8) MOVE POSITION NUMBER
MVC TJOBCUS,5(8) MOVE POSITION TITLE
CLI 4(8),C'*' CURRENT POSITION ???
BNE *+10 NO - CONTINUE PLEASE
OC TERRS,SET14 YES - SET ERROR BITS
*
LA 8,30(,8) BUMP POSITION POINTER
FIXBP3 EQU *
AP WCTR,=P'1' INCREMENT EFF.SEQUENCE
CLC WDATE,TDATE DUPLICATE DATE ???
BE *+10 YES - CONTINUE PLEASE
ZAP WCTR,=P'0' NO - RESET EFF.SEQUENCE
*
ZAP TSEQ,WCTR RESET EFFECTIVE SEQ#
MVC WDATE,TDATE RESET EFFECTIVE DATE
LA 9,TLEN(,9) BUMP TABLE POINTER
B FIXLP3 TEST NEXT TABLE ENTRY
FIXTABT EQU *
MVC TRACE(6),=C'FIXTAB' SET TRACE DESCRIPTION
BAL 6,TRCTAB WRITE TRACE TABLE
FIXTABX EQU *
L 6,FIXTAB-4 RESTORE LINK REGISTER
BR 6 BRANCH ON LINK REGISTER
***********************************************************************
EJECT
***********************************************************************
* ADJUST FIRST TABLE ENTRY (SAME-DAY SEGMENT ACTIVITY) *
***********************************************************************
DC F'0' RETURN ADDRESS SAVE AREA
FRSTLN EQU *
ST 6,*-4 SAVE RETURN ADDRESS
*
LA 9,TABLE LOAD TABLE ADDRESS
*
MVI FRSSAL+1,X'00' INIT SALARY TEST SWITCH
MVI FRSJOB+1,X'00' INIT JOB TEST SWITCH
MVI FRSDEP+1,X'00' INIT DEPT TEST SWITCH
MVI FRSSTA+1,X'00' INIT STATUS TEST SWITCH
*
MVC HSALSEG,TSALSEG INIT FIRST SAL SEGMENT
MVC HJOBSEG,TJOBSEG INIT FIRST JOB SEGMENT
MVC HDEPSEG,TDEPSEG INIT FIRST DEP SEGMENT
MVC HSTASEG,TSTASEG INIT FIRST STA SEGMENT
FRSTLP EQU *
CLI TDATE,X'FF' END OF TABLE ???
BE FRSTST YES - MAKE ADJUSTMENTS
CLC TDATE,EMPTY EMPTY TABLE SLOT ???
BE FRSTST YES - MAKE ADJUSTMENTS
CLC TDATE,TABLE 1ST ENTRY DATE ???
BH FRSTST NO - SET 1ST ENTRY LINE
FRSSAL BC 0,FRSJOB
TM TBITS,@SAL SALARY SEGMENT ???
BNO FRSJOB NO - CONTINUE PLEASE
OI FRSSAL+1,X'F0' RESET TEST SWITCH
MVC HSALSEG,TSALSEG REPLACE FIRST SEGMENT
FRSJOB BC 0,FRSDEP
TM TBITS,@JOB JOB SEGMENT ???
BNO FRSDEP NO - CONTINUE PLEASE
OI FRSJOB+1,X'F0' RESET TEST SWITCH
MVC HJOBSEG,TJOBSEG REPLACE FIRST SEGMENT
FRSDEP BC 0,FRSSTA
TM TBITS,@DEP DEPT SEGMENT ???
BNO FRSSTA NO - CONTINUE PLEASE
OI FRSDEP+1,X'F0' RESET TEST SWITCH
MVC HDEPSEG,TDEPSEG REPLACE FIRST SEGMENT
FRSSTA BC 0,FRSBMP
TM TBITS,@STA STATUS SEGMENT ???
BNO FRSBMP NO - CONTINUE PLEASE
OI FRSSTA+1,X'F0' RESET TEST SWITCH
MVC HSTASEG,TSTASEG REPLACE FIRST SEGMENT
FRSBMP EQU *
LA 9,TLEN(,9) BUMP TABLE POINTER
B FRSTLP TEST NEXT TABLE ENTRY
FRSTST EQU *
LA 9,TABLE LOAD TABLE ADDRESS
CLI FRSSAL+1,X'00' REPLACE SEGMENT ???
BE *+22 NO - CONTINUE PLEASE
TM TBITS,@SAL SEGMENT PRESENT ???
BO *+14 YES - CONTINUE PLEASE
OI TBITS,@SAL SET SEGMENT BITS
MVC TSALSEG,HSALSEG MOVE FIRST OCCURRANCE
*
CLI FRSJOB+1,X'00' REPLACE SEGMENT ???
BE *+22 NO - CONTINUE PLEASE
TM TBITS,@JOB SEGMENT PRESENT ???
BO *+14 YES - CONTINUE PLEASE
OI TBITS,@JOB SET SEGMENT BITS
MVC TJOBSEG,HJOBSEG MOVE FIRST OCCURRANCE
*
CLI FRSDEP+1,X'00' REPLACE SEGMENT ???
BE *+22 NO - CONTINUE PLEASE
TM TBITS,@DEP SEGMENT PRESENT ???
BO *+14 YES - CONTINUE PLEASE
OI TBITS,@DEP SET SEGMENT BITS
MVC TDEPSEG,HDEPSEG MOVE FIRST OCCURRANCE
*
CLI FRSSTA+1,X'00' REPLACE SEGMENT ???
BE *+22 NO - CONTINUE PLEASE
TM TBITS,@STA SEGMENT PRESENT ???
BO *+14 YES - CONTINUE PLEASE
OI TBITS,@STA SET SEGMENT BITS
MVC TSTASEG,HSTASEG MOVE FIRST OCCURRANCE
*
MVC TRACE(6),=C'FRSTLN' SET TRACE DESCRIPTION
BAL 6,TRCTAB WRITE TRACE TABLE
FRSTLNX EQU *
L 6,FRSTLN-4 RESTORE LINK REGISTER
BR 6 BRANCH ON LINK REGISTER
***********************************************************************
EJECT
***********************************************************************
* ERROR CHECK *
***********************************************************************
DC F'0' RETURN ADDRESS SAVE AREA
ERRCHK EQU *
ST 6,*-4 SAVE RETURN ADDRESS
*
MVC PERRS,=X'0000' INIT ERROR BITS
MVI PBITS,X'00' INIT SEGMENT BITS
MVC WJOB,BLANKS INIT EARLIEST JOB DATE
MVI ERRBIT+1,X'00' INIT SEGMENT BIT TEST
MVI ERRSAL2+1,X'00' INIT HIRE DATE TEST
MVI ERRJOB2+1,X'00' INIT HIRE DATE TEST
MVI ERRDEP2+1,X'00' INIT HIRE DATE TEST
MVI ERRSTA2+1,X'00' INIT HIRE DATE TEST
*
CLC PPOSPSE,BLANKS PS POS NBR-E BLANK ???
BNE *+20 NO - CONTINUE PLEASE
CLC PPOSPSP,BLANKS PS POS NBR-P BLANK ???
BNE *+10 NO - CONTINUE PLEASE
OC PERRS,SET16 YES - SET ERROR BIT
*
LA 9,TABLE LOAD TABLE ADDRESS
ERRLP1 EQU *
CLI TDATE,X'FF' END OF TABLE ???
BE ERRHIRE YES - ERROR DETECTED
CLC TDATE,EMPTY END OF ENTRIES ???
BE ERRHIRE YES - ERROR DETECTED
TM TBITS,@JOB JOB SEGMENT ???
BO ERRTST1 YES - EARLIEST JOB DATE
LA 9,TLEN(,9) BUMP TABLE POINTER
B ERRLP1 TEST NEXT TABLE ENTRY
ERRTST1 EQU *
MVC WJOB,TDATE MOVE EARLIEST JOB DATE
BAL 6,SETDATE DETERMINE HIRE DATE
CLI WERR,C'E' ERROR DETECTED ???
BNE ERREND1 NO - END OF TEST 1
ERRHIRE EQU *
OC TERRS,SET02 SET ERROR BITS
MVI ERRSAL2+1,X'F0' SKIP HIRE DATE TEST
MVI ERRJOB2+1,X'F0' SKIP HIRE DATE TEST
MVI ERRDEP2+1,X'F0' SKIP HIRE DATE TEST
MVI ERRSTA2+1,X'F0' SKIP HIRE DATE TEST
ERREND1 EQU *
LA 9,TABLE LOAD TABLE ADDRESS
ERRLP2 EQU *
CLI TDATE,X'FF' END OF TABLE ???
BE ERRSEG YES - TEST SEGMENT BITS
CLC TDATE,EMPTY END OF ENTRIES ???
BE ERRSEG YES - TEST SEGMENT BITS
ERRBIT BC 0,*+22
OI *-3,X'F0' INITIAL RECORD ONLY
CLI TBITS,X'F0' ALL SEGMENTS PRESENT ???
BE *+10 YES - CONTINUE PLEASE
OC TERRS,SET13 NO - SET ERROR BITS
*
CLC CDATE,TDATE CURRENT < ENTRY DATE ???
BNL *+10 NO - CONTINUE PLEASE
OC TERRS,SET15 YES - SET ERROR BITS
ERRSAL1 EQU *
TM TBITS,@SAL SEGMENT PRESENT ???
BNO ERRJOB1 NO - NEXT SEGMENT
ERRSAL2 BC 0,ERRJOB1
MVI *-3,X'F0' TEST FIRST DATE ONLY
CLC TDATE,WHIRE EARLIEST DATE = HIRE ???
BE ERRJOB1 YES - NEXT SEGMENT
CLC TDATE,WREHIRED EARLIEST DATE = REHIRE ???
BE ERRJOB1 YES - NEXT SEGMENT
CLC TDATE,PHIRE EARLIEST DATE = HIRE ???
BE ERRJOB1 YES - NEXT SEGMENT
CLC TDATE,PRECENT EARLIEST DATE = RECENT ???
BE ERRJOB1 YES - NEXT SEGMENT
OC TERRS,SET05 NO - SET ERROR BITS
ERRJOB1 EQU *
TM TBITS,@JOB SEGMENT PRESENT ???
BNO ERRDEP1 NO - NEXT SEGMENT
*
CLC TJOB1,BLANK JOB1 MISSING ???
BNE *+10 NO - CONTINUE PLEASE
OC TERRS,SET09 YES - SET ERROR BITS
ERRJOB2 BC 0,ERRDEP1
MVI *-3,X'F0' TEST FIRST DATE ONLY
CLC TDATE,WHIRE EARLIEST DATE = HIRE ???
BE ERRDEP1 YES - NEXT SEGMENT
CLC TDATE,WREHIRED EARLIEST DATE = REHIRE ???
BE ERRDEP1 YES - NEXT SEGMENT
CLC TDATE,PHIRE EARLIEST DATE = HIRE ???
BE ERRDEP1 YES - NEXT SEGMENT
CLC TDATE,PRECENT EARLIEST DATE = RECENT ???
BE ERRDEP1 YES - NEXT SEGMENT
OC TERRS,SET06 NO - SET ERROR BITS
ERRDEP1 EQU *
TM TBITS,@DEP SEGMENT PRESENT ???
BNO ERRSTA1 NO - NEXT SEGMENT
*
CLC TDEPPS,BLANK P.S.DEPT# MISSING ???
BNE *+10 NO - CONTINUE PLEASE
OC TERRS,SET10 YES - SET ERROR BITS
*
CLC TDEPLOC,BLANK LOCATION MISSING ???
BNE *+10 NO - CONTINUE PLEASE
OC TERRS,SET11 YES - SET ERROR BITS
ERRDEP2 BC 0,ERRSTA1
MVI *-3,X'F0' TEST FIRST DATE ONLY
CLC TDATE,WHIRE EARLIEST DATE = HIRE ???
BE ERRSTA1 YES - NEXT SEGMENT
CLC TDATE,WREHIRED EARLIEST DATE = REHIRE ???
BE ERRSTA1 YES - NEXT SEGMENT
CLC TDATE,PHIRE EARLIEST DATE = HIRE ???
BE ERRSTA1 YES - NEXT SEGMENT
CLC TDATE,PRECENT EARLIEST DATE = RECENT ???
BE ERRSTA1 YES - NEXT SEGMENT
OC TERRS,SET07 NO - SET ERROR BITS
ERRSTA1 EQU *
TM TBITS,@STA SEGMENT PRESENT ???
BNO ERRBMP NO - BUMP POINTER
ERRSTA2 BC 0,ERRBMP
MVI *-3,X'F0' TEST FIRST DATE ONLY
CLC TDATE,WHIRE EARLIEST DATE = HIRE ???
BE ERRBMP YES - BUMP POINTER
CLC TDATE,WREHIRED EARLIEST DATE = REHIRE ???
BE ERRBMP YES - NEXT SEGMENT
CLC TDATE,PHIRE EARLIEST DATE = HIRE ???
BE ERRBMP YES - NEXT SEGMENT
CLC TDATE,PRECENT EARLIEST DATE = RECENT ???
BE ERRBMP YES - NEXT SEGMENT
OC TERRS,SET08 NO - SET ERROR BITS
ERRBMP EQU *
OC PERRS,TERRS SET MAIN ERROR BITS
OC PBITS,TBITS SET MAIN SEGMENT BITS
LA 9,TLEN(,9) BUMP TABLE POINTER
B ERRLP2 TEST NEXT TABLE ENTRY
ERRSEG EQU *
CLI PBITS,X'F0' ALL SEGMENTS PRESENT ???
BE *+10 YES - CONTINUE PLEASE
OC PERRS,SET13 NO - SET ERROR BITS
*
MVC TRACE(6),=C'ERRCHK' SET TRACE DESCRIPTION
BAL 6,TRCTAB WRITE TRACE TABLE
ERRCHKX EQU *
L 6,ERRCHK-4 RESTORE LINK REGISTER
BR 6 BRANCH ON LINK REGISTER
***********************************************************************
EJECT
***********************************************************************
* SET CONVERSION DATES (TDPS-HIR) *
***********************************************************************
DC F'0' RETURN ADDRESS SAVE AREA
SETDATE EQU *
ST 6,*-4 SAVE RETURN ADDRESS
*
CNOP 0,4 FULLWORD ALLIGNMENT
BAL 1,SETLOAD LOAD PARMLIST ADDRESS
*
DC A(PHIRE) INPUT PARAMETER NO.1
DC A(PRECENT) INPUT PARAMETER NO.2
DC A(WJOB) INPUT PARAMETER NO.3
DC A(WHIRE) OUTPUT PARAMETER NO.1
DC A(WSERVICD) OUTPUT PARAMETER NO.2
DC A(WREHIRED) OUTPUT PARAMETER NO.3
DC A(WERR) OUTPUT PARAMETER NO.4
*
DC V(TDPSHIR) EXTERNAL SUBROUTINE
SETLOAD EQU *
L 15,*-4 LOAD SUBROUTINE ADDRESS
BALR 14,15 EXECUTE EXTERNAL ROUTINE
SETDATEX EQU *
L 6,SETDATE-4 RESTORE LINK REGISTER
BR 6 BRANCH ON LINK REGISTER
***********************************************************************
EJECT
***********************************************************************
* ADJUST SAME-DAY SEGMENT ACTIVITY (PROPAGATE THRU TABLE) *
***********************************************************************
DC F'0' RETURN ADDRESS SAVE AREA
ADJTAB EQU *
ST 6,*-4 SAVE RETURN ADDRESS
*
MVI HSALSEG,C' ' INIT SALARY SEGMENT BYTE
MVC HSALSEG+1(@SALL-1),HSALSEG INIT SALARY SEGMENT AREA
MVI HJOBSEG,C' ' INIT JOB SEGMENT BYTE
MVC HJOBSEG+1(@JOBL-1),HJOBSEG INIT JOB SEGMENT AREA
MVI HDEPSEG,C' ' INIT DEPT SEGMENT BYTE
MVC HDEPSEG+1(@DEPL-1),HDEPSEG INIT DEPT SEGMENT AREA
MVI HSTASEG,C' ' INIT STATUS SEGMENT BYTE
MVC HSTASEG+1(@STAL-1),HSTASEG INIT STATUS SEGMENT AREA
*
MVI ADJ1SAL+1,X'00' INIT SALARY TEST SWITCH
MVI ADJ1JOB+1,X'00' INIT JOB TEST SWITCH
MVI ADJ1DEP+1,X'00' INIT DEPT TEST SWITCH
MVI ADJ1STA+1,X'00' INIT STATUS TEST SWITCH
*
LA 9,TABLE LOAD TABLE ADDRESS
ADJ1LP EQU *
CLI TDATE,X'FF' END OF TABLE ???
BE ADJUST YES - MAKE ADJUSTMENTS
CLC TDATE,EMPTY EMPTY TABLE SLOT ???
BE ADJUST YES - MAKE ADJUSTMENTS
ADJ1SAL BC 0,ADJ1JOB
TM TBITS,@SAL SALARY SEGMENT ???
BNO ADJ1JOB NO - CONTINUE PLEASE
OI ADJ1SAL+1,X'F0' RESET SEGMENT TEST SWITCH
MVC HSALSEG,TSALSEG MOVE TABLE SEGMENT
ADJ1JOB BC 0,ADJ1DEP
TM TBITS,@JOB JOB SEGMENT ???
BNO ADJ1DEP NO - CONTINUE PLEASE
OI ADJ1JOB+1,X'F0' RESET SEGMENT TEST SWITCH
MVC HJOBSEG,TJOBSEG MOVE TABLE SEGMENT
ADJ1DEP BC 0,ADJ1STA
TM TBITS,@DEP DEPT SEGMENT ???
BNO ADJ1STA NO - CONTINUE PLEASE
OI ADJ1DEP+1,X'F0' RESET SEGMENT TEST SWITCH
MVC HDEPSEG,TDEPSEG MOVE TABLE SEGMENT
ADJ1STA BC 0,ADJ1BMP
TM TBITS,@STA STATUS SEGMENT ???
BNO ADJ1BMP NO - CONTINUE PLEASE
OI ADJ1STA+1,X'F0' RESET SEGMENT TEST SWITCH
MVC HSTASEG,TSTASEG MOVE TABLE SEGMENT
ADJ1BMP EQU *
LA 9,TLEN(,9) BUMP TABLE POINTER
B ADJ1LP TEST NEXT ENTRY
ADJUST EQU *
LA 9,TABLE LOAD TABLE ADDRESS
ADJ2LP EQU *
CLI TDATE,X'FF' END OF TABLE ???
BE ADJTABT YES - EXIT ROUTINE PLEASE
CLC TDATE,EMPTY EMPTY TABLE SLOT ???
BE ADJTABT YES - EXIT ROUTINE PLEASE
ADJ2SAL EQU *
TM TBITS,@SAL SALARY SEGMENT ???
BO *+24 YES - RESET SEGMENT DATA
CLC TDATE,HSALSEG+3 SAME DAY SEGMENT ???
BL ADJ2JOB NO - CONTINUE PLEASE
MVC TSALSEG,HSALSEG YES - MOVE SEGMENT DATA
OI TBITS,@SAL SET SEGMENT BITS
*
MVC HSALSEG,TSALSEG RESET SEGMENT DATA
ADJ2JOB EQU *
TM TBITS,@JOB JOB SEGMENT ???
BO *+24 YES - RESET SEGMENT DATA
CLC TDATE,HJOBSEG+3 SAME DAY SEGMENT ???
BL ADJ2DEP NO - CONTINUE PLEASE
MVC TJOBSEG,HJOBSEG YES - MOVE SEGMENT DATA
OI TBITS,@JOB SET SEGMENT BITS
*
MVC HJOBSEG,TJOBSEG RESET SEGMENT DATA
ADJ2DEP EQU *
TM TBITS,@DEP DEPT SEGMENT ???
BO *+24 YES - RESET SEGMENT DATA
CLC TDATE,HDEPSEG+3 SAME DAY SEGMENT ???
BL ADJ2STA NO - CONTINUE PLEASE
MVC TDEPSEG,HDEPSEG YES - MOVE SEGMENT DATA
OI TBITS,@DEP SET SEGMENT BITS
*
MVC HDEPSEG,TDEPSEG RESET SEGMENT DATA
ADJ2STA EQU *
TM TBITS,@STA STATUS SEGMENT ???
BO *+24 YES - RESET SEGMENT DATA
CLC TDATE,HSTASEG+3 SAME DAY SEGMENT ???
BL ADJ2BMP NO - CONTINUE PLEASE
MVC TSTASEG,HSTASEG YES - MOVE SEGMENT DATA
OI TBITS,@STA SET SEGMENT BITS
*
MVC HSTASEG,TSTASEG RESET SEGMENT DATA
ADJ2BMP EQU *
LA 9,TLEN(,9) BUMP TABLE POINTER
B ADJ2LP TEST NEXT ENTRY
ADJTABT EQU *
MVC TRACE(6),=C'ADJTAB' SET TRACE DESCRIPTION
BAL 6,TRCTAB WRITE TRACE TABLE
ADJTABX EQU *
L 6,ADJTAB-4 RESTORE LINK REGISTER
BR 6 BRANCH ON LINK REGISTER
***********************************************************************
EJECT
***********************************************************************
* HIRE DATE HISTORY ADJUSTMENT *
***********************************************************************
DC F'0' RETURN ADDRESS SAVE AREA
HIRFIX EQU *
ST 6,*-4 SAVE RETURN ADDRESS
*
CLC PRECENT,PHIRE MULTIPLE HIRE DATES ???
BNH HIRFIXX NO - EXIT ROUTINE NOW
*
MVC HERRS,=X'0000' INIT ERROR SWITCH
MVI HIRCUR+1,X'00' INIT CURRENT HISTORY
MVI HIRPRI+1,X'00' INIT PRIOR HISTORY
MVI HIRSUB+1,X'00' INIT PRIOR SUBSEQUENT
*
LA 9,TABLE LOAD TABLE ADDRESS
HIRLOOP EQU *
CLI TDATE,X'FF' END OF TABLE ???
BE HIRSET YES - APPLY CHANGES
CLC TDATE,EMPTY EMPTY TABLE SLOT ???
BE HIRSET YES - APPLY CHANGES
*
CLC TDATE,PRECENT CURRENT HISTORY ???
BL HIRPRI NO - PRIOR HISTORY
*
HIRCUR BC 0,HIRBMP 1ST RECORD (CURRENT) ???
OI *-3,X'F0' NO - CONTINUE PLEASE
TM HERRS+1,X'10' BYPASS PRIOR HISTORY ???
BNO HIRBMP NO - CONTINUE PLEASE
CLI TBITS,X'F0' ALL SEGMENTS PRESENT ???
BE HIRBMP YES - CONTINUE PLEASE
OC TERRS,SET13 NO - SET ERROR BITS
B HIRBMP BUMP TABLE POINTER
*
HIRPRI BC 0,HIRSUB 1ST RECORD (PRIOR) ???
OI *-3,X'F0' NO - CONTINUE PLEASE
*
TM TERRS,X'80' CRITICAL ERROR ???
BNO HIRBMP NO - CONTINUE PLEASE
MVI HIRSUB+1,X'F0' YES - SET REJECT SWITCH
B HIRREJ REJECT PRIOR HISTORY
HIRSUB BC 0,HIRREJ
TM TERRS,X'80' CRITICAL ERROR ???
BNO HIRBMP NO - CONTINUE PLEASE
HIRREJ EQU *
OC TERRS,SET12 SET ERROR BITS
NI TERRS,X'7F' SET NON-CRITICAL BIT
HIRBMP EQU *
OC HERRS,TERRS SET MAIN ERROR BITS
LA 9,TLEN(,9) BUMP TABLE POINTER
B HIRLOOP TEST NEXT ENTRY
HIRSET EQU *
MVC PERRS,HERRS RESET MAIN ERROR BITS
*
MVC TRACE(6),=C'HIRFIX' SET TRACE DESCRIPTION
BAL 6,TRCTAB WRITE TRACE TABLE
HIRFIXX EQU *
L 6,HIRFIX-4 RESTORE LINK REGISTER
BR 6 BRANCH ON LINK REGISTER
***********************************************************************
EJECT
***********************************************************************
* TRACE TABLE *
***********************************************************************
DC F'0' RETURN ADDRESS SAVE AREA
TRCTAB EQU *
ST 6,*-4 SAVE RETURN ADDRESS
*
CLC TREMP,PEMP EMPLOYEE MATCH ???
BNE TRCTABX NO - EXIT ROUTINE PLEASE
*
LA 9,TABLE LOAD TABLE ADDRESS
TRCLKP EQU *
CLI 0(9),X'FF' END OF TABLE ???
BE TRCTABX YES - EXIT ROUTINE
CLC TDATE,EMPTY END OF ENTRIES ???
BE TRCTABX YES - EXIT ROUTINE
*
MVC TRACE+16(TLEN),0(9) MOVE TABLE ENTRY
PUT STDWKT,TRACE WRITE TRACE RECORD
*
LA 9,TLEN(,9) BUMP TABLE POINTER
B TRCLKP PROCESS NEXT ENTRY
TRCTABX EQU *
L 6,TRCTAB-4 RESTORE LINK REGISTER
BR 6 BRANCH ON LINK REGISTER
***********************************************************************
EJECT
***********************************************************************
* BUILD STATIC DATA *
***********************************************************************
DC F'0' RETURN ADDRESS SAVE AREA
STATIC EQU *
ST 6,*-4 SAVE RETURN ADDRESS
*
BAL 6,EMPNUM CONVERT EMPLOYEE NUMBER
*
PACK WORK(4),EMPNO PACK PS EMPLOYEE NUMBER
AP WORK(4),=P'2000' ADD 2000 TO PS EMP#
OI WORK+3,X'0F' TURN ON ALL SIGN BITS
UNPK PPOSPSE,WORK(4) REPLACE PS POS NBR-E
*
CLI PSTAT,C'A' STATUS = ACTIVE ???
BE *+24 YES - CONTINUE PLEASE
CLI PSTAT,C'L' STATUS = ON-LEAVE ???
BE *+16 YES - CONTINUE PLEASE
MVC PPOSPSP,BLANKS CLEAR PS POSITION-P
MVC PPOSPSE,BLANKS CLEAR PS POSITION-E
*
CALL TDPSGRP,(PCO,PDEPT,STGRP) CONVERT PAY GROUP
CALL TDPSCMP,(PDEPT,STCO) CONVERT COMPANY
CALL TDPSREG,(PREG,STFL,STRG,STHR) CONVERT FULL/REG/HRS
CALL TDPSTYP,(PTYPE,STTYPE,STFLSA) CONVERT TYPE/FLSA
*
MVI HDATA,C' ' MOVE BLANK TO HOLD DATA
MVC HDATA+1(HDATAX-HDATA-1),HDATA CLEAR HOLD DATA AREA
*
MVC WACT,=C'HIR' INIT ACTION CODE
STATICX EQU *
L 6,STATIC-4 RESTORE LINK REGISTER
BR 6 BRANCH ON LINK REGISTER
***********************************************************************
EJECT
***********************************************************************
* BUILD CONVERSION RECORD *
***********************************************************************
DC F'0' RETURN ADDRESS SAVE AREA
CNVREC EQU *
ST 6,*-4 SAVE RETURN ADDRESS
*
TM PERRS,X'80' CRITICAL ERROR ???
BO CNVRECX YES - BYPASS ROUTINE
TM TERRS+1,X'10' BYPASS PRIOR HISTORY ???
BO CNVRECX YES - BYPASS ROUTINE
*
TM TBITS,@SAL SALARY SEGMENT ???
BNO *+16 NO - CONTINUE PLEASE
MVC HSALAMT,TSALAMT HOLD SALARY AMOUNT
MVC HSALRATE,TSALRATE HOLD SALARY RATE
*
TM TBITS,@JOB JOB SEGMENT ???
BNO *+22 NO - CONTINUE PLEASE
MVC HJOBGRD,TJOBGRD HOLD JOB GRADE
MVC HJOB1,TJOB1 HOLD JOB CODE
MVC HJOBGE,TJOBGE HOLD JOB GE POSITION
*
TM TBITS,@DEP DEPT SEGMENT ???
BNO *+22 NO - CONTINUE PLEASE
MVC HDEPNO,TDEPNO HOLD DEPT NUMBER
MVC HDEPPS,TDEPPS HOLD DEPT PS NUMBER
MVC HDEPLOC,TDEPLOC HOLD DEPT LOCATION
*
TM TBITS,@STA STATUS SEGMENT ???
BNO *+10 NO - CONTINUE PLEASE
MVC HSTACODE,TSTACODE HOLD DEPT LOCATION
*
BAL 6,ENTRY DETERMINE ENTRY DATES
*
CLI TDATE+TLEN,X'FF' LAST TABLE ENTRY ???
BE *+14 YES - MOVE CURRENT DATA
CLC TDATE+TLEN,EMPTY LAST TABLE ENTRY ???
BNE CNVBLD NO - BUILD CONV RECORD
*
MVC EPOSDATE,TDATE POSITION ENTRY DATE
*
MVC HPOSPS,PPOSPSP INIT PS POSITION-P
CLC PPOSPSP,BLANKS PS POSITION-P BLANK ???
BNE *+10 NO - CONTINUE PLEASE
MVC HPOSPS,PPOSPSE MOVE PS POSITION-E
*
CLC WACT,=C'HIR' 1ST AND LAST RECORD ???
BE *+18 YES - CONTINUE PLEASE
CLI HSTACODE,C'T' STATUS = TERMINATED ???
BNE *+10 NO - CONTINUE PLEASE
MVC WACT,=C'TER' YES - RESET ACTION CODE
*
CLC PNXTPRF,BLANKS NEXT REVIEW BLANKS ???
BE CNVBLD YES - CONTINUE PLEASE
MVC HNXTPRF,PNXTPRF NEXT PERFORMANCE REVIEW
PACK WORK(3),HNXTPRF(4) PACK NEXT REVIEW YEAR
SP WORK(3),=P'1' DEDUCT 1 YEAR FROM DATE
UNPK HNXTPRF(4),WORK(3) REPLACE NEXT REVIEW YEAR
OI HNXTPRF+3,X'F0' TURN ON ALL ZONE BITS
CNVBLD EQU *
PACK WORK(4),EMPNO PACK EMPLOYEE ID
OI WORK+3,X'0F' TURN ON ALL SIGN BITS
UNPK OEMP(6),WORK(4) EMPLOYEE ID NUMBER
*
CALL TDPSGRP,(PCO,HDEPNO,HTGRP) CONVERT PAY GROUP
CALL TDPSCMP,(HDEPNO,HTCO) CONVERT COMPANY
*
MVC OACT,WACT ACTION
MVC OACTD,CDATE ACTION DATE
MVC OACTR,=C'CNV' ACTION REASON
MVC OSALRT,HSALRATE SALARY RATE
MVC OCO,HTCO COMPANY
MVC OSALAMT,HSALAMT SALARY AMOUNT
MVC OCUR,=C'USD' CURRENCY CODE
MVC ODEPDATE,EDEPDATE DEPT - ENTRY DATE
MVC ODEPPS(L'HDEPPS),HDEPPS DEPT - PS NUMBER
MVC OEFFDT,TDATE EFFECTIVE DATE
OI TSEQ+1,X'0F' TURN ON ALL SIGN BITS
UNPK OEFFSEQ,TSEQ EFFECTIVE SEQUENCE
MVC OPOSPS,HPOSPS PS POSITION NUMBER
MVC OSTACODE,HSTACODE STATUS - CODE
MVC OTYPE,STTYPE EMPLOYEE TYPE
MVC OFLSA,STFLSA FLSA STATUS
MVC OFULL,STFL FULL/PART TIME
MVC OGRADE,HJOBGRD+1 JOB GRADE
MVC OGRADATE,EGRADATE JOB GRADE - ENTRY DATE
MVC OJOBDATE,EJOBDATE JOB - ENTRY DATE
MVC OJOB1,HJOB1 JOB - CODE
MVC ODEPTAG,HTCO DEPT - LOCATION TAG
MVC ODEPLOC,HDEPLOC DEPT - LOCATION
MVC OPAYGRP,HTGRP PAY GROUP
MVC OREG,STRG REG/TEMP
MVC OSTDHRS,STHR STANDARD HOURS
MVC ONXTPRF,HNXTPRF NEXT PERFORMANCE REVIEW
MVC OPOSGE,HJOBGE JOB - GE POSITION
MVC OPOSDATE,EPOSDATE POS - ENTRY DATE
*
CALL TDPSDAT,(OACTD) ORACLE DATE CONVERSION
CALL TDPSDAT,(ODEPDATE) ORACLE DATE CONVERSION
CALL TDPSDAT,(OEFFDT) ORACLE DATE CONVERSION
CALL TDPSDAT,(OGRADATE) ORACLE DATE CONVERSION
CALL TDPSDAT,(OJOBDATE) ORACLE DATE CONVERSION
CALL TDPSDAT,(ONXTPRF) ORACLE DATE CONVERSION
CALL TDPSDAT,(OPOSDATE) ORACLE DATE CONVERSION
*
PUT STDWKO,OREC WRITE OUTPUT RECORD
*
MVC WACT,=C'DTA' RESET ACTION CODE
CNVRECX EQU *
L 6,CNVREC-4 RESTORE LINK REGISTER
BR 6 BRANCH ON LINK REGISTER
***********************************************************************
EJECT
***********************************************************************
* DETERMINE ENTRY DATES *
***********************************************************************
DC F'0' RETURN ADDRESS SAVE AREA
ENTRY EQU *
ST 6,*-4 SAVE RETURN ADDRESS
*
C 9,=A(TABLE) 1ST TABLE ENTRY ???
BNE ENTRY2 NO - CONTINUE PLEASE
*
MVC EGRADATE,TDATE INIT GRADE ENTRY DATE
MVC EDEPDATE,TDATE INIT DEPT ENTRY DATE
MVC EJOBDATE,TDATE INIT JOB ENTRY DATE
MVC EPOSDATE,BLANKS INIT POS ENTRY DATE
*
MVC EJOBGRD,HJOBGRD INIT GRADE ENTRY
MVC EDEPPS,HDEPPS INIT DEPT ENTRY
MVC EDEPLOC,HDEPLOC INIT DEPT ENTRY
MVC EJOB1,HJOB1 INIT JOB ENTRY
MVC EJOBGE,HJOBGE INIT JOB ENTRY
ENTRY2 EQU *
CLC EJOBGRD,HJOBGRD SAME ENTRY DATA ???
BE *+16 YES - CONTINUE PLEASE
MVC EJOBGRD,HJOBGRD RESET ENTRY DATA
MVC EGRADATE,TDATE RESET ENTRY DATE
*
CLC EDEPLOC,HDEPLOC SAME ENTRY DATA ???
BNE *+14 NO - NEW ENTRY DATA
CLC EDEPPS,HDEPPS SAME ENTRY DATA ???
BE *+22 YES - CONTINUE PLEASE
MVC EDEPLOC,HDEPLOC RESET ENTRY DATA
MVC EDEPPS,HDEPPS RESET ENTRY DATA
MVC EDEPDATE,TDATE RESET ENTRY DATE
*
CLC EJOBGE,HJOBGE SAME ENTRY DATA ???
BNE *+14 NO - NEW ENTRY DATA
CLC EJOB1,HJOB1 SAME ENTRY DATA ???
BE *+22 YES - CONTINUE PLEASE
MVC EJOBGE,HJOBGE RESET ENTRY DATA
MVC EJOB1,HJOB1 RESET ENTRY DATA
MVC EJOBDATE,TDATE RESET ENTRY DATE
ENTRYX EQU *
L 6,ENTRY-4 RESTORE LINK REGISTER
BR 6 BRANCH ON LINK REGISTER
***********************************************************************
EJECT
***********************************************************************
* BUILD AUDIT RECORD *
***********************************************************************
DC F'0' RETURN ADDRESS SAVE AREA
AUDREC EQU *
ST 6,*-4 SAVE RETURN ADDRESS
*
PACK WORK(4),EMPNO PACK EMPLOYEE ID
OI WORK+3,X'0F' TURN ON ALL SIGN BITS
UNPK AEMP(6),WORK(4) EMPLOYEE ID NUMBER
*
MVC ADATA,PDATA MOVE INPUT DATA
MVC ATEST,TENTRY MOVE TABLE ENTRY
MVC AERRS,PERRS MOVE ERROR CODES
MVC ABITS,PBITS MOVE SEGMENT CODES
MVC ACO,STCO MOVE COMPANY CODE
*
PUT STDWKA,AREC WRITE OUTPUT RECORD
AUDRECX EQU *
L 6,AUDREC-4 RESTORE LINK REGISTER
BR 6 BRANCH ON LINK REGISTER
***********************************************************************
EJECT
***********************************************************************
* CLEAR HISTORY TABLE *
***********************************************************************
DC F'0' RETURN ADDRESS SAVE AREA
CLRTAB EQU *
ST 6,*-4 SAVE RETURN ADDRESS
*
LA 9,TABLE LOAD TABLE ADDRESS
CLRLOOP EQU *
CLI 0(9),X'FF' END OF TABLE ???
BE CLRTABX YES - EXIT ROUTINE
*
MVI TENTRY,C' ' MOVE BLANK TO ENTRY
MVC TENTRY+1(TLEN-1),TENTRY PROPAGATE THRU ENTRY
MVC TDATE,EMPTY MOVE EMPTY INDICATOR
ZAP TSEQ,=P'0' INIT SEQUENCE COUNT
MVI TBITS,X'00' INIT SEGMENT BITS
MVC TERRS,=X'0000' INIT ERROR BITS
*
LA 9,TLEN(,9) BUMP TABLE POINTER
B CLRLOOP TEST NEXT ENTRY
CLRTABX EQU *
L 6,CLRTAB-4 RESTORE LINK REGISTER
BR 6 BRANCH ON LINK REGISTER
***********************************************************************
EJECT
***********************************************************************
* CLEAR OUTPUT RECORD AREA *
***********************************************************************
DC F'0' RETURN ADDRESS SAVE AREA
CLEAR EQU *
ST 6,*-4 SAVE RETURN ADDRESS
*
LA 2,BLANK LOAD SOURCE ADDRESS
LA 3,1 LOAD SOURCE LENGTH
LA 4,OREC LOAD TARGET ADDRESS
LA 5,ORECX-OREC LOAD TARGET LENGTH
ICM 3,B'1000',BLANK LOAD PAD CHARACTER
MVCL 4,2 INIT RECORD AREA
*
LA 2,BLANK LOAD SOURCE ADDRESS
LA 3,1 LOAD SOURCE LENGTH
LA 4,AREC LOAD TARGET ADDRESS
LA 5,ARECX-AREC LOAD TARGET LENGTH
ICM 3,B'1000',BLANK LOAD PAD CHARACTER
MVCL 4,2 INIT RECORD AREA
CLEARX EQU *
L 6,CLEAR-4 RESTORE LINK REGISTER
BR 6 BRANCH ON LINK REGISTER
***********************************************************************
EJECT
***********************************************************************
* CONVERT EMPLOYEE NUMBER *
***********************************************************************
DC F'0' RETURN ADDRESS SAVE AREA
EMPNUM EQU *
ST 6,*-4 SAVE RETURN ADDRESS
*
CALL TDPSEMP,(PEMP,EMPNO) CONVERT EMPLOYEE NUMBER
EMPNUMX EQU *
L 6,EMPNUM-4 RESTORE LINK REGISTER
BR 6 BRANCH ON LINK REGISTER
***********************************************************************
EJECT
***********************************************************************
* PAY FREQUENCY (IF MISSING) R5=ADDRESS SALARY/RATE *
***********************************************************************
DC F'0' RETURN ADDRESS SAVE AREA
PAYFRQ EQU *
ST 6,*-4 SAVE RETURN ADDRESS
*
CLC 0(10,5),BLANKS SALARY MISSING ???
BE PAYFRQX YES - EXIT ROUTINE NOW
*
BAL 6,AMTCNV AMOUNT CONVERSION
*
MVI 10(5),C'H' INIT RATE = HOURLY
CP WAMTP,=P'10000' SALARY UNDER $100.00 ???
BL PAYFRQX YES - EXIT ROUTINE NOW
MVI 10(5),C'A' SET RATE = ANNUAL
PAYFRQX EQU *
L 6,PAYFRQ-4 RESTORE LINK REGISTER
BR 6 BRANCH ON LINK REGISTER
***********************************************************************
EJECT
***********************************************************************
* AMOUNT CONVERSION R5=ADDRESS *
***********************************************************************
DC F'0' RETURN ADDRESS SAVE AREA
AMTCNV EQU *
ST 6,*-4 SAVE RETURN ADDRESS
*
MVC WAMTI(8),0(5) MOVE INTEGER PORTION
MVI WAMTI+8,C'.' MOVE DECIMAL POINT
MVC WAMTI+9(2),8(5) MOVE DECIMAL PORTION
*
CALL TDPSAMT,(WAMT@) CONVERT AMOUNT
AMTCNVX EQU *
L 6,AMTCNV-4 RESTORE LINK REGISTER
BR 6 BRANCH ON LINK REGISTER
***********************************************************************
EJECT
***********************************************************************
* GET INPUT PARAMETERS *
***********************************************************************
DC F'0' RETURN ADDRESS SAVE AREA
GETPARM EQU *
ST 6,*-4 SAVE RETURN ADDRESS
*
L 2,0(1) LOAD EXEC PARM ADDRESS
CLC 13(6,2),=C'TRACE=' TRACE EMPLOYEE ???
BNE *+16 NO - CONTINUE PLEASE
MVC TREMP,19(2) YES - MOVE EMPLOYEE
MVC TRACE+8(6),TREMP MOVE TRACE EMPLOYEE
*
MVC CDATE,2(2) MOVE CURRENT DATE
CLC CDATE(2),=C'19' DATE ENTERED ???
BE GETPARMX YES - EXIT ROUTINE
*
COMRG OBTAIN SYSTEM DATE
*
MVC CDATE,=CL10'19YY/MM/DD' INIT CURRENT DATE
MVC CDATE+2(2),6(1) MOVE CURRENT DATE - YY
MVC CDATE+5(2),0(1) MOVE CURRENT DATE - MM
MVC CDATE+8(2),3(1) MOVE CURRENT DATE - DD
GETPARMX EQU *
L 6,GETPARM-4 RESTORE LINK REGISTER
BR 6 BRANCH ON LINK REGISTER
***********************************************************************
EJECT
***********************************************************************
* ABEND ROUTINES *
***********************************************************************
ABEND1 EQU *
LA 0,111 LOAD R0 WITH ABEND CODE
MVC ABMSG,AB111 MOVE ABEND MESSAGE
ABENDIT EQU *
MVC PRT,PRT-1 CLEAR PRINT LINE
BAL 6,W8B PRINT - PAGE EJECT
MVC PRT+1(26),ABTITLE MOVE TITLE LINE
BAL 6,W19 PRINT - SPACE 3 LINES
MVC PRT+1(26),ABMSG MOVE ABEND MESSAGE
MVC PRT+28(6),PEMP MOVE EMPLOYEE NUMBER
BAL 6,W09 PRINT - SPACE 1 LINE
BAL 6,WXX CLOSE PRINT FILE
ABEND (0) ISSUE ABEND REGISTER 0
***********************************************************************
ABMSG DC CL26' '
AB111 DC CL26'HISTORY TABLE FULL - EMP#:'
ABTITLE DC CL26'TD-PS-007 PROGRAM ABEND '
***********************************************************************
EJECT
***********************************************************************
* WORKING STORAGE *
***********************************************************************
STDWKI DCB DDNAME=STDWKI,DSORG=PS,MACRF=(GM),EODAD=EOFI
STDWKO DCB DDNAME=STDWKO,DSORG=PS,MACRF=(PM)
STDWKA DCB DDNAME=STDWKA,DSORG=PS,MACRF=(PM)
STDWKT DCB DDNAME=STDWKT,DSORG=PS,MACRF=(PM)
***********************************************************************
TREMP DC CL6'$$$$$$' TRACE TABLE EMPLOYEE
TRACE DC CL(TLEN+20)' ' TRACE TABLE DATA
***********************************************************************
WAMT@ DS 0CL27 AMOUNT CONVERSION PARMS
WAMTI DC CL11'-ZZZZZZZ.99' WORK AMOUNT INPUT
WAMTO DC CL10'-ZZZZZZZ99' WORK AMOUNT OUTPUT
WAMTP DC PL6'0' WORK AMOUNT PACKED
***********************************************************************
WJOB DC CL10'YYYY/MM/DD' EARLIEST JOB DATE
WHIRE DC CL10'YYYY/MM/DD' HIRE DATE
WSERVICD DC CL10'YYYY/MM/DD' SERVICE DATE
WREHIRED DC CL10'YYYY/MM/DD' REHIRE DATE
WERR DC CL1' ' ERROR CODE
***********************************************************************
CDATE DC CL10'YYYY/MM/DD' CURRENT DATE
HALF DC H'0' HALF-WORD
EMPTY DC XL10'FEFFFFFFFFFFFFFFFFFF' EMPTY TABLE POSITION
HEAD DC CL1'N' HEADING SWITCH
PGCT DC PL2'0' PAGE COUNTER
ED1 DC XL4'40202120' EDIT PATTERN - FZZ9
WORK DC XL20'00' WORK FIELD
WACT DC CL3'HIR' ACTION CODE
ZEROES DC 10CL1'0' ZEROES
BLANKS DC 35CL1' ' BLANKS
BLANK EQU BLANKS BLANKS
@ZERO DC CL10' 00' ZERO INIT OUTPUT FIELD
***********************************************************************
@CRIT EQU 32768 CRITICAL ERROR BIT X'8000'
@BIT01 EQU 32768 ERROR 01 SETTING X'8000'
@BIT02 EQU 16384 ERROR 02 SETTING X'4000'
@BIT03 EQU 8192 ERROR 03 SETTING X'2000'
@BIT04 EQU 4096 ERROR 04 SETTING X'1000'
@BIT05 EQU 2048 ERROR 05 SETTING X'0800'
@BIT06 EQU 1024 ERROR 06 SETTING X'0400'
@BIT07 EQU 512 ERROR 07 SETTING X'0200'
@BIT08 EQU 256 ERROR 08 SETTING X'0100'
@BIT09 EQU 128 ERROR 09 SETTING X'0080'
@BIT10 EQU 64 ERROR 10 SETTING X'0040'
@BIT11 EQU 32 ERROR 11 SETTING X'0020'
@BIT12 EQU 16 ERROR 12 SETTING X'0010'
@BIT13 EQU 8 ERROR 13 SETTING X'0008'
@BIT14 EQU 4 ERROR 14 SETTING X'0004'
@BIT15 EQU 2 ERROR 15 SETTING X'0002'
@BIT16 EQU 1 ERROR 16 SETTING X'0001'
***********************************************************************
SET01 DC AL2(@BIT01) CRITICAL ERROR
SET02 DC AL2(@BIT02+@CRIT) HIRE DATE ERROR
SET03 DC AL2(@BIT03) --UNDEFINED--
SET04 DC AL2(@BIT04) --UNDEFINED--
SET05 DC AL2(@BIT05+@CRIT) EARLIEST.SAL <> HIRE.DT
SET06 DC AL2(@BIT06+@CRIT) EARLIEST.JOB <> HIRE.DT
SET07 DC AL2(@BIT07+@CRIT) EARLIEST.DEP <> HIRE.DT
SET08 DC AL2(@BIT08+@CRIT) EARLIEST.STA <> HIRE.DT
SET09 DC AL2(@BIT09+@CRIT) MISSING JOB1
SET10 DC AL2(@BIT10+@CRIT) MISSING PS.DEPT#
SET11 DC AL2(@BIT11+@CRIT) MISSING DEPT.LOC
SET12 DC AL2(@BIT12) BYPASS PRIOR HISTORY
SET13 DC AL2(@BIT13+@CRIT) MISSING SEGMENTS
SET14 DC AL2(@BIT14) POS# ALIGNMENT (FIXTAB)
SET15 DC AL2(@BIT15) HISTORY.DATE > CURR.DATE
SET16 DC AL2(@BIT16) MISSING PS.POS#
***********************************************************************
EDATA EQU * ENTRY DATA
EGRADATE DC CL10'YYYY-MM-DD' GRADE - ENTRY DATE
EJOBDATE DC CL10'YYYY-MM-DD' JOB - ENTRY DATE
EDEPDATE DC CL10'YYYY-MM-DD' DEPT - ENTRY DATE
EPOSDATE DC CL10'YYYY-MM-DD' POS - ENTRY DATE
EJOBGRD DS CL4 JOB - GRADES
EJOB1 DS CL10 JOB - JOB1
EJOBGE DS CL4 JOB - GE POSITION
EDEPPS DS CL6 DEPT - PS DEPT NO
EDEPLOC DS CL6 DEPT - LOCATION
EDATAX EQU * END ENTRY DATA
***********************************************************************
HTGRP DC CL3' ' PAY GROUP - HISTORY
HTCO DC CL3' ' COMPANY - HISTORY
***********************************************************************
STDATA EQU * STATIC CONVERSION DATA
STGRP DC CL3' ' PAY GROUP
STCO DC CL3' ' COMPANY
STFL DC CL1' ' FULL/PART TIME
STRG DC CL1' ' REG/TEMP
STHR DC CL4'0000' STANDARD HOURS
STTYPE DC CL1' ' EMPLOYEE TYPE
STFLSA DC CL1' ' FLSA STATUS
STDATAX EQU * END STATIC CONVERSION DATA
***********************************************************************
HDATA EQU * TABLE CONVERSION DATA
HNXTPRF DC CL10'YYYY-MM-DD' NEXT REVIEW DATE
HPOSPS DC CL8' ' PS POSITION NUMBER
HSALAMT DS CL10 SALARY - AMOUNT
HSALRATE DS CL2 SALARY - RATES
HJOBGRD DS CL4 JOB - GRADES
HJOB1 DS CL10 JOB - JOB1
HJOBGE DS CL4 JOB - GE POSITION
HDEPNO DS CL6 DEPT - DEPT NO
HDEPPS DS CL6 DEPT - PS DEPT NO
HDEPLOC DS CL6 DEPT - LOCATION
HSTACODE DS CL1 STATUS - CODE
HDATAX EQU * END TABLE CONVERSION DATA
***********************************************************************
HSALSEG DS CL(L'ISALSEG) SALARY SEGMENT
HJOBSEG DS CL(L'IJOBSEG) JOB SEGMENT
HDEPSEG DS CL(L'IDEPSEG) DEPT SEGMENT
HSTASEG DS CL(L'ISTASEG) STATUS SEGMENT
***********************************************************************
EJECT
***********************************************************************
* H/R CONVERSION RECORD - INPUT *
***********************************************************************
IREC DS 0CL400 H/R CONVERSION RECORD
IDATA DS 0CL(IDATAX-IEMP) DATA - START SEGMENT
IEMP DC CL8'000000' EMPLOYEE ID NUMBER
ICO DC CL3' ' COMPANY CODE
ISEQ DC CL3' ' SEQUENCE
IMAX DC CL3' ' MAXIMUM SEQUENCE
IREG DC CL1' ' REG/TEMP/FULL/PART
ITYPE DC CL1' ' TYPE (EXEMPT/NON-EXEMPT)
IDEPT DC CL6' ' DEPARTMENT
INXTPRF DC CL10'YYYY-MM-DD' NEXT REVIEW DATE
IPOSGE DC CL5' ' GE POSITION NUMBER
IPOSNO DC CL10' ' POSITION NUMBER
IPOSPSE DC CL8' ' PS POSITION NUMBER-E (EMP)
IPOSPSP DC CL8' ' PS POSITION NUMBER-P (POS)
ISTAT DC CL1' ' CURRENT STATUS CODE
ISALARY DC CL10'-ZZZZZZZ99' CURRENT SALARY AMOUNT
IRATE DC CL1' ' CURRENT RATE CODE (A/H)
IJOB# DC CL6' ' CURRENT JOB NUMBER
IJOB#1 DC CL10' ' CURRENT JOB 1
ICUSTOM DC CL25' ' CURRENT CUSTOM USER.TAB1
IHIRE DC CL10'YYYY-MM-DD' HIRE DATE
IRECENT DC CL10'YYYY-MM-DD' MOST RECENT HIRE DATE
IDATAX EQU * DATA - END SEGMENT
*
ISALSEG DS 0CL(ISALX-ISALMAX) SALARY - START SEGMENT
ISALMAX DC CL3' ' SALARY - MAXIMUM SEQUENCE
ISALDATE DC CL10'YYYY-MM-DD' SALARY - DATE
ISALAMT DC CL10'-ZZZZZZZ99' SALARY - AMOUNT
ISALRATE DC CL2' ' SALARY - RATES
ISALINCR DC CL10'-ZZZZZZZ99' SALARY - INCR.AMOUNT
ISALPCTG DC CL10'-ZZZZZZZ99' SALARY - INCR.PERCENT
ISALCODE DC CL3' ' SALARY - INCR.CODE
ISALX EQU * SALARY - END SEGMENT
*
IJOBSEG DS 0CL(IJOBX-IJOBMAX) JOB - START SEGMENT
IJOBMAX DC CL3' ' JOB - MAXIMUM SEQUENCE
IJOBDATE DC CL10'YYYY-MM-DD' JOB - DATE
IJOBNO DC CL8' ' JOB - NUMBER
IJOBTTL DC CL25' ' JOB - TITLE
IJOBGRD DC CL4' ' JOB - GRADES
IJOBCODE DC CL3' ' JOB - CODE
IJOB1 DC CL10' ' JOB - JOB1
IJOBGE DC CL4' ' JOB - GE POSITION
IJOBCUS DC CL25' ' JOB - CUSTOM USER.TAB1
IJOBX EQU * JOB - END SEGMENT
*
IDEPSEG DS 0CL(IDEPX-IDEPMAX) DEPT - START SEGMENT
IDEPMAX DC CL3' ' DEPT - MAXIMUM SEQUENCE
IDEPDATE DC CL10'YYYY-MM-DD' DEPT - DATE
IDEPNO DC CL8' ' DEPT - NUMBER
IDEPNAME DC CL20' ' DEPT - NAME
IDEPPS DC CL6' ' DEPT - PS DEPT NO
IDEPLOC DC CL6' ' DEPT - LOCATION
IDEPX EQU * DEPT - END SEGMENT
*
ISTASEG DS 0CL(ISTAX-ISTAMAX) STATUS - START SEGMENT
ISTAMAX DC CL3' ' STATUS - MAXIMUM SEQUENCE
ISTADATE DC CL10'YYYY-MM-DD' STATUS - DATE
ISTACODE DC CL3' ' STATUS - CODE
ISTAREAS DC CL3' ' STATUS - REASON
ISTAX EQU * STATUS - END SEGMENT
*
IFILL DS CL(L'IREC-(*-IREC)) FILLER
***********************************************************************
* H/R CONVERSION RECORD - AUDIT *
***********************************************************************
AREC DS 0CL400 PEOPLESOFT CONVERSION
AEMP DC CL11'000000' EMPLOYEE ID NUMBER
ADATA DS CL(L'IDATA) INPUT RECORD DATA
ATEST DS CL(TLEN) INPUT TABLE ENTRY
AERRS DC XL2'0000' INPUT AUDIT ERRORS
ABITS DC XL1'00' INPUT AUDIT SEGMENTS
ACO DC CL3' ' COMPANY (TIP/SPC)
AFILL DS CL(L'AREC-(*-AREC)) FILLER
ARECX EQU * END OF RECORD
***********************************************************************
* H/R CONVERSION RECORD - OUTPUT *
***********************************************************************
OREC DS 0CL400 PEOPLESOFT CONVERSION
OEMP DC CL11'000000' EMPLOYEE ID NUMBER
OACT DC CL3' ' ACTION
OACTD DC CL10'YYYY/MM/DD' ACTION DATE
OACTR DC CL3'CNV' ACTION REASON
OSALRT DC CL1' ' SALARY RATE
OCO DC CL3' ' COMPANY
OSALAMT DC CL10'-ZZZZZZZZ99' SALARY AMOUNT
OCUR DC CL3'USD' CURRENCY CODE
ODEPDATE DC CL10'YYYY/MM/DD' DEPT - ENTRY DATE
ODEPPS DC CL10' ' DEPT - PS NUMBER
OEFFDT DC CL10'YYYY/MM/DD' EFFECTIVE DATE
OEFFSEQ DC CL3'ZZ9' EFFECTIVE SEQUENCE
OPOSPS DC CL8' ' PS POSITION NUMBER
OSTACODE DC CL1' ' STATUS - CODE
OTYPE DC CL1' ' EMPLOYEE TYPE
OFLSA DC CL1' ' FLSA STATUS
OFULL DC CL1' ' FULL/PART TIME
OGRADE DC CL3' ' JOB GRADE
OGRADATE DC CL10'YYYY/MM/DD' JOB GRADE - ENTRY DATE
OJOBDATE DC CL10'YYYY/MM/DD' JOB - ENTRY DATE
OJOB1 DC CL6' ' JOB - CODE
ODEPLOC# DS 0CL5 DEPT - LOCATION KEY
ODEPTAG DC CL1' ' DEPT - LOCATION TAG
ODEPLOC DC CL4' ' DEPT - LOCATION
OPAYGRP DC CL3' ' PAY GROUP
OREG DC CL1' ' REG/TEMP
OSTDHRS DC CL4'ZZ99' STANDARD HOURS
ONXTPRF DC CL10'YYYY/MM/DD' NEXT PERFORMANCE REVIEW
OPOSGE DC CL4' ' JOB - GE POSITION
OPOSDATE DC CL10'YYYY/MM/DD' POS - ENTRY DATE
OFILL DS CL(L'OREC-(*-OREC)) FILLER
ORECX EQU * END OF RECORD
***********************************************************************
TPRNT TPRINTER UTILITY
LTORG LITERAL POOL
***********************************************************************
EMPNO DC CL6'000000' NEW EMPLOYEE NUMBER
***********************************************************************
PDATA DS 0CL(L'IDATA) DATA SEGMENT
PEMP DC CL8'$$$$$$$$' EMPLOYEE ID NUMBER
PCO DC CL3' ' COMPANY CODE
PSEQ DC CL3' ' SEQUENCE
PMAX DC CL3' ' MAXIMUM SEQUENCE
PREG DC CL1' ' REG/TEMP/FULL/PART
PTYPE DC CL1' ' TYPE (EXEMPT/NON-EXEMPT)
PDEPT DC CL6' ' DEPARTMENT
PNXTPRF DC CL10'YYYY-MM-DD' NEXT REVIEW DATE
PPOSGE DC CL5' ' GE POSITION NUMBER
PPOSNO DC CL10' ' POSITION NUMBER
PPOSPSE DC CL8' ' PS POSITION NUMBER-E (EMP)
PPOSPSP DC CL8' ' PS POSITION NUMBER-P (POS)
PSTAT DC CL1' ' CURRENT STATUS CODE
PSALARY DC CL10'-ZZZZZZZ99' CURRENT SALARY AMOUNT
PRATE DC CL1' ' CURRENT RATE CODE (A/H)
PJOB# DC CL6' ' CURRENT JOB NUMBER
PJOB#1 DC CL10' ' CURRENT JOB 1
PCUSTOM DC CL25' ' CURRENT CUSTOM USER.TAB1
PHIRE DC CL10'YYYY-MM-DD' HIRE DATE
PRECENT DC CL10'YYYY-MM-DD' MOST RECENT HIRE DATE
*
HERRS DC XL2'0000' ERROR BITS (HIRFIX)
PERRS DC XL2'0000' ERROR BITS
PBITS DC XL1'00' SEGMENT BITS
PSALMAX DC PL2'0' SALARY - MAXIMUM SEQUENCE
PJOBMAX DC PL2'0' JOB - MAXIMUM SEQUENCE
PDEPMAX DC PL2'0' DEPT - MAXIMUM SEQUENCE
PSTAMAX DC PL2'0' STATUS - MAXIMUM SEQUENCE
*
WSEQ DC PL2'0' PACKED SEQUENCE NUMBER
WDATE DC CL10'YYYY-MM-DD' FIND DATE ARGUMENT
WBITS DC XL1'00' TABLE SEGMENT BITS
WCTR DC PL2'0' TABLE SEQUENCE COUNTER
***********************************************************************
POSTAB DS 35CL30 POSITION/TITLE TABLE
***********************************************************************
TLEN EQU (IFILL-IDATAX)+15 TABLE - ELEMENT LENGTH
TLAST DC A(TABLEX-TLEN) LAST ENTRY ADDRESS
TABLE DS 35CL(TLEN) HISTORY TABLE
TABLEX DC XL1'FF' END OF TABLE
***********************************************************************
@SAL EQU X'80' SALARY SEGMENT BIT
@JOB EQU X'40' JOB SEGMENT BIT
@DEP EQU X'20' DEPT SEGMENT BIT
@STA EQU X'10' STATUS SEGMENT BIT
***********************************************************************
@SALL EQU L'ISALSEG SALARY SEGMENT LENGTH
@JOBL EQU L'IJOBSEG JOB SEGMENT LENGTH
@DEPL EQU L'IDEPSEG DEPT SEGMENT LENGTH
@STAL EQU L'ISTASEG STATUS SEGMENT LENGTH
***********************************************************************
TDSECT DSECT HISTORY DSECT
TENTRY DS 0CL(TLEN) HISTORY ENTRY
TDATE DS CL10 EFFECTIVE DATE
TSEQ DS PL2 EFFECTIVE SEQUENCE
TBITS DS XL1 SEGMENT BITS
TERRS DS XL2 ERROR BITS
*
TSALSEG DS 0CL(L'ISALSEG) SALARY SEGMENT
TSALMAX DS CL3 SALARY - MAXIMUM SEQUENCE
TSALDATE DS CL10 SALARY - DATE
TSALAMT DS CL10 SALARY - AMOUNT
TSALRATE DS CL2 SALARY - RATES
TSALINCR DS CL10 SALARY - INCR.AMOUNT
TSALPCTG DS CL10 SALARY - INCR.PERCENT
TSALCODE DS CL3 SALARY - INCR.CODE
*
TJOBSEG DS 0CL(L'IJOBSEG) JOB SEGMENT
TJOBMAX DS CL3 JOB - MAXIMUM SEQUENCE
TJOBDATE DS CL10 JOB - DATE
TJOBNO DS CL8 JOB - NUMBER
TJOBTTL DS CL25 JOB - TITLE
TJOBGRD DS CL4 JOB - GRADES
TJOBCODE DS CL3 JOB - CODE
TJOB1 DS CL10 JOB - JOB1
TJOBGE DS CL4 JOB - GE POSITION
TJOBCUS DS CL25 JOB - CUSTOM USER.TAB1
*
TDEPSEG DS 0CL(L'IDEPSEG) DEPT SEGMENT
TDEPMAX DS CL3 DEPT - MAXIMUM SEQUENCE
TDEPDATE DS CL10 DEPT - DATE
TDEPNO DS CL8 DEPT - NUMBER
TDEPNAME DS CL20 DEPT - NAME
TDEPPS DS CL6 DEPT - PS DEPT NO
TDEPLOC DS CL6 DEPT - LOCATION
*
TSTASEG DS 0CL(L'ISTASEG) STATUS SEGMENT
TSTAMAX DS CL3 STATUS - MAXIMUM SEQUENCE
TSTADATE DS CL10 STATUS - DATE
TSTACODE DS CL3 STATUS - CODE
TSTAREAS DS CL3 STATUS - REASON
***********************************************************************
END TDPS007
Keep in mind this is just a small sampling of the overall project.