6bf0ebfd1d
LedgerService::resolveSupplierId returns suppliers.code='direct' row for DIRECT-platform supplier_projects (and for parsed-from-payload non-B projects). CsvReconcileJob::extractPlatform now classifies most non-empty, non-junk project strings as DIRECT (instead of dumping them into unparseable_count) — this allows CSV recovery to also create DIRECT supplier_leads, mirroring the webhook path. CsvReconcileJobTest junk-rows fixtures updated: previously used callback phone-number-as-project (79135551234) and URL-like strings as 'junk', but those are now valid DIRECT identifiers. Replaced with truly junk strings matching only outside-whitelist symbols (e.g. '???', '!@#'). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>