Ingest & map
The file and the records it contains are handled separately — content hash, length, source, and uploader are tied together. Source fields are mapped to one canonical model with versioned rules. payment_ref and transaction_reference only match if you say they mean the same thing.