To solve this optimization problem, we first need to define the variables and constraints in a symbolic representation. Let's denote 'hours worked by Bobby' as $x_1$ and 'hours worked by Bill' as $x_2$. The objective function is to maximize $5x_1 + 7x_2$.

The given constraints are:
- The work quality rating for Bobby is 14.16, which implies $14.16x_1$ represents the contribution of Bobby's work quality.
- The work quality rating for Bill is 5.77, implying $5.77x_2$ represents the contribution of Bill's work quality.
- The total combined work quality rating from hours worked by both must be equal to or greater than 8: $14.16x_1 + 5.77x_2 \geq 8$.
- Another constraint is $-4x_1 + 5x_2 \geq 0$.
- The total combined work quality rating should be less than or equal to 39: $14.16x_1 + 5.77x_2 \leq 39$.
- Since the maximum allowed is exactly 39, we actually have an equality for the maximum condition but will treat it as $\leq 39$ for optimization purposes.
- Both $x_1$ and $x_2$ must be integers.

The symbolic representation of the problem is:
```json
{
    'sym_variables': [('x1', 'hours worked by Bobby'), ('x2', 'hours worked by Bill')],
    'objective_function': '5*x1 + 7*x2',
    'constraints': [
        '14.16*x1 + 5.77*x2 >= 8',
        '-4*x1 + 5*x2 >= 0',
        '14.16*x1 + 5.77*x2 <= 39',
        'x1 == int(x1)',
        'x2 == int(x2)'
    ]
}
```

To implement this in Gurobi, we use the following Python code:

```python
from gurobipy import *

# Create a new model
m = Model("Work Hours Optimization")

# Define variables
x1 = m.addVar(vtype=GRB.INTEGER, name="hours_worked_by_Bobby")
x2 = m.addVar(vtype=GRB.INTEGER, name="hours_worked_by_Bill")

# Set the objective function
m.setObjective(5*x1 + 7*x2, GRB.MAXIMIZE)

# Add constraints
m.addConstr(14.16*x1 + 5.77*x2 >= 8, "Work_Quality_Min")
m.addConstr(-4*x1 + 5*x2 >= 0, "Balance_Constraint")
m.addConstr(14.16*x1 + 5.77*x2 <= 39, "Work_Quality_Max")

# Optimize the model
m.optimize()

# Print the results
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Hours worked by Bobby: {x1.x}")
    print(f"Hours worked by Bill: {x2.x}")
    print(f"Objective function value: {m.objVal}")
else:
    print("No optimal solution found")
```