Random thought: this is another thing we might want to start inching out of the presentation layer. I made a tentative and experimental attempt at this with cash receipt by moving it into the View layer: https://github.com/xtuple/xtuple/blob/master/enyo-client/extensions/source/billing/client/views/cash_receipt.js#L40