idx-cli/src
hermes a5cfdd79b4 fix: handle spaced KSEI PDF headers (SHARE CODE vs SHARE_CODE)
Newer KSEI above1 PDFs use spaces in column headers (SHARE CODE,
INVESTOR NAME, INVESTOR CLASSIFICATION) instead of the underscored
form (SHARE_CODE, INVESTOR_NAME, INVESTOR_TYPE) that the parser
schema markers expected.  This caused valid holder-register PDFs to
be misclassified as LegacyAboveFivePercent (false positive on
REKENING TAMPUNGAN KSEI text in the data), blocking import.

Changes:
- Add normalize_stext_for_classification() that replaces spaces with
  underscores inside text="..." attributes before schema marker
  matching, so both old and new header layouts are recognized
- Add INVESTOR_CLASSIFICATION to HOLDER_REGISTER_SCHEMA_MARKERS and
  HEADER_LABELS to match the renamed column
- Update ANNOUNCEMENT_WRAPPER and ABOVE_FIVE marker constants to use
  underscores (matching the normalized text)
- Add test fixture and test case for the spaced-header layout
- Bump version to 0.2.3

Tested against the live June 2026 KSEI PDF (as_of 2026-05-29):
  idx ownership import --url <latest-pdf-url>
  -> Imported 7124 rows for 956 tickers (as of 2026-05-29)
2026-07-29 04:21:54 +00:00
..
analysis feat(fundamental): add fundamental analysis suite (growth, valuation, risk, compare) 2026-03-06 05:54:37 +00:00
api chore: prepare v0.2.1 release 2026-04-06 17:47:20 +07:00
cli feat: default ownership sync to published snapshot 2026-04-12 14:27:47 +07:00
output chore: prepare v0.2.1 release 2026-04-06 17:47:20 +07:00
ownership fix: handle spaced KSEI PDF headers (SHARE CODE vs SHARE_CODE) 2026-07-29 04:21:54 +00:00
cache.rs chore: prepare v0.2.1 release 2026-04-06 17:47:20 +07:00
config.rs chore: prepare v0.2.1 release 2026-04-06 17:47:20 +07:00
curl_impersonate.rs ownership: add IDX above1 discovery and import 2026-03-30 11:57:14 +07:00
error.rs fix(api): reject empty ticker in resolve_symbol() 2026-03-12 16:53:28 +00:00
main.rs fix: handle missing scrip column in April 2026 KSEI PDF 2026-04-06 19:15:19 +07:00