Hi Ron,
So to preface this, I'll first say that I'm not an accountant, and most of my accounting knowledge comes from a semester accounting class and text book. Feedback like yours is critical to help create a system that works in the real world of accounting, but also makes it easy for developers to implement generally accepted accounting principles. So thank you!
I have been thinking that Plutus needs some type of mechanism for making adjusting entries, and your returned check scenario is the perfect example. I'm sure you may not know about the returned checks until the next accounting period, so you'd need to go in and add an adjusting entry for the previous month, and manually overriding the created_at field does feel like a hack.
That said, I'm still unclear what you mean by an effective date. If I'm understanding your description right, you might need to implement a cash receipt system alongside Plutus. The `commercial_document` field in the transaction would be the association you could use for the receipt, which would have any data regarding the receipt of checks or cash. Transactions in Plutus are really meant to be journal entries that are usually based on source documents such as invoices, purchase order, receipts, check book stubs, etc.
So if I were registering payments via checks that are picked up, I'd first issue a receipt for the check, noting the amount. The receipt would probably also show for what the check was a payment for. So if it's for service for last month, it would show dates for last month somewhere on the receipt (I believe this is what you might mean by an effective date?). In the accounting system, however, the transaction (i.e. the journal entry) would be entered on the day the receipt was created.
Part of my resistance to adding a date field has been that manual entry of dates for most transactions is probably not needed and might increase the likelihood of booking mistakes. Clearly for things like returned checks though, we need to be able to make adjusting entries.
So my current thinking is that a date field is added to the transactions table. However, in the vein of Rails "sensible defaults" the transaction creation API would automatically set the date to the current day. A new "adjustment" API would be added that would allow the date to be entered manually, and mark the transaction as an adjustment. The additional date field would also provide a check that books aren't being messed with by being able to ensure that the transaction_date and create_at fields match unless it's marked as an adjustment.
Am I missing anything? Thoughts?
-- Mike