## Problem Description and Formulation

The problem is an optimization problem with two variables: 'hours worked by Laura' and 'hours worked by John'. The objective function to be maximized is:

\[ 1.13 \times (\text{hours worked by Laura})^2 + 5.24 \times (\text{hours worked by John})^2 + 1.28 \times (\text{hours worked by John}) \]

The problem has several constraints:

1. Laura's likelihood to quit index is 9.
2. Laura's productivity rating is 21.
3. Laura's work quality rating is 26.
4. John's likelihood to quit index is 14.
5. John's productivity rating is 23.
6. John's work quality rating is 16.
7. The total combined likelihood to quit index must be 71 or more.
8. The total combined productivity rating must be greater than or equal to 62.
9. The total combined work quality rating must be 66 or more.
10. \(3 \times (\text{hours worked by Laura}) - 7 \times (\text{hours worked by John}) \geq 0\).
11. The total combined likelihood to quit index must be at most 198.
12. The total combined productivity rating must be at most 168.
13. The total combined work quality rating must be at most 121.
14. Hours worked by Laura can be any real number.
15. Hours worked by John must be an integer.

## Gurobi Code Formulation

```python
import gurobi

# Create a new model
m = gurobi.Model()

# Define variables
laura_hours = m.addVar(lb=-gurobi.GRB.INFINITY, ub=gurobi.GRB.INFINITY, name="laura_hours")
john_hours = m.addVar(lb=0, ub=gurobi.GRB.INFINITY, vtype=gurobi.GRB.INTEGER, name="john_hours")

# Objective function
m.setObjective(1.13 * laura_hours ** 2 + 5.24 * john_hours ** 2 + 1.28 * john_hours, gurobi.GRB.MAXIMIZE)

# Constraints
m.addConstr(9 * laura_hours + 14 * john_hours >= 71, name="likelihood_to_quit_index")
m.addConstr(21 * laura_hours + 23 * john_hours >= 62, name="productivity_rating")
m.addConstr(26 * laura_hours ** 2 + 16 * john_hours ** 2 >= 66, name="work_quality_rating")
m.addConstr(3 * laura_hours - 7 * john_hours >= 0, name="hours_worked_constraint")
m.addConstr(9 * laura_hours + 14 * john_hours <= 198, name="likelihood_to_quit_index_max")
m.addConstr(21 * laura_hours + 23 * john_hours <= 168, name="productivity_rating_max")
m.addConstr(26 * laura_hours ** 2 + 16 * john_hours ** 2 <= 121, name="work_quality_rating_max")

# Optimize
m.optimize()

# Print solution
if m.status == gurobi.GRB.OPTIMAL:
    print("Optimal solution found.")
    print(f"Laura's hours: {laura_hours.varValue}")
    print(f"John's hours: {john_hours.varValue}")
    print(f"Objective: {m.objVal}")
else:
    print("No optimal solution found.")
```