Page tree
Skip to end of metadata
Go to start of metadata

Overview

The CSV Translator is a Java program used to perform data transformations on a CSV file.  It uses a template file containing functions and commands to determine what transformations to make, and generates a CSV file as output.  This program may be used to transform CSV files from any external source into a format compatible with the Unanet import.  The CSV Translator can be easily called by the IMU.

Table of Contents

System Requirements

To run the program, the Java Runtime Environment (JRE) must be installed on the same machine.  The CSV Translator was compiled on a system running the following versions:

java version "1.8.0_131"
Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)

Program Download

Release DateProgram Attachment
06/13/2019csvtranslator_v9.jar
07/10/2018csvtranslator_v8.jar
07/24/2017csvtranslator_v7.jar
07/07/2017
06/27/2017csvtranslator_v5.jar

*Note: V6 has LOAD() function not compatible with other versions, input parameters swapped.


Running the Program

The program is written in Java, so the file has a .jar extension.  It is run by calling Java, which must be installed on the machine (per the System Requirements above).  

The program can be invoked directly from the command line or from within a .bat file, and accepts 5 arguments (preceded by a dash), one of which is optional:


-jar      [filepath]  //Specifies the path and filename of the CSV Translator program.

-template [filepath]  //Specifies the path and filename of the template file.

-log      [filepath]  //Specifies the path and filename of the log file that may optionally be generated.  This argument is optional. 

-input    [filepath]  //Specifies the path and filename of the input file to be transformed.

-output   [filepath]  //Specifies the path and filename of the output file that will be generated.


When all 5 arguments are applied, the syntax would be of this format:

java -jar csvtranslator_v3.3.1.jar -template [filepath] -log [filepath] -input [filepath] -output [filepath]

For example, the following could either be typed at the command line, or could be in a .bat file:

java -jar csvtranslator_v3.3.1.jar -template my_person_template.txt -log my_person_log.log -input my_person_input.csv -output my_person_output.csv

Calling from the IMU

(This section to be completed. – Show where jar file is being called.  Also include screenshots of standard directory structure)

Template File

Template Structure

The template file is a text file that can be created in Notepad with a .txt extension. The file consists of a header block followed by a set of detail blocks, as follows:


(1) A header block that begins with the HEADER() function, which specifies the header row of the output file.  

    • The translator automatically inserts the leading asterisk before the first column header
    • The header block may also contain the following functions:
      • LOAD() – To load reference files
      • NEWVAR() – To define variables
      • UNIQUE()  – To generate unique output rows
      • SORT()
      • LOADMIN()
      • LOADRELATIVEMIN()
      • HEADER()
    • The header block is ended with the END command
    • Example header block:

      HEADER("Username,Last_Name,Exempt_Status,Roles")

      UNIQUE(TRUE())

      LOAD("Person_Export_All.csv","Unanet_People")

      NEWVAR("Bill_Rate")

      NEWVAR("Cost_Structure")

      END


(2) One detail block of code for each column specified in the header: 

    • The first detail block corresponds to the first header
    • Each detail block contains the logic that will be written to the next column of the output file
    • The detail block might contain just a literal value, which should be enclosed in double quotes.  For example, a detail block might be:

      "RT"
      END

    • Each detail block ends with the END command 

Notes:

  • The columns on the input file are referred to using the C() function with the column number.  So the first column of the input file is referred to as C(1), and the 2nd is C(2). 
  • The number of columns in the input file does not need to match the number of columns in the output file.
  • Comments start with #

Template Functions

Header Functions

The following functions, if used, are referred to as header functions.  They must be specified within the first block of the template, at the top of the file.  The header block is completed with the END command.

HEADER( string headers )

This function may be used once in the header block, and specifies the column header labels of the output file.  The function takes a comma separated list, and uses those values as the headers of the output file being generated.  

The template must then contain the number of detail blocks of code corresponding to the number of values in the header.  

Example:

HEADER("Username,Last_Name,First_Name")        causes 3 headers to be written to the output file.  The template must then contain 3 detail blocks of code to cause values to be generated for all 3 columns.


LOAD( string filename, string id )

This function may be used one or many times in the header block, and loads / reads a separate CSV file to be used as reference data.  For example, a Unanet Export might be done in advance of running the CSV Translator, and by using the LOAD() function on that file, the program can then reference values in that file by using the EXISTS() or LOOKUP() functions. 

