It can be done like you describe for sure. Like, if we have vaginal, we begin to check if we have vaginal + indoors, then vaginal+no bg, then vaginal + beach, etc. Then make another list with existing locations. Then pick one from the list randomly, and based on the picked one add description before giving it to show function.
But it means tons of confusing and excessive code at least for two jobs, whores and rest. Because we don't care where they do it, yet describing the place would be nice.
BTW: That is not what I meant, at least not exactly. My approach would be to put as much logic into the reports as possible such as:
1) Did the client like the workers for traits. (should prolly be passed from Building through flags).
2) Were there any building upgrades that effected the action (Job) and how.
3) Any special events that took place.
4) Special logic like a worker becoming clients favorite.
and etc.
Most of that is not ready yet
but all of that may get in the way of proper reports... or conflicts could be created. Basically I favor a logic driven approach even if we get incorrect pictures from time to time. If you base descriptions and/or draw acts from pics, there could be problems:
1) Inconsistency with logic.
2) You fall into a trap of plainly describing what where is on the image, which is not reasonable.
===
In my mind:
1) Clients walks into your building which can have a number of businesses/upgrades.
2) Client has a specific action/act in mind.
3) If there is a room and workers available:
- Client finds a worker he/she likes or pics one at random if none is found.
- We check for events, figure out the cost of the service and tips if applicable.
- Run the Job.
Important Note: Job plainly writes a report on what has already happened, that is not true in our case yet because ACT is picked inside of a job, I don't like that but there seems to be no harm in it at the moment.
- Clients and Worker are freed for more actions.
4) If there is no room or workers available:
- Clients may wish to wait.
- Client may visit a different upgrade (Bar/Club).
- Client may plainly leave.
Managers can help here... but that code is far from done.
5) We check if client is done for the day or still wishes to do something else...
===
The system is really powerful due to SimPy, even after a while, I still struggle often with it and get confused but it's getting clearer and clearer with every week of coding

One of the main problems is that the system is not linear any more, there can be dozens if not hundreds of process be alive simultaneously, we did not have that anywhere in the game before SimPy. A fact that I don't have as much time as before doesn't help either, coding for jobs unlike small bits like I did for PopScale or forum posts require proper time and concentration.
We'll get it done, just by taking one step at a time and coordinating properly. You can work on texts/events for jobs, just keep in mind what I am working on as well.