Skip to content

vendors: map Freshdesk native export headers (Created time / Closed time / Resolved time) - #30

Open
ursasi wants to merge 1 commit into
roy-tong:mainfrom
ursasi:freshdesk-native-header-aliases
Open

ursasi wants to merge 1 commit into
roy-tong:mainfrom
ursasi:freshdesk-native-header-aliases

Conversation

@ursasi

@ursasi ursasi commented Oct 3, 2026

Copy link
Copy Markdown

Closes #23.

What

Adds the native Freshdesk ticket-export headers to registry/vendor-rules.json
column_aliases:

Freshdesk native header canonical column
Created time opened_at
Closed time closed_at
Resolved time closed_at

Resolved time joins the existing Zendesk Solved at / Closed at mapping —
either status ends the conversation, so both land on closed_at.

Why

A Freshdesk standard ticket export labels its timestamps Created time /
Closed time / Resolved time (Freshworks support, How do I export my tickets
from Freshdesk?
). After lower() those keep the space, so none of them matched
the alias table and a native export silently lost both timestamps — the
recount could not place a single line in time. Ticket ID already mapped via
the existing ticket id alias, so the id column was fine.

This is the same class of fix as commit ec0d06a (Zendesk space-form aliases):
data-only, no engine code, registry stays the single source of truth.

Files

  • registry/vendor-rules.json — the three aliases (source of truth)
  • healthcheck/am_healthcheck/vendor-rules.json — synced copy
  • website/vendor-rules.js — regenerated via python3 scripts/gen_web_rules.py --build
  • healthcheck/tests/test_vendors.py — two tests in TestNativeHeaderAliases

Verification

  • python3 -m unittest discover -s healthcheck/tests → 454 tests, OK (was 452)
  • python3 healthcheck/agentmeasure selftest → PASS
  • python3 scripts/gen_web_rules.py --check → in sync
  • python3 verify_vectors.py → ALL VECTORS PASS

Notes

  • No new semantics invented: all three aliases map to columns that already exist.
  • Agent / Resolution status were deliberately not aliased to
    human_agent_participated / issue_addressed. An assigned agent is a lead,
    not proof a human finished the conversation, and the status codes
    (2 Open / 3 Pending / 4 Resolved / 5 Closed) are not an issue-addressed
    judgement — those belong in a prepare_hints block, and prepare --vendor freshdesk would need a matching vendors.freshdesk billing block first, so
    it is left for a separate change.
  • Minor pre-existing oddity: healthcheck/tests/test_vendors.py has
    if __name__ == "__main__": unittest.main() before TestNativeHeaderAliases,
    so running that file directly skips the class (discovery still finds it).
    Happy to move the guard to the end in this PR if you want.

…ime / Resolved time)

A Freshdesk standard ticket export labels its timestamps "Created time",
"Closed time" and "Resolved time" (Freshworks support: "How do I export my
tickets from Freshdesk?"). After lower() those keep the space, so none of the
three matched the alias table and a native export silently lost both
timestamps - the recount could not place a single line in time.

Adds the three space-form headers to registry/vendor-rules.json
column_aliases ("Resolved time" joins the existing Zendesk "Solved at"
mapping to closed_at). registry/ stays the single source of truth: the
healthcheck copy is synced and website/vendor-rules.js is regenerated with
scripts/gen_web_rules.py.

Tests: 452 -> 454 (Freshdesk style headers map; Resolved time maps closed_at).

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Good first issue: add native CSV export header aliases for one more vendor to registry/vendor-rules.json

1 participant