I'm replying based on my assumption that this was developed in-house rather than customizing a third-party commercial package. If that assumption is wrong, please ignore this post.
The needs of a wholesale and retail business are *different*. So different in fact a huge chunk of functionality needed for retail is plain missing.
Given that, and given that IT ultimately works for the users who will be using the software, you have to satisfy the users. There's no such thing as over customization, just poor initial architecture. If a change introduces "overhead" (whatever that means in each individual context) then either the original architecture wasn't flexible enough, or the original architects disdain the new requirements and are just dragging their feet.
Either way, that's a high level problem.
Now, if the customization is poorly done (bad implementation, overuse of IT resources, etc.) that's not over customization, that's just a bad add-on, kind of like adding a truck trailer to a 747... 😛
Either way, the bottom line is the application had missing functionality that made it unfit for purpose. I'm unsure from the article what politics were involved (and there are *always* politics at scale, sigh) but anyone worried about "the big picture" darn well needs to finish coloring the book, not whine when somebody else adds a page because the original authors wouldn't!
PowerBuilder had an interesting solution to the inevitable update problem involved in updating versions. They built an empty customizable layer between each layer of their framework. That made it *possible* (not easy, but possible) to keep in-house customizations to the framework when they updated it.
I'm familiar with building flexible architecture, since our company's salespeople have the unfortunate habit of adding weird new lines of business without warning. 🙂 As a result I can offer readers some advice:
1) There are no rules set in stone.
2) Anything they assure you will never change will last exactly as long as it takes you to deliver the software.
3) As a result, constants aren't and variables don't. 🙂
4) Therefore, code by data and make EVERYTHING a property.
Call it the Shape Shifter programming model...