Here is the comprehensive Standard Operating Procedure (SOP) and ETL Pipeline Documentation for the ProfitSword (BRAINS) to Workday Daily Budget integration.
I have structured this to serve as both an Operational Guide (for support teams) and Technical Documentation (for developers).
This integration automates the daily ingestion of forecasted budget data from ProfitSword into Workday. The data is loaded into the Child Budget Check Plan, allowing the Folio reporting tool to provide real-time "Actuals vs. Forecast" variance analysis for operational leaders.
Data Flow:
ProfitSword (Source) → CouchDrop (SFTP) → Workday Studio (INT6105a) → Workday Budget Plan
Key Components:
Transport: Secure File Transfer Protocol (SFTP).
Engine: Workday Studio Assembly (Custom Integration).
Load Method: SOAP Web Service (Import Budget, Financial_Management v41.0).
Data originates from the ProfitSword forecasting system and is dropped into a specific SFTP directory.
Protocol: SFTP (CouchDrop)
Directory Path:
Plaintext
Workday SFTP Drives/Actabl/Actabl Inbound/Budget Check Daily Forecast
File Pattern: Workday_Forecast_Daily_YYYYMMDD.csv (e.g., Workday_Forecast_Daily_20251206.csv)
Frequency: Daily (Scheduled Future Process).
File Format: CSV (Comma Separated Values).
Source Schema & Data Definition:
The source file contains raw codes that require translation.
⚠️ Technical Note: The "Ghost Column"
The ProfitSword file generator appends a trailing comma to every row.
Impact: Rows appear to have 16 columns instead of 15.
Resolution: The Workday Studio CsvToXml step handles this, but manual file inspections must account for this empty trailing field.
The integration logic is contained within the Workday Studio Assembly (INT6105a). It does not use Prism for transformation; it uses XSLT maps within the Studio runtime.
The integration accepts "Launch Parameters" that define the destination:
Target Structure: Daily Budget Check Plan Structure (WID: 3739...)
Target Plan: Daily Budget Check Plan Name (WID: 17a2...)
Before loading, raw codes must be converted into Workday Reference IDs (WIDs). This is handled in the Apply_Maps.xsl step.
1. Cost Center Translation:
Logic: The integration looks at the CSV column TRANSLATION (Col 13).
Map: Translation Code to Cost Center
Example: Input TRA100 → Output Workday Cost Center WID (ab86...).
2. Outlet Translation:
Logic: The integration looks at the CSV column COMPANY (Col 1).
Map: Company Translation Code to Outlet
Example: Input LE00066 → Output Workday Outlet WID (d1d8...).
INT6105a_Get_File: Retrieves the specific daily CSV from CouchDrop.
CsvToXml: Parses the text file into an XML envelope.
Apply_Maps: Applies the XSLT lookups described above.
Budget_Check_Grouping: Aggregates lines to prepare the SOAP body.
WorkdayOutSoap: Calls the Import Budget Web Service.
DoWhile Loop: Polls the background process until Status is Completed or Failed.
The job is set up as a Scheduled Future Process.
It runs automatically every morning (check integration schedule for exact time).
Workday Notification:
Success: No alert (or Info only).
Failure: A "CRITICAL" notification is sent to the System Administrator group if errorCounter > 0.
Log Files:
Detailed processing history is saved in INT6105_Activity_Log.html attached to the integration event.
Data Validation (Folio):
To verify data accuracy, run a Folio report for the specific Cost Centers referenced in the file.
Compare the Revised Budget amount in Folio against the DEBIT column in the source CSV.
Create_Group_XML_1.xsl file, the integration takes all rows for the same Posting Interval and groups them together using this key:<wd:Budget_Lines_Data> node:<wd:Budget_Debit_Amount> and <wd:Budget_Credit_Amount>.The error is being caused by a conflict between Lines in your original CSV file (Workday_Forecast_Daily_xxxx).
Here is some example data from a file with two lines:
Line 27: Company LE00681 | Cost Center CC575 | Spend Code SC0195 | Credit: 0.43
Line 3444: Company LE00681 | Cost Center CC575 | Spend Code SC0195 | Debit: 400.87
As we saw in your Create_Group_XML_1.xsl file, the integration groups rows together if they share the exact same combination of Company, Cost Center, Outlet, Spend Code, Revenue, Job Title, and Meal Period.
Because both Line 27 and Line 3444 share the exact same Worktags (LE00681, CC575, and SC0195, with all other tags blank), the integration merges them into a single budget line.
It sums up the Debits (400.87) and sums up the Credits (0.43). Since both totals are greater than zero, it attempts to submit both a Budget_Debit_Amount and a Budget_Credit_Amount on the same line to Workday, triggering the rejection.
When ProfitSword (Actabl) generates the daily forecast file, it may occasionally output multiple lines for the same Worktag combination (e.g., Company LE00681, Cost Center CC575, Spend Code SC0195). If one of those lines is a Debit and another is a Credit, it causes a grouping failure in the Workday Studio integration.
Why it happens:
The XSLT step (Create_Group_XML_1.xsl) aggregates all rows by Posting Interval + Worktags.
It sums the total Debits and total Credits for that group.
If both sums are greater than 0, it creates both a <wd:Budget_Debit_Amount> and <wd:Budget_Credit_Amount> tag for the same budget line item.
The Workday Import_Budget Web Service strictly requires that only one of these fields is populated per budget line.
How to Fix (Operational / Quick Fix):
Review the Workday integration error log to identify the specific Plan and Worktags causing the failure.
Open the source CSV file and locate the duplicate rows sharing those exact tags.
Calculate the net amount of the two rows (e.g., if Debit is $400.87 and Credit is $0.43, the net is a Debit of $400.44).
Update one row with the netted amount and delete the duplicate row.
Leave the unused column completely blank (do not enter a 0).
Place the corrected file back into CouchDrop to be reprocessed.
Studio Assembly File: WorkdayAssembly.xml (Stored in Version Control).
XSLT Maps: Apply_Maps.xsl, Budget_Check_Grouping.xsl.
Sample File: Workday_Forecast_Daily_20251206.csv.