WORKFORCE READY REST API Overview KRONOS INCORPORATED DECEMBER
WORKFORCE READY REST API Overview © KRONOS INCORPORATED │ DECEMBER 1, 2020 │ 1
What is REST? • Web Services to Send & Receive Data “In many ways, the World Wide Web itself, based on HTTP, can be viewed as a RESTbased architecture” • Architecture style, platform & language independent, light weight alternative to SOAP • Uses HTTP to post (send), get (read), put (change), and delete data © KRONOS INCORPORATED │ DECEMBER 1, 2020 │ 2
Why REST? • Interface development • 3 rd party application development • Custom data reporting Workforce Ready’s next gen mobile app will be developed using REST APIs only © KRONOS INCORPORATED │ DECEMBER 1, 2020 │ 3
REST API FAQ: “Does this replace Middleware? ”…No Middleware Windows Services SOAP APIs • Pre-written SOAP scripts • GUI-based interaction • Regularly scheduled imports / exports • Legacy API Architecture © KRONOS INCORPORATED │ DECEMBER 1, 2020 │ 4
Before getting started… • Ensure you’ve added Web Services (REST) to your company marketplace (note – if you do not see the marketplace items then you do not have sufficient security privileges and will need to contact your manager) • http: //secure 3. saashr. com/ta/do cs/rest/ should be referenced with the most up-to-date links and information © KRONOS INCORPORATED │ DECEMBER 1, 2020 │ 5
STEP 1 Authentication • You’ll need a Token to make use of REST APIs • Tokens can be secured with post invocation https: //secure 3. saashr. com: 443/ta/rest/v 1/login with a valid company, username, and password • You will need to manually prefix your retrieved Token with “Bearer ” for all invocations thereafter *Note – full list of invocations are made public at https: //secure 3. saashr. com/ta/docs/rest/api. html © KRONOS INCORPORATED │ DECEMBER 1, 2020 │ 6
QUICK EXERCISE… Request a Token… 1. Encode your Workforce Ready password using http: //www. url-encode -decode. com/ (note: http does not like special characters ) 2. Open your internet browser and type in the following URL, using your unique login credentials: https: //secure. saashr. com/ta/rest/v 1/login? company=Kronos. WFRAdm in&username=[User. Name]&password=[Encoded. Password] * e. g. : Company Short Name = Kronos. WFRAdmin; Username = Test. EE; Password: Kronos#1 https: //secure. saashr. com/ta/rest/v 1/login? company=KRONOSWFRADMIN&username=TESTEE&password=KRONOS%231 © KRONOS INCORPORATED │ DECEMBER 1, 2020 │ 7
QUICK EXERCISE… Request a Token… • If you got a response like this, you’re officially a REST API user! {"token": "c 19 f 226 d-c 48 c-4 ecd-9 beb-01 c 93831 ee 4 f", "ttl": 3600000, "units": "milliseconds"} This response is written in language “JSON”, note the extra detail “ttl”, telling us we have one hour until this token expires © KRONOS INCORPORATED │ DECEMBER 1, 2020 │ 8
C# EXAMPLE Authenticate by sending user credentials var client = new Rest. Client("https: //middleware. workforceready. euta/rest/v 1/login"); var request = new Rest. Request(Method. POST); request. Add. Header("cache-control", "no-cache"); request. Add. Header("x-forwarded-proto", "https"); request. Add. Header("content-type", "application/json"); request. Add. Header("accept", "application/json"); request. Add. Parameter("application/json", "{n "credentials": {n "username": " AUSERNAME ", n "password": " APASSWORD ", n "company": "admin"n }n}n", Parameter. Type. Request. Body); IRest. Response response = client. Execute(request) © KRONOS INCORPORATED │ DECEMBER 1, 2020 │ 9
STEP 2 Authentication > Invocation • An invocation is the type of request you wish to make • There approximately 50 invocations available with base URL http: //secure 3. saashr. com/ta/docs/rest/, e. g. : − …/employee/schedules − …/report/saved/{settings_id} − …/webclock *Note – full list of invocations are made public at http: //secure 3. saashr. com/ta/docs/rest/ © KRONOS INCORPORATED │ DECEMBER 1, 2020 │ 10
PARAMETERS OF A REST API INVOCATION Examples Authentication (i. e. token) Content-Type (e. g. CSV, Text, XML, JSON) Content-ID (e. g. report, export, settings) Filter (i. e. field names) © KRONOS INCORPORATED │ DECEMBER 1, 2020 │ 11
Sub get. Available. Reports() // declare variables Set myrequest = Create. Object("winhttprequest. 5. 1") EXCEL VBA EXAMPLE Retrieve Saved Reports with Parameters URLReport = ("https: //secure. saashr. com: 443/ta/rest/v 1/reports? type=Saved&company%3 shortna me=" & Company) myrequest. Open "GET", URLReport, False myrequest. set. Request. Header "Accept", "application/json" myrequest. set. Request. Header "Authentication", "Bearer " & Token myrequest. set. Request. Header "Content-Type", "application/json" myrequest. Send // handle response from myrequest. responsetext End Sub © KRONOS INCORPORATED │ DECEMBER 1, 2020 │ 12
CONTENT-ID FAQ: “Where do I find a specific {content_id}? ” THERE A FEW DYNAMIC CONTENT-ID TYPES: EACH OF WHICH HAS A SEPARATE GET REQUEST TO RETRIEVE THE CONTENT-ID NEEDED: • EXPORT/{DATA_EXPORT_ID} • GET HTTPS: //SECURE 3. SAASHR. COM: 443/TA/REST/V 1/EXPORTS • IMPORT/{TYPE ID} • GET HTTPS: //SECURE 3. SAASHR. COM: 443/TA/REST/V 1/IMPORTS • REPORT/. . /{REPORT_ID} • GET HTTPS: //SECURE 3. SAASHR. COM: 443/TA/REST/V 1/REPORTS • REPORT/. . /SAVED/{SETTINGS_ID} • GET HTTPS: //SECURE 3. SAASHR. COM: 443/TA/REST/V 1/REPORTS* * Note – saved reports must be specified in the Body as ‘type. Saved’ (not type. All) © KRONOS INCORPORATED │ DECEMBER 1, 2020 │ 13
CONTENT-ID FAQ: “Where do I find a specific {content_id}? ” Continued… • You can also find the {content_id} within Workforce Ready under column title: “SYSTEM ID” © KRONOS INCORPORATED │ DECEMBER 1, 2020 │ 14
FAQ: “Where do I find a specific {content_id}? ” Continued… Saved Reports • Dynamic settings_ids (unique for every saved report) Global Reports • Fixed report_ids (examples below): − − − "REPORT_ACCOUNT_MY_TODO” "REPORT_COMPANY_ACCRUAL_BALANCES” "REPORT_EMPLOYEE_ROSTER” "REPORT_FIND_CC_1” "REPORT_MY_SAVED_REPORTS” Etc…(Full List in Appendix) © KRONOS INCORPORATED │ DECEMBER 1, 2020 │ 15
ADDITIONAL REQUIREMENTS FOR POST, PUT, AND DELETE INVOCATIONS Examples GET: n/a POST: Body (JSON, XML, Multi-Part Form) PUT: Body (JSON, XML, Multi-Part Form) DELETE: Filter (e. g. field name and operators) © KRONOS INCORPORATED │ DECEMBER 1, 2020 │ 16
JAVASCRIPT EXAMPLE Create Employee Base Compensation var settings = { "async": true, "cross. Domain": true, "url": "https: //middleware. workforceready. eu: 443/ta/rest/v 1/employee/compensation/history", "method": "POST", "headers": { "authentication": "bearer 23 bf 5 de 4 -298 d-43 f 5 -ae 82 -354 a 99 a 9 d 71 d", "x-forwarded-proto": "https", "content-type": "application/json", "cache-control": "no-cache" }, "process. Data": false, "data": "{rn "compensations": [rn {rn "company" : {rn "short_name" : "intl. demo"rn }, rn "employee": {rn "employee_id": "12335_546"rn }, rn "effective_from": "2016 -71", rn "amount": 5000. 0, rn "amount_period": "Month", rn "hours": "40: 00", rn …. ]rn}" } $. ajax(settings). done(function (response) { console. log(response); }); © KRONOS INCORPORATED │ DECEMBER 1, 2020 │ 17
STEP 3 Authentication > Invocation > Response Handling • All REST API queries that reach our server will solicit a response { "ttl": 3600000, "token": "7 bd 0 fd 3 b-ecba-4674 -8 b 1139 c 51 b 38 d 820", "units": "milliseconds“ } • …sometimes that response is not what you’d hoped for { "errors": [ { "code": 400, "message": } ] } "Unparsable payload" *Note – full list of invocations are made public at http: //secure 3. saashr. com/ta/docs/rest/ © KRONOS INCORPORATED │ DECEMBER 1, 2020 │ 18
Response Handling (Continued) • Response formats default to JSON, however WFR supports representations as XML, and in some cases CSV or HTML • Error troubleshooting should start with the “code” and “message” provided in the response – usually the message is descriptive enough to get you what you need © KRONOS INCORPORATED │ DECEMBER 1, 2020 │ 19
Troubleshooting from WFR • Once enabled you can audit all REST Invocations from within WFR © KRONOS INCORPORATED │ DECEMBER 1, 2020 │ 20
IMPORTANT NOTE! API Removal Process Per Kronos engineering, APIs / invocations will be removed as required 1. Depreciate the existing API − Note in the documentation http: //secure 3. saashr. com/ta/docs/rest/ − Mention in release notes − Depreciated header on the response 2. ~6 -12 months later − Notice of pending removal in release notes 3. Following release − Removal of API © KRONOS INCORPORATED │ DECEMBER 1, 2020 │ 21
Custom Web Clock Demonstration © KRONOS INCORPORATED │ DECEMBER 1, 2020 │ 22
What is expected? x Consultants are not expected to be able to write code/programs ü Consultants are expected to understand the framework and benefits of REST APIs © KRONOS INCORPORATED │ DECEMBER 1, 2020 │ 23
Homework • Practice making REST API calls & reference our available resources from our test tool: http: //secure 3. saashr. com/ta/docs/rest/ • Learn how JSON works: http: //json-schema. org/example 1. html • Practice making advanced REST API calls using google chrome add-on “Postman”: Link • …Imagine the possibilities! © KRONOS INCORPORATED │ DECEMBER 1, 2020 │ 24
Appendix © KRONOS INCORPORATED │ DECEMBER 1, 2020 │ 25
EXAMPLES Login Javascript (ajax) C# (Rest. Sharp) var settings = { "async": true, "cross. Domain": true, "url": "https: //middleware. workforceready. eu/ta/rest/v 1/log in", "method": "POST", "headers": { "accept": "application/json", "content-type": "application/json", "x-forwarded-proto": "https", "cache-control": "no-cache" }, "process. Data": false, "data": "{n "credentials": {n "username": "AUSERNAME", n "password": "APASSWORD", n "company": "admin"n }n}n" } $. ajax(settings). done(function (response) { console. log(response); }); var client = new Rest. Client("https: //middleware. workforceready. euta/res t/v 1/login"); var request = new Rest. Request(Method. POST); request. Add. Header("cache-control", "no-cache"); request. Add. Header("x-forwarded-proto", "https"); request. Add. Header("content-type", "application/json"); request. Add. Header("accept", "application/json"); request. Add. Parameter("application/json", "{n "credentials": {n "username": " AUSERNAME ", n "password": " APASSWORD ", n "company": "admin"n }n}n", Parameter. Type. Request. Body); IRest. Response response = client. Execute(request); c. URL curl -X POST -H "Accept: application/json" -H "Content-Type: application/json" -H "XFORWARDED-PROTO: https" -H "Cache-Control: no -cache" -d '{ "credentials": { "username": " AUSERNAME ", "password": " APASSWORD ", "company": "admin" } } ' "https: //middleware. workforceready. eu/ta/rest/v 1/login" © KRONOS INCORPORATED │ DECEMBER 1, 2020 │ 26
EXAMPLES List Available Reports Javascript (ajax) var settings = { "async": true, "cross. Domain": true, "url": "https: //middleware. workforceready. eu: 443/ta/ rest/v 1/reports? type=all", "method": "GET", "headers": { "accept": "application/json", "authentication": "bearer 23 bf 5 de 4 -298 d-43 f 5 ae 82 -354 a 99 a 9 d 71 d", "cache-control": "no-cache" } } $. ajax(settings). done(function (response) { console. log(response); }); List available reports C# (Rest. Sharp) var client = new Rest. Client("https: //middleware. workforceready. eu: 443/ ta/rest/v 1/reports? type=all"); var request = new Rest. Request(Method. GET); request. Add. Header("cache-control", "no-cache"); request. Add. Header("authentication", "bearer 23 bf 5 de 4298 d-43 f 5 -ae 82 -354 a 99 a 9 d 71 d"); request. Add. Header("accept", "application/json"); IRest. Response response = client. Execute(request); c. URL curl -X GET -H "Accept: application/json" -H "Authentication: bearer 23 bf 5 de 4 -298 d-43 f 5 ae 82 -354 a 99 a 9 d 71 d" -H "Cache-Control: nocache" "https: //middleware. workforceready. eu/ta/rest/ v 1/reports? type=all" © KRONOS INCORPORATED │ DECEMBER 1, 2020 │ 27
EXAMPLES Run Default Report Javascript (ajax) var settings = { "async": true, "cross. Domain": true, "url": "https: //middleware. workforceready. eu/ta/rest/ v 1/report/global/ADMIN_REPORT_SYSTEM_ACC OUNTS", "method": "GET", "headers": { "accept": "text/csv", "authentication": "bearer 23 bf 5 de 4 -298 d-43 f 5 ae 82 -354 a 99 a 9 d 71 d", "cache-control": "no-cache" } } $. ajax(settings). done(function (response) { console. log(response); }); C# (Rest. Sharp) Run Default Report var client = new Rest. Client("https: //middleware. workforceready. eu/ta/r est/v 1/report/global/ADMIN_REPORT_SYSTEM_ACCOU NTS"); var request = new Rest. Request(Method. GET); request. Add. Header("cache-control", "no-cache"); request. Add. Header("authentication", "bearer 23 bf 5 de 4298 d-43 f 5 -ae 82 -354 a 99 a 9 d 71 d"); request. Add. Header("accept", "text/csv"); IRest. Response response = client. Execute(request); c. URL curl -X GET -H "Accept: text/csv" -H "Authentication: bearer 23 bf 5 de 4 -298 d-43 f 5 ae 82 -354 a 99 a 9 d 71 d" -H "Cache-Control: nocache" "https: //middleware. workforceready. eu/ta/rest/ v 1/report/global/ADMIN_REPORT_SYSTEM_ACC OUNTS" © KRONOS INCORPORATED │ DECEMBER 1, 2020 │ 28
EXAMPLES Run Saved Report Javascript (ajax) var settings = { "async": true, "cross. Domain": true, "url": "https: //middleware. workforceready. eu/ta/rest/ v 1/report/saved/616257", "method": "GET", "headers": { "accept": "application/xml", "authentication": "bearer 23 bf 5 de 4 -298 d-43 f 5 ae 82 -354 a 99 a 9 d 71 d", "cache-control": "no-cache" } } $. ajax(settings). done(function (response) { console. log(response); }); C# (Rest. Sharp) Run Saved Report var client = new Rest. Client("https: //middleware. workforceready. eu/ta/r est/v 1/report/saved/616257"); var request = new Rest. Request(Method. GET); request. Add. Header("cache-control", "no-cache"); request. Add. Header("authentication", "bearer 23 bf 5 de 4298 d-43 f 5 -ae 82 -354 a 99 a 9 d 71 d"); request. Add. Header("accept", "application/xml"); IRest. Response response = client. Execute(request); c. URL curl -X GET -H "Accept: application/xml" -H "Authentication: bearer 23 bf 5 de 4 -298 d-43 f 5 ae 82 -354 a 99 a 9 d 71 d" -H "Cache-Control: nocache" "https: //middleware. workforceready. eu/ta/rest/ v 1/report/saved/616257" © KRONOS INCORPORATED │ DECEMBER 1, 2020 │ 29
EXAMPLES Create Employee Base Compensation Javascript (ajax) var settings = { "async": true, "cross. Domain": true, "url": "https: //middleware. workforceready. eu: 443/ta/rest/v 1/employee/compensation /history", "method": "POST", "headers": { "authentication": "bearer 23 bf 5 de 4 -298 d-43 f 5 -ae 82 -354 a 99 a 9 d 71 d", "x-forwarded-proto": "https", "content-type": "application/json", "cache-control": "no-cache" }, "process. Data": false, "data": "{rn "compensations": [rn {rn "company" : {rn "short_name" : "intl. demo"rn }, rn "employee": {rn "employee_id": "12335_546"rn }, rn "effective_from": "2016 -7 -1", rn "amount": 5000. 0, rn "amount_period": "Month", rn "hours": "40: 00", rn "hours_period": "Month", rn "num_pp_in_year": 52, rn "remove_all_future": truern }, rn {rn "company" : {rn "short_name" : "intl. demo"rn }, rn "employee": {rn "employee_id": "12335_546"rn }, rn "effective_from": "2017 -7 -1", rn "amount": 5000. 0, rn "amount_period": "Month", rn "hours": "40: 00", rn "hours_period": "Month", rn "num_pp_in_year": 52, rn "remove_all_future": falsern }rn ]rn}" } $. ajax(settings). done(function (response) { console. log(response); }); Create Employee Base Compensation C# (Rest. Sharp) var client = new Rest. Client("https: //middleware. workforceready. eu: 443/ta/rest/v 1/employee/co mpensation/history"); var request = new Rest. Request(Method. POST); request. Add. Header("cache-control", "no-cache"); request. Add. Header("content-type", "application/json"); request. Add. Header("x-forwarded-proto", "https"); request. Add. Header("authentication", "bearer 23 bf 5 de 4 -298 d-43 f 5 -ae 82354 a 99 a 9 d 71 d"); request. Add. Parameter("application/json", "{rn "compensations": [rn {rn "company" : {rn "short_name" : "intl. demo"rn }, rn "employee": {rn "employee_id": "12335_546"rn }, rn "effective_from": "2016 -7 -1", rn "amount": 5000. 0, rn "amount_period": "Month", rn "hours": "40: 00", rn "hours_period": "Month", rn "num_pp_in_year": 52, rn "remove_all_future": truern }, rn {rn "company" : {rn "short_name" : "intl. demo"rn }, rn "employee": {rn "employee_id": "12335_546"rn }, rn "effective_from": "2017 -7 -1", rn "amount": 5000. 0, rn "amount_period": "Month", rn "hours": "40: 00", rn "hours_period": "Month", rn "num_pp_in_year": 52, rn "remove_all_future": falsern }rn ]rn}", Parameter. Type. Request. Body); IRest. Response response = client. Execute(request); c. URL curl -X POST -H "Authentication: bearer 23 bf 5 de 4 -298 d-43 f 5 -ae 82 -354 a 99 a 9 d 71 d" H "X-FORWARDED-PROTO: https" -H "Content-Type: application/json" -H "Cache. Control: no-cache" -d '{ "compensations": [ { "company" : { "short_name" : "intl. demo" }, "employee": { "employee_id": "12335_546" }, "effective_from": "2016 -7 -1", "amount": 5000. 0, "amount_period": "Month", "hours": "40: 00", "hours_period": "Month", "num_pp_in_year": 52, "remove_all_future": true }, { "company" : { "short_name" : "intl. demo" }, "employee": { "employee_id": "12335_546" }, "effective_from": "2017 -7 -1", "amount": 5000. 0, "amount_period": "Month", "hours": "40: 00", "hours_period": "Month", "num_pp_in_year": 52, "remove_all_future": false } ] }' "https: //middleware. workforceready. eu/ta/rest/v 1/employee/compensation/history " © KRONOS INCORPORATED │ DECEMBER 1, 2020 │ 30
AVAILABLE REPORT_IDS Global Reports • "Report. Ids": [ • "REPORT_COMPANY_EXCEPTION_SUMMARY_BY_WEEK", • "REPORT_ACCOUNT_MY_TODO", • "REPORT_COMPANY_SKILLS_PULL", • "REPORT_ALL_ACCOUNT_NOTES", • "REPORT_EMPLOYEE_CUSTOM_FORM_ITEMS", • "REPORT_ALL_SYSTEM_ACCOUNTS", • "REPORT_EMPLOYEE_HARDWARE_SETTINGS", • "REPORT_ALL_TIME_ENTRIES", • "REPORT_EMPLOYEE_MY_CUSTOM_FORM_ITEMS", • "REPORT_ANNIVERSARY_CALENDAR_COMPANY", • "REPORT_EMPLOYEE_ROSTER", • "REPORT_ANNIVERSARY_CALENDAR_COMPANY_MONTHLY", • "REPORT_EMPLOYEE_SENIORITY", • "REPORT_ANNIVERSARY_CALENDAR_COMPANY_WEEKLY", • "REPORT_EMPLOYEE_SUMMARY", • "REPORT_APPLICANT_CUSTOM_FORM_ITEMS", • "REPORT_EMPLOYEE_TIMESHEETS", • "REPORT_APPLICANT_MY_CUSTOM_FORM_ITEMS", • "REPORT_EMPLOYEES_POINTS_BALANCES", • "REPORT_APPROVE_EXTRA_PAY_ENTRIES", • "REPORT_EMPLOYEES_POINTS_DETAILS", • "REPORT_APPROVE_TIME_ENTRIES", • "REPORT_EMPLOYEES_POINTS_HISTORY", • "REPORT_BIRTHDAY_CALENDAR_COMPANY", • "REPORT_FIND_CC_1", • "REPORT_BIRTHDAY_CALENDAR_COMPANY_MONTHLY", • "REPORT_FIND_CC_2", • "REPORT_COMPANY_ACCRUAL_BALANCES", • "REPORT_FIND_CC_3", • "REPORT_COMPANY_ACCRUAL_BALANCES_AS_OF_DATE", • "REPORT_FIND_CC_4", • "REPORT_COMPANY_ACCRUAL_HISTORY", • "REPORT_FIND_CC_5", • "REPORT_COMPANY_EXCEPTION_BY_ENTRY" • "REPORT_FIND_CC_6", • "REPORT_FIND_CC_7", © KRONOS INCORPORATED │ DECEMBER 1, 2020 │ 31
AVAILABLE REPORT_IDS Global Reports (Continued) • "REPORT_FIND_CC_8", • "REPORT_TIME_ENTRY_DETAILED_OVERVIEW_PDF", • "REPORT_FIND_CC_9", • "REPORT_TIME_ENTRY_SUMMARY", • "REPORT_HR_ACTION_REQUESTS", • "REPORT_TIME_OFF_CALENDAR_COMPANY", • "REPORT_HR_EMPLOYEE_INVENTORY_ITEMS", • "REPORT_TIME_OFF_CALENDAR_COMPANY_MONTHLY", • "REPORT_HR_MY_EMPLOYEE_INVENTORY_ITEMS", • "REPORT_TIME_OFF_CALENDAR_COMPANY_WEEKLY", • "REPORT_LATE_EARLY_ABSENT", • "REPORT_TIME_SUMMARY_BY_WEEK", • "REPORT_MY_SAVED_REPORTS", • "REPORT_TIMESHEET_APPROVAL_HIST_OVERVIEW", • "REPORT_PERFORMANCE_REVIEWS", • "REPORT_TIMESHEET_VIEW_ALL", • "REPORT_PTO_REQUEST_ALL", • "REPORT_TIMESHEET_VIEW_ALL_DOCUMENTS", • "REPORT_PTO_REQUEST_HISTORY", • "REPORT_TIMESHEET_VIEW_ALL_NOTES", • "REPORT_PTO_REQUEST_MY_TO_APPROVE", • "REPORT_TIMESHEET_VIEW_PAY_PERIOD", • "REPORT_PTO_REQUEST_OPEN", • "REPORT_TIMESHEET_VIEW_WEEK", • "REPORT_TIME_DOT_BOARD", • "REPORT_TIMESHEETS_ALL_CURRENT", • "REPORT_TIME_ENTRY_BY_COST_CENTER", • "REPORT_TIMESHEETS_ALL_OPEN", • "REPORT_TIME_ENTRY_BY_DAY", • "REPORT_TIMESHEETS_MY_APPROVE", • "REPORT_TIME_ENTRY_BY_EMPLOYEE", • "REPORT_TREE_CC_1", • "REPORT_TIME_ENTRY_BY_WEEK", • "REPORT_TREE_CC_2", • "REPORT_TIME_ENTRY_DETAILED", • "REPORT_TREE_CC_3", • "REPORT_TIME_ENTRY_DETAILED_OVERVIEW", • "REPORT_TREE_CC_4", © KRONOS INCORPORATED │ DECEMBER 1, 2020 │ 32
AVAILABLE REPORT_IDS Global Reports (Continued) • "REPORT_TREE_CC_5", • "REPORT_TREE_CC_6", • "REPORT_TREE_CC_7", • "REPORT_TREE_CC_8", • "REPORT_TREE_CC_9", • "REPORT_TREE_TIME_OFF", • "REPORT_WORK_SCHEDULE_BUDGET_VS_ACTUAL", • "REPORT_WORK_SCHEDULE_DAY", • "REPORT_WORK_SCHEDULE_ENTRIES_EDIT", • "REPORT_WORK_SCHEDULE_OVERVIEW_MONTHLY", • "REPORT_WORK_SCHEDULE_OVERVIEW_WEEKLY", • "REPORT_WORK_SCHEDULE_WEEK_BY_DAILY_SCHEDULE" • ] • } © KRONOS INCORPORATED │ DECEMBER 1, 2020 │ 33
- Slides: 33