Scramble sensitive HR data in test-environments
In the event of a restore of production data into your Test / QA environment, you need scramble your sensitive HR data.
In the event of a restore of production data into your Test / QA environment, you need scramble your sensitive...
Continue Reading This Article
Enjoy this article as well as all of our content, including E-Guides, news, tips and more.
HR data. This program will scramble the employees SSN, date of birth, salaries, bonuses, etc. The code was written in R/3 4.6B.
REPORT zhrqaprv. ************************************************************************ * Program Name : ZHRQAPRV * * Interface ID : N/A * * Create Date : 09/26/2003 * * Application : HR * * Author : Mike Arnold * * Logical DB : PNP * * Description : This program will scramble confidential data in * * a NON-production environment * * * * Infotype * * 0002 Change DOB and SSN * * 0006 Change BEGDA if it equals DOB * * 0077 Change BEGDA if it equals DOB * * 0008 Change Salary * * 0014 Change Recurring payments & deductions * * 0015 Change one-time payments * * * * Inputs : N/A * * Includes : N/A * * Functions : N/A * * Modifications: * * DATE PROGRAMMER CORR# DESCRIPTION * * 09/26/03 Mike Arnold DV2K906063 New Program * ************************************************************************ TABLES: pernr. INFOTYPES: 0002, 0006, 0008, 0014, 0015, 0025, 0077. DATA: g_gbdat_real TYPE d, g_gbdat_fake TYPE d, g_mode TYPE pspar-actio, g_multiplier TYPE bseg-wrbtr, g_gbdat_adj TYPE p, g_salpct_adj TYPE p. DATA: wa_return TYPE bapireturn1, wa_record_key TYPE bapipakey, wa_pskey TYPE pskey. START-OF-SELECTION. * Prevent this program from accidentally being run in PRD. IF sy-sysid = 'PRD'. MESSAGE a001(z1) WITH 'Program cannot be run in ' sy-sysid. ENDIF. GET pernr. CALL FUNCTION 'BAPI_EMPLOYEE_ENQUEUE' EXPORTING number = pernr-pernr IMPORTING return = wa_return. IF NOT wa_return IS INITIAL. WRITE:/ wa_return-message. EXIT. ENDIF. rp-provide-from-last p0002 space pn-begda pn-endda. MOVE p0002-gbdat TO g_gbdat_real. PERFORM change_dob USING g_gbdat_real CHANGING g_gbdat_fake. * Change the DOB and SSN. LOOP AT p0002. MOVE g_gbdat_fake TO p0002-gbdat. CONCATENATE '999' pernr-pernr+2(6) INTO p0002-perid. IF p0002-begda = g_gbdat_real. MOVE g_gbdat_fake TO p0002-begda. MOVE 'INS' TO g_mode. ELSE. MOVE 'MOD' TO g_mode. ENDIF. MOVE-CORRESPONDING p0002 TO wa_pskey. PERFORM update_infotype USING p0002 g_mode wa_pskey. * If the begin date is later than the original, then the * old one will be delimited. This must be deleted. IF g_gbdat_fake > g_gbdat_real. MOVE g_gbdat_real TO: wa_pskey-begda, p0002-begda. wa_pskey-endda = g_gbdat_fake - 1. MOVE wa_pskey-endda TO p0002-endda. MOVE 'DEL' TO g_mode. PERFORM update_infotype USING p0002 g_mode wa_pskey. ENDIF. ENDLOOP. * Since BEGDA on 0006 and 0077 is the same as the DOB, * these need to be changed as well. LOOP AT p0006 WHERE begda = g_gbdat_real. MOVE g_gbdat_fake TO p0006-begda. MOVE 'INS' TO g_mode. MOVE-CORRESPONDING p0006 TO wa_pskey. PERFORM update_infotype USING p0006 g_mode wa_pskey. * If the begin date is later than the original, then the * old one will be delimited. This must be deleted. IF g_gbdat_fake > g_gbdat_real. MOVE g_gbdat_real TO: wa_pskey-begda, p0006-begda. wa_pskey-endda = g_gbdat_fake - 1. MOVE wa_pskey-endda TO p0006-endda. MOVE 'DEL' TO g_mode. PERFORM update_infotype USING p0006 g_mode wa_pskey. ENDIF. ENDLOOP. LOOP AT p0077 WHERE begda = g_gbdat_real. MOVE g_gbdat_fake TO p0077-begda. MOVE 'INS' TO g_mode. MOVE-CORRESPONDING p0077 TO wa_pskey. PERFORM update_infotype USING p0077 g_mode wa_pskey. * If the begin date is later than the original, then the * old one will be delimited. This must be deleted. IF g_gbdat_fake > g_gbdat_real. MOVE g_gbdat_real TO: wa_pskey-begda, p0077-begda. wa_pskey-endda = g_gbdat_fake - 1. MOVE wa_pskey-endda TO p0077-endda. MOVE 'DEL' TO g_mode. PERFORM update_infotype USING p0077 g_mode wa_pskey. ENDIF. ENDLOOP. * Scramble each salary LOOP AT p0008. PERFORM get_random_number CHANGING g_multiplier. MULTIPLY p0008-ansal BY g_multiplier. MOVE 'MOD' TO g_mode. MOVE-CORRESPONDING p0008 TO wa_pskey. PERFORM update_infotype USING p0008 g_mode wa_pskey. ENDLOOP. * Scramble each recurring payment LOOP AT p0014. PERFORM get_random_number CHANGING g_multiplier. MULTIPLY p0014-betrg BY g_multiplier. MOVE 'MOD' TO g_mode. MOVE-CORRESPONDING p0014 TO wa_pskey. PERFORM update_infotype USING p0014 g_mode wa_pskey. ENDLOOP. * Scramble each additional payment LOOP AT p0015. PERFORM get_random_number CHANGING g_multiplier. MULTIPLY p0015-betrg BY g_multiplier. MOVE 'MOD' TO g_mode. MOVE-CORRESPONDING p0015 TO wa_pskey. PERFORM update_infotype USING p0015 g_mode wa_pskey. ENDLOOP. CALL FUNCTION 'BAPI_EMPLOYEE_DEQUEUE' EXPORTING number = pernr-pernr IMPORTING return = wa_return. END-OF-SELECTION. WRITE:/ 'Employee data has been scrambled'. *&---------------------------------------------------------------------* *& Form CHANGE_DOB *&---------------------------------------------------------------------* * Scramble date of birth *----------------------------------------------------------------------* * -->P_GBDAT_REAL Real DOB * <--P_GBDAT_FAKE Fake DOB *----------------------------------------------------------------------* FORM change_dob USING p_gbdat_real CHANGING p_gbdat_fake. DATA: l_value TYPE bseg-wrbtr, l_abs_value TYPE bseg-wrbtr. DO. CALL FUNCTION 'RANDOM_P' EXPORTING rnd_min = -3650 rnd_max = 3650 IMPORTING rnd_value = l_value. * This will adjust the persons DOB by at least 90 days l_abs_value = abs( l_value ). IF l_abs_value > 90. EXIT. ENDIF. ENDDO. * Adjust the employee's age by +/- 10 years p_gbdat_fake = p_gbdat_real + l_value. ENDFORM. " CHANGE_DOB *&---------------------------------------------------------------------* *& Form UPDATE_INFOTYPE *&---------------------------------------------------------------------* * Use the BAPI to update the infotypes *----------------------------------------------------------------------* * -->P_nnnn Infotype Data * -->P_MODE Operation (INS, MOD, or DEL) * -->P_PSKEY Infotype keys *----------------------------------------------------------------------* FORM update_infotype USING p_nnnn p_mode p_pskey STRUCTURE pskey. CALL FUNCTION 'HR_INFOTYPE_OPERATION' EXPORTING infty = p_pskey-infty number = p_pskey-pernr subtype = p_pskey-subty objectid = p_pskey-objps lockindicator = p_pskey-sprps validityend = p_pskey-endda validitybegin = p_pskey-begda recordnumber = p_pskey-seqnr record = p_nnnn operation = p_mode * TCLAS = 'A' * DIALOG_MODE = '0' * NOCOMMIT = * VIEW_IDENTIFIER = * SECONDARY_RECORD = IMPORTING return = wa_return key = wa_record_key. IF wa_return-type = 'E'. WRITE:/ p_pskey, wa_return-message. ENDIF. ENDFORM. " UPDATE_INFOTYPE *&---------------------------------------------------------------------* *& Form GET_RANDOM_NUMBER *&---------------------------------------------------------------------* * Get a random number to multiply by the person's * salary, bonus, etc... *----------------------------------------------------------------------* * <--P_MULTIPLIER Random number *----------------------------------------------------------------------* FORM get_random_number CHANGING p_multiplier. DO. CALL FUNCTION 'RANDOM_P' EXPORTING rnd_min = '0.80' rnd_max = '1.20' IMPORTING rnd_value = p_multiplier. * Adjust the number by at least 3% IF p_multiplier < '0.97' OR p_multiplier > '1.03'. EXIT. ENDIF. ENDDO. ENDFORM. " GET_RANDOM_NUMBER