This is a high-level question. I'm building an ITFM database and am getting close to a 1.0 version. I've built modules for budgeting, contracts, and requisitions. Now I'm building the invoice module. The purpose of this module is to reconcile the invoices we pay against the orders we have placed (contracts and requisition).
Invoices USUALLY match a contract or requisition line for line, but not always. Occasionally, we'll have partial fulfillment of a requisition or a contract will be billed for different services at different times.
Bringing it down to the specific use case, I have a one to many relationship between contracts/requisitions (Order Table) and products (OrderProduct Table), so one contract or requisition can include multiple products.
I have an Invoice table to record the details of Invoices and a many to many join table between Orders and Invoices. That gives me the most flexibility between Orders and Invoices. Currently, the form for invoice entry has a search box on it for the order (requisition or contract). Once the user clicks on the order, it brings up a blank invoice form for the user to populate and lists the products on the contract.
However, that edge case where an invoice only covers partial fulfillment is problematic. I need to be able to allow for partial fulfillment scenarios by allowing Invoices reconcile directly against the product (vice the entire contract/requisition), but I also don't want to force the user to have to tick off every product if the invoice is a complete fulfillment of the order.
Would love to hear your thoughts about the best way to do this from a design perspective. My initial thoughts are:
1) User indicates if they have a partial or complete fulfillment invoice, then present either contract/requisition search OR product search. Problem there is the user may not know if it's partial/complete until they compare what they have against what should be there.
2) User searches for the order, clicks, and in the product list can tick off which ones are covered in the invoice, as well as enter the other details.
Any others?
Thanks,
Phil