I need to track trade status. Here's what I said about it briefly in my last post:
Trades can be in multiple states. At least initially we'll need "open", "canceled", "executed", and "invalid". I'm trying to figure out a good system for this. Trade status values must be exclusive - an order can't be open and canceled at the same time. I could use the taxonomy system. I could use nodequeue, workflow, or workflow "next generation". While I like nodequeue a lot, it has the drawback of not enforcing exclusivity, so that might remove it from the running. Workflow and WorkflowNG are both big scary modules to me. Taxonomy is nice and well tested, but of course lacks some features that Workflow/WorkflowNG have.
The other part I forgot about in that discussion was contract status. Contracts can also be in a couple states: "pre-launch", "available for trading", "closed", and "expired" are the first that pop up. I don't know if I really want more granular or less granular. Right now that's all I can think of.
In more detail:
A trade can only have one status at a time. The status must be easily queried. Orders also need to be ordered in each status pool by the price and by date/time they were entered.
Workflow could be nice
It might be nice to have them based on a workflow module so that actions could be associated with the movement from one status to another.
I think it will be handy to let views create some reports to slice and dice my trades based on status values (among other things) so I need that.
Permissions and flow on State Changes
In general, things can only flow in one direction and the state changes from one to the next are quite defined:
- Everything starts out open when the user submits it - validation at creation time makes sure that it's valid.
- If a user cancels their trade, it can't be uncanceled - only the owner or an admin should be able to cancel trades
- If the user runs out of money or something, the system (or an admin) could mark a trade as invalid and ideally there should be a log of why that happened - maybe in the core revision log system.
- If the trade is valid and matched then the system or an admin should be able to mark it as executed
There needs to be protection (ideally in the status system itself) to prevent a scenario where the user is viewing a trade and has a button for "cancel" on their screen, they wait a few seconds, meanwhile the trade is executed by the system, and then the user clicks cancel which is now an invalid operation.
Usual Module Caveats Apply
It should be actively maintained, well coded, play well with others, etc.
So, what meets those goals?