The continuing saga of the absent-vendor clean-up took a slight turn today that makes a lot of sense to me. The customer decided that, instead of having me spend 3 or 4 days re-writing a complex feature that doesn't work very well, I should spend 2 days getting rid of the feature entirely and replacing it with an editable list.
Here's the issue, sanitized for your protection: The application has to determine whether individual items that a customer has ordered should be billed separately or together. There are some basic rules to follow, involving where the products got shipped and in how many boxes, whether the customer re-sold the products or used them internally, and things like that. The application that came over the wall from my competitor did most of this, even though it sometimes confused "ordered" with "received" and didn't quite know how to handle cancellations and other shipping exceptions.
Sadly, those basic rules apply only to about half of the orders. For the other half, my client makes exceptions. Lots of exceptions. So many exceptions that a half-finished ASP.NET application really shouldn't try to figure them out. Especially an ASP.NET application that makes irreversible changes to billing data, as this hunk of whatever does.
My client actually hit on a reasonable solution to the dillemma: don't automate the process. Instead, show a list of the orders organized so that the likeliest candidates for consolidation show up next to each other, and let the humans make reversible changes to the list that the invoice process will make permanent later on. It's not only easier to code, it is manifestly what the user wants, which cuts down on the assumptions I have to make, further easing my burdens.
Sometimes, humans do things better than machines. Or, at least, they do it more cheaply. Getting the machines to do what humans can do would take lots of developer time, instead of just a little bit of administrative time. If it takes me 25-30 hours just to get the consolidation feature to work properly, and then another 40-60 hours to handle the common exceptions, it would cost about as much as 250-300 hours—almost two months—of administrative time.
So if I spend about 16-24 hours building a list and giving the administrative staff tools to handle all the exceptions easily, and they can do the process in about an hour each month, everybody wins. By the time they've burned up the same dollars as it would have cost had I done it in code, I'll have a competing product on the market.