- 81 Minutes to read
- Print
- Dark
- PDF
Planful API Library
- 81 Minutes to read
- Print
- Dark
- PDF
API Library: Structured Planning, Consolidation, Reporting & Analytics
Introduction
Planful provides many Application Programming Interfaces (APIs). These APIs offer a simple, powerful and secured way of importing or exporting data to and from the Planful application.
Planful and Workiva have partnered to optimize the financial reporting process by providing APIs to integrate Workiva’s Wdesk (a collaborative work management platform) with Planful platforms. With the ability to integrate data directly from Planful into the Workiva Wdesk platform, organizations can achieve a seamless financial close, consolidation, reporting, and disclosure process.
You might leverage this integration by using Planful to generate US GAAP and IFRS compliant balance sheets, income statements, statements of cash flow, and other financial and statutory reports. Create board-ready reports and presentations that integrate structured financial and operational data with unstructured data and commentary. And, leverage Wdesk to create and manage complex reporting requirements, including SEC filings, XBRL, and iXBRL.
Data Import
The data import operation loads data from source systems into Planful. Data import can be done for the following data load types:
- Segment Hierarchies
- Common COA
- Sales
- Data
- GL Data
- Sales Data
- Transaction Data
- Translation Data
- Attributes
- Attribute Hierarchies
- Entity Hierarchies
- Budget Entity Hierarchy
- User Information
- User Load
- Workforce Planning
- Workforce - Employee Data
- Workforce - Employee Compensation Item
- Workforce - Employee Allocations
- Currency Exchange Rates
- External Source Model
Data Export
The data export operation retrieves data from Planful. Data export can be done for:
a. COA Segments
b. GL Data
For each operation the Client application submits a synchronous request to the Planful Web Service API, awaits the Web Service’s response, and processes the results.
Workiva Integration
You’ll use Host APIs to extract the metadata (the report structure) and data (the data in the report) directly from your financial reports generated within Planful. These APIs are integrated with Workiva via Boomi. The extracted financial metadata and data is loaded to the WDesk platform, which automates the process of generating SEC filings and XBRL tagging.
Because the APIs extract data directly from your financial reports, the need for consolidation, the generation of financial statements, and other manual steps in WDesk is eliminated. Additionally, these APIs provide you with the option to override page level parameters on the Dynamic Report.
Additionally, the request API call is capable of overriding partial page filters applied to a Dynamic Report. So, for example, in the Request sample code below, the Scenario in a Dynamic Report is set to 100. You can change the parameter in the API request to run the report for Scenario 102 without making a change to the Dynamic Report or other filters.
API authentication for data and metadata extraction as well as dimension security on the data is applied based on Integration User as configured for the data load APIs.
Best Practices / Tips and Tricks
To override page level parameters on the dynamic report, you must provide the dimension name and dimension code.Example - {[Scenario].[Actual]} ,{ [Time].[2015], [Time].[2016]}, {[Company].[US Company1]}
APIs extract the data from the OLAP cube. Information and settings like excel formulas, headers and footers, report level comments, insert formulas, formula exceptions, hide/show rows, text formatting, suppress empty rows/columns/headers that are present in a report in the application are excluded in the API response.
APIs are supported only for Financial and Workforce (a.k.a cubes).
In Practice: Workiva API Sample
Method
POST
Endpoint Url Syntax
<Provide Application Url>/WkReportDataProvider/GetReportData
Headers
Key : APIKey
Value : Authorization Key
Request Example:
[Copy](javascript:void(0);) ```
`{
"ReportCode" : "page filters report1" ,
"Lineage" : "File Cabinet\Planful Training" ,
"CubeName" : "RepCube" ,
"PageFilters" :
[
{ "DimensionName" : "Scenario" , "MemberIds" : [100]},
{ "DimensionName" : "Reporting" , "MemberIds" : [20]}
],
"ApplyPageFilters" : "true"
}`
Response Example:
[Copy](javascript:void(0);) ```
`{
"RowHeaders" : [
[
{
"Label" : "Balance Sheet" ,
"DimensionName" : "Account" ,
"MemberId" : "2"
}
]
],
"ColumnHeaders" : [
[
{
"Label" : "2018" ,
"DimensionName" : "Time" ,
"MemberId" : "2018"
}
]
],
"Data" : [
[
"-1217991.666666"
]
],
"Status" : "Success" ,
"StatusMessage" : ""
}
`
Usage
Use the Load_Data call to load COA Segment / GL data to staging tables in Planful. When a Client application invokes the Load_Data call, it passes in the rule code and collection of strings with custom delimiter (like “,”,”;”,”|_|” etc). Each string in the collection represents a data row of the COA segment / GLData that is to be loaded into Planful.
Upon invocation, the Web Service parses the string collection and (based on the rule code) transfers the COA segment / GL Data to the staging table in the database and returns an operation result object, which contains the status and status message of the operation. The Client application can then use methods for the operation result objects and retrieve information.
The Client application must be logged in with sufficient access rights to load COA segment / GL data.
Arguments List
The following table provides a list of arguments that are required for Load_Data method call:
Name | Type | Description |
RuleCode | String | The name of the rule that is configured in the ETL of the Planful application. |
ObjectArray | String | The collection of strings. Each string item in the collection represents a data row of the COA segment / GL data that is to be loaded to the Planful application. |
Delimiter | String | The column separator in each row of the source file. Examples are; Comma (,), Tab (VBTab), | (Pipe), ; (Semicolon) |
Response
OperationResult
The Load_Data method call returns an OperationResult object, which contains the status and the status message of the Load_Data method call.
Sample Code
[Copy](javascript:void(0);) ```
`Private Sub LoadData()
Dim api As New HostAPI()
Dim strRuleCode As String = "" , strDelimiter As String = "" , objData()
As String , objResult As OperationResult
Try
'Prepare an array of GL Data Strings to pass to the web method
ReDim objData(1)
objData(0) = "Revenue Acc1||Revenue Acc1||Revenue Acc
Parent1|_|Revenue Acc
Parent1||||Revenue||Balance||YTD||Credit||Active||Leaf||EOM||Yes||Report Category1"
objData(1) = "Revenue Acc2||Revenue Acc2||Revenue Acc
Parent1|_|Revenue Acc
Parent1||||Revenue||Balance||YTD||Credit||Active||Leaf||EOM||Yes||YES|_|Report Category2"
objResult = New OperationResult
'Call the web method with the rule code created in Planful and the delimiter used in the data string
objResult = api.Load_Data("WS - Loading Accounts" , objData, "|_|" )
Console.WriteLine(objResult.message)
Consolde.ReadLine()
Catch ex As Exception
End Try
End Sub
`
Usage
Use the Transfer_Data call to load the staging data to the destination tables in Planful. Upon invocation, the Web Service accepts the rule code and transfers the data available in the staging table for the rule code to the corresponding destination table and returns an operation result object, which contains the status and status message of the operation. The Client application can then use methods on the operation result objects and retrieve information. The Client application must be logged in with sufficient access rights to transfer the staging data to the destination tables.
Arguments List
The following table provides a list of arguments that are required for the Transfer_Data method
call:
Name | Type | Description |
RuleCode | String | The name of the rule that is configured in the Data Load Rules of the Planful application. |
Responses
The Transfer_Data method call returns the OperationResult object which contains status and the status message of the Transfer_Data method call.
[Copy](javascript:void(0);) Success Response
[Copy](javascript:void(0);) Invalid Data Response
[Copy](javascript:void(0);) Invalid Response
Sample Code
[Copy](javascript:void(0);) ```
`Private Sub TransferData()
Dim api As New HostAPI()
Dim strRuleCode As String ="" , objResult As OperationResult
Try
objResult = New OperationResult
'Call the web method with the rule code created in Planful
ojbResult = api.Transfer_Data("WS - Loading Accounts" )
Console.WriteLine(objResult.message)
Console.ReadLine()
Catch ex As Exception
End Try
End Sub `
Usage
Use the Clear_Data call to delete the staging data loaded into Planful. Upon invocation, the Web Service accepts the rule code and clears the data available in the staging table for the rule code and returns an operation result object, which contains the status and status message of the operation. The Client application can then use methods for the operation result objects and retrieve information.
Client application must be logged in with sufficient access rights to clear the staging data.
Arguments List
The following table provides a list of arguments that are required for the Clear_Data method
call:
Name | Type | Description |
RuleCode | String | The name of the rule that is configured in the Data Load Rules of the Planful application. |
Response
The Clear_Data method call returns the OperationResult object which contains status and the status message of the Clear_Data method call.
Sample Code
[Copy](javascript:void(0);) ```
`Private Sub ClearData()
Dim api As New HostAPI()
Dim strRuleCode As String ="" , objResult As OperationResult
Try
objResult = New OperationResult
'Call the web method with the rule code created in Planful
ojbResult = api.Clear_Data("WS - Loading Accounts" )
Console.WriteLine(objResult.message)
Console.ReadLine()
Catch ex As Exception
End Try
End Sub `
Usage
Use the Segment1_Retrieve call to retrieve Segment1 data. When a Client application invokes the Segment1_Retrieve call, it passes the segment1 filter criteria in collection of Segment1Filter objects to filter the data rows.
Upon invocation, the Web Service queries the database for segment1 data rows with the specified filter criteria and returns the collection of segment1 objects. Each segment1 object corresponds to a data row in the database. The Client application can then use methods on the collection of segment1 objects to iterate through the collection and retrieve information. The Client application must be logged in with sufficient access rights to query segment1 objects.
Arguments List
The following table provides a list of arguments that are required for the Segment1_Retrieve method call:
Name | Type | Description |
Segment1Filter | Segment1F | Collection of segment1 filter objects to filter thesegment1 data rows during retrieval. |
Response
The Segment1_Retrieve method call returns a collection of Segment1 objects, which contain the data values of segment1 data rows in the database.
Parent Code, Parent Name
There are two separate fields (i.e., columns) for Parent Code and Parent Name.
Sample Code
[Copy](javascript:void(0);) ```
`Private Sub RetrieveSegment1()
Dim api As New HostAPI()
'This method retrieves all segment1 objects that start with the code specified.
Dim objSegment1() As Segment1, objSegment1Filter As Segment1Filter
Dim objSegment1FilterCollection() As Segment1Filters, strValue() As String
Try
'Create a new segment1 filter to add the filter criteria during retrieval
objSegment1Filter = New Segment1Filter
objSegment1Filter.Field = Segment1Field.Code
objSegment1Filter.FieldOperator = FieldOperator.StartsWith
ReDim strValue(0)
strValue(0) = "10"
objSegment1Filter.Value = strValue
'Add the filter objects built to the filter collection to pass to the web method
ReDim objSegment1FilterCollection(0)
objSegment1FilterCollection(0) = New Segment1Filter
objSegment1FilterCollection(0) = objSegment1Filter
'Call the web method to retrieve the segment1 collection
objSegment1 = api.Segment1_Retrieve (objSegment1FilterCollection)
'Loop through the segment1 collection to display the segment1 objects retrieved
If Not objSegment1 is Nothing Then
Console.WriteLine ("Code" & vbTab & "|" &_Obj.Name & vbTab &
"|AccountGroup" & vbTab & "|AccountyType" )
For Each _Obj As Segment1 In objSegment1
Console.WriteLine (_Obj.Code & vbTab & "|" _Obj.Name & vbTab &
"|" & _Obj.AccountGroup.ToString() & vbTab & "|" &
_Obj.AccountType.ToString())
Next
End If
Console.ReadLine()
Catch ex As Exception
End Try
End Sub
`
Usage
Use the Segment2_Retrieve call to retrieve Segment2 data. When a Client application invokes the Segment2_Retrieve call, it passes the segment2 filter criteria in collection of Segment2Filter objects to filter the data rows.
Upon invocation, the Web Service queries the database for segment2 data rows with the specified filter criteria and returns the collection of segment2 objects. Each segment2 object corresponds to a data row in the database. The Client application can then use methods on the collection of segment2 objects to iterate through the collection and retrieve information. The Client application must be logged in with sufficient access rights to query segment2 objects.
Arguments list
The following table provides a list of arguments that are required for the Segment2_Retrieve method call:
Name | Type | Description |
Segment2Filter | Segment2F | Collection of segment2 filter objects to filter thesegment2 data rows during retrieval. |
Response
The Segment2_Retrieve method call returns a collection of Segment2 objects, which contain the data values of segment2 data rows in the database.
Sample Code
[Copy](javascript:void(0);) ```
`Private Sub RetrieveSegment2()
Dim api As New HostAPI()
'This method retrieves all segment2 objects that start with the code specified.
Dim objSegment2() As Segment2, objSegment2Filter As Segment2Filter
Dim objSegment2FilterCollection() As Segment2Filters, strValue() As String
Try
'Create a new segment2 filter to add the filter criteria during retrieval
objSegment2Filter = New Segment2Filter
objSegment2Filter.Field = Segment2Field.Code
objSegment2Filter.FieldOperator = FieldOperator.StartsWith
ReDim strValue(0)
strValue(0) = "10"
objSegment2Filter.Value = strValue
'Add the filter objects built to the filter collection to pass to the web method
ReDim objSegment2FilterCollection(0)
objSegment2FilterCollection(0) = New Segment2Filter
objSegment2FilterCollection(0) = objSegment2Filter
'Call the web method to retrieve the segment2 collection
objSegment2 = api.Segment2_Retrieve (objSegment2FilterCollection)
'Loop through the segment2 collection to display the segment2 objects retrieved
If Not objSegment2 is Nothing Then
Console.WriteLine ("Code" & vbTab & "|" &_Obj.Name & vbTab &
"|AccountGroup" & vbTab & "|AccountyType" )
For Each _Obj As Segment2 In objSegment2
Console.WriteLine (_Obj.Code & vbTab & "|" _Obj.Name & vbTab &
"|" & _Obj.AccountGroup.ToString() & vbTab & "|" &
_Obj.AccountType.ToString())
Next
End If
Console.ReadLine()
Catch ex As Exception
End Try
End Sub
`
Usage
Use the Segment3_Retrieve call to retrieve Segment3 data. When a Client application invokes the Segment3_Retrieve call, it passes in the segment3 filter criteria in collection of SegmentFilter objects to filter the data rows.
Upon invocation, the Web Service queries the database for segment3 data rows with the specified filter criteria and returns the collection of segment3 objects. Each segment3 object corresponds to a data row in the database. The Client application can then use methods on the collection of segment3 objects to iterate through the collection and retrieve information. The Client application must be logged in with sufficient access rights to query segment3 objects.
Arguments List
The following table provides a list of arguments that are required for the Segment3_Retrieve method call:
Name | Type | Description |
SegmentFilter | SegmentFilter() | Collection of segment3 filter objects to filter thesegment3 data rows during retrieval. |
Response
The Segment3_Retrieve method call returns collection of Segment3 objects, which contain the data values of segment3 data rows in the database.
Sample Code
[Copy](javascript:void(0);) ```
`Private Sub RetrieveSegment3()
Dim api As New HostAPI()
'This method retrieves all segment3 objects that start with the code specified.
Dim objSegment3() As Segment3, objSegment3Filter As Segment3Filter
Dim objSegment3FilterCollection() As Segment3Filters, strValue() As String
Try
'Create a new segment3 filter to add the filter criteria during retrieval
objSegment3Filter = New Segment3Filter
objSegment3Filter.Field = Segment3Field.Code
objSegment3Filter.FieldOperator = FieldOperator.StartsWith
ReDim strValue(0)
strValue(0) = "10"
objSegment3Filter.Value = strValue
'Add the filter objects built to the filter collection to pass to the web method
ReDim objSegment3FilterCollection(0)
objSegment3FilterCollection(0) = New Segment3Filter
objSegment3FilterCollection(0) = objSegment3Filter
'Call the web method to retrieve the segment3 collection
objSegment3 = api.Segment3_Retrieve (objSegment3FilterCollection)
'Loop through the segment3 collection to display the segment3 objects retrieved
If Not objSegment3 is Nothing Then
Console.WriteLine ("Code" & vbTab & "|" &_Obj.Name & vbTab &
"|AccountGroup" & vbTab & "|AccountyType" )
For Each _Obj As Segment3 In objSegment3
Console.WriteLine (_Obj.Code & vbTab & "|" _Obj.Name & vbTab &
"|" & _Obj.AccountGroup.ToString() & vbTab & "|" &
_Obj.AccountType.ToString())
Next
End If
Console.ReadLine()
Catch ex As Exception
End Try
End Sub `
Usage
Use the Segment4_Retrieve call to retrieve Segment4 data. When a Client application invokes the Segment4_Retrieve call, it passes in the segment1 filter criteria in collection of SegmentFilter objects to filter the data rows.
Upon invocation, the Web Service queries the database for segment4 data rows with the specified filter criteria and returns the collection of segment4 objects. Each segment4 object corresponds to a data row in the database. The Client application can then use methods on the collection of segment4 objects to iterate through the collection and retrieve information. The Client application must be logged in with sufficient access rights to query segment4 objects.
Arguments List
The following table provides a list of arguments that are required for the Segment4_Retrieve method call:
Name | Type | Description |
SegmentFilter | SegmentFilter() | Collection of segment4 filter objects to filter the segment4 data rows during retrieval. |
Response
Segment4()
The Segment4_Retrieve method call returns collection of Segment4 objects, which contain the data values of segment4 data rows in the database.
Sample Code
[Copy](javascript:void(0);) ```
`Private Sub RetrieveSegment4()
Dim api As New HostAPI()
'This method retrieves all segment4 objects that start with the code specified.
Dim objSegment4() As Segment4, objSegment4Filter As Segment4Filter
Dim objSegment4FilterCollection() As Segment4Filters, strValue() As String
Try
'Create a new segment4 filter to add the filter criteria during retrieval
objSegment4Filter = New Segment4Filter
objSegment4Filter.Field = Segment4Field.Code
objSegment4Filter.FieldOperator = FieldOperator.StartsWith
ReDim strValue(0)
strValue(0) = "10"
objSegment4Filter.Value = strValue
'Add the filter objects built to the filter collection to pass to the web method
ReDim objSegment4FilterCollection(0)
objSegment4FilterCollection(0) = New Segment4Filter
objSegment4FilterCollection(0) = objSegment4Filter
'Call the web method to retrieve the segment4 collection
objSegment4 = api.Segment4_Retrieve (objSegment4FilterCollection)
'Loop through the segment4 collection to display the segment4 objects retrieved
If Not objSegment4 is Nothing Then
Console.WriteLine ("Code" & vbTab & "|" &_Obj.Name & vbTab &
"|AccountGroup" & vbTab & "|AccountyType" )
For Each _Obj As Segment4 In objSegment4
Console.WriteLine (_Obj.Code & vbTab & "|" _Obj.Name & vbTab &
"|" & _Obj.AccountGroup.ToString() & vbTab & "|" &
_Obj.AccountType.ToString())
Next
End If
Console.ReadLine()
Catch ex As Exception
End Try
End Sub `
Usage
Use the Segment5_Retrieve call to retrieve Segment5 data. When a Client application invokes the Segment5_Retrieve call, it passes in the segment5 filter criteria in collection of SegmentFilter objects to filter the data rows.
Upon invocation, the f queries the database for segment5 data rows with the specified filter criteria and returns the collection of segment5 objects. Each segment5 object corresponds to a data row in the database. The Client application can then use methods on the collection of segment5 objects to iterate through the collection and retrieve information. The Client application must be logged in with sufficient access rights to query segment5 objects.
Arguments List
The following table provides a list of arguments that are required for the Segment5_Retrieve method call:
Name | Type | Description |
SegmentFilter | SegmentFilter() | Collection of segment5 filter objects to filter the segment5 data rows during retrieval. |
Response
The Segment5_Retrieve method call returns collection of Segment5 objects which contain the data values of segment5 data rows in the database.
Sample Code
[Copy](javascript:void(0);) ```
`Private Sub RetrieveSegment5()
Dim api As New HostAPI()
'This method retrieves all segment objects that start with the code specified.
Dim objSegment5() As Segment5, objSegment5Filter As Segment5Filter
Dim objSegment5FilterCollection() As Segment5Filters, strValue() As String
Try
'Create a new segment5 filter to add the filter criteria during retrieval
objSegment5Filter = New Segment5Filter
objSegment5Filter.Field = Segment5Field.Code
objSegment5Filter.FieldOperator = FieldOperator.StartsWith
ReDim strValue(0)
strValue(0) = "10"
objSegment5Filter.Value = strValue
'Add the filter objects built to the filter collection to pass to the web method
ReDim objSegment5FilterCollection(0)
objSegment5FilterCollection(0) = New Segment5Filter
objSegment5FilterCollection(0) = objSegment5Filter
'Call the web method to retrieve the segment5 collection
objSegment5 = api.Segment5_Retrieve (objSegment5FilterCollection)
'Loop through the segment5 collection to display the segment5 objects retrieved
If Not objSegment5 is Nothing Then
Console.WriteLine ("Code" & vbTab & "|" &_Obj.Name & vbTab &
"|AccountGroup" & vbTab & "|AccountyType" )
For Each _Obj As Segment5 In objSegment5
Console.WriteLine (_Obj.Code & vbTab & "|" _Obj.Name & vbTab &
"|" & _Obj.AccountGroup.ToString() & vbTab & "|" &
_Obj.AccountType.ToString())
Next
End If
Console.ReadLine()
Catch ex As Exception
End Try
End Sub `
Usage
Use the Segment6_Retrieve call to retrieve Segment6 data. When a Client application invokes the Segment6_Retrieve call, it passes in the segment6 filter criteria in collection of SegmentFilter objects to filter the data rows.
Upon invocation, the Web Service queries the database for segment6 data rows with the specified filter criteria and returns the collection of segment6 objects. Each segment6 object corresponds to a data row in the database. The Client application can then use methods on the collection of segment6 objects to iterate through the collection and retrieve information. The Client application must be logged in with sufficient access rights to query segment6 objects.
Arguments List
The following table provides a list of arguments that are required for the Segment6_Retrieve method call:
Name | Type | Description |
SegmentFilter | SegmentFilter() | Collection of segment6 filter objects to filter the segment6 data rows during retrieval. |
Response
The Segment6_Retrieve method call returns collection of Segment6 objects, which contain the data values of segment6 data rows in the database.
Sample Code
[Copy](javascript:void(0);) ```
`Private Sub RetrieveSegment6()
Dim api As New HostAPI()
'This method retrieves all segment objects that start with the code specified.
Dim objSegment6() As Segment6, objSegment6Filter As Segment6Filter
Dim objSegment6FilterCollection() As Segment6Filters, strValue() As String
Try
'Create a new segment6 filter to add the filter criteria during retrieval
objSegment6Filter = New Segment6Filter
objSegment6Filter.Field = Segment6Field.Code
objSegment6Filter.FieldOperator = FieldOperator.StartsWith
ReDim strValue(0)
strValue(0) = "10"
objSegment6Filter.Value = strValue
'Add the filter objects built to the filter collection to pass to the web method
ReDim objSegment6FilterCollection(0)
objSegment6FilterCollection(0) = New Segment6Filter
objSegment6FilterCollection(0) = objSegment6Filter
'Call the web method to retrieve the segment6 collection
objSegment6 = api.Segment6_Retrieve (objSegment6FilterCollection)
'Loop through the segment6 collection to display the segment6 objects retrieved
If Not objSegment6 is Nothing Then
Console.WriteLine ("Code" & vbTab & "|" &_Obj.Name & vbTab &
"|AccountGroup" & vbTab & "|AccountyType" )
For Each _Obj As Segment6 In objSegment6
Console.WriteLine (_Obj.Code & vbTab & "|" _Obj.Name & vbTab &
"|" & _Obj.AccountGroup.ToString() & vbTab & "|" &
_Obj.AccountType.ToString())
Next
End If
Console.ReadLine()
Catch ex As Exception
End Try
End Sub `
Usage
Use the Segment7_Retrieve call to retrieve Segment7 data. When a Client application invokes the Segment7_Retrieve call, it passes in the segment7 filter criteria in collection of SegmentFilter objects to filter the data rows.
Upon invocation, the Web Service queries the database for segment7 data rows with the specified filter criteria and returns the collection of segment7 objects. Each segment7 object corresponds to a data row in the database. The Client application can then use methods on the collection of segment7 objects to iterate through the collection and retrieve information. The Client application must be logged in with sufficient access rights to query segment7 objects.
Arguments List
The following table provides a list of arguments that are required for the Segment7_Retrieve method call:
Name | Type | Description |
SegmentFilter | SegmentFilter() | Collection of segment7 filter objects to filter the segment7 data rows during retrieval. |
Response
The Segment7_Retrieve method call returns collection of Segment7 objects, which contain the data values of segment7 data rows in the database.
Sample Code
[Copy](javascript:void(0);) ```
`Private Sub RetrieveSegment7()
Dim api As New HostAPI()
'This method retrieves all segment objects that start with the code specified.
Dim objSegment7() As Segment7, objSegment7Filter As Segment7Filter
Dim objSegment7FilterCollection() As Segment7Filters, strValue() As String
Try
'Create a new segment7 filter to add the filter criteria during retrieval
objSegment7Filter = New Segment7Filter
objSegment7Filter.Field = Segment7Field.Code
objSegment7Filter.FieldOperator = FieldOperator.StartsWith
ReDim strValue(0)
strValue(0) = "10"
objSegment7Filter.Value = strValue
'Add the filter objects built to the filter collection to pass to the web method
ReDim objSegment7FilterCollection(0)
objSegment7FilterCollection(0) = New Segment7Filter
objSegment7FilterCollection(0) = objSegment7Filter
'Call the web method to retrieve the segment7 collection
objSegment7 = api.Segment7_Retrieve (objSegment7FilterCollection)
'Loop through the segment7 collection to display the segment7 objects retrieved
If Not objSegment7 is Nothing Then
Console.WriteLine ("Code" & vbTab & "|" &_Obj.Name & vbTab &
"|AccountGroup" & vbTab & "|AccountyType" )
For Each _Obj As Segment7 In objSegment7
Console.WriteLine (_Obj.Code & vbTab & "|" _Obj.Name & vbTab &
"|" & _Obj.AccountGroup.ToString() & vbTab & "|" &
_Obj.AccountType.ToString())
Next
End If
Console.ReadLine()
Catch ex As Exception
End Try
End Sub `
Usage
Use the Segment8_Retrieve call to retrieve Segment8 data. When a Client application invokes the Segment8_Retrieve call, it passes in the segment8 filter criteria in collection of SegmentFilter objects to filter the data rows.
Upon invocation, the Web Service queries the database for segment8 data rows with the specified filter criteria and returns the collection of segment8 objects. Each segment8 object corresponds to a data row in the database. The Client application can then use methods on the collection of segment8 objects to iterate through the collection and retrieve information. The Client application must be logged in with sufficient access rights to query segment8 objects.
Arguments List
The following table provides a list of arguments that are required for the Segment8_Retrieve method call:
Name | Type | Description |
SegmentFilter | SegmentFilter() | Collection of segment8 filter objects to filter the segment8 data rows during retrieval. |
Response
The Segment8_Retrieve method call returns collection of Segment8 objects, which contain the
data values of segment8 data rows in the database.
Sample Code
[Copy](javascript:void(0);) ```
`Private Sub RetrieveSegment8()
Dim api As New HostAPI()
'This method retrieves all segment objects that start with the code specified.
Dim objSegment8() As Segment8, objSegment8Filter As Segment8Filter
Dim objSegment8FilterCollection() As Segment8Filters, strValue() As String
Try
'Create a new segment8 filter to add the filter criteria during retrieval
objSegment8Filter = New Segment8Filter
objSegment8Filter.Field = Segment8Field.Code
objSegment8Filter.FieldOperator = FieldOperator.StartsWith
ReDim strValue(0)
strValue(0) = "10"
objSegment8Filter.Value = strValue
'Add the filter objects built to the filter collection to pass to the web method
ReDim objSegment8FilterCollection(0)
objSegment8FilterCollection(0) = New Segment8Filter
objSegment8FilterCollection(0) = objSegment8Filter
'Call the web method to retrieve the segment8 collection
objSegment8 = api.Segment8_Retrieve (objSegment8FilterCollection)
'Loop through the segment8 collection to display the segment8 objects retrieved
If Not objSegment8 is Nothing Then
Console.WriteLine ("Code" & vbTab & "|" &_Obj.Name & vbTab &
"|AccountGroup" & vbTab & "|AccountyType" )
For Each _Obj As Segment8 In objSegment8
Console.WriteLine (_Obj.Code & vbTab & "|" _Obj.Name & vbTab &
"|" & _Obj.AccountGroup.ToString() & vbTab & "|" &
_Obj.AccountType.ToString())
Next
End If
Console.ReadLine()
Catch ex As Exception
End Try
End Sub `
Usage
Use the GLData_Retrieve call to retrieve GLData data. When a Client application invokes the GLData_Retrieve call, it passes in the GLData filter criteria in collection of GLDataFilter objects to filter the data rows.
Upon invocation, the Web Service queries the database for GLData data rows with the specified filter criteria and returns the collection of GLData objects. Each GLData object corresponds to a data row in the database.
The Client application can then use methods on the collection of GLData objects to iterate through the collection and retrieve information.
The Client application must be logged in with sufficient access rights to query GLData objects.
Arguments List
The following table provides a list of arguments that are required for the GLData_Retrieve method call:
Name | Type | Description |
GLDataFilter | GLDataFilter() | Collection of segment filter objects to filter theGL Data rows during retrieval. |
NOTES:
- Fields on which filter can be applied: Segment1, Segment2, Segment3, Segment4, Segment5, Segment6, Segment7, Segment8, Scenario, Reporting, FiscalYear, FiscalPeriod, AmountType.
- Mandatory filter fields: Scenario, AmountType, and FiscalYear (NOTE: FiscalYear is mandatory if scenario is Actual or filter fields contain FiscalPeriod)
- Field operators supported: Equals, Contains
- Multiple filters can be applied on one retrieval but only one value can be supplied per field. For instance, to retrieve the data for two scenarios Actual and Budget, the API needs to be called two times once for Actual and once for Budget scenario.
Response
The GLData_Retrieve method call returns collection of GLData objects, which contain the data values of GLData data rows in the database.
Sample Code
[Copy](javascript:void(0);) ```
`<ns:GLData_RetrieveWithLogin>
<ns:LoginName>mborra@planful.com</ns:LoginName>
<ns:Password>VASavi@61</ns:Password>
<ns:TenantCode>ETLCPMTENANTBASEQFQACopy</ns:TenantCode>
<ns:FilterCollection>
<ns:GLDataFilter>
<ns:Field>FiscalYear</ns:Field>
<ns:FieldOperator>Equals </ns:FieldOperator>
<ns:Value>
<ns:string >2012</ns:string >
</ns:Value>
</ns:GLDataFilter>
<ns:GLDataFilter>
<ns:Field>FiscalPeriod</ns:Field>
<ns:FieldOperator>Equals </ns:FieldOperator>
<ns:Value>
<ns:string >4</ns:string >
</ns:Value>
</ns:GLDataFilter>
<ns:GLDataFilter>
<ns:Field>Segment2</ns:Field>
<ns:FieldOperator>Equals </ns:FieldOperator>
<ns:Value>
<ns:string >112ETL</ns:string >
</ns:Value>
</ns:GLDataFilter>
<ns:GLDataFilter>
<ns:Field>Scenario</ns:Field>
<ns:FieldOperator>Equals </ns:FieldOperator>
<ns:Value>
<ns:string >Forecast2012</ns:string >
</ns:Value>
</ns:GLDataFilter>
<ns:GLDataFilter>
<ns:Field>AmountType</ns:Field>
<ns:FieldOperator>Equals </ns:FieldOperator>
<ns:Value>
<ns:string >MTD</ns:string >
</ns:Value>
</ns:GLDataFilter>
</ns:FilterCollection>
<ns:ApplyCreditDebit>No</ns:ApplyCreditDebit>
</ns:GLData_RetrieveWithLogin>`
Sample Invalid Input
[Copy](javascript:void(0);) ```
`<ns:GLData_RetrieveWithLogin>
<ns:LoginName>mborra@planful.com</ns:LoginName>
<ns:Password>VASavi@61</ns:Password>
<ns:TenantCode>ETLCPMTENANTBASEQFQACopy</ns:TenantCode>
<ns:FilterCollection>
<ns:GLDataFilter>
<ns:Field>Scenario</ns:Field>
<ns:FieldOperator>Equals </ns:FieldOperator>
<ns:Value>
<ns:string >DummyScenario</ns:string >
</ns:Value>
</ns:GLDataFilter>
<ns:GLDataFilter>
<ns:Field>AmountType</ns:Field>
<ns:FieldOperator>Equals </ns:FieldOperator>
<ns:Value>
<ns:string >MTD</ns:string >
</ns:Value>
</ns:GLDataFilter>
</ns:FilterCollection>
</ns:GLData_RetrieveWithLogin>`
Usage
Use the Login call to log in to the Planful Web Service application and start a Client session. A Client application must log in and obtain a session ID before making any other API calls.
When a Client application invokes the Login call, it passes in a user name and password and tenant code. Upon invocation, the Planful Web Service authenticates the login and returns the session ID for the session, the user ID associated with the logged in user name, to use in all subsequent API calls.
After logging in, a Client application needs to set the session ID in the SOAP header so that the Planful Web Service can validate subsequent requests for this session.
Note: Can you obtain login credentials from the Web Service Access - Configuration Tasks application page. For tenant code, contact Support if you do not already have it. Changes to either the Login or Password for the Web Services API will impact existing integrations that are using the same credentials and as such should be changed with caution.
Development tools differ in the way you specify session headers. For more information, see the documentation for your particular development tool.
Client applications do not need to explicitly log out to end the session. Sessions expire automatically after a predetermined length of time which is 120 minutes (two hours).
Arguments List
The following table provides a list of arguments that are required for the Load_Data method call:
Name | Type | Description |
LoginName LoginPassword TenantCode | String String String | User login name User login password Tenant code for connecting to the tenant application |
Response
LoginResult
The Login method call returns LoginResult object which contains the status of method call and session id for making subsequent API calls in case of successful login.
Sample Code
[Copy](javascript:void(0);) ```
`Private Sub Login()
Dim api As New HostAPI()
Dim strSessionId As String = "" , strTenantCode As String = "" , objLoginResult As LoginResult
Try
'User login/pwd for the API access and the tenant code
strLogin = "admin@planful.com"
strPWD = "admin123"
strTenantCode = "MoonPie"
'Instantiate the authentication header object to accept the session ID from the web method after sucessful login
api.AuthenticationHeaderValue = New AuthenticationHeader
'Call the web method to login the Planful web server API
objLoginResult = api.Login(strLogin, strPWD, strTenantCode)
If objLoginResult.Success Then
'Assign the session ID in login result object to API objects authenticatio header. This is to pass the session ID as SOAP header for authentication in subsequent API calls
api.AuthenticationHeaderValue.SessionId =
objLoginResult.sessionId
End If
Console.WriteLine(objLoginResult.message)
Catch ex As Exception
End Try
End Sub `
Usage
Use the GetSessionId to retrieve the session id for the current user session. Upon invocation, the Web Service returns the session id of the current user session. The Client application can then use methods on the session id and retrieve information. The Client application must be logged in with sufficient access rights to retrieve the session id.
Response
SessionId
The GetSessionId method call returns session id of the current user session.
Sample Code
[Copy](javascript:void(0);) ```
`Private Sub getSessionId()
Dim api As New HostAPI()
Dim strSessionId As String = ""
Try
'Call the web method to retrieve the current session ID
strSessionId = api.getSessionId()
Console.WriteLine(strSessionId)
Catch ex As Exception
End Try
End Sub `
Usage
Use the GetVersion call to retrieve the current version of the Planful application for the tenant. Upon invocation Web Service queries and returns the AppVersion object which contains the version name and version number of the Planful application for the tenant. The Client application must be logged in with sufficient access rights to retrieve the session id.
Response
AppVersion
The GetVersion call returns the AppVersion object which contains the version name and version number of the Planful application for the tenant.
Sample Code
[Copy](javascript:void(0);) ```
`Private Sub getVersion()
Dim api As New HostAPI()
Dim objVersion As APPVersion
Try
'Call the web method to retrieve the API version details
objVersion = api.getVersion()
Console.WriteLine("Version Name : " & objVersion.Name)
Console.WriteLine("Version : " & objVersion.Version)
Catch ex As Exception
End Try
End Sub `
Usage
Use the GetAllCurrencies call to retrieve currency data. Upon invocation, the Web Service queries the database for currency data rows and returns the collection of currency objects. Each currency object corresponds to a data row in the database. The Client application can then use methods on the collection of currency objects to iterate through the collection and retrieve information. The Client application must be logged in with sufficient access rights to query currency objects.
Response
Currency()
The GetAllCurrencies method call returns collection of Currency objects which contain the data values of currency data rows in the database.
Sample Code
[Copy](javascript:void(0);) ```
`Private Sub getAllCurrencies()
Dim api As New HostAPI()
Dim objCurrency() As Currency
Try
'Call the web method to retrieve the list of currencies
objCurrency = api.getALLCurrencies()
'Loop through the currency collection objects to display the currencies retrieved
If Not objCurrency Is Nothing Then
Console.WriteLine("Code" & vbTab & "|Name" )
For Each _Obj As Currency in objCurrency
Console.WriteLine(_Obj.Code & vbTab & "|" & _Obj.Name)
Next
End If
Catch ex As Exception
End Try
End Sub `
Usage
Use the GetAllCurrencyTypes call to retrieve currency type data. Upon invocation, the Web Service queries the database for currency type data rows and returns the collection of currency type objects. Each currency type object corresponds to a data row in the database.
The Client application can then use methods on the collection of currency type objects to iterate through the collection and retrieve information. The Client application must be logged in with sufficient access rights to query currency type objects.
Response
CurrencyType()
The GetAllCurrencyTypes method call returns collection of CurrencyType objects which contain the data values of currency type data rows in the database.
Sample Code
[Copy](javascript:void(0);) ```
`Private Sub getAllCurrencyTypes()
Dim api As New HostAPI()
Dim objCurrencyType() As CurrencyType
Try
'Call the web method to retrieve the list of currency types
objCurrencyType = api.getALLCurrencyTypes()
'Loop through the currency type collection objects to display the currency types retrieved
If Not objCurrencyType Is Nothing Then
Console.WriteLine("Code" & vbTab & "|Name" )
For Each _Obj As CurrencyType in objCurrencyType
Console.WriteLine(_Obj.Code & vbTab & "|" & _Obj.Name)
Next
End If
Catch ex As Exception
End Try
End Sub `
Usage
Use the GetAllSegments call to retrieve COAsegment data. Upon invocation, the Web Service queries the database for COAsegment data rows and returns the collection of COAsegment objects. Each COAsegment object corresponds to a data row in the database.
The Client application can then use methods on the collection of COAsegment objects to iterate through the collection and retrieve information. The Client application must be logged in with sufficient access rights to query COAsegment objects.
Response
COAsegment ()
The GetAllSegments method call returns collection of COAsegment objects which contain the data values of COAsegment data rows in the database.
Sample Code
[Copy](javascript:void(0);) ```
`Private Sub getAllSegments()
Dim api As New HostAPI()
Dim objSegment() As COASegmet
Try
'Call the web method to retrieve the list of COA segments
objSegment = api.getALLSegments()
'Loop through the segments collection objects to display the segments retrieved
If Not objSegment Is Nothing Then
Console.WriteLine("Name" & vbTab & "|DisplayName" & vbTab & "|Type" & vbTab & "|Visability" & vbTab & "|ActiveStatus" )
For Each _Obj As COASegment in objSegment
Console.WriteLine(_Obj.Name & "|" & _Obj.DisplayName & vbTab & "|" & _Obj.Type.ToString() & vbTab & "|" & _Obj.Visibility.ToString() & vbTab & "|" & _Obj.ActiveStatus.ToString())
Next
End If
Catch ex As Exception
End Try
End Sub `
Usage
Use the Logout call to log out of the Planful Web Service application. When a Client application invokes the Logout call, the Web Service abandons the current user session.
The Client application must be logged in with sufficient access rights to logout from the application. Client applications do not need to explicitly log out to end the session. Sessions expire automatically after a predetermined length of time, which is 120 minutes (two hours).
Response
OperationResult
The Logout method call returns an OperationResult object, which contains the status and the status message of the logout method call.
Sample Code
[Copy](javascript:void(0);) ```
`Private Sub Logout()
Dim objResult As OperationResult
Try
'Call the web method to logout from the API
objResult = api.Logout()
Console.WriteLine (objResult.message)
Catch ex As Exception
End Try
End Sub `
Example
[Copy](javascript:void(0);) ```
`LoadEmployees( "tenant1user1@company.com" , "tenant1user1@epmsuite.com" ,
"tenant1code" , employees, DateTime.UtcNow)`
Invalid Response
[Copy](javascript:void(0);) ```
`<soap:Body>
<soap:Fault>
<faulcode> soap:Server</faultcode>
<faultstring> Server was unable to process request. Payroll upload is mandatory.</faultstring>
<detail/>
</soap:Fault>
</soap:Body> `
Sample
[Copy](javascript:void(0);) ```
`DeleteEmployees( "tenant1user1@company.com" , "tenant1user1@epmsuite.com" ,
"tenant1code" , "ScenarioCode1" , EmployeeFilterOptions.Scenario , filterOptions);`
Invalid Response
An invalid response could be due to:
- LoginName is empty or invalid email
- Invalid or empty password
- Invalid or empty TenantCode
- Invalid or empty ScenarioCode
- Invalid or empty EmployeeFilterOptions
- Empty FilterOptions (e.g., HomeBudgetEntities/Employees)
Get Employees
Used to get employees in the tenant. You can get only those employees which are accessible by a given user, even if the filter option is scenario . The example shown below will get the first 1,000 employee positions, based on the start index given, under scenario API3 , in the APR08GOLDENTENANT tenant.
Note: For allocations with multiple rows for the same department and compensations, you only get segments for one row. Also, for input compensations items, you get the average annual value.
Syntax
[Copy](javascript:void(0);) ```
public EmployeePosition[] GetEmployees(string LoginName, string Password, string TenantCode, string scenarioCode, EmployeeFilterOptions employeeFilterOption, string [] FilterOptions = null)
Success Response
[Copy](javascript:void(0);) ```
`<EmployeePosition>
<EmployeeInfo>
<ScenarioCode>API3</ScenarioCode>
<HomeBudgetEntityCode>new <</HomeBudgetEntityCode>
<Number>Load1</Number>
<Name>Load1</Name>
<HireDate>2020-01-01T00:00:00</HireDate>
</EmployeeInfo>
<PositionName>Position1</PositionName>
<PositionEntityCode>new </PositionEntityCode>
<OtherSegmentCodes>
<KeyValues>`
Sample Request
[Copy](javascript:void(0);) ```
`
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="http://www.HostAnalytics.com/API/SOAP/StateFree/Common/2009/03/19" >
<soapenv:Header/>
<soapenv:Body>
<ns:GetEmployeeCompensationsForPeriods>
<!--Optional :-->
<ns:LoginName>nrramisetty@hostanalytics.com</ns:LoginName>
<!--Optional :-->
<ns:Password>Host@123</ns:Password>
<!--Optional :-->
<ns:TenantCode>WFTMWFONRENAMEON</ns:TenantCode>
<!--Optional :-->
<ns:scenarioCode>Workforce Budget 2021</ns:scenarioCode>
<!--Optional :-->
<ns:FilterCollection>
<!--Zero or more repetitions:-->
<ns:Filters>
<ns:FilterOption>Employees</ns:FilterOption>
<!--Optional :-->
<ns:Values>
<!--Zero or more repetitions:-->
<ns:string >FT1</ns:string >
<ns:string >000000000657</ns:string >
</ns:Values>
</ns:Filters>
</ns:FilterCollection>
<ns:startIndex>0</ns:startIndex>
</ns:GetEmployeeCompensationsForPeriods>
</soapenv:Body>
</soapenv:Envelope>
`
Invalid Responses
An invalid response could be due to:
Invalid or no data for Default Scenario
Invalid filter value for a group of filters
Invalid or employees out of the Budget cycle
Invalid data for compensation items:
- Compensations not mapped to employees ( or) out of the Budget cycle
- For compensation Items with no user access
Invalid or zero compensation item value for:
- Compensation items value calculated by system as zero for all the scenario months
- Compensation item value is 0 explicitly input by the user
- Compensation items with values calculated by system for some months and 0 for some months
- For employees whose data is not processed (status is ‘Not processed’)
- For employees out of the Budget cycle
Process Employees
Used to process employees automatically when you load multiple employees by API.
To process all the employees automatically by using this API, on the Configuration Task page, in the Define Workforce Planning Budgeting Criteria task, for the Enable Delta Processing list box, you must select the Yes option.
If you choose No for the Enable Delta Processing list box, the uploaded employees will not be processed automatically, and the Auto process stopped as Employee Delta process is not enabled notification is displayed. The Auto Process field is included in the Employee Load API definition.
Sample
[Copy](javascript:void(0);) ```
`<soapenv:Envelope xmlns: soapenv ="http://schemas.xmlsoap.org/soap/envelope/" xmlns: ns ="http://www.Planful.com/API/SOAP/StateFree/Common/2009/03/19" >
<soapenv:Header/>
<soapenv:Body>
<ns:LoadEmployees>
<!--Optional:-->
<ns:LoginName> ?</ns:LoginName>
<!--Optional:-->
<ns:Password> ?</ns:Password>
<!--Optional:-->
<ns:TenantCode> ?</ns:TenantCode>
<!--Optional:-->
<ns:employees1>
<!--Zero or more repetitions:-->
<ns:EmployeePosition>
<!--Optional:-->
<ns:EmployeeInfo>
<!--Optional:-->
<ns:ScenarioCode> ?</ns:ScenarioCode>
<!--Optional:-->
<ns:HomeBudgetEntityCode> ?</ns:HomeBudgetEntityCode>
<!--Optional:-->
<ns:Number> ?</ns:Number>
<!--Optional:-->
<ns:Name> ?</ns:Name>
<ns:HireDate> ?</ns:HireDate>
</ns:EmployeeInfo>
<!--Optional:-->
<ns:PositionName> ?</ns:PositionName>
<!--Optional:-->
<ns:PositionEntityCode> ?</ns:PositionEntityCode>
<!--Optional:-->
<ns:OtherSegmentCodes>
<!--Zero or more repetitions:-->
<ns:KeyValues>
<!--Optional:-->
<ns:Key> ?</ns:Key>
<!--Optional:-->
<ns:Value> ?</ns:Value>
</ns:KeyValues>
</ns:OtherSegmentCodes>
<!--Optional:-->
<ns:EmployeeTypeCode> ?</ns:EmployeeTypeCode>
<!--Optional:-->
<ns:PayPlanCode> ?</ns:PayPlanCode>
<!--Optional:-->
<ns:WageType> ?</ns:WageType>
<ns:RateperHour> ?</ns:RateperHour>
<ns:WorkHours> ?</ns:WorkHours>
<ns:Salary> ?</ns:Salary>
<ns:FromDate> ?</ns:FromDate>
<ns:TerminationDate> ?</ns:TerminationDate>
<!--Optional:-->
<ns:reviewType> ?</ns:reviewType>
<ns:NextReviewDate> ?</ns:NextReviewDate>
<!--Optional:-->
<ns:Attribute>
<!--Zero or more repetitions:-->
<ns:KeyValues>
<!--Optional:-->
<ns:Key> ?</ns:Key>
<!--Optional:-->
<ns:Value> ?</ns:Value>
</ns:KeyValues>
</ns:Attribute>
<!--Optional:-->
<ns:CompensationItem>
<!--Zero or more repetitions:-->
<ns:KeyValues>
<!--Optional:-->
<ns:Key> ?</ns:Key>
<!--Optional:-->
<ns:Value> ?</ns:Value>
</ns:KeyValues>
</ns:CompensationItem>
<ns:BudgetReviewPercentage> ?</ns:BudgetReviewPercentage>
<ns:CurrentReviewPercentage> ?</ns:CurrentReviewPercentage>
<!--Optional:-->
<ns:BudgetRaiseMultiple>
<!--Zero or more repetitions:-->
<ns:APIBudgetReviews>
<ns:Date> ?</ns:Date>
<ns:Percentage> ?</ns:Percentage>
</ns:APIBudgetReviews>
</ns:BudgetRaiseMultiple>
<!--Optional:-->
<ns:notes> ?</ns:notes>
</ns:EmployeePosition>
</ns:employees1>
<ns:payRollUploadDate> ?</ns:payRollUploadDate>
<ns:AutoProcess> ?</ns:AutoProcess>
</ns:LoadEmployees>
</soapenv:Body>
</soapenv:Envelope>
`
Success Response
[Copy](javascript:void(0);) ```
`<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/ [schemas.xmlsoap.org]" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance [w3.org]" xmlns:xsd="http://www.w3.org/2001/XMLSchema [w3.org]" >
<soap:Body>
<LoadEmployeesResponse xmlns="http://www.Planful.com/API/SOAP/StateFree/Common/2009/03/19" >
<LoadEmployeesResult>
<EmployeeStatuses>
<EmployeeStatus>
<EmployeeInfo>
<ScenarioCode>EUB_Budget2018</ScenarioCode>
<HomeBudgetEntityCode>45</HomeBudgetEntityCode>
<Number>Planful2000</Number>
<Name>HA2000</Name>
<HireDate>2017-12-12T00:00:00</HireDate>
</EmployeeInfo>
<Status>true </Status>
<ErrorMessage>Employee added successfully.</ErrorMessage>
<PositionName>HA2000</PositionName>
</EmployeeStatus>
<EmployeeStatus>
<EmployeeInfo>
<ScenarioCode>EUB_Budget2018</ScenarioCode>
<HomeBudgetEntityCode>leaf</HomeBudgetEntityCode>
<Number>HA3000</Number>
<Name>HA3000</Name>
<HireDate>2017-12-12T00:00:00</HireDate>
</EmployeeInfo>
<Status>true </Status>
<ErrorMessage>Employee added successfully.</ErrorMessage>
<PositionName>HA11</PositionName>
</EmployeeStatus>
</EmployeeStatuses>
<TotalEmployeesLoaded>2</TotalEmployeesLoaded>
<EmployeeLoadSuccessCount>2</EmployeeLoadSuccessCount>
<EmployeeLoadFailureCount>0</EmployeeLoadFailureCount>
<ProcessStatusMessage>Employee process triggered successfully</ProcessStatusMessage>
</LoadEmployeesResult>
</LoadEmployeesResponse>
</soap:Body>
</soap:Envelope>`
Usage
This API automates approval role setup for budget users eliminating the need to select approval role options on an individual budget user basis.
Approval Role identifies user authorizations to perform template actions such as; approval actions related to budget templates, sales templates and initiative templates. Approval roles also provide users with access to sales information.
Setup functionality allows you to define varying levels of user responsibility for budget entities. For example, when a user has access to two entities (A and B), but has HR responsibility for entity B only, the user can be restricted to only view specific data based on HR access for the approval role assigned for the entity.
Assigning different approval roles for different entities provides a user with different levels of privileges. For example, an Admin role might provide ‘Workforce’ template access, but an ‘Admin with no HR’ role, might not have ‘HR’ (Workforce Planning) template access.
The following fields are required.
- User ID – typically the users name
- Segment - A segment is the Planful term for a dimension. Dimensions may be referred to as segments throughout the application.
- Code – represents the complete path to a budget entity. For example, Bob Smith is a Budget Manager and one of the segment codes he has access to is 2000-Americas|2100-US|2110-US North East|All.
Duplicate codes are supported, but the entire segment code path must be provided so that the API can properly identify it in regards to approval role access. For example, in the budget hierarchy below, the complete segment code path is provided. The paths are duplicates with the exception of the 100-100 entity.
Note: The segmentCode (Dimension Member Name / Budget Entity Name) must be unique in order for the API to work seamlessly. Otherwise, it will apply to the first member that the API finds with the segmentCode available in the Dimension Tree.
User ID | Segment Code | Approval Role |
bsmith@planful.com | Budget Hierarchy | 100-100 | 100-100 | 101-101| 1001-1001 | Budget approver |
bsmith@planful.com | Budget Hierarchy | 100-100 | 100-101 | 100-100 | 1001-1001 | 100-100 | Budget approver |
Sample
[Copy](javascript:void(0);) ```
`<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="http://www.Planful.com/API/SOAP/StateFree/Common/2009/03/19" >
<soapenv:Header/>
<soapenv:Body>
<ns:AddApprovalRoleForBudgetEntity>
<ns:userLogin>ababu@planful.com</ns:userLogin>
<ns:entityCode>Entity</ns:entityCode>
<ns:roleName>Budget Approver</ns:roleName>
<ns:loginName>anilvkbabu@planful.com</ns:loginName>
<ns:password>testUser123#</ns:password>
<ns:tenantCode>TESTCPMTENANTBASEQA</ns:tenantCode>
</ns:AddApprovalRoleForBudgetEntity>
</soapenv:Body>
</soapenv:Envelope>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" >
<soap:Body>
<AddApprovalRoleForBudgetEntityResponse xmlns="http://www.Planful.com/API/SOAP/StateFree/Common/2009/03/19" >
<AddApprovalRoleForBudgetEntityResult>
<Success>true </Success>
<message>Approval Role has been configured successfully</message>
</AddApprovalRoleForBudgetEntityResult>
</AddApprovalRoleForBudgetEntityResponse>
</soap:Body>
</soap:Envelope>`
Sample
[Copy](javascript:void(0);) ```
`<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="http://www.Planful.com/API/SOAP/StateFree/Common/2009/03/19" >
<soapenv:Header/>
<soapenv:Body>
<ns:RemoveApprovalRoleForBudgetEntity>
<ns:userLogin>ababu@planful.com</ns:userLogin>
<ns:entityCode>Entity</ns:entityCode>
<ns:roleName>Budget Approver</ns:roleName>
<ns:loginName>anilvkbabu@planful.com</ns:loginName>
<ns:password>testUser123#</ns:password>
<ns:tenantCode>TESTCPMTENANTBASEQA</ns:tenantCode>
</ns:RemoveApprovalRoleForBudgetEntity>
</soapenv:Body>
</soapenv:Envelope>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" >
<soap:Body>
<RemoveApprovalRoleForBudgetEntityResponse xmlns="http://www.Planful.com/API/SOAP/StateFree/Common/2009/03/19" >
<RemoveApprovalRoleForBudgetEntityResult>
<Success>true </Success>
<message>Approval Role has been removed successfully.</message>
</RemoveApprovalRoleForBudgetEntityResult>
</RemoveApprovalRoleForBudgetEntityResponse>
</soap:Body>
</soap:Envelope>`
Sample
[Copy](javascript:void(0);) ```
`<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="http://www.Planful.com/API/SOAP/StateFree/Common/2009/03/19" >
<soapenv:Header/>
<soapenv:Body>
<ns:GetApprovalRolesForUser>
<ns:userLogin>muralimohan1234@planful.com</ns:userLogin>
<ns:loginName>anilvkbabu@planful.com</ns:loginName>
<ns:password>testUser123#</ns:password>
<ns:tenantCode>TESTCPMTENANTBASEQA</ns:tenantCode>
</ns:GetApprovalRolesForUser>
</soapenv:Body>
</soapenv:Envelope>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" >
<soap:Body>
<GetApprovalRolesForUserResponse xmlns="http://www.Planful.com/API/SOAP/StateFree/Common/2009/03/19" >
<GetApprovalRolesForUserResult>
<BudgetEntityApprovalRole>
<UserLogin>muralimohan1234@planful.com</UserLogin>
<BudgetEntityCode>1050-001-10-110-4100</BudgetEntityCode>
<BudgetEntityLabel>1050-001-10-110-4100 - OXO-Sales-USD</BudgetEntityLabel>
<ApprovalRole>Budget Approver</ApprovalRole>
</BudgetEntityApprovalRole>
<BudgetEntityApprovalRole>
<UserLogin>muralimohan1234@planful.com</UserLogin>
<BudgetEntityCode>1030-001-20-120-4200</BudgetEntityCode>
<BudgetEntityLabel>1030-001-20-120-4200 - Professional-Marketing-USD</BudgetEntityLabel>
<ApprovalRole>Budget Approver</ApprovalRole>
</BudgetEntityApprovalRole>
</GetApprovalRolesForUserResult>
</GetApprovalRolesForUserResponse>
</soap:Body>
</soap:Envelope>
`
Sample
[Copy](javascript:void(0);) ```
`<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="http://www.Planful.com/API/SOAP/StateFree/Common/2009/03/19" >
<soapenv:Header/>
<soapenv:Body>
<ns:GetAllApprovalRolesForAllUsers>
<ns:hasMore>true </ns:hasMore>
<ns:startIndex>0</ns:startIndex>
<ns:loginName>anilvkbabu@planful.com</ns:loginName>
<ns:password>testUser123#</ns:password>
<ns:tenantCode>TESTCPMTENANTBASEQA</ns:tenantCode>
</ns:GetAllApprovalRolesForAllUsers>
</soapenv:Body>
</soapenv:Envelope>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" >
<soap:Body>
<GetAllApprovalRolesForAllUsersResponse xmlns="http://www.Planful.com/API/SOAP/StateFree/Common/2009/03/19" >
<GetAllApprovalRolesForAllUsersResult>
<BudgetEntityApprovalRole>
<UserLogin>vadlamudi.prathyusha@planful.com</UserLogin>
<BudgetEntityCode/>
<BudgetEntityLabel>Budget Hierarchy</BudgetEntityLabel>
<ApprovalRole>Budget Approver</ApprovalRole>
</BudgetEntityApprovalRole>
<BudgetEntityApprovalRole>
<UserLogin>ababu@Planful.com</UserLogin>
<BudgetEntityCode>Entity</BudgetEntityCode>
<BudgetEntityLabel>Entity - Common Areas</BudgetEntityLabel>
<ApprovalRole>Budget Approver</ApprovalRole>
</BudgetEntityApprovalRole>
<BudgetEntityApprovalRole>
<UserLogin>mchiruvella@planful.com</UserLogin>
<BudgetEntityCode/>
<BudgetEntityLabel>Budget Hierarchy</BudgetEntityLabel>
<ApprovalRole>Budget Approver</ApprovalRole>
</BudgetEntityApprovalRole>
<BudgetEntityApprovalRole>
<UserLogin>anilvkbabu@planful.com</UserLogin>
<BudgetEntityCode>1155</BudgetEntityCode>
<BudgetEntityLabel>1155 - Germany</BudgetEntityLabel>
<ApprovalRole>Budget Preparer</ApprovalRole>
</BudgetEntityApprovalRole>
<BudgetEntityApprovalRole>
<UserLogin>anilvkbabu@planful.com</UserLogin>
<BudgetEntityCode>Entity</BudgetEntityCode>
<BudgetEntityLabel>Entity - Common Areas</BudgetEntityLabel>
<ApprovalRole>Budget Approver</ApprovalRole>
</BudgetEntityApprovalRole>
<BudgetEntityApprovalRole>
<UserLogin>vadlamudiprathyusha3@planful.com</UserLogin>
<BudgetEntityCode/>
<BudgetEntityLabel>Budget Hierarchy</BudgetEntityLabel>
<ApprovalRole>Budget Approver</ApprovalRole>
</BudgetEntityApprovalRole>
<BudgetEntityApprovalRole>
<UserLogin>muralimohan1234@planful.com</UserLogin>
<BudgetEntityCode>1050-001-10-110-4100</BudgetEntityCode>
<BudgetEntityLabel>1050-001-10-110-4100 - OXO-Sales-USD</BudgetEntityLabel>
<ApprovalRole>Budget Approver</ApprovalRole>
</BudgetEntityApprovalRole>
<BudgetEntityApprovalRole>
<UserLogin>muralimohan1234@planful.com</UserLogin>
<BudgetEntityCode>1030-001-20-120-4200</BudgetEntityCode>
<BudgetEntityLabel>1030-001-20-120-4200 - Professional-Marketing-USD</BudgetEntityLabel>
<ApprovalRole>Budget Approver</ApprovalRole>
</BudgetEntityApprovalRole>
</GetAllApprovalRolesForAllUsersResult>
<hasMore>false </hasMore>
</GetAllApprovalRolesForAllUsersResponse>
</soap:Body>
</soap:Envelope>
`
Usage
This API updates Scenario Access permissions based on User ID and Scenario Code.
Sample
[Copy](javascript:void(0);) ```
`<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ns="http://www.Planful.com/API/SOAP/StateFree/Common/2009/03/19" >
<soapenv:Header/>
<soapenv:Body>
<ns:AllowScenarioAccessToUser>
<ns:userLogin>anilvkbabu@planful.com</ns:userLogin>
<ns:scenarioCode>Budget 2009</ns:scenarioCode>
<ns:loginName>anilvkbabu@planful.com</ns:loginName>
<ns:password>testUser123#</ns:password>
<ns:TenantCode>TESTCPMTENANTBASEQA</ns:TenantCode>
</ns:AllowScenarioAccessToUser>
</soapenv:Body>
</soapenv:Envelope>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" >
<soap:Body>
<AllowScenarioAccessToUserResponse xmlns="http://www.Planful.com/API/SOAP/StateFree/Common/2009/03/19" >
<AllowScenarioAccessToUserResult>
<Success>true </Success>
<message>Scenario Access has been provided successfully</message>
</AllowScenarioAccessToUserResult>
</AllowScenarioAccessToUserResponse>
</soap:Body>
</soap:Envelope>`
Usage
Before Scenario Access can be updated, existing data must be removed. This API removes Scenario Access permissions.
Sample
[Copy](javascript:void(0);) ```
`<soapenv:Envelope xmlns: soapenv ="http://schemas.xmlsoap.org/soap/envelope/" xmlns: ns ="http://www.Planful.com/API/SOAP/StateFree/Common/2009/03/19" >
<soapenv:Header/>
<soapenv:Body>
<ns:RemoveScenarioAccessFromUser>
<ns:userLogin> test1a1@ha.com</ns:userLogin>
<ns:scenarioCode> Budget 2009</ns:scenarioCode>
<ns:loginName> anilvkbabu@planful.com</ns:loginName>
<ns:password> testUser123#</ns:password>
<ns:TenantCode> TESTCPMTENANTBASEQA</ns:TenantCode>
</ns:RemoveScenarioAccessFromUser>
</soapenv:Body>
</soapenv:Envelope>
<soap:Envelope xmlns: soap ="http://schemas.xmlsoap.org/soap/envelope/"
xmlns: xsi ="http://www.w3.org/2001/XMLSchema-instance"
xmlns: xsd ="http://www.w3.org/2001/XMLSchema" >
<soap:Body>
<RemoveScenarioAccessFromUserResponse xmlns ="http://www.Planful.com/API/SOAP/StateFree/Common/2009/03/19" >
<RemoveScenarioAccessFromUserResult>
<Success> true</Success>
<message> Scenario Access has been removed successfully.</message>
</RemoveScenarioAccessFromUserResult>
</RemoveScenarioAccessFromUserResponse>
</soap:Body>
</soap:Envelope>
`
Usage
This API extracts existing scenario access data stored in Planful. Existing data is required to compare with source data to locate change records.
Two APIs are provided; one which will extract scenario access data for a single user only and the other which will extract data for all scenarios
Sample
[Copy](javascript:void(0);) ```
`<soapenv:Envelope xmlns: soapenv ="http://schemas.xmlsoap.org/soap/envelope/" xmlns: ns ="http://www.Planful.com/API/SOAP/StateFree/Common/2009/03/19" >
<soapenv:Header/>
<soapenv:Body>
<ns:GetBudgetScenariosAccessibleToUser>
<ns:userLogin> test1a1@ha.com</ns:userLogin>
<ns:loginName> anilvkbabu@planful.com</ns:loginName>
<ns:password> testUser123#</ns:password>
<ns:TenantCode> TESTCPMTENANTBASEQA</ns:TenantCode>
</ns:GetBudgetScenariosAccessibleToUser>
</soapenv:Body>
</soapenv:Envelope>
<soap:Envelope xmlns: soap ="http://schemas.xmlsoap.org/soap/envelope/"
xmlns: xsi ="http://www.w3.org/2001/XMLSchema-instance"
xmlns: xsd ="http://www.w3.org/2001/XMLSchema" >
<soap:Body>
<GetBudgetScenariosAccessibleToUserResponse xmlns ="http://www.Planful.com/API/SOAP/StateFree/Common/2009/03/19" >
<GetBudgetScenariosAccessibleToUserResult>
<string> Budget 2009</string>
<string> Budget 2010</string>
</GetBudgetScenariosAccessibleToUserResult>
</GetBudgetScenariosAccessibleToUserResponse>
</soap:Body>
</soap:Envelope>
`
Usage
This API extracts existing scenario access data stored in Planful. Existing data is required to compare with source data to locate change records.
Two APIs are provided; one which will extract scenario access data for a single user only and the other which will extract data for all scenarios.
Sample
[Copy](javascript:void(0);) ```
`<soapenv:Envelope xmlns: soapenv ="http://schemas.xmlsoap.org/soap/envelope/" xmlns: ns ="http://www.Planful.com/API/SOAP/StateFree/Common/2009/03/19" >
<soapenv:Header/>
<soapenv:Body>
<ns:GetAllBudgetScenariosAccessible>
<ns:hasMore> true</ns:hasMore>
<ns:startIndex> 0</ns:startIndex>
<ns:LoginName> anilvkbabu@planful.com</ns:LoginName>
<ns:Password> testUser123#</ns:Password>
<ns:TenantCode> TESTCPMTENANTBASEQA</ns:TenantCode>
</ns:GetAllBudgetScenariosAccessible>
</soapenv:Body>
</soapenv:Envelope>
<soap:Envelope xmlns: soap ="http://schemas.xmlsoap.org/soap/envelope/"
xmlns: xsi ="http://www.w3.org/2001/XMLSchema-instance"
xmlns: xsd ="http://www.w3.org/2001/XMLSchema" >
<soap:Body>
<GetAllBudgetScenariosAccessibleResponse xmlns ="http://www.Planful.com/API/SOAP/StateFree/Common/2009/03/19" >
<GetAllBudgetScenariosAccessibleResult>
<SegmentMemberSecurityInfo>
<UserLogin> muralimohan1234@planful.com</UserLogin>
<SegmentMemberCode> Budget 2009</SegmentMemberCode>
</SegmentMemberSecurityInfo>
<SegmentMemberSecurityInfo>
<UserLogin> test1a1@ha.com</UserLogin>
<SegmentMemberCode> Budget 2009</SegmentMemberCode>
</SegmentMemberSecurityInfo>
<SegmentMemberSecurityInfo>
<UserLogin> test1a1@ha.com</UserLogin>
<SegmentMemberCode> Budget 2010</SegmentMemberCode>
</SegmentMemberSecurityInfo>
</GetAllBudgetScenariosAccessibleResult>
<hasMore> false</hasMore>
</GetAllBudgetScenariosAccessibleResponse>
</soap:Body>
</soap:Envelope>
`
Usage
This API updates names of members in a given dimension for the Main Hierarchy.
Sample
[Copy](javascript:void(0);) ```
`List<DimensionMember> membersList = new List<DimensionMember> (){ new
DimemsionMember(){ Code = "Sample Code", Name = "Sample Name"}};
UpdateDimensionMemberResponse response = UpdateNameforDimensionMember("Account", memberList, "user@planful.com", "password", "TestTenant");`
Usage
This API is available for bulk user and user group extraction.
Samples
[Copy](javascript:void(0);) ```
`List<Planful.EPM.WebServices.UserInformation.UserAndUserGrroups> Get_AllUserGroups(True, 0, "test@planful.com", QAEnviornment", "HACPM867")
<soapenv:Header/>
<soapenv:Body>
<ns:Get_AllUserGroups>
ns:hasMore>True</ns:hasMore>
ns:startIndex>0</ns:StartIndex
</ns:Get_AllUserGroups>
</soapenv:Body> `
`Get_AllUserGroupsResult>
<UserAndUserGroups>
<UserLogin> khegglin@planful.com</UserLogin>
<UserGroups/>
</UserAndUserGroups> `
`Get_AllUserGroupsResult>
<UserAndUserGroups>
<UserLogin> khegglin@planful.com</UserLogin>
<UserGroups>
<string> G1</string>
<string> G2</string>
<UserGroups/>
</UserAndUserGroups> `
Dimension Security APIs
This API provides the ability to apply dimension security to users. The following methods can be used to set or update dimension security.
ApplyDimensionSecurity
Applies all the Dimension Security Configuration updates and refreshes the Finance cube with latest security information. (Note that this is applicable for Financial Cube only.)
[Copy](javascript:void(0);) ```
Public Function ApplyDimensionSecurity(ByVal LoginName As String, ByVal Password As String, ByVal TenantCode As String) As StandardObjects.OperationResult
The dimension member name update is available for Financial Dimension members.
[Copy](javascript:void(0);) ```
StandardObjects.OperationResult
Sample Response
[Copy](javascript:void(0);) ```
`<soap:Envelope xmlns: soap ="http://schemas.xmlsoap.org/soap/envelope/" xmlns: xsi ="http://www.w3.org/2001/XMLSchema-instance" xmlns: xsd ="http://www.w3.org/2001/XMLSchema" >
<soap:Body>
<CreateNewUserResponse xmlns ="http://www.HostAnalytics.com/API/SOAP/StateFree/Common/2009/03/19" >
<CreateNewUserResult>
<Success> true</Success>
<message> User created successfully.</message>
</CreateNewUserResult>
</CreateNewUserResponse>
</soap:Body>
</soap:Envelope>
`
`(“Prasanna””Lakshmi”,”klakshmi@planful.com”,”BudgetAdministrator”,”RegularUser”,”SSO”,true,”planfuluser@gmail.com”,”planfulusertest”,”QATenant”)Invalid Input - User already exists in the tenant
<CreateNewUserResult>
<Code> 5</Code>
<Success> false</Success>
<message> User already exists in current tenant.</message>
</CreateNewUserResult>
Valid Input - User created successfully
<CreateNewUserResult>
<Success> true</Success>
<message> User Created Succesfully.</message>
</CreateNewUserResult> `
Response
[Copy](javascript:void(0);) ```
`<soap:Envelope xmlns: soap ="http://schemas.xmlsoap.org/soap/envelope/" xmlns: xsi ="http://www.w3.org/2001/XMLSchema-instance" xmlns: xsd ="http://www.w3.org/2001/XMLSchema" >
<soap:Body>
<UpdateUserInformationResponse xmlns ="http://www.HostAnalytics.com/API/SOAP/StateFree/Common/2009/03/19" >
<UpdateUserInformationResult>
<Success> true</Success>
<message> User Updated Successfully</message>
</UpdateUserInformationResult>
</UpdateUserInformationResponse>
</soap:Body>
</soap:Envelope>
`
`(”klakshmi@planful.com”,”Status”,true ,”planfuluser@gmail.com”,”planfulusertest”,”QATenant”) → Makes the user ‘klakshmi@planful.com’ Active in QATenant
`
(”klakshmi@planful.com”,”Status”,false ,”planfuluser@gmail.com”,”planfulusertest”,”QATenant”) → Makes the user ‘klakshmi@planful.com’ InActive in QATenant
(”klakshmi@planful.com”,”NavigationRole”,”BudgetAdministrator”,”planfuluser@gmail.com”,”planfulusertest”,”QATenant”)
`(”klakshmi@planful.com”,”ReportingRole”,”RegularUser”,”planfuluser@gmail.com”,”planfulusertest”,”QATenant”)Invalid input – user does not exist in the tenant
<UpdateUserInformationResult>
<Code>15</Code>
<Success>false</Success>
<message>User does not exist in the tenant.</message>
</UpdateUserInformationResult>
`
`<UpdateUserInformationResult>
<Success>true</Success>
<message>User Updated Successfully</message>
</UpdateUserInformationResult>`
Data That Needs to be Supplied to the API
- userLogin (user ID) – in string format
- userGroupCode – existing user group code in string format
- mapUser – Boolean value – “False” unmaps the user to the user group and “True” maps the user to the user group
- loginName, password and tenantCode – user credentials to authenticate the API connection
Sample Calls
[Copy](javascript:void(0);) MapToUserGroup - Add User to User Group
[Copy](javascript:void(0);) MapToUserGroup - Remove User From User Froup
[Copy](javascript:void(0);) Invalid Call – When user group code doesn’t exist in Planful
[Copy](javascript:void(0);) Valid Call – User mapped to user group successfully
Invalid Cases
- userLogin does not exist in Planful
- userGroup code does not exist i in Planful
Get List of User Groups
To update user group mappings, an administrator needs to know the current user group mapping. The GetUserGroupsByUser call generates a list of user groups mapped to the user.
Format of API String
[Copy](javascript:void(0);) ```
List<string > GetUserGroupsByUser(string userLogin, string loginName, string password, string tenantCode)
`(”klakshmi@planful.com”,”planfuluser@gmail.com”,”planfulusertest”,”QATenant”) → Gets the list of user groups for which ‘klakshmi@planful.com’ is added.
<Get_UserGroups_By_UserResult>
string >UG!</string >
<string >UG2</string >
<string >Raj+Naren</string >
<string >Test RC</string >
</Get_UserGroups_By_UserResult>`
Sample Calls
[Copy](javascript:void(0);) Get 0 to 4999 Users
[Copy](javascript:void(0);) Get 5000+ Users
Dimension Security Update API
In Planful, dimension access for reporting is controlled by the Dimension Security configuration and Setup. The UpdateDimensionSecurityByUser call saves the custom security data by user at the cube level. This security is applicable for all cube-based reporting in Planful (i.e. Dynamic Reports, Report Books, FPP, Excel Add-in, etc.).
Prior to using the UpdateDimensionSecurityByUser call, administrators establish dimension security using the Planful Dimension Security Configuration and Setup pages. Dimensions can be expanded to display specific members to secure as disucessed below. Once complete, the administrator uses the API to update user details.
Note: Customer dimensions such as Fund, Org, Program, and Account must be configured as secured dimensions.
Expanded Dimension Members
Format of API String
[Copy](javascript:void(0);) ```
Bool UpdateDimensionSecurityByUser(string userLogin, string dimensionName, string dimensionMemberCode,bool allowAccess, string loginName, string password, string tenantCode)
(”klakshmi@planful.com”,”Account”,”Internet”,true,Financial,”planfuluser@gmail.com”,”planfulusertest”,”QATenant”) → Gives user ‘klakshmi@planful.com’ access to Dimension member ‘Internet’
`(”klakshmi@planful.com”,”Account”,”Internet”,false,Financial,”planfuluser@gmail.com”,”planfulusertest”,”QATenant”) → Removes user ‘klakshmi@planful.com’ access to Dimension member ‘Internet’.
Valid call – Dimension security updated successfully
<Update_Dimension_Security_ByUserResult>
<Success> true</Success>
<message> Dimension Security Updated Successfully</message>
</Update_Dimension_Security_ByUserResult>
Invalid call – Invalid dimension member code
<Update_Dimension_Security_ByUserResult>
<Code> 20</Code>
<Success> false</Success>
<message> Invalid dimension member code.</message>
</Update_Dimension_Security_ByUserResult>
`
Sample Request and Response
Sample request and response calls for the Get_Dimension_Security_By_Segment API is provided below. In the request, dimension security is applied at the Account parent level. In the response, all members of the Account rollup are provided starting with member code 1010 .
[Copy](javascript:void(0);) Request
[Copy](javascript:void(0);) Response
Selective Property in the Get_Dimension_Security_By_Segment APl
You can export only selected members using this property. The sample code below shows how selective members are exported in the Dimension Security report.
[Copy](javascript:void(0);) Request
[Copy](javascript:void(0);) Response
Dimension Processing
After the dimension security update API call is complete, the dimension processing (ProcessDimension) call needs to take place to update the reporting cube. Processing of dimensions will update the cube with dimension security data for all dimensions.
Format of API String
void ProcessDimension(string dimensionCode, Model model,string loginName, string password, string tenantCode)
MapEntity API
Usage
Use this API to map templates to entities.
Sample Request
In this example an Workforce template is mapped to two entities "1000-USD" and "Test-New".
[Copy](javascript:void(0);) ```
`<soapenv:Envelope xmlns: soapenv ="http://schemas.xmlsoap.org/soap/envelope/"
xmlns: ns ="http://www.Planful.com/API/SOAP/StateFree/Common/2009/03/19" >
<soapenv:Header/>
<soapenv:Body>
<ns:MapEntity>
<ns:TenantCode> WFPOnetimeGF</ns:TenantCode>
<ns:LoginName> schamarthi@planful.com</ns:LoginName>
<ns:Password> Planful@1234</ns:Password>
<ns:ScenarioCode> Budget 2017</ns:ScenarioCode>
<ns:templateCode> HR</ns:templateCode>
<ns:budgetEntities>
<!--Zero or more repetitions:-->
<ns:string> Test-New</ns:string>
<ns:string> 1000-USD</ns:string>
</ns:budgetEntities>
</ns:MapEntity>
</soapenv:Body>
</soapenv:Envelope> `
When an invalid entity is mapped, the following message is displayed.
[Copy](javascript:void(0);) ```
`<MapEntityResult>
<Status> Fail</Status>
<MapStatus>
<string> srintnata-INVALID</string>
</MapStatus)
</MapEntityResult> `
Refresh Preloaded Data API
The Refresh Preloaded Data API updates the Preload Budget Scenario with the data from the reference Scenario or the CC data based on the Scenario setup.
You have to generate the APIKey first to use the API. You can pass the following information to generate the APIKey.
Method
POST
Syntax
<Provide the Application Url>/auth/login
Sample Body
[Copy](javascript:void(0);) ```
`{
“Username”: “xyz@planful.com”,
“Password”: “Ayz@123”,
“TenantCode”: “Apr2021Demo”,
“ClientType”: “ExcelAddin”
}`
The API refreshes the data and displays an appropriate successful message.
Best Practices and Tips
Authentication - Every API requires a loginName, password and tenantCod. The API results in an UnAuthorized exception if the user is not valid.
Audit Log - The application audit log displays each action performed based upon user.
Error Handling - Unlike DLRs, errors or exceptions thrown by the APIs need to be captured and necessary action taken. For example, if a user could not be created, It could be because the server was busy (overloaded) or because another user with the same user ID exists in the application.
When the API returns an error code, take action to handle the error. For example, the server was busy so you invoke Retry logic. Or, perhaps the failure occurred due to a duplicate user ID. You can capture details in the error in failure log. Details in the error failure log can be emailed.
An authentication failure may occur when there is an invalid username/password. If this is the case, a SoapException is produced by the API. A sample soap exception is provided below:
[Copy](javascript:void(0);) ```
`<soap:Fault>
<faultcode> soap:Server</faultcode>
<faultstring>
System.Web.Services.Protocols.SoapException: Invalid username or password.
</faultstring>
<faultactor> https://qa.planful.com/PlanfulAPI/</faultactor>
</soap:Fault> `
If the user already exists in the tenant, the following occurs:
[Copy](javascript:void(0);) ```
`<CreateNewUserResult>
<Code> 5</Code>
<Success> false</Success>
<message> User already exists in current tenant.</message>
</CreateNewUserResult> `
Server Level Exceptions - Occur when the server is busy or experiencing other issues. In this case the client process needs to be retried three times before exiting the process.
Authentication and Authorization - This API requires a valid Planful user ID and password for authentication.
- Unique segment codes are needed. The dimension security API will not function correctly when there are duplicate segment codes. Only the first code found will be updated and the behavior cannot be predicted.
- All segments need to have codes updated. For instance, the Planful application creates root nodes without the code and only the name. The Services team needs to ensure that codes are updated for all nodes.
- After the dimension security API completes, Boomi needs to call the Process Dimension API as a task.
- Ensure that the reporting roles are alpha numeric and not created with numeric codes.
- Ensure that the user type (Native/SSO) field is not loaded with numeric values (this is a bug which will be fixed soon).
Enumerations
Enumerations are a group of named constants. Enumerations are built for the Host API and used during data import / export operations. Use enumerations to restrict the possible values of the web method argument. For example, FieldOperator contains the list of filtering patterns supported by the Host API. The following table provides a list of enumerations built for the Host API:
Enumeration | Members |
AccountGroup | Asset, Equity, Income, Liability, Statistical |
AccountType | Balance, Flow |
ActiveStatus | Active, Inactive |
Amount Type | Opening Balance, MTD, QTD, YTD |
CreditDebit | Credit, Debit |
FieldOperator | Contains, EndsWith, Equals, Greater, GreaterEq, Less, LessEq, NotEquals, StartsWith |
GLDataField | All, Scenario, Segment1, Segment2, Segment3, Segment4, Segment5, Segment6, Segment7, Segment8, Reporting, FiscalYear, FiscalPeriod |
MemberType | ConsolMember, CalcMember,LeafMember |
NormalDataInput | YTD, MTD |
Segment1Field | All, Code, Name, MemberType, RollupOperator, ActiveStatus, AccountGroup, AccountType, CreditDebit, NormalDataInput, CurrencyType,Variance |
Segment2Field | All, Code, Name, MemberType, RollupOperator, ActiveStatus, Currency |
SegmentField | All, Code, Name, MemberType, RollupOperator, ActiveStatus |
Variance | Positive, Negative |
Visibility | Visible, NotVisible |