wulf-pulse/docs/TIME_ENTRY_FIELD_MAPPING.md
root 6eee14f8af Add comprehensive admin features and multi-system integration
- Add admin dashboard with sync controls and data browser
- Implement RMM, Auvik, and Addigy organization mappings
- Add chunked ticket sync with progress tracking
- Implement entity sync service with rate limiting
- Add analytics engine and performance optimizer
- Create data browser for all PSA entities
- Add navigation components and UI improvements
- Implement background processing and sync services
- Add comprehensive documentation and migration scripts
- Update configuration items with multi-system support
- Enhance contact management and purchase history
- Add issue type assignment and LLM analyzer
- Improve error handling and logging utilities
2025-11-19 14:18:16 -05:00

8.3 KiB

Time Entry Field Mapping Analysis

Test Record: Time Entry ID 438553

Database Record (Current State)

id                           | 438553
resource_id                  | 30861536
ticket_id                    | 638476
task_id                      | NULL
project_id                   | NULL
company_id                   | NULL
entry_date                   | 2025-11-03 00:00:00
hours_worked                 | 0.08
notes                        | "Enabled Cleared alert"
internal_notes               | NULL
title                        | NULL
type                         | NULL
start_date_time              | 2025-11-03 11:40:00
end_date_time                | 2025-11-03 11:42:00
billable                     | NULL (defaults to true in schema)
billing_rate                 | NULL
billing_rate_currency_id     | NULL
cost_rate                    | NULL
cost_rate_currency_id        | NULL
cost                         | NULL
cost_currency_id             | NULL
revenue                      | NULL
revenue_currency_id          | NULL
margin                       | NULL
margin_currency_id           | NULL
approved                     | NULL (defaults to false in schema)
approved_by_resource_id      | NULL
approved_date_time           | NULL
non_billable                 | NULL (defaults to false in schema)
contract_service_id          | NULL
contract_service_bundle_id   | NULL
role_id                      | 29780072
department_id                | NULL
location_id                  | NULL
allocation_code_id           | NULL
imp_project_schedule_id      | NULL
imp_project_schedule_task_id | NULL
api_vendor_id                | NULL
created_at                   | 2025-11-03 19:55:30.069736
updated_at                   | 2025-11-03 22:07:12.72631
synced_at                    | 2025-11-03 22:07:12.142
is_deleted                   | false
deleted_at                   | NULL

Field Mapping: Autotask API → Database

Autotask API Field Database Field Mapped? Notes
id id Direct mapping
resourceID resource_id Direct mapping
ticketID ticket_id Direct mapping
taskID task_id Direct mapping
projectID project_id Direct mapping
companyID company_id Direct mapping
dateWorked entry_date Field name differs
hoursWorked hours_worked Field name differs
summaryNotes notes Field name differs
internalNotes internal_notes Direct mapping (snake_case)
title title Direct mapping
type type Direct mapping
startDateTime start_date_time Direct mapping (snake_case)
endDateTime end_date_time Direct mapping (snake_case)
billable billable Direct mapping
billingRate billing_rate Direct mapping (snake_case)
billingRateCurrencyID billing_rate_currency_id Direct mapping (snake_case)
costRate cost_rate Direct mapping (snake_case)
costRateCurrencyID cost_rate_currency_id Direct mapping (snake_case)
cost cost Direct mapping
costCurrencyID cost_currency_id Direct mapping (snake_case)
revenue revenue Direct mapping
revenueCurrencyID revenue_currency_id Direct mapping (snake_case)
margin margin Direct mapping
marginCurrencyID margin_currency_id Direct mapping (snake_case)
approved approved Direct mapping
approvedByResourceID approved_by_resource_id Direct mapping (snake_case)
approvedDateTime approved_date_time Direct mapping (snake_case)
nonBillable non_billable Direct mapping (snake_case)
contractServiceID contract_service_id Direct mapping (snake_case)
contractServiceBundleID contract_service_bundle_id Direct mapping (snake_case)
roleID role_id Direct mapping (snake_case)
departmentID department_id Direct mapping (snake_case)
locationID location_id Direct mapping (snake_case)
allocationCodeID allocation_code_id Direct mapping (snake_case)
impProjectScheduleID imp_project_schedule_id Direct mapping (snake_case)
impProjectScheduleTaskID imp_project_schedule_task_id Direct mapping (snake_case)
apiVendorID api_vendor_id Direct mapping (snake_case)
createDate N/A Not stored - We use our own created_at
lastModifiedDate updated_at ⚠️ Partial - We track our own updates
userDefinedFields N/A Not stored - Custom fields not captured