The first parameter is the file-path of the file to be loaded.

The second parameter is an ID that you assign to that file to reference the file within the template.

Example:
LOAD("./data/Person_Export.csv","UnanetPeople"loads the file called "Person_Export.csv" and it can be referred to as "UnanetPeople" by other functions within the template.



LOADMIN( string filename, string id, int min_lines )

LOADMIN is used to load a file just as any other load function, but it will intentionally fail if the loaded file contains less than the minimum number of lines passed. For example, if you called LOADMIN("import.csv", "IMPORT", 15) then it would load the file import.csv, assign it the ID 'IMPORT' and give an error if the file contains less than 15 lines.

The first parameter is the name of the file to load.

The second parameter is an ID that you assign to that file to reference the file within the template.

The third parameter is the minimum number of lines that file can contain.

Example:

LOAD("./data/Person_Export.csv", "UnanetPeople", 15)


LOADRELATIVEMIN( string filename, string id, int min_lines )

LOADRELATIVEMIN works very similarly to LOADMIN. LOADRELATIVEMIN ensures that the loaded file has at least the amount of lines as the import file, minus the given value. For example, if the import file as 20 lines, and you called LOADRELATIVEMIN("./data/Person_Export.csv", "Import", 5) then this would ensure the loaded file as at least 15 lines. This is because the import file has 20 lines minus the given value of 5. Thus, the file must have at least 15 lines.

The first parameter is the name of the file to load.

The second parameter is an ID that you assign to that file to reference the file within the template.

The third parameter is the minimum number of lines relative to the import file that the loaded file must have.

Example:

LOADRELATIVEMIN("./data/Person_Export.csv", "Import", 5)


NEWVAR( string ) – This function is no longer necessary

This function may be used once or many times in the header block, and allows a variable name to be defined.  The SETVAR() and GETVAR() functions are used in conjunction with this header function.


The parameter is the name of the variable to create.

Example:

NEWVAR("Bill_Rate")


UNIQUE( bool )

This function may be specified once in the header block, and is used to enable the generation of an output file in which each record is unique.  That is, if the entire row to be output is identical to another, then it will remove the duplicate row from the file.  This function should only be placed within the header block.  The two ways to call it are:

UNIQUE("true")

or

UNIQUE(TRUE())


SORT( bool )
This function is used to specify that the output should be sorted lexicographically. The two ways to call it are:
SORT("true")
or
SORT(TRUE())

Body Functions


The following functions may be used within the detail blocks of code after the END of the header block. 

AFTER(string trim_str, string token)

AFTER is used grab everything after the given token. For example, you could use it to grab the domain name after the '@' symbol in an email address.

Example:

AFTER("anemail@emails.com", "@") = "emails.com"

BEFORE(string trim_str, string token)

BEFORE is used to grab everything before the given token. For example, you could use it to grab the part of an email address occurring before the '@' symbol.

Example:

BEFORE("anemail@emails.com", "@") = "anemail"

BLANK()

Returns a blank value.  It is equivalent to instead writing the literal value "".  It is used when you want a column value to be empty.


C( n )

Returns the data from the input file in the specified column number.

Example:
C(2)      returns the value the second column.


CONCAT( string... )

Returns the concatenation of the given strings provided as arguments.
You can pass as many strings as you would like to be concatenated.

Examples:
CONCAT("Hello", ", world!")       returns "Hello, world!"
CONCAT("Hello", ", world!"," Welcome to ", "Unanet!")      returns  "Hello, world! Welcome to Unanet!"


DATE( in_format, out_format, date ) - v9

Returns a formatted date from an epoch string.

The first parameter (in_format) is the date format used by the (date) parameter. 

The second parameter (out_format) is the date output format.

The third parameter (date) is the date to be converted from (in_format) to (out_format).

Example:

DATE("mm/dd/yyyy","yyyymmdd","08/22/2019")     returns 20190822


DATEADD( format, in_date, d, m, y ) - v9

Adds days, months, and years from a given date.  Returns the formatted date with added months, days, or years.

The first parameter (format) is the date format used by the (in_date) parameter. 

The second parameter (in_date) is the incoming date.

The third parameter (d) is number of days to add to (in_date).

The fourth parameter (m) is number of months to add to (in_date).

The fifth parameter (y) is number of years to add to (in_date).

Example:

DATEADD("MM/dd/yyyy","08/22/2019",5,0,0)       returns 08/27/2019


DATECMP( format, date_a, date_b ) - v9

Compares two dates.  Returns either -1, 0, or 1.  -1 if date_a is less than date_b, 0 if equal, 1 if date_a is greater than date_b

The first parameter (format) is the date format used by the other 2 parameters. 

The second parameter  (date_a) is the first date to be compared.

The third parameter (date_b) is the second date to be compared.

Note: The most common usage of this would be as part of an "IF" statement.

Example:

DATECMP("MM/dd/yyyy","09/01/2019","01/01/2019") returns 1 


DATENEXT ( format, date, day ) - v9

Returns the previous date in which a certain day of the week occurs. For example: "Return the date of the next Sunday".

The first parameter (format) is the date format used by the (date) parameter. 

The second parameter (date) is the incoming date.

The third parameter (day) is an integer from 0-6 that represents the day of the week to search for. 0 is Sunday

Note the (format) parameter's usage of MM.

Example:

DATENEXT("MM/dd/yyyy","08/22/2019",0)    returns 08/25/2019


DATEPREV( format, date, day ) - v9

Returns the previous date in which a certain day of the week occurs. For example: "Return the date of the previous Sunday".

The first parameter (format) is the date format used by the (date) parameter. 

The second parameter (date) is the incoming date.

The third parameter (day) is an integer from 0-6 that represents the day of the week to search for. 0 is Sunday

Note the (format) parameter's usage of MM.

Example:

DATEPREV("MM/dd/yyyy","08/22/2019",0)  returns 08/18/2019


DATESUB( format, in_date, d, m, y ) - v9

Subtracts days, months, and years from a given date.

The first parameter (format) is the date format used by the (in_date) parameter. 

The second parameter (in_date) is the incoming date.

The third parameter (d) is number of days to subtract from (in_date).

The fourth parameter (m) is number of months to subtract from (in_date).

The fifth parameter (y) is number of years to subtract from (in_date).

Example:

DATESUB("MM/dd/yyyy","08/22/2019",5,0,0)       returns 08/17/2019


EXISTS( string, string, string )

Determines whether data exists within a column of a reference file that has been loaded using the LOAD() function. If it does, it returns true, else it returns false.

The first parameter is the ID for the loaded reference file you'd like to search, as specified in the LOAD function within the header block.
The second parameter is the header name of the column you want to search within the loaded file.
The third parameter is the value you are looking for within the column specified in the second parameter.

Example:
EXISTS("Employees","Username","GWashington")        returns true if GWashington is found in the Username column of the loaded reference file called "Employees".  


FC( start, end )

Retrieves data from a fixed field format.  It is essentially a substring across the entire set of data in a row.

Example:
FC( 1, 10 )   returns the first character to the tenth character of each row.


GETVAR( string )

Retrieves data from a variable that was previously set.  The parameter is the name of the variable.

Example:
GETVAR("Bill_Rate")  


GROUPTOTAL( string )

Counts the number of times a string occurs in a column.

The first parameter is the unique string to count. To count how many times an employee's name occurs and that name is stored in column 1, then you would print GROUPTOTAL(C(1)).

EXAMPLE

GROUPTOTAL("Dohn Joe")







HAS( string, what ) - v9

Returns true/false depending on whether or not a string contains another string.

The first parameter (string) is the string to search in.  The second parameter (what) is the string to search for in (string).


EXAMPLE

HAS(c(1),"bob")

Example to handle blank in strings

LOGICONLY()
SETVAR("Last_Name","")
IF(C(6)="")
{
   SETVAR("Last_Name","!ERROR! Last name not provided in Paylocity. Please provide a last name.")
}
ELSEIF( HAS(C(6), " ") )
{
   SETVAR("Last_Name",CONCAT(BEFORE(C(6), " "),AFTER(C(6), " ")))
}
ELSE
{
   SETVAR("Last_Name",C(6))
}
END

IGNORE()

Ignores an entire row of input data from being included in the output file. When called, the current row of operation will not be output. The function takes no parameters.


EXAMPLE

IF (C(12) = "INACTIVE") 
{
IGNORE()
}
ELSE

C(12)
}


