Files
sure/app/models/import
d57c4301f2 fix(import): tolerate null Rule names and orphaned rejected transfers (#2775)
* fix(import): tolerate null Rule names and orphaned rejected transfers

Importing a full all.ndjson export aborted on data that is actually
valid. The preflight listed name as a required field for Rule, but
rules.name is nullable and the model allows it, so a single rule with
"name": null blocked the entire import. Separately, a RejectedTransfer
whose referenced transaction had been deleted raised a hard
missing_reference error in preflight and a MissingReferenceError in
strict mode, even though the importer already had a skip path for it.

Require Rule.id instead of Rule.name in preflight, matching the field
the importer actually needs. Treat RejectedTransfer references as
advisory: a missing referenced transaction becomes a warning, and the
importer resolves the references with required: false so the orphaned
row is skipped and counted instead of raising.

Fixes #2721

* fix(import): keep SureImport preflight warnings as strings at the API boundary

The orphaned-RejectedTransfer path emits warnings as {code, message} hashes via
add_warning, but the published OpenAPI contract documents /api/v1/imports/preflight
warnings as strings. sure_import_preflight_payload copied them through unchanged, so
the endpoint returned a heterogeneous array once that path was exercised and
contract-generated clients could fail to deserialize.

Map warnings to their human-readable message at the API boundary so the array stays
homogeneous strings, matching the documented schema. The internal {code, message}
shape is unchanged. Adds a regression test.

* i18n(import): localize missing-reference preflight messages

The missing-reference warning and error are user-facing (returned in
Result#payload[:warnings]/[:errors]) but were hard-coded. Move the full templates
to config/locales/models/sure_import/preflight/en.yml and interpolate line, type,
field, and value, per the i18n coding guideline. Warning key and error behavior are
unchanged, and the rendered text is identical.

---------

Co-authored-by: agentloop <agentloop@localhost>
Co-authored-by: pro3958 <pro3958@users.noreply.github.com>
2026-08-22 05:52:18 +02:00
..