Database-Only Fields

These fields exist in the database but are not from Autotask:

Database Field Purpose Source
created_at Record creation timestamp Generated by database
updated_at Record update timestamp Generated by database
synced_at Last sync timestamp Set during sync process
is_deleted Soft delete flag Managed by sync process
deleted_at Deletion timestamp Set when is_deleted = true

Key Findings

All Autotask Fields Are Mapped

All 37 standard Autotask TimeEntry fields are properly mapped to database columns.

⚠️ Important Field Name Differences

  1. dateWorkedentry_date - Autotask uses "dateWorked", we use "entry_date"
  2. hoursWorkedhours_worked - Autotask uses "hoursWorked", we use "hours_worked"
  3. summaryNotesnotes - Autotask uses "summaryNotes", we use "notes"

Fields Not Captured

  1. createDate - Autotask's original creation date (we use our own created_at)
  2. lastModifiedDate - Autotask's last modified date (we track our own updated_at)
  3. userDefinedFields - Custom fields defined in Autotask

Data Accuracy for Test Record

Based on the database record for ID 438553:

Field Value Status
ID 438553 Correct
Resource ID 30861536 Correct
Ticket ID 638476 Correct
Entry Date 2025-11-03 Correct
Hours Worked 0.08 (4.8 minutes) Correct
Notes "Enabled Cleared alert" Correct
Start Time 11:40:00 Correct
End Time 11:42:00 Correct (2 min = 0.08h rounded)
Role ID 29780072 Correct

NULL Values Analysis

Many fields are NULL in this record, which is normal:

  • Financial fields (billable, billing_rate, cost, revenue, margin) - May not be set yet
  • Approval fields (approved, approved_by_resource_id) - Not yet approved
  • Optional associations (task_id, project_id, company_id) - This entry is ticket-based only
  • Advanced fields (allocation_code_id, contract_service_id) - Not used for this entry

Recommendations

1. Current Mapping is Complete

All essential Autotask fields are captured. The mapping is comprehensive and accurate.

2. ⚠️ Consider Capturing Autotask Timestamps

Optional Enhancement: Store Autotask's createDate and lastModifiedDate in separate columns:

  • autotask_created_date - Original creation date in Autotask
  • autotask_modified_date - Last modification date in Autotask

This would help with:

  • Audit trails
  • Detecting out-of-sync records
  • Historical analysis

3. User Defined Fields

Low Priority: If custom fields are needed, consider:

  • Adding a JSONB column user_defined_fields
  • Storing the array of custom field name/value pairs
  • Only implement if business requirements demand it

4. Field Naming is Consistent

The snake_case conversion from Autotask's camelCase is consistent and follows PostgreSQL best practices.

Conclusion

All fields are properly represented and accurate.

The mapping from Autotask API to database is:

  • Complete - All 37 standard fields mapped
  • Accurate - Test record shows correct data
  • Consistent - Naming conventions followed
  • ⚠️ Missing optional data - Autotask timestamps and custom fields not captured (acceptable)

The only fields not captured are:

  1. Autotask's internal timestamps (we use our own)
  2. User-defined custom fields (not currently needed)

Both omissions are acceptable for the current use case.