ProfitSword Journals Outbound INT6001/INT6002 - Daily: SOP, Mapping, Scheduling

ProfitSword Journals Outbound INT6001/INT6002 - Daily: SOP, Mapping, Scheduling

Here is a Standard Operating Procedure (SOP) document summarizing the interaction, configuration, and execution of the INT6001 and INT6002 Accounting Journals Outbound integrations.

This document is designed for the HRIS/Financial Systems team responsible for maintaining property mappings and scheduling these integrations.


SOP: INT6001 & INT6002 Accounting Journals Outbound (ProfitSword)

1. Overview

INT6001 and INT6002 are duplicate Workday Studio integrations designed to extract General Ledger (GL) activity and ending balances for ingestion into the ProfitSword (BRAINS) system.

While the integrations share identical source code and logic, they function as two distinct "pipelines" to allow for:

  • Segmentation: Splitting the processing load between two different lists of properties (Companies).

  • Scheduling Flexibility: Delivering data for specific groups of hotels at different times of the day/month.

  • Output Separation: Producing distinct output files for each group to streamline ingestion on the ProfitSword side.

Scheduling


Integration

Period

Start Time - WD

Finish Time - WD

SFTP Sweep - ProfitSword

INT6001

Current

4:00 AM

~6:30 AM

7:10 AM

INT6002

Current

6:00 AM

~6:30 AM

7:10 AM

INT6001

Prior

9:00 AM

~11:30 AM

12:10 PM

INT6002

Prior

11:00 AM

~1:30 PM

2:40 PM

INT6001

Prior

9:00 PM

~11:30 PM

12:10 AM

INT6002

Prior

11:00 PM

~1:30 AM

2:40 AM

From SFTP Sweep to items loading in BRAINS/Profitsword is approximately 2 hours for the Profitsword ingestion job to complete the loading of each file.


Mapping

INT6001:
066 Hilton Garden Inn JFK
101 Nu Hotel
118 Hilton Garden Inn Tribeca
131 Hotel 48 Lex New York
137 Hyatt House White Plains
149 Cadillac Hotel & Beach Club
168 Hyatt Union Square
169 Homewood Suites University City
171 The Rittenhouse
172 The Boxer (Pending Term)
199 Hilton Garden Inn Midtown East 52nd Street
204 Hilton Garden Inn Central Park South (Detransition)
229 St. Gregory (Pending Term)
230 Parrot Key Hotel & Villas
233 Hilton Daytona Beach (Pending term)
235 Residence Inn Conshohocken (Detransition)
237 Sanctuary Beach Resort
239 Sheraton Miami Airport
255 The Envoy Hotel
262 The Ambrose
263 Mystic Marriott
265FB AC Hotel Pleasanton Concessions
266 Westin Philadelphia
267FB Westin Dallas Fort Worth Concessions
269 Annapolis Waterfront Hotel
270 Plaza Hotel Pioneer Park
271 AC Hotel Westport
272 Hyatt Place Sugarland
274 Hilton Garden Inn Hershey
275 Hyatt Place Georgetown
276 Homewood Suites Clearwater (Pending term)
277E The Fifth Avenue Hotel Eliminations
277FB Fifth Avenue Hotel Concessions
277 Fifth Avenue Hotel
283 Hyatt Place Washington DC/US Capitol
284 Hampton Inn & Suites Providence/Smithfield
285 Hotel Nia
286 Aliz Hotel Times Square
287 Home2 Suites Chicago River North
292 Hilton Carillon Park (Pending Term)
295 Holiday Inn Express & Suites Cambridge
296 Capitol Hill Hotel (Pending Term)
297 Hotel Landy
298 AC Hotel Miami Wynwood
299 Hampton Inn & Suites Miami Wynwood/Design District
301 Renaissance Denver Central Park Hotel
302 Holiday Inn Denver East
303 Embassy Suites Anaheim
304 Holiday Inn Anaheim
305 Embassy Suites Palm Desert
306 Hotel Dena
307 Westin Sacramento
308 Holiday Inn San Mateo
309 Holiday Inn Resort Orlando
314 Moxy NYC Downtown
316 Courtyard Harlingen
317 Courtyard Houston Westchase
318 Residence Inn Houston Westchase (Detransition)
320 Residence Inn Houston Westchase
321 Residence Inn Brownsville
323 The Morrow
328 Homewood Suites Long Beach
329 Hampton Inn Long Beach
331 Hilton Garden Inn Chicagoland Lake Forest
332 Residence Inn Chicagoland Mettawa
333 Hilton Garden Inn Chicagoland Warrenville
334 Hilton Garden Inn Chicagoland Hoffman Estates
336 Courtyard Austin North (Pending term)
337 Fairfield Inn & Suites Austin North (Pending term)
338 Hilton Garden Inn Austin North (Pending term)
339 Hampton Inn & Suites Omaha Downtown
340 Hampton Inn Herald Square
341 Hampton Inn Chelsea
342 Hampton Inn Times Square
343 Holiday Inn Express Times Square
344 Candlewood Suites Times Square
345 Holiday Inn Wall Street
346 Holiday Inn Express Wall Street
348 Homewood Suites Omaha Downtown
349 Hilton Garden Inn Omaha Downtown
351 Fairfield Inn & Suites Notre Dame South Bend
352 Residence Inn Notre Dame South Bend
353 Embassy Suites Tampa Brandon
354 Hilton Garden Inn Detroit Novi
357 SpringHill Suites Salt Lake City Airport (Pending Term)
358 Hilton Garden Inn Merillville
359 Hampton Inn & Suites Miami Doral
361FB Hilton Garden Inn Bloomington Concessions
361 Hilton Garden Inn Bloomington
367 Marriott Denver South
368 Renaissance Boulder Broomfield
369 Renaissance Fort Lauderdale West
371 Fairfield Inn & Suites Louisville Downtown
372 SpringHill Suites Louisville Downtown
373 TownePlace Suites Orlando Southwest
374 Aloft Lake Buena Vista
376 Holiday Inn Express & Suites Orlando LBV
377 Hampton Inn Boston Chelsea
378 Courtyard Brookline
379 Hampton Inn Philadelphia
381 Hampton Inn Washington DC
383 TownePlace Suites Sunnyvale
384 Hilton Garden Inn M Street
386 Courtyard Sunnyvale
387 Courtyard San Diego
388 Courtyard Washington DC Navy Yard
392 Fairfield Inn Humble (Pending term)
393FB Sea Crest Concessions
394 Residence Inn Orlando Lake Buena Vista
395 Hilton Garden Inn Austin University Capitol District
396 Aloft Orlando International Drive
397 Element Orlando International Drive
398 Hotel Madera
399 Mondrian New York Park Avenue (Pending tern)
401 Larkspur Campbell Opco
402 Larkspur Folsom Opco
403 Larkspur Milpitas Opco
404 Larkspur Pleasanton Opco
405 Larkspur Roseville Opco
406 Larkspur Sacramento Opco
407 Larkspur South San Francisco Opco
408 Larkspur Sunnyvale Opco
409 Larkspur Hillsboro Opco
411 Larkspur Bellevue Opco
412 Larkspur Renton Opco
413 SCG REIT 1 Larkspur Opco
414 Holiday Inn Express Altus Opco
415 Holiday Inn Arlington Opco
416 Comfort Inn & Suites Buda Opco
417 Hampton Inn & Suites Buda Opco
418 Hampton Inn & Suites Decatur Opco
419 Holiday Inn Express Huntsville Opco
421 Country Inn & Suites Humble Opco (Detransition)
422 Hampton Inn & Suites Longview Opco
423 Courtyard Lufkin Opco
424 Holiday Inn Express Paris Opco
425 Comfort Inn & Suites Paris Opco
426 Hampton Inn Sweetwater Opco
427 Holiday Inn Express Terrell Opco
428 Candlewood Suites Texarkana Opco (Detransition)
429 Holiday Inn Express Texarkana Opco (Detransition)
431 Holiday Inn Express Tyler Opco
432 Courtyard Tyler Opco
432FB Courtyard Tyler Concessions
433 Hampton Inn & Suites Waco South Opco
434 Fairfield Inn & Suites Weatherford Opco
435 Courtyard Wichita Falls Opco
435FB Courtyard Wichita Falls Concession
436 SCG REIT 3 Texas Opco
438 Residence Inn Dartmouth Opco (Pending term)
441 Hilton Garden Inn Glastonbury Opco
443 Residence Inn Danbury Opco
444 Residence Inn Mystic Groton Opco
445 Residence Inn Southington Opco
446 SpringHill Suites Mystic Waterford Opco

