SOP - ProfitSword WD - Budget Check Daily Import - INT6105a ETL and Process

SOP - ProfitSword WD - Budget Check Daily Import - INT6105a ETL and Process

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).


SOP: ProfitSword Daily Budget Ingestion (INT6105a)

Document Meta

Details

Integration ID

INT6105a

Process Name

Daily Budget Check Inbound from BRAINs (ProfitSword)

Source System

ProfitSword (Actabl)

Target System

Workday Financials (Budget Plans)

Owner

Finance Systems / IT

Downstream Consumer

Workday Folio (Variance Reporting)



1. Executive Summary

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.

2. Architecture Overview

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).


3. Source Specifications (Phase 1)

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.

Column

Field Name

Description

1

COMPANY

Source Company Code (e.g., LE00066)

3

POSTING_INTERVAL

YYYYMM (Fiscal Period)

4

LEDGER_ACCOUNT

General Ledger Account (e.g., 601000)

6

SPEND_CODE

Spend Category Code (e.g., SC0165)

13

TRANSLATION

Key Field. Maps to Workday Cost Center (e.g., TRA100).

14/15

DEBIT/CREDIT

Budget Amount.

⚠️ 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.


4. ETL Logic & Transformation (Phase 2)

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.

A. Initialization & Parameters

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...)

B. Transformation Logic (The "Black Box")

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...).

C. Orchestration Steps (Studio Flow)

  1. INT6105a_Get_File: Retrieves the specific daily CSV from CouchDrop.

  2. CsvToXml: Parses the text file into an XML envelope.

  3. Apply_Maps: Applies the XSLT lookups described above.

  4. Budget_Check_Grouping: Aggregates lines to prepare the SOAP body.

  5. WorkdayOutSoap: Calls the Import Budget Web Service.

  6. DoWhile Loop: Polls the background process until Status is Completed or Failed.


5. Operational Procedures

A. Scheduling

  • The job is set up as a Scheduled Future Process.

  • It runs automatically every morning (check integration schedule for exact time).

  • Scheduling


    Integration

    Period

    Start Time - WD

    Finish Time - WD

    INT6105a

    Current+1

    2:30 AM

    ~2:45 AM


B. Monitoring & Validation

  1. Workday Notification:

    • Success: No alert (or Info only).

    • Failure: A "CRITICAL" notification is sent to the System Administrator group if errorCounter > 0.

  2. Log Files:

    • Detailed processing history is saved in INT6105_Activity_Log.html attached to the integration event.

  3. 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.

C. Troubleshooting Common Errors

Error Message

Likely Cause

Resolution

"No file found"

ProfitSword failed to drop the file or CouchDrop is down.

Check CouchDrop path: .../Actabl Inbound/Budget Check Daily Forecast.

"Invalid Reference ID"

A new TRANSLATION code (e.g., TRA999) was added in ProfitSword but not mapped in Workday.

Update the Translation Code to Cost Center map in Workday Integration Attributes.

"Import Process Failed"

Budget Plan is closed or locked for the period 202501.

Open the Budget Period in Workday Financials.


6. Notes

The integration groups rows and sums their amounts before sending them to Workday. Specifically, in the Create_Group_XML_1.xsl file, the integration takes all rows for the same Posting Interval and groups them together using this key:

<xsl:for-each-group select = "current-group()"  group-by = "concat(COMPANY, COST_CENTER, OUTLET, SPEND_CODE, REVENUE, JOB_TITLE, MEAL_PERIOD)" >


If multiple lines in your CSV share the exact same combination of Company, Cost Center, Outlet, Spend Code, etc., but one line has a Debit and another line has a Credit, the integration sums them up and attempts to submit both on the same <wd:Budget_Lines_Data> node:
 

<xsl:if test = "sum(current-group()/DEBIT) > 0" >

   <wd:Budget_Debit_Amount> <xsl:value-of select = "format-number(sum(current-group()/DEBIT), '9.99')" /> </wd:Budget_Debit_Amount>

</xsl:if>

<xsl:if test = "sum(current-group()/CREDIT) > 0" >

   <wd:Budget_Credit_Amount> <xsl:value-of select = "format-number(sum(current-group()/CREDIT), '9.99')" /> </wd:Budget_Credit_Amount>  

</xsl:if>


When this happens, Workday rejects the payload because its API strictly forbids a single budget line from containing both a <wd:Budget_Debit_Amount> and <wd:Budget_Credit_Amount>.


7. Errors Troubleshooting notes

      1. Error ReceivedCredit Amount and Debit Amount can't both have values on the same line. Remove either one on this line for plan: FY26 Budget Check Forecast (Property).

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

Why this happens

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.

To fix this immediately for your April forecast, you can manually net these two lines in your file, or if the value is low enough, remove one of the lines from BRAINS, or reclass in BRAINS. 

Issue: Debit and Credit on the Same Budget Line

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:

  1. The XSLT step (Create_Group_XML_1.xsl) aggregates all rows by Posting Interval + Worktags.

  2. It sums the total Debits and total Credits for that group.

  3. 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.

  4. 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):

  1. Review the Workday integration error log to identify the specific Plan and Worktags causing the failure.

  2. Open the source CSV file and locate the duplicate rows sharing those exact tags.

  3. 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).

  4. Update one row with the netted amount and delete the duplicate row.

  5. Leave the unused column completely blank (do not enter a 0).

  6. Place the corrected file back into CouchDrop to be reprocessed.


    


8. Appendix: Attachments & References

  • 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.