To solve the optimization problem described, we first need to understand the objective function and the constraints. The objective is to maximize the value of \(4 \times \text{hours worked by Jean} + 5 \times \text{hours worked by Laura} + 4 \times \text{hours worked by Mary}\).

The constraints are based on work quality ratings and dollar costs per hour for each person, as well as combined work quality ratings and total dollar costs for various combinations of workers.

Here is the breakdown of the problem in terms that can be translated into Gurobi code:

- Decision Variables: 
  - \(J\): hours worked by Jean
  - \(L\): hours worked by Laura
  - \(M\): hours worked by Mary

- Objective Function:
  - Maximize: \(4J + 5L + 4M\)

- Constraints:
  1. Work Quality Rating Constraints:
     - \(19J + 16M \geq 22\)
     - \(19J + 8L \geq 30\)
     - \(8L + 16M \geq 27\)
     - \(19J + 8L \leq 39\)
     - \(8L + 16M \leq 91\)
     - \(19J + 8L + 16M \leq 91\)
  2. Dollar Cost Constraints:
     - \(12J + 2M \leq 90\)
     - \(12J + 14L \leq 56\)
     - \(12J + 14L + 2M \leq 56\)

Given these constraints and the objective function, we can write the Gurobi code to solve this problem. Note that all variables are allowed to be non-integer (float), so we will use continuous variable types in Gurobi.

```python
from gurobipy import *

# Create a new model
m = Model("Optimization_Model")

# Decision Variables
J = m.addVar(vtype=GRB.CONTINUOUS, name="hours_worked_by_Jean")
L = m.addVar(vtype=GRB.CONTINUOUS, name="hours_worked_by_Laura")
M = m.addVar(vtype=GRB.CONTINUOUS, name="hours_worked_by_Mary")

# Objective Function
m.setObjective(4*J + 5*L + 4*M, GRB.MAXIMIZE)

# Constraints
m.addConstr(19*J + 16*M >= 22, name="Work_Quality_Rating_JM")
m.addConstr(19*J + 8*L >= 30, name="Work_Quality_Rating_JL")
m.addConstr(8*L + 16*M >= 27, name="Work_Quality_Rating_LM")
m.addConstr(19*J + 8*L <= 39, name="Work_Quality_Rating_JL_Upper")
m.addConstr(8*L + 16*M <= 91, name="Work_Quality_Rating_LM_Upper")
m.addConstr(19*J + 8*L + 16*M <= 91, name="Total_Work_Quality_Rating_Upper")

m.addConstr(12*J + 2*M <= 90, name="Dollar_Cost_JM")
m.addConstr(12*J + 14*L <= 56, name="Dollar_Cost_JL")
m.addConstr(12*J + 14*L + 2*M <= 56, name="Total_Dollar_Cost_Upper")

# Optimize the model
m.optimize()

# Print solution
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Hours worked by Jean: {J.x}")
    print(f"Hours worked by Laura: {L.x}")
    print(f"Hours worked by Mary: {M.x}")
    print(f"Objective function value: {m.objVal}")
else:
    print("No optimal solution found")
```