The requirements increased over time, it turned out that the chosen technology was not suitable, the developers did not have sufficient competencies, and, in general, the managers and architects who accepted the product from the contractors fuck-up. Feature development took unreasonably long, testing wasn't complete, quality suffered, deadlines constantly dragged on, and people reworked.
Analysis: We studied the code, documentation, requirements, process and resources, and estimated the labour costs.
Solution: Justified the need to switch to a familiar stack, and convinced the client to rewrite the basic functionality of the solution in the form of a scalable microservice. The development took two months, the full-time team coped, and everything worked.
Result: The new solution ended up on a familiar stack for the entire parent organization, which means that almost any developer could extend the solution. The application turned out to be testable, becoming possible to write unit tests (hello groovy and java integration). Development and support became measurable and began to meet the expected timelines.