ISNUMERIC( string )

Checks whether or not the supplied string is a number or not. This is useful for when a column contains both numbers and strings as it allows you to not do numerical checks on those that are not numerical.

EXAMPLE

ISNUMERIC( "Hello!" )   returns false
ISNUMERIC( "12313" )     returns true


LEFT( int, string )

Returns a given number of characters from the left side of a string. Similar to SUBSTR but the left-most parameter defaults to 0.

The first parameter is the number of characters to keep from the left side.
The second parameter is the string.

EXAMPLE

LEFT( 3, "Unanet!" )    returns  "Una"

LEFT( 8, C(15) )     returns the first 8 characters of the value in Column #15 of the input file


RIGHT( int, string )

Returns a given number of characters from the right side of a string. Similar to SUBSTR but the right-most parameter defaults to the length of the supplied string.

The first parameter is the number of characters to keep from the right side.
The second parameter is the string.

EXAMPLE

RIGHT( 3, "Unanet!" )    returns  "et!"

RIGHT( 8, C(15) )     returns the last 8 characters of the value in Column #15 of the input file



LENGTH( string )

Returns the length of the supplied string. Useful for substring functions.

EXAMPLE

LENGTH( "Hello!" )  returns 6.



LOGICONLY()

Indicates that program that the current block of code should only be used to set variables, and does not represent a column of output.  This function must be used whenever you want to set a variable to be used throughout your code.

