I'm developing a system on which there are two requirements that seems to be in conflict. Since this seems to be a situation that can be more general, I thought it to be valid to ask here.
The system in question is for management of the finances of a company.
In the system the customers are registered and in the customer data it is possible to specify the services the company is providing for them.
The system also has a billing module, where the company registers its services, and issues bills to the customers by selecting the service they registered.
The two requirements in conflict are:
In the customer registration module, the services are predefined. One picks what services are provided for each customer and the properties of the corresponding service, which tune how the service is provided. The point is that each service has some defining properties. Furthermore, on other areas of the system, there is business logic that needs to know about those services and properties. This makes the services end up hardcoded.
In the billing module, the end user wants to register the services by their own. They want to be able to register the services and categorize the services they are billing in their own way.
Now, these two are in conflict because integration is required. In the sense that when a service is provided to a customer, the end user wants the bill to be issued automatically.
One example: if there is one Support service, on the customer registration there could be a class representing the service or a property of the Customer, indicating whether the service is provided or not. This will allow the system to make decisions and perform business logic related to the Support provided to this Customer.
On the other hand, on the billing part of the system, the end user added manually a register "Support". Now, if we need to automate, there is no way the system can automatically know that the "Support" that is hardcoded there, in a class or in a property, corresponds to the "Support" entry on the database.
In my opinion the correctly way to solve this issue is to remove the possibility of the end user registering the services themselves. But then there's the problem: what if the end user doens't want to hear and wants it that way no matter what?
How can I reconcile these two requirements? How can I deal with the situation where in two parts of the system the same concept appears, in one it needs to actually be coded and in the other the user wants to have freedom to register it by itself? I believe DDD bounded contexts can help here, but I don't know how yet.
Customer
class there are properties to determine the services and their attributes. This happens so that, for instance, if one tries to add a "support" requirement for that customer, some verifications happen based on the "support" properties (like the hours purchased and so on). But this logic depends on each service, I believe that's what led to the "hardcoded" solution.