ACH Table Load
Excerpts below are taken from the requirements document. Complete documents can be found at the end of this document.
Purpose:
This process uses a flat file feed from Payroll to update the ACH Payee table in KFS. By scheduling a batch process to load data directly into the database, the Accounts Payable department is looking reduce the number of checks printed and distributed. The department is also looking to replace the dual ACH entry process, where the Payroll department is maintaining records and the Accounts Payable office is maintaining records.
Accounts Payable department wants employees to receive ACH payments for advances and reimbursements and have the Payroll department maintain the ACH records so that we can save time, effort, and money.
Accounts Payable is looking to eliminate paper checks to put them in a position to outsource the check-writing function. Also, this process will reduce the fees being paid to the bank for Special Handling due to invalid addresses.
Assumptions and Dependencies:
Payroll generates a .csv file, using PSQuery, with employee information, excluding undergraduate student employees.
1) Employees already using direct deposit will need to be informed that their existing payroll direct deposit information will be used by AP for reimbursements. Any new employees will use a revised direct deposit form allowing AP to use the bank account information.
2) The bank account has already been pre-noted by Core-CT prenote process.
3) Email addresses within LDAP are accurate.
4) Bank Routing Number already exists in Kuali Accounts Payable bank table.
5) Only employee information will be added or updated. Undergraduate student employees will be excluded from the payroll feed. Non-employee records, like vendor records, will need to be manually maintained by AP.
6) Information will be added or updated, only. Deleting of information will not be done.
7) File is encrypted/decrypted when stored on the server using SFTP PGP/GPG key exchange.
8) Accounts Payable to provide initial exception list of Payee IDs to be bypassed. Finance Systems will create the new table, using the data from the provided exception list.
9) Accounts Payable will be responsible for updating the bypass indicator on the ACH table for the exceptions. The indicator will be updated via the Payee ACH Account maintenance screen.
10) Accounts Payable will manually update and maintain the ACH Table for the exception payee IDs, using Kuali Financial Systems, Payee ACH Account maintenance screen.
Risks:
1) Accounts Payable ACH employee information will remain active in the table, even after an employee has left the university.
2) Employees could potentially have their ACH record(s) updated, if any service requests requesting updates to the exception table are not processed in a timely manner.
Process Flow:
Technical Details:
DataStage(ETL) procedure will process the payroll file, updating/inserting ACH Payee Account records. It uses userid ACH_UAT_USR_RO.
A reject file will be produced for any errors and emailed to AP_Vend_Coord@uconn.edu. The file will be timestamped when stored on a server. Each row on the file will duplicate the input file plus an additional field that contains the reject code. The Bank account number will be masked except for the last four digits. Errors may include the following:
1) Bank Routing Number does not exist on the KFS ACH Bank Table (ROUTING).
2) Employee does not exist on LDAP (NO LDAP).
3) Duplicate Employee (DUPLICATE)
4) Bypass Employee who is on Exception file (VIP)
Payroll Direct Deposit Data Extract:
Payroll extract file is .csv format. The first row of the file will be the column headers.
Name of payroll extract file will be ACH<ccyymmdd>.csv
Selection criteria:
1) Account Type is Checking or Savings
2) PreNote status is confirmed
3) Deposit Type is Percent
4) Amount Percent >=40%
5) Employee status is active
6) Position number <> “00065845”
Sort Order:
Emplid, EffDate (Descending), AcctType, AcctNum, AmountPct (descending)
Header Row:
Field Name | Pos | Data Type |
emplid | 1 | String 6 |
EffDate | 2 | String 7 |
AccountNum | 3 | String 10 |
AcctType | 4 | String 8 |
RoutNum | 5 | String 7 |
AmountPct | 6 | String 9 |
Detail Rows:
Field Name | Pos | Data Type | Description | PDP_PAYEE_ACH_ACCT_T |
emplid | 1 | Char 6 | PAYEE_ID_NBR | |
EffDate | 2 | Date | mm/dd/ccyy | |
AccountNum | 3 | Char 17 | BNK_ACCT_NBR | |
AcctType | 4 | Char 1 | Values: “C”, “S” | |
RoutNum | 5 | Char 11 | BNK_ RTNG_NBR | |
AmountPct | 6 | Double 5.2 |
Account Type “C” means Checking, “S” means Savings.
Exception Table – UCONN_PDP_PAYEE_ACH_ACCT_EXT_T:
Field Name | Data Type | Description |
ACH_ACCT_GNRTD_ID | NUMBER(10,0) | From PDP_PAYEE_ACH_ACCT_T |
OBJ_ID | VARCHAR2(36 BYTE) | SYS_GUID() |
VER_NBR | NUMBER(8,0) | Hardcode – 1 |
BYPASS_FEED_UPDATE | VARCHAR2(1 BYTE) | Y means to bypass |
Datastage Processing:
Bypass any Payroll Employee ID whose BYPASS_FEED_UPDATE indicator on the UCONN_PDP_PAYEE_ACH_ACCT_EXT_T is set to ‘Y’. Write a rejection record with the reason code VIP for the records being bypassed due to this condition.
Update the PDP_PAYEE_ACH_ACCT_T table with information from the Payroll extract file. Payee id does not have leading zeroes when inserting or updating. If the record does not exist on the table, create a new row using the data mapping below. On inserts, a new row needs to be added to the UCONN_PDP_PAYEE_ACH_ACCT_EXT_T table as well.
If the row already exists, only update that information that has changed.
Selection Criteria for duplicate records:
1) Get max effective date per emplid.
2) If one record has an Account Type of Checking and one record has Account Type of Savings, choose “Checking”.
3) If both records are checking accounts or both records are savings accounts, choose the higher percentage (AmountPct).
4) If the AmountPct is 50/50 split, choose the lowest account number.
Reject the record not chosen with a reject reason of DUPLICATE.
When accessing LDAP, emplid must have four leading zeroes added to the emplid. LDAP uses a numeric (10) format.
Validation Rules:
1) Employee ID is found on LDAP. Add four leading zeroes to the payroll emplid, before attempting to find on LDAP. If not found on LDAP, reject with “No LDAP”.
2) Payroll Bank Number must exist as a routing number on the PDP_ACH_BNK_T and is active (indicator = ‘Y’). Payroll Bank Number is the same as the KFS Bank Routing Number. This field is the key to the table. If the number is not on the table, reject with “Routing”.
3) If more than one record is received for an employee, reject the unselected record with “DUPLICATE”.
4) Encrypt the Bank Account Number, using the KFS Encrypt_String function.
5) When comparing data on the PDP_PAYEE_ACH_ACCT_T, select only active (ROW_ACTV_IND =’Y’) employee (PAYEE_ID_TYP_CD = ‘E’) records. Bank account number would need to be decrypted using Kuali DECRYPT_STRING function.
6) Bypass any employee with a BYPASS_FEED_UPDATE indicator = ‘Y’ on the UCONN_ PDP_PAYEE_ACH_ACCT_EXT_T.
PDP_PAYEE_ACH_ACCT_T:
Schema – prod: kfs_prd
Field Name | Data Type | Description |
ACH_ACCT_GNRTD_ID | NUMBER(10,0) | PDP_ACH_ACCT_GNRID_ID_SEQ |
OBJ_ID | VARCHAR2(36 BYTE) | SYS_GUID() |
VER_NBR | NUMBER(8,0) | Hardcode – 1 |
BNK_RTNG_NBR | VARCHAR2(9 BYTE) | From Payroll – RoutNum - Verify it exists on PDP_ACH_BNK_T and is active – Reject if does not exist, using reject code Routing |
BNK_ACCT_NBR | VARCHAR2(255 BYTE) | From Payroll – AccountNum – needs to be encrypted using Kuali ENCRYPT_STRING function |
PAYEE_NM | VARCHAR2(123 BYTE) | From LDAP – cn (VARCHAR) - First MiddleInitial Last emplid is used as the key. |
PAYEE_EMAIL_ADDR | VARCHAR2(200 BYTE) | From LDAP – mail (VARCHAR) - emplid is used as the key. |
PAYEE_ID_TYP_CD | VARCHAR2(1 BYTE) | Hardcode – “E” for Employee ID |
ACH_TRANS_TYP | VARCHAR2(4 BYTE) | Hardcode – “ACH” |
ROW_ACTV_IND | VARCHAR2(1 BYTE) | Hardcode – “Y” for inserts only, otherwise do not update this field |
BNK_ACCT_TYP_CD | VARCHAR2(2 BYTE) | Hardcode = If Payroll Account Type = “C”, then “22”, If Payroll Account Type = “S”, then “32” |
PAYEE_ID_NBR | VARCHAR2(40 BYTE) | From Payroll – emplid |
UCONN_PDP_PAYEE_ACH_ACCT_EXT_T:
Schema – prod: kfs_prd
Field Name | Data Type | Description |
ACH_ACCT_GNRTD_ID | NUMBER(10,0) | From PDP_PAYEE_ACH_ACCT_T |
OBJ_ID | VARCHAR2(36 BYTE) | SYS_GUID() |
VER_NBR | NUMBER(8,0) | Hardcode – 1 |
BYPASS_FEED_UPDATE | VARCHAR2(1 BYTE) | Hardcode – “N” |
PDP_ ACH_BNK_T:
Schema – prod: kfs_prd
Userid - prod: ACH_UAT_USR_RO
Field Name | Data Type | Description |
BNK_RTNG_NBR | VARCHAR2(9 BYTE) | Bank Routing Number |
ACTV_IND | VARCHAR2(1 BYTE) | Active indicator = ‘Y’ |
Reject File:
(Copy of input file plus the Reject Reason Code)
Field Name | Pos | Data Type | Description |
emplid | 1 | Char 6 | |
EffDate | 2 | Date | |
AccountNum | 3 | Char 17 | Must mask, leaving last four characters showing |
AcctType | 4 | Char 1 | |
RoutNum | 5 | Char 11 | |
AmountPct | 6 | Double 5.2 | |
ReasonCode | 7 | String |
Related Documents:
Functional Spec by Amy Tse.docx
ACH_Requirements_20150408.docx
Direct Deposit Automation technical specification.doc
UAT-ETL-ACHDIMsExtractETLJob#1.txt
UAT-ETL-ACHDIMsExtractETLJob#2.txt
Meeting 1 minutes-20141205-UPDATED.docx
Meeting 2 minutes-20141205-UPDATED.docx