EXAMPLE

LOGICONLY()

SETVAR("Bill_Rate",MATH(CONCAT(C(2),"*1.5"),1))                        sets the value of variable "Bill_Rate" to Column 2 multiplied by 1.5

END




LOOKUP( string, string, string, string ) 

The value in the referencing column HAS TO BE UNIQUE.

Looks for and then retrieves a value from a loaded file. (See LOAD for more information.)

The first parameter is the ID of the file that has been loaded via the LOAD function.
The second parameter is the column header of the column to be searched for the value in the 3rd parameter.
The third parameter is the data to find within that column.
The fourth parameter is the column header of the column from which you would like to retrieve data.

Example:

EXAMPLE

LOOKUP("Employees","Username","JSmith","Bill_Rate")       looks in the loaded file called "Employees" and searches through every row looking in the "Username" column to find the value "JSmith".  If found, returns the corresponding value in the "Bill_Rate" column.


LOWER( string )

Changes the case of a string from uppercase to lowercase.

EXAMPLE

LOWER("THIs")     returns "this".


MATH( equation, precision )

Performs basic mathematical operations on numeric values.
The CONCAT() function may be used to perform MATH operations on variable values such as a column value.

The first parameter is a string used to supply the operation, like:  "2*4+6"
The second parameter is used to supply the decimal precision of the output. For example, if 2 is given, it will output the answer to two decimal places.

EXAMPLE

MATH("3*4+2", 4)     returns 14.0000 (it is likely to simply be output as 14 unless there are significant figures).

To perform a calculation on a column value, use the CONCAT() function.  For example:

MATH(CONCAT(C(1),"*25"),4)    multiplies Column 1 of the input file by 25.




PRINT( string )

Prints output to the log file.

EXAMPLE

PRINT(C(1))     prints column one to the log file.

PRINT(CONCAT("Term_Date set to: "GETVAR("Term_Date")))



REPLACE( string, replace, with )

Replaces a piece of a string that with another string.

The first parameter is the string to be modified.

The second parameter is the string to find.

The third parameter is the replacing string.

EXAMPLE


REPLACE( "Hello, world!", "Hello,", "Bye " )    returns "Bye world!"

REPLACE( C(12), " ", "_" )      takes the value in the input file's 12th column, and replaces all spaces with underscores.



RIGHT( int, string )

Returns a specified number of characters from the right side of a string. Similar to SUBSTR but the right-most parameter defaults to the length of the supplied string.

The first parameter is the number of characters to return from the right side.
The second parameter is the string to trim.

EXAMPLE

RIGHT( 5, "Hello, world!" )    returns "orld!"

RIGHT(2, C(14))       takes the value in the input file's 14th column, and returns the last two characters. 



SEARCH(string,string)

Searches within the second parameter (a string) to find the index location of the first instance of the first parameter (another string).

The first string is the value to seach for.

The second string is the value to seach within.


*** please note that the SEARCH function cannot be used to find " " (blank char). please refer to example under HAS function. ***