INT6002:
  • 131 Hotel 48 Lex New York
  • 169 Homewood Suites University City
  • 239 Sheraton Miami Airport (Pending Term)
  • 265 AC Hotel Pleasanton
  • 265CC AC Hotel Pleasanton Concessions CC
  • 265FB AC Hotel Pleasanton Concessions
  • 267FB Westin Dallas Fort Worth Concessions
  • 267 Westin Dallas Fort Worth
  • 270FB Plaza Pioneer Concessions
  • 270 Plaza Hotel Pioneer Park
  • 274 Hilton Garden Inn Hershey
  • 275 Hyatt Place Georgetown
  • 277E The Fifth Avenue Hotel Eliminations
  • 277FB Fifth Avenue Hotel Concessions
  • 277 Fifth Avenue Hotel
  • 282 Hampton Inn & Suites Annapolis (Pending term)
  • 283 Hyatt Place Washington DC/US Capitol
  • 284 Hampton Inn & Suites Providence/Smithfield
  • 285 Hotel Nia
  • 286 Aliz Hotel Times Square
  • 287 Home2 Suites Chicago River North
  • 292 Hilton Carillon Park (Pending Term)
  • 293 Islander Resort (Owner Only)
  • 295 Holiday Inn Express & Suites Cambridge
  • 297 Hotel Landy
  • 298 AC Hotel Miami Wynwood
  • 299 Hampton Inn & Suites Miami Wynwood/Design District
  • 301FB Renaissance Denver Central Park Hotel Concessions
  • 301 Renaissance Denver Central Park Hotel
  • 302FB Holiday Inn Denver East Concessions
  • 302 Holiday Inn Denver East
  • 303 Embassy Suites Anaheim
  • 303FB Embassy Suites Anaheim Concessions
  • 304FB Holiday Inn Anaheim Concessions
  • 304 Holiday Inn Anaheim
  • 305 Embassy Suites Palm Desert
  • 305FB Embassy Suites Palm Desert Concessions
  • 306FB Hotel Dena Concessions
  • 306 Hotel Dena
  • 307FB Westin Sacramento Concessions
  • 307 Westin Sacramento
  • 308FB Holiday Inn San Mateo Concessions
  • 308 Holiday Inn San Mateo
  • 309 Holiday Inn Resort Orlando
  • 313 Creekside Inn Islamorada (Pending term)
  • 314 Moxy NYC Downtown
  • 316 Courtyard Harlingen
  • 316FB Courtyard Harlingen Concessions
  • 317 Courtyard Houston Westchase
  • 317FB Courtyard Houston Westchase Concessions
  • 318FB Residence Inn Houston Westchase Concessions (Detransition)
  • 318 Residence Inn Houston Westchase (Detransition)
  • 320 Residence Inn Houston Westchase
  • 321FB Residence Inn Brownsville Concessions
  • 321 Residence Inn Brownsville
  • 323FB The Morrow Concessions
  • 323 The Morrow
  • 324 TownePlace Suites Orlando/Lake Buena Vista
  • 326 SpringHill Suites Orlando/Lake Buena Vista
  • 328 Homewood Suites Long Beach
  • 329 Hampton Inn Long Beach
  • 340 Hampton Inn Herald Square
  • 341 Hampton Inn Chelsea
  • 342 Hampton Inn Times Square
  • 343 Holiday Inn Express Times Square
  • 344 Candlewood Suites Times Square
  • 345 Holiday Inn Wall Street
  • 346 Holiday Inn Express Wall Street
  • 366 Residence Inn Merrillville (Pending term)
  • 367 Marriott Denver South
  • 368 Renaissance Boulder Broomfield
  • 369 Renaissance Fort Lauderdale West
  • 371 Fairfield Inn & Suites Louisville Downtown
  • 371FB Fairfield Inn & Suites Louisville Concessions
  • 372FB SpringHill Suites Louisville Concessions
  • 372 SpringHill Suites Louisville Downtown
  • 373 TownePlace Suites Orlando Southwest
  • 374 Aloft Lake Buena Vista
  • 376 Holiday Inn Express & Suites Orlando LBV
  • 377 Hampton Inn Boston Chelsea
  • 387 Courtyard San Diego
  • 387FB Courtyard San Diego Concessions
  • 393FB Sea Crest Concessions
  • 393 Sea Crest Cape Cod
  • 394 Residence Inn Orlando Lake Buena Vista
  • 396 Aloft Orlando International Drive
  • 397 Element Orlando International Drive
  • 398 Hotel Madera
  • 607 Marriott Palm Beach Singer Island Beach Resort & Spa
  • 609 Visitation Hotel Frederick
  • 611 Hilton Garden Inn Rockville
  • 612 Homewood Suites Rockville
  • 614 Residence Inn Big Sky The Wilson Hotel
  • 616 Renaissance Reno Downtown Hotel & Spa (Pending Term)
  • 618 Whiteface Lodge Resort
  • 619 Marriott Ithaca Downtown
  • 620 Residence Inn West Orange
  • 624 Courtyard New York Queens Jamaica
  • 627 SpringHill Suites New York LaGuardia Airport
  • 628 SpringHill Suites New York JFK Airport Jamaica
  • 629 Fairfield Inn New York La Guardia Airport Flushing
  • 631 Fairfield Inn & Suites NY Manhattan Downtown East
  • 632 Fairfield Inn New York Queens Jamaica
  • 634 Hilton Garden Inn Flushing
  • 636 Hampton Inn Garden City Long Island
  • 637 Hotel Indigo Flushing (Pending term)
  • 642 Hilton Garden Inn Pittsburgh University Place
  • 643 Hotel Indigo Pittsburgh University Oakland
  • 644 Hilton Garden Inn Washington DC Downtown
  • 648 Fairfield Inn & Suites Washington DC Downtown
  • 649 Marriott Quebec Downtown (Pending Term)
  • 650 Marriott Quebec Downtown
  • 651 Humaniti Montreal
  • 652 Renaissance Montreal
  • 653 Hotel Rive Gauche Beloeil
  • 656 Courtyard Montreal Airport
  • 657 Residence Inn Montreal Airport
  • 658 Residence Inn Mont Tremblant
  • 659 Hampton Montreal Downtown
  • 661 Homewood Suites Montreal Downtown
  • 662 Hilton Garden Inn Montreal Midtown
  • 663 Homewood Suites Montreal Midtown
  • 667 Courtyard Laval
  • 672 Tips Up Restaurant (Pending Term)
  • 673 Block 3 Restaurant (Pending Term)
  • 678 Courtyard St John's
  • 679 Courtyard Nassau Downtown/Junkanoo Beach
  • 681 Hilton Brooklyn New York CH
  • 683FB The Tillary Hotel Concessions
  • 683 The Tillary Hotel
  • 687FB Hilton Los Angeles Culver City Concessions
  • 687 Hilton Los Angeles Culver City
  • 689 Homewood Suites Mont Tremblant
  • 701 The Whitney
  • 703 Le Meridien Tampa, The Courthouse
  • 704 Courtyard Philadelphia Downtown
  • 709 Hyatt Regency Bethesda
  • 712 Carte San Diego Downtown
  • 712 Carte San Diego Gym
  • 712FB Carte San Diego Downtown Concessions
  • 712RMD Carte San Diego (RMD)
  • 713 Washington Marriott Capital
  • 714 Holiday Inn Express NYC Chelsea NoMad Area
  • 716 Aloft Philadelphia
  • 716FB Aloft Philadelphia Concessions
  • 717 The Ray Hotel
  • 718FB Towneplace Suites Bozeman Concessions
  • 718 Towneplace Suites Bozeman
  • 719 AC Hotel Boston Cambridge
  • 720 Hampton Inn & Suites Annapolis
  • 721 The Manner
  • 723 Hampton Inn & Suites Yonkers
  • 724 Hilton Garden Inn Westchester Dobbs Ferry
  • 725 Hilton Carillon Park
  • 726 Laurel Lake Placid
  • 727 Capitol Hill Hotel
  • 735 Homewood Suites Washington DC Downtown
  • 736 Joinery Hotel Pittsburgh
  • 741FB Kimpton Harper Hotel Concessions
  • 741 Kimpton Harper Hotel
  • 742FB Le Meridien Houston Concessions
  • 742 Le Meridien Houston
  • 743 AMTD IDEA Tribeca Hotel
  • 744 Courtyard San Jose Airport
  • 777 Boston Harbor Hotel
  • 777HD History Boston Harbor Hotel
  • 809 Hyatt Regency Bethesda Propco
  • BS004 LR NAS Operator Limited
  • TMG II Bethesda Hotel Holdings, LP
  • TMG II Bethesda Hotel Holdings GP, LLC
  • TMG II Highgate Bethesda Hotel, LP

