```json
{
  "sym_variables": [
    ("x0", "hours worked by Bill"),
    ("x1", "hours worked by Bobby"),
    ("x2", "hours worked by John"),
    ("x3", "hours worked by Jean")
  ],
  "objective_function": "1*x0 + 7*x1 + 7*x2 + 2*x3",
  "constraints": [
    "6.03*x0 + 7.15*x1 >= 27",
    "3.18*x2 + 10.35*x3 >= 53",
    "6.03*x0 + 7.15*x1 + 10.35*x3 >= 49",
    "6.03*x0 + 7.15*x1 + 3.18*x2 + 10.35*x3 >= 49",
    "11.64*x1 + 4.78*x3 >= 30",
    "11.64*x1 + 9.03*x2 >= 20",
    "9.03*x2 + 4.78*x3 >= 31",
    "11.64*x1 + 9.03*x2 + 4.78*x3 >= 29",
    "9.43*x0 + 11.64*x1 + 9.03*x2 + 4.78*x3 >= 29",
    "7*x1 - 1*x2 >= 0",
    "-7*x1 + 7*x3 >= 0",
    "4*x0 - 10*x3 >= 0",
    "6.03*x0 + 7.15*x1 + 3.18*x2 <= 212",
    "9.43*x0 + 9.03*x2 + 4.78*x3 <= 152"
  ]
}
```

```python
import gurobipy as gp

try:
    # Create a new model
    m = gp.Model("optimization_model")

    # Create variables
    x = m.addVars(4, lb=0, vtype=gp.GRB.CONTINUOUS, names=["Bill", "Bobby", "John", "Jean"])

    # Set objective function
    m.setObjective(1*x[0] + 7*x[1] + 7*x[2] + 2*x[3], gp.GRB.MINIMIZE)

    # Add constraints
    m.addConstr(6.03*x[0] + 7.15*x[1] >= 27)
    m.addConstr(3.18*x[2] + 10.35*x[3] >= 53)
    m.addConstr(6.03*x[0] + 7.15*x[1] + 10.35*x[3] >= 49)
    m.addConstr(6.03*x[0] + 7.15*x[1] + 3.18*x[2] + 10.35*x[3] >= 49)
    m.addConstr(11.64*x[1] + 4.78*x[3] >= 30)
    m.addConstr(11.64*x[1] + 9.03*x[2] >= 20)
    m.addConstr(9.03*x[2] + 4.78*x[3] >= 31)
    m.addConstr(11.64*x[1] + 9.03*x[2] + 4.78*x[3] >= 29)
    m.addConstr(9.43*x[0] + 11.64*x[1] + 9.03*x[2] + 4.78*x[3] >= 29)
    m.addConstr(7*x[1] - 1*x[2] >= 0)
    m.addConstr(-7*x[1] + 7*x[3] >= 0)
    m.addConstr(4*x[0] - 10*x[3] >= 0)
    m.addConstr(6.03*x[0] + 7.15*x[1] + 3.18*x[2] <= 212)
    m.addConstr(9.43*x[0] + 9.03*x[2] + 4.78*x[3] <= 152)


    # Optimize model
    m.optimize()

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

except gp.GurobiError as e:
    print(f'Error code {e.errno}: {e.message}')
except AttributeError:
    print('Encountered an attribute error')
```