EXAMPLE

SEARCH("U","UNANET") returns 0

SEARCH("N","UNANET") returns 1 (only finds first instance)

SEARCH("A","UNANET") returns 2

SEARCH("NET","UNANET") returns 3 (only returns the first index of the begining of the string to search for)



SEQ(start)

Creates a counter. The parameter given is the number at which to start counting.

EXAMPLE

SEQ(5)     returns a count starting from 5.



SETVAR( string, string )

Sets a defined variable to a given value.  The variable must first be declared using the NEWVAR function.  This LOGICONLY function must be used whenever you want to set a variable so that the program knows not to output a column of data as it normally does.

Example:

EXAMPLE

IF ( LENGTH(C(11)) = 1) 
{
SETVAR("Segment1", CONCAT("0",C(11)))
}
ELSE
{
SETVAR("Segment1",C(11))
}
END




SUBSTR( string, start, end )

Returns a segment of the string provided, based on the given start and end index values.

The character count starts at zero for the first character in a string. To include the first character in a string, start from '0'.

The starting index INCLUDES the character. The ending index EXCLUDES the character.

EXAMPLE

SUBSTR( "Unanet", 0, 2 )     returns  "Un".

SUBSTR( "Unanet", 3, 6 )       returns "net".

SUBSTR( C(25), 1, 2 )           takes the value in the input file's 25th column, and returns just the second character


NOTE: Function will fail if the string is shorter than the provided "end" index.


TODAY(x)

Return today's date in a specified format. The format for the dates is the Java standard format. More information on this can be found here:  (https://docs.oracle.com/javase/tutorial/i18n/format/simpleDateFormat.html)

Example:
TODAY("MM:dd:yy")   returns the date formatted as 06:30:18.


UPPER( string )

Change the case of a string from lowercase to uppercase.

Example:
UPPER("thiS")   returns "THIS"


LTRIM( string )

LTRIM is used to trim leading whitespace off of a string. The only parameter it takes is the string you would like to trim.

Example:

LTRIM("    Project_ABC")

will return "Project_ABC"


RTRIM( string )

RTRIM is used to trim trailing whitespace off of a string. The only parameter it takes is the string you would like to trim.

Example:

RTRIM("Project_ABC      ")

will return "Project_ABC"


TRIM( string )

TRIM is used to trim leading and trailing whitespace on a string. The only parameter it takes is the string you would like to trim. It is equivalent to saying LTRIM(RTRIM(string)).

Example:

TRIM("   Project_ABC   ")

will return "Project_ABC"



Logic Functions

AND(bool a, bool b)

A logical and statement. This returns true if both a AND b are true.

Example:

AND("true", "false") = false
AND("false", "false") = false
AND("true", "true") = true


 Set up flow_flag that output "N" if today is between 1st & 5th OR 16th and 20th
#NEWVAR("After_first")
#NEWVAR("Before_fifth")
#NEWVAR("After_sixteenth")
#NEWVAR("Before_twentyth")


LOGICONLY()
SETVAR("After_first", SUBSTR(TODAY("MM/dd/yyyy"),3,5)>="01")
SETVAR("Before_fifth", SUBSTR(TODAY("MM/dd/yyyy"),3,5)<="05")
SETVAR("After_sixteenth", SUBSTR(TODAY("MM/dd/yyyy"),3,5)>="16")
SETVAR("Before_twentyth", SUBSTR(TODAY("MM/dd/yyyy"),3,5)<="20")
END


LOGICONLY()
IF ( AND(GETVAR("After_first"), GETVAR("Before_fifth")) = "true" )
{
SETVAR("Flow_Flag","N")
}
ELSEIF ( AND(GETVAR("After_sixteenth"), GETVAR("Before_twentyth")) = "true" )
{
SETVAR("Flow_Flag","N")
}
ELSE
{
SETVAR("Flow_Flag","Y")
}
END


OR(bool a, bool b)

A logical or statement. This returns true if a OR b are true.

Example:

OR("true", "false") = true
OR("false", "false") = false
OR("false", "true") = tru


NOT(bool a)

A logical inverse statement. This returns the opposite of what is passed to it.

Example:

NOT("true") = "false"
NOT("false") = "true"

Function Nesting

All functions can be nested, and there is no limit to how many functions can be nested.