2. Integration Logic & Flow

Both integrations follow the exact same execution path. The only variable is the input list of companies, which is defined by an Integration Attribute.

Process Steps

  1. Launch & Parameters: The integration is launched (manually or scheduled) with a specific Fiscal Period and Time Period.

  2. Property Selection: The integration looks up the specific Integration Attribute configured for that system (INT6001 or INT6002) to determine which companies to process1111.
    +1

  3. Iterative Processing: The integration loops through every selected company one by one.


  • It retrieves Journal Lines (Activity and Ending Balance) for that specific company.

  • It retrieves Translation Codes (BRAINS codes) to map Workday "Outlet" values to ProfitSword codes.

  1. Transformation:

  • GL Balance: Aggregates totals by Ledger Account, Cost Center, and Spend Category.

  • GL Detail: extracting granular journal line details (Invoice #, Supplier, etc.).

  1. Aggregation & Output: All individual company data is combined into two final CSV files per integration run:

  • GL_Balances_YYYYMMDDHHMMSS.csv

  • GL_Detail_YYYYMMDDHHMMSS.csv

3. Configuration & Property Mapping

This is the most critical step for the team. A company must only be mapped to ONE integration at a time to avoid duplicate data in ProfitSword.

Step 1: Assigning Properties

To assign a hotel/entity to a specific integration pipeline:

  1. Search for Configure Integration Attributes in Workday.

  2. Select the specific integration system:

  • Choose INT6001 Accounting Journals Outbound for Group A (e.g., Managed Hotels).

  • Choose INT6002 Accounting Journals Outbound for Group B (e.g., Franchised/Other).

  1. Locate the attribute: "Companies / Company Hierarchies"6666.
    +1

  2. Action: Add or Remove Company Reference IDs from this list.

  • Note: Ensure the company is not listed in both integrations.

Step 2: Scheduling

Since both integrations query the exact same Journal Lines data source, they can compete for system resources if run simultaneously.

  • Recommendation: Offset the schedules by at least 30–60 minutes.

  • Example: Schedule INT6001 to run at 2:00 AM and INT6002 to run at 3:00 AM.

  • SFTP Delivery: Both integrations will deliver files to the configured SFTP server. The filenames will differ only by the timestamp and the content (based on the mapped companies).

4. Operational Differences Table

Feature

INT6001

INT6002

Primary Use Case

Group A Properties (e.g., Managed)

Group B Properties (e.g., Franchised/Other)

System Name

INT6001 Accounting Journals Outbound - Profitsword

INT6002 Accounting Journals Outbound - Profitsword

Attribute Map ID

INT6001_AttrMapSvc

INT6001_AttrMapSvc (Same ID, distinct value per system)

Output File 1

GL_Balances_[Timestamp].csv

GL_Balances_[Timestamp].csv

Output File 2

GL_Detail_[Timestamp].csv

GL_Detail_[Timestamp].csv

5. Troubleshooting & Maintenance

Common Issues

  • "Missing Data" in ProfitSword:

  • Cause: The company was created in Workday but not added to the Integration Attribute list for either INT6001 or INT6002.

  • Fix: Follow the steps in Section 3 to add the new company to the correct integration map.

  • Duplicate Data:

  • Cause: A company was added to both INT6001 and INT6002 attributes.

  • Fix: Audit both attribute lists and remove the duplicate.

  • Timeout / Performance Failures:

  • Cause: If one integration is overloaded (e.g., INT6001 has 200 companies and INT6002 has 10), INT6001 may time out.

  • Fix: Balance the load by moving some companies from the "heavy" integration to the "light" one using the Attribute settings.

6. Revision History

  • INT6002 Creation: Cloned from INT6001 to allow parallel processing of distinct property groups.

  • Codebase: Both integrations utilize the same GLBalance.xsl and GLDetail.xsl transformations. Any code changes (XSLT updates) must be applied to both integrations to maintain consistency.




Executive Summary

Purpose The INT6001 integration automates the extraction of financial data from Workday for ProfitSword, a business intelligence and data management platform used in the hospitality industry. It bridges the gap between Workday Financials and ProfitSword by delivering accurate General Ledger (GL) data in a specific format required for financial reporting and forecasting.

Key Capabilities

  • Dual-Level Reporting: It generates two distinct output files simultaneously:

    1. GL Balances: A high-level summary of ending balances and activity totals for the period.

    2. GL Details: A granular, transaction-level log of every journal entry, invoice, and payment.

  • Intelligent Mapping: The system automatically translates internal Workday "Outlet" IDs into ProfitSword "Translation Codes" using a dynamic lookup, eliminating the need for manual cross-referencing.

  • Scalable Architecture: It uses a "Split-and-Aggregate" technical design. This allows it to process multiple companies sequentially without running out of memory, while still delivering a single, unified file for the end-user.

Workflow Overview

  1. Launch: A user or schedule triggers the integration for a specific Fiscal Period (e.g., Nov 2024).

  2. Process: The system identifies all relevant companies, extracts their financial activity and balance data, and applies complex formatting rules (XSLT).

  3. Deliver: The final output is two CSV files (GL_Balances_....csv and GL_Detail_....csv) attached to the integration event record in Workday.

Business Value

  • Automation: Replaces manual report running and Excel manipulation with a single-click or scheduled process.

  • Auditability: By providing both summary and detail files from the same source snapshot, it ensures that financial reports in ProfitSword can be easily reconciled back to Workday.

  • Reliability: Technical safeguards (error handling and memory management) ensure the integration runs successfully even during high-volume period-close cycles.



SOP: INT6001 Accounting Journals Outbound - Profitsword

Document ID: SOP-INT6001-001

Integration Type: Workday Studio Custom Integration

System ID: INT6001

Version: 2024.11

1. Overview and Purpose

This integration extracts General Ledger (GL) data from Workday for consumption by the ProfitSword system. It processes financial data for specific companies and periods, aggregating the results into two distinct CSV output files:

  1. GL Balances: Summary level data including ending balances and activity amounts.

  2. GL Details: Transactional level details for the journals.

The integration runs a "Split-and-Aggregate" pattern: it splits processing by Company, fetches data via Report-as-a-Service (RaaS), transforms the data using XSLT, and aggregates the results into single batch files.


2. Launch Parameters & Inputs

When launching this integration, the following parameters are required:

Parameter Name

Description

Type

Required?

Period

The specific Fiscal Period for the extract.

Reference (WID)

Yes

Time Period

The Time Period in relation to the selected Period (e.g., YTD, Current Period).

Reference (WID)

Yes

Note: The integration also utilizes an Attribute Map named Companies / Company Hierarchies to determine which Companies to process. This is configured on the Integration System, not selected at runtime.


3. Process Logic Flow

Phase 1: Initialization & Reference Data

  1. Parameter Retrieval: The integration captures the Period and Time Period WIDs.

  2. Company Selection: It retrieves the list of companies from the Companies / Company Hierarchies attribute.

  3. Translation Codes: It calls a specific RaaS (OutletTranslationCode) to fetch mapping data that links "Outlets" to "Translation Codes." This data is cached in memory variable v.TRACodes for later use.

Phase 2: Per-Company Processing (The Splitter)

The integration iterates through every Company found in the attribute map. For each company, the following steps occur:

  1. Fetch Activity: Calls the JournalLines RaaS filtering by Amount_Type = 'ACTIVITY'.

  2. Fetch Ending Balance: Calls the JournalLines RaaS filtering by Amount_Type = 'END_BALANCE'.

  3. Data Consolidation:

    • Merges Activity Data, Ending Balance Data, and the cached Translation Codes into a single XML structure.

    • Applies XSLT GenerateActivityTotalsXML.xsl to calculate totals.

    • Snapshot: Saves an intermediate XML file WD_Data_@{Company}.xml to the event documents (useful for debugging).

  4. Transformation:

    • Balance Data: Applies GLBalance.xsl to format the data for the Balance CSV.

    • Detail Data: Applies GLDetail.xsl to format the data for the Detail CSV.

  5. Aggregation: The transformed lines are sent to two separate aggregators (DetailGLAggregator and BalanceGLAggregator) to be held until all companies are processed.

Phase 3: Finalization & Delivery

Once all companies are processed:

  1. Batch Processing: The aggregators release the combined data.

  2. Header Generation:

    • A CSV header is prepended to the Balance data.

    • A CSV header is prepended to the Detail data.

  3. File Naming: Files are named using the pattern:

    • GL_Balances_YYYYMMDDHHMMSS.csv

    • GL_Detail_YYYYMMDDHHMMSS.csv

  4. Delivery: The files are attached to the Integration Event via PutIntegrationMessage and marked as deliverable.


4. Technical Components Inventory

Reports (RaaS)

  • OutletTranslationCode: Used to map internal Outlet IDs to external Translation Codes.

  • JournalLines: The primary data source. It accepts parameters for Company, Amount Type, Period, and Time Period.

XSLT Transformations

  • GenerateActivityTotalsXML.xsl: Calculates math/totals within the XML before CSV conversion.

  • GLBalance.xsl: Transforms the XML XML data into the CSV structure for the Balances file.

  • GLDetail.xsl: Transforms the XML data into the CSV structure for the Details file.

Output File Specifications

File 1: GL Balances

Columns: Period, Company, Ledger Account, Cost Center, Spend Code, Revenue Code, Job Title, Outlet, Meal Period, Hotel Lot and Unit, Bank Account, Intercompany Affiliate, Translation Code, Ending_Balance_Amount, Activity_Amount

File 2: GL Details

Columns: Accounting_Journal_ID, Journal_Entry_Status_ID, Period, Ledger_Reference_ID, Journal_Number, Journal_Source_ID, Currency_ID, Company, Ledger Account, Revenue Code, Cost Center, Spend Code, Job Title, Outlet, Meal Period, Hotel Lot and Unit, Bank Account, Intercompany Affiliate, Translation Code, Accounting_Date, DESCRIPTION, Debit_Amount, Credit_Amount, Supplier_Invoice_ID, Invoice_Number, Document_Status_ID, Supplier_ID, Invoice_Date, Payment Number, Date Paid, Invoice WID


5. Troubleshooting & Maintenance

Issue

Potential Cause

Resolution Step

Missing Data in Output

The Companies attribute map is empty or the RaaS returns no data for the selected Period.

1. Check the Companies / Company Hierarchies attribute on the INT System.


2. Run the JournalLines report manually in Workday for that period.

Incorrect Translation Codes

The OutletTranslationCode report is outdated or missing mappings.

Run the OutletTranslationCode report in Workday to verify mappings exist for the specific Outlet.

Performance Slowness

High volume of companies or journal lines causing memory pressure.

Check the Integration Event log. If "Out of Memory" errors occur, the Splitter logic or Heap size may need adjustment.

Validation Errors

"Required Parameter" error on launch.

Ensure both "Period" and "Time Period" are selected in the launch window.

Debugging Tip

If data looks incorrect in the final CSV, look at the Integration Attachments. The integration saves a file named WD_Data_[CompanyID].xml for every company processed. Download this file to see the raw data before it was converted to CSV.


Here are the templates for the two XSLT files required by your integration (GLBalance.xsl and GLDetail.xsl).

Important Configuration Note:

Since I do not have the exact XML Schema (XSD) of your specific Workday Reports (JournalLines and OutletTranslationCode), I have used standard Workday RaaS namespaces (urn:com.workday/bsvc) and logical field names. You must replace the specific XPath field names (e.g., wd:Ledger_Account/wd:ID) with the actual field names from your specific RaaS output.

1. GLBalance.xsl

This stylesheet generates the summarized balance data. It iterates through the <ending_balance> section of your aggregated data and performs a lookup for the Translation Code.

XML


<?xml version="1.0" encoding="UTF-8"?>

<xsl:stylesheet version="2.0" 

    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 

    xmlns:wd="urn:com.workday/bsvc"

    exclude-result-prefixes="wd">


    <xsl:output method="text" indent="no" encoding="UTF-8"/>

    <xsl:strip-space elements="*"/>


    <xsl:key name="TraCodeKey" match="TRACodes/wd:Report_Data/wd:Report_Entry" use="wd:Outlet_ID"/>


    <xsl:template match="/">

        <xsl:apply-templates select="data/ending_balance/wd:Report_Data/wd:Report_Entry"/>

    </xsl:template>


    <xsl:template match="wd:Report_Entry">

        <xsl:variable name="outletID" select="wd:Outlet/wd:ID[@wd:type='Outlet_ID']"/>

        

        <xsl:variable name="translationCode">

            <xsl:for-each select="/data">

                <xsl:value-of select="key('TraCodeKey', $outletID)/wd:Translation_Code"/>

            </xsl:for-each>

        </xsl:variable>


        <xsl:value-of select="wd:Fiscal_Period/wd:Descriptor"/>

        <xsl:text>,</xsl:text>


        <xsl:value-of select="wd:Company/wd:ID[@wd:type='Company_Reference_ID']"/>

        <xsl:text>,</xsl:text>


        <xsl:value-of select="wd:Ledger_Account/wd:ID[@wd:type='Ledger_Account_ID']"/>

        <xsl:text>,</xsl:text>


        <xsl:value-of select="wd:Cost_Center/wd:ID[@wd:type='Cost_Center_Reference_ID']"/>

        <xsl:text>,</xsl:text>


        <xsl:value-of select="wd:Spend_Category/wd:ID[@wd:type='Spend_Category_ID']"/>

        <xsl:text>,</xsl:text>


        <xsl:value-of select="wd:Revenue_Category/wd:ID[@wd:type='Revenue_Category_ID']"/>

        <xsl:text>,</xsl:text>


        <xsl:value-of select="wd:Job_Profile/wd:Descriptor"/>

        <xsl:text>,</xsl:text>


        <xsl:value-of select="$outletID"/>

        <xsl:text>,</xsl:text>


        <xsl:value-of select="wd:Meal_Period"/>

        <xsl:text>,</xsl:text>


        <xsl:value-of select="wd:Hotel_Lot_Unit"/>

        <xsl:text>,</xsl:text>


        <xsl:value-of select="wd:Bank_Account"/>

        <xsl:text>,</xsl:text>


        <xsl:value-of select="wd:Intercompany_Affiliate"/>

        <xsl:text>,</xsl:text>


        <xsl:value-of select="$translationCode"/>

        <xsl:text>,</xsl:text>


        <xsl:value-of select="wd:Ending_Balance_Amount"/>

        <xsl:text>,</xsl:text>


        <xsl:value-of select="wd:Activity_Amount"/>

        

        <xsl:text>&#xa;</xsl:text>

    </xsl:template>


</xsl:stylesheet>


2. GLDetail.xsl

This stylesheet generates the transaction level details. It likely iterates through the <activity> section of your data (or wherever the journal lines are stored) and maps fields to the larger detail CSV specification.

XML


<?xml version="1.0" encoding="UTF-8"?>

<xsl:stylesheet version="2.0" 

    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 

    xmlns:wd="urn:com.workday/bsvc"

    exclude-result-prefixes="wd">


    <xsl:output method="text" indent="no" encoding="UTF-8"/>

    <xsl:strip-space elements="*"/>


    <xsl:key name="TraCodeKey" match="TRACodes/wd:Report_Data/wd:Report_Entry" use="wd:Outlet_ID"/>


    <xsl:template match="/">

        <xsl:apply-templates select="data/activity/wd:Report_Data/wd:Report_Entry"/>

    </xsl:template>


    <xsl:template match="wd:Report_Entry">

        <xsl:variable name="outletID" select="wd:Outlet/wd:ID[@wd:type='Outlet_ID']"/>

        

        <xsl:variable name="translationCode">

             <xsl:for-each select="/data">

                <xsl:value-of select="key('TraCodeKey', $outletID)/wd:Translation_Code"/>

            </xsl:for-each>

        </xsl:variable>


        <xsl:value-of select="wd:Accounting_Journal_ID"/>

        <xsl:text>,</xsl:text>


        <xsl:value-of select="wd:Journal_Status_ID"/>

        <xsl:text>,</xsl:text>


        <xsl:value-of select="wd:Fiscal_Period/wd:Descriptor"/>

        <xsl:text>,</xsl:text>


        <xsl:value-of select="wd:Ledger/wd:ID[@wd:type='Ledger_Reference_ID']"/>

        <xsl:text>,</xsl:text>


        <xsl:value-of select="wd:Journal_Number"/>

        <xsl:text>,</xsl:text>


        <xsl:value-of select="wd:Journal_Source_ID"/>

        <xsl:text>,</xsl:text>


        <xsl:value-of select="wd:Currency/wd:ID[@wd:type='Currency_ID']"/>

        <xsl:text>,</xsl:text>


        <xsl:value-of select="wd:Company/wd:ID[@wd:type='Company_Reference_ID']"/>

        <xsl:text>,</xsl:text>


        <xsl:value-of select="wd:Ledger_Account/wd:ID[@wd:type='Ledger_Account_ID']"/>

        <xsl:text>,</xsl:text>


        <xsl:value-of select="wd:Revenue_Category/wd:ID[@wd:type='Revenue_Category_ID']"/>

        <xsl:text>,</xsl:text>


        <xsl:value-of select="wd:Cost_Center/wd:ID[@wd:type='Cost_Center_Reference_ID']"/>

        <xsl:text>,</xsl:text>


        <xsl:value-of select="wd:Spend_Category/wd:ID[@wd:type='Spend_Category_ID']"/>

        <xsl:text>,</xsl:text>


        <xsl:value-of select="wd:Job_Profile/wd:Descriptor"/>

        <xsl:text>,</xsl:text>


        <xsl:value-of select="$outletID"/>

        <xsl:text>,</xsl:text>


        <xsl:value-of select="wd:Meal_Period"/>

        <xsl:text>,</xsl:text>


        <xsl:value-of select="wd:Hotel_Lot_Unit"/>

        <xsl:text>,</xsl:text>


        <xsl:value-of select="wd:Bank_Account"/>

        <xsl:text>,</xsl:text>


        <xsl:value-of select="wd:Intercompany_Affiliate"/>

        <xsl:text>,</xsl:text>


        <xsl:value-of select="$translationCode"/>

        <xsl:text>,</xsl:text>


        <xsl:value-of select="wd:Accounting_Date"/>

        <xsl:text>,</xsl:text>


        <xsl:value-of select="replace(wd:Description, ',', ' ')"/>

        <xsl:text>,</xsl:text>


        <xsl:value-of select="wd:Debit_Amount"/>

        <xsl:text>,</xsl:text>


        <xsl:value-of select="wd:Credit_Amount"/>

        <xsl:text>,</xsl:text>


        <xsl:value-of select="wd:Supplier_Invoice_ID"/>

        <xsl:text>,</xsl:text>


        <xsl:value-of select="wd:Invoice_Number"/>

        <xsl:text>,</xsl:text>


        <xsl:value-of select="wd:Document_Status_ID"/>

        <xsl:text>,</xsl:text>


        <xsl:value-of select="wd:Supplier/wd:ID[@wd:type='Supplier_ID']"/>

        <xsl:text>,</xsl:text>


        <xsl:value-of select="wd:Invoice_Date"/>

        <xsl:text>,</xsl:text>


        <xsl:value-of select="wd:Payment_Number"/>

        <xsl:text>,</xsl:text>


        <xsl:value-of select="wd:Date_Paid"/>

        <xsl:text>,</xsl:text>


        <xsl:value-of select="wd:Invoice_WID"/>

        

        <xsl:text>&#xa;</xsl:text>

    </xsl:template>


</xsl:stylesheet>





ETL Pipeline Documentation: INT6001 Accounting Journals Outbound

Pipeline Name: Workday to ProfitSword GL Extract

Pipeline Type: Batch / Scheduled

Source System: Workday Financials (GL)

Target System: ProfitSword (via CSV file exchange)

Middleware: Workday Studio

1. High-Level Architecture

The pipeline utilizes a "Split-Extract-Aggregate" pattern. To avoid timeouts and memory issues common with large financial data sets, the integration splits the request by Company, extracts data for each company individually, and then re-aggregates the results into a single payload for delivery.


2. Phase I: Extraction (E)

2.1 Trigger & Scope

  • Trigger: Scheduled or Ad-hoc Manual Launch.

  • Scope Definition:

    • Time: Determined by Launch Parameters (Period, Time Period).

    • Entity: Determined by Integration Attribute (Companies / Company Hierarchies).

2.2 Data Sources (RaaS)

The pipeline extracts data from three distinct internal Workday Report-as-a-Service (RaaS) endpoints:

Source ID

Report Name

Purpose

Cardinality

SRC_01

OutletTranslationCode

Reference data mapping internal Workday "Outlets" to external "Translation Codes".

1 call per run (Cached).

SRC_02

JournalLines (Mode: Activity)

Fetches transactional journal lines for the period.

1 call per Company.

SRC_03

JournalLines (Mode: Balance)

Fetches ending balance summaries for the period.

1 call per Company.

2.3 Extraction Logic

  1. Reference Caching: SRC_01 is called once at the start. The output is stored in a global variable (v.TRACodes) to allow for O(1) lookup speeds during transformation, preventing repeated API calls.

  2. Company Iteration: The pipeline iterates through the list of companies provided in the Attribute Map.

  3. Dual-Pass Extraction: For each company:

    • Pass 1: Call SRC_02 (Activity).

    • Pass 2: Call SRC_03 (Balance).


3. Phase II: Transformation (T)

This pipeline performs complex transformations including data merging, arithmetic calculation, and format conversion.

3.1 Data Merging & Enrichment

Before conversion to CSV, the raw data streams are merged into a temporary XML "Super-Document" (v.AggregatedData) for the current company being processed.

  • Structure:

  • XML


<data>

   <ending_balance>... (From SRC_03) ...</ending_balance>

   <activity>... (From SRC_02) ...</activity>

   <TRACodes>... (From SRC_01) ...</TRACodes>

   <activity_totals>... (Calculated below) ...</activity_totals>

</data>



  • Lookup Logic: The XSLT uses the Outlet_ID from the Journal Lines to query the TRACodes block and inject the correct external Translation Code into the final output.

3.2 Calculated Fields (Arithmetic)

A specific XSLT (GenerateActivityTotalsXML.xsl) is applied to the merged XML to generate the <activity_totals> node.

  • Logic: Aggregates debits and credits from the transaction lines to ensure the summary file matches the detail file.

3.3 Format Conversion (XML to CSV)

Two parallel XSLT transformations occur to generate the final flat files:

Stream A: Balance File (GLBalance.xsl)

  • Input: <ending_balance> nodes.

  • Output: Comma-Separated Values.

  • Key Transformation: Denormalizes the hierarchical XML into a single flat row per ledger account/dimension combination.

Stream B: Detail File (GLDetail.xsl)

  • Input: <activity> nodes.

  • Output: Comma-Separated Values.

  • Key Transformation: Flattens complex journal headers and lines into a single row per transaction line. Handles comma escaping in the Description field.


4. Phase III: Load (L)

4.1 Aggregation Strategy

Because the data was extracted per company, it must be re-assembled.

  • Aggregator Component: DetailGLAggregator and BalanceGLAggregator.

  • Logic: The aggregators hold all transformed CSV fragments in memory.

  • Release Condition: When the Splitter signals that the last company has been processed (batch=true), the aggregator releases the combined dataset.

4.2 File Construction

Once the aggregated payload is released:

  1. Header Injection: The static CSV headers are prepended to the top of the data stream.

  2. File Naming:

    • GL_Balances_YYYYMMDDHHMMSS.csv

    • GL_Detail_YYYYMMDDHHMMSS.csv

4.3 Delivery Endpoint

  • Mechanism: PutIntegrationMessage (Workday Core Connector Standard Action).

  • Result: Files are attached to the Workday Integration Event. External retrieval is handled by a separate connector or manual download from this event.


5. Field Mapping Specification

5.1 Balance File Map (GL_Balances)

Target Field (ProfitSword)

Source Field (Workday)

Transformation / Logic

Period

Fiscal_Period

Direct Map

Company

Company_Reference_ID

Direct Map

Ledger Account

Ledger_Account_ID

Direct Map

Outlet

Outlet_ID

Direct Map

Translation Code

Derived

Lookup Outlet_ID against TRACodes cached data.

Ending_Balance_Amount

Ending_Balance_Amount

Sourced from SRC_03 (Balance RaaS).

Activity_Amount

Activity_Amount

Sourced from SRC_03 (Balance RaaS).

5.2 Detail File Map (GL_Detail)

Target Field (ProfitSword)

Source Field (Workday)

Transformation / Logic

Accounting_Journal_ID

Accounting_Journal_ID

Unique Key

Journal_Number

Journal_Number

Direct Map

Description

Description

Clean: Commas replaced with spaces to prevent CSV breakage.

Debit_Amount

Debit_Amount

Sourced from SRC_02 (Activity RaaS).

Credit_Amount

Credit_Amount

Sourced from SRC_02 (Activity RaaS).

Translation Code

Derived

Lookup Outlet_ID against TRACodes cached data.

Invoice WID

Invoice_WID

Used for drill-back URL construction if needed.


6. Error Handling & Recovery

6.1 Global Error Handler

  • Mechanism: cc:send-error hooked to global-error-handler.

  • Action: If any unhandled exception occurs (e.g., SOAP Fault, Null Pointer), the integration:

    1. Catches the error context.

    2. Sets the integration status to CRITICAL.

    3. Logs the error summary to the Integration Event.

6.2 Data Validation

  • Missing Parameters: If Period or Time Period are missing at launch, the integration fails immediately (Launch Option: required).

  • Empty Reports: If a Company returns 0 rows, the XSLT produces an empty string for that segment, ensuring the pipeline continues for other companies.


7. Performance Considerations

  • Memory Management: The "Splitter" is critical here. By processing one company at a time and converting to CSV (text) before aggregation, the memory footprint is significantly reduced compared to aggregating the full DOM (XML) of all companies at once.

  • Retention Policy: Intermediate debug files (WD_Data_*.xml) are set to expire in 30 Days (P30D) to manage storage.