```json
{
  "sym_variables": [
    ("x0", "hours worked by Bill"),
    ("x1", "hours worked by Mary"),
    ("x2", "hours worked by Dale"),
    ("x3", "hours worked by John"),
    ("x4", "hours worked by Jean"),
    ("x5", "hours worked by Paul")
  ],
  "objective_function": "9.2 * x0 + 4.25 * x1 + 6.62 * x2 + 4.22 * x3 + 8.6 * x4 + 9.09 * x5",
  "constraints": [
    "17 * x2 + 3 * x3 >= 41",
    "20 * x0 + 20 * x4 >= 46",
    "20 * x0 + 3 * x3 >= 47",
    "14 * x1 + 12 * x5 >= 47",
    "14 * x1 + 20 * x4 >= 62",
    "17 * x2 + 20 * x4 >= 35",
    "14 * x1 + 17 * x2 >= 48",
    "20 * x4 + 12 * x5 >= 28",
    "3 * x3 + 12 * x5 >= 66",
    "20 * x0 + 14 * x1 + 17 * x2 + 3 * x3 + 20 * x4 + 12 * x5 >= 66",
    "-9 * x3 + 10 * x4 >= 0",
    "-10 * x1 + 7 * x5 >= 0",
    "7 * x2 - x4 >= 0",
    "-8 * x1 + 3 * x3 >= 0",
    "17 * x2 + 3 * x3 <= 190",
    "17 * x2 + 20 * x4 <= 409",
    "20 * x0 + 20 * x4 <= 130",
    "3 * x3 + 12 * x5 <= 336",
    "20 * x0 + 17 * x2 <= 138",
    "17 * x2 + 12 * x5 <= 182",
    "20 * x4 + 12 * x5 <= 222",
    "20 * x0 + 3 * x3 <= 320",
    "14 * x1 + 17 * x2 <= 276",
    "14 * x1 + 3 * x3 <= 440",
    "20 * x0 + 12 * x5 <= 365",
    "3 * x3 + 20 * x4 <= 171"
  ]
}
```

```python
import gurobipy as gp

# Create a new model
model = gp.Model("Productivity Optimization")

# Create variables
bill = model.addVar(vtype=gp.GRB.CONTINUOUS, name="bill")
mary = model.addVar(vtype=gp.GRB.CONTINUOUS, name="mary")
dale = model.addVar(vtype=gp.GRB.CONTINUOUS, name="dale")
john = model.addVar(vtype=gp.GRB.CONTINUOUS, name="john")
jean = model.addVar(vtype=gp.GRB.CONTINUOUS, name="jean")
paul = model.addVar(vtype=gp.GRB.CONTINUOUS, name="paul")

# Set objective function
model.setObjective(9.2 * bill + 4.25 * mary + 6.62 * dale + 4.22 * john + 8.6 * jean + 9.09 * paul, gp.GRB.MINIMIZE)

# Add constraints
model.addConstr(17 * dale + 3 * john >= 41)
model.addConstr(20 * bill + 20 * jean >= 46)
model.addConstr(20 * bill + 3 * john >= 47)
model.addConstr(14 * mary + 12 * paul >= 47)
model.addConstr(14 * mary + 20 * jean >= 62)
model.addConstr(17 * dale + 20 * jean >= 35)
model.addConstr(14 * mary + 17 * dale >= 48)
model.addConstr(20 * jean + 12 * paul >= 28)
model.addConstr(3 * john + 12 * paul >= 66)
model.addConstr(20 * bill + 14 * mary + 17 * dale + 3 * john + 20 * jean + 12 * paul >= 66)
model.addConstr(-9 * john + 10 * jean >= 0)
model.addConstr(-10 * mary + 7 * paul >= 0)
model.addConstr(7 * dale - jean >= 0)
model.addConstr(-8 * mary + 3 * john >= 0)
model.addConstr(17 * dale + 3 * john <= 190)
model.addConstr(17 * dale + 20 * jean <= 409)
model.addConstr(20 * bill + 20 * jean <= 130)
model.addConstr(3 * john + 12 * paul <= 336)
model.addConstr(20 * bill + 17 * dale <= 138)
model.addConstr(17 * dale + 12 * paul <= 182)
model.addConstr(20 * jean + 12 * paul <= 222)
model.addConstr(20 * bill + 3 * john <= 320)
model.addConstr(14 * mary + 17 * dale <= 276)
model.addConstr(14 * mary + 3 * john <= 440)
model.addConstr(20 * bill + 12 * paul <= 365)
model.addConstr(3 * john + 20 * jean <= 171)


# Optimize model
model.optimize()

# Print results
if model.status == gp.GRB.OPTIMAL:
    print('Obj: %g' % model.objVal)
    for v in model.getVars():
        print('%s %g' % (v.varName, v.x))
elif model.status == gp.GRB.INFEASIBLE:
    print("The model is infeasible.")
else:
    print(f"Optimization ended with status {model.status}")

```