Example:  Given the incoming file data:

JOHN, JACOB, RED

KEVIN, JAMES, BLUE
KYLE, SMITH, PURPLE
LUKE, LEE, BROWN

Three functions can be nested as follows:

 LEFT(3,LOWER(C(1)))

and the resulting column would be:

joh
kev
kyl
luk

Conditional Logic

If and Else Statements

IF evaluates a condition and returns a specified value if the result is true, and another result if the value is false.  

The syntax is:

IF (value1 operator value2) { trueValue}  [ ELSE { falseValue} ]

The Else block is optional.

 For example:


IF( C(2"ACTIVE" )

{

        C(1)

}

ELSE

{

        IGNORE()

}


If there are multiple conditions, the IF statements must be nested, as in the following example:


IF( C(2) = "ACTIVE" )

{

IF ( C(1) > 1) 

{

              C(1)

}

ELSE

{

BLANK()

}

}

ELSE

{

BLANK()

}


Additionally, one can use ELSEIF statements to chain IF's and ELSE's as in the following example:

IF( C(2) = "ACTIVE" ) {
 
IF ( C(1) > 1) {
 
C(1)
 
} ELSE {
 
BLANK()
 
}
}ELSEIF( C(2) = "INACTIVE" ) {

C(2)
 
}ELSE{

BLANK()
 
}


Comparison Operators

In the comparison of two values within an IF or ELSE block:


=          Evaluates to true if value1 is equal to value2
!=         Evaluates to true if value1 is not equal to value2
>          Evaluates to true if value1 is greater than value2
<          Evaluates to true if value1 is less than value2
>=        Evaluates to true if value1 is greater than or equal to value2
<=        Evaluates to true if value1 is less than or equal to value2


Switch | Case Statements

The Switch Case commands evaluate a given field and take specified actions based on specified values of the field.   A Default result should always be given in the case that no match is found. 

For example:


SWITCH(C(22))

{

    CASE( "Salary" )

{

"E"

}

    CASE( "Hourly" )

{

        "N"

}

CASE ("1099")

{

"X"

}

CASE DEFAULT

{

"Unknown Pay Type Value"

}

}

Perferred File Structure For CSV Translator 

Zipped Example: CSV_Translator_Directory.zip


 

Directory input_files

  • Holds files received from external vendor
  • Holds Unanet export files to be used for reference purposes


Directory output_files_for_Unanet_import

  • Holds files generated by CSV Translator for import into Unanet


Directory processing

  • Holds .bat file that calls the CSV Translator.
  • In CSV Translator dir:   

      • CSV Translator .jar file.  
      • Installation directory contains any Unanet export templates (exported for import into Unanet, like   “Z_Ref_People_Export_Template.csv”)
      • In Templates Dir:   

          • Holds CSV template files.  Use filename format template_<import type>.txt
          • Holds a Backups subdirectory :  Every time a template is changed in production, make a backup first.

Reference

Sample Template File

#  The program will create a CSV file with 4 columns, headed by the following labels, and each resulting row will be unique:

HEADER("Username,Last_Name,Exempt_Status,Roles")

UNIQUE()

END


#  Input file Columns:  (The program is reading an input file with 6 columns, although all of the columns will not be used to derive the output.)

#  C(1) is the Last Name

#  C(2) is the Email address

#  C(3) is a flag indicating whether the user supervises people

#  C(4) is an Employee field indicating whether the user is paid on an hourly or salaried basis

#  C(5) is an Employee value that will not be used by the program

#  C(6) is another Employee value that will not be used by the program


#  Username – Uses Column #2 from the input file, and takes everything before the @ symbol the email address to derive the Username:

UPPER(LEFT(SEARCH(C(1),"@"),C(1)))

END


#  Last_Name – Uses Column #1 from the input file, and takes the value without modification:

C(1)

END


#  Exempt_Status – Uses Column #4 from the input file, and maps to Unanet values:

IF (C(4) = "HOURLY") 

{

"N"

}

ELSE

{

"E"

}

END


#  Roles – Uses Column #3 from the input file, which contains a Y/N flag indicating whether the user is a supervisor, to derive Unanet Roles:

IF (C(3) = "Y") 

{

"timesheetUser,expenseUser,manager"

}

ELSE

{

"timesheetUser,expenseUser"

}

END





  • No labels