## Step 1: Define the symbolic representation of the variables
The variables are ['hours worked by Mary', 'hours worked by Bobby', 'hours worked by Bill', 'hours worked by Laura']. Let's denote them as $x_1$, $x_2$, $x_3$, and $x_4$ respectively.

## Step 2: Convert the objective function into a symbolic representation
The objective function to maximize is $3.06x_1^2 + 1.58x_1x_3 + 5.27x_2x_3 + 5.19x_2x_4 + 4.9x_3^2 + 6.23x_3x_4 + 2.23x_2 + 2.24x_3$.

## 3: List all the constraints in symbolic notation
1. $20x_1 \leq 236$
2. $19x_2 \leq 236$
3. $1x_3 \leq 236$
4. $20x_4 \leq 236$
5. $19x_2 + 20x_4 \geq 36$
6. $1x_3 + 20x_4 \geq 27$
7. $20x_1 + 19x_2 \geq 48$
8. $20^2x_1^2 + 20^2x_4^2 \geq 37$
9. $19x_2 + 1x_3 \geq 26$
10. $20x_1 + 1x_3 + 20x_4 \geq 35$
11. $19x_2 + 1x_3 + 20x_4 \geq 35$
12. $20^2x_1^2 + 19^2x_2^2 + 20^2x_4^2 \geq 35$
13. $20x_1 + 19x_2 + 1x_3 \geq 35$
14. $20x_1 + 1x_3 + 20x_4 \geq 39$
15. $19x_2 + 1x_3 + 20x_4 \geq 39$
16. $20x_1 + 19x_2 + 20x_4 \geq 39$
17. $20x_1 + 19x_2 + 1x_3 \geq 39$
18. $20x_1 + 1x_3 + 20x_4 \geq 53$
19. $19x_2 + 1x_3 + 20x_4 \geq 53$
20. $20x_1 + 19x_2 + 20x_4 \geq 53$
21. $20x_1 + 19x_2 + 1x_3 \geq 53$
22. $20^2x_1^2 + 1^2x_3^2 + 20^2x_4^2 \geq 54$
23. $19x_2 + 1x_3 + 20x_4 \geq 54$
24. $20^2x_1^2 + 19^2x_2^2 + 20^2x_4^2 \geq 54$
25. $20x_1 + 19x_2 + 1x_3 \geq 54$
26. $7x_2 - 7x_3 - 7x_4 \geq 0$
27. $20^2x_1^2 + 20^2x_4^2 \leq 162$
28. $1^2x_3^2 + 20^2x_4^2 \leq 84$
29. $19x_2 \cdot 20x_4 \leq 196$
30. $20^2x_1^2 + 1^2x_3^2 \leq 125$
31. $20x_1 + 19x_2 + 1x_3 \leq 106$
32. $20x_1 + 1x_3 + 20x_4 \leq 180$
33. $20x_1 + 19x_2 + 1x_3 + 20x_4 \leq 180$

## 4: Define the symbolic representation of the problem
```json
{
    'sym_variables': [
        ('x1', 'hours worked by Mary'),
        ('x2', 'hours worked by Bobby'),
        ('x3', 'hours worked by Bill'),
        ('x4', 'hours worked by Laura')
    ],
    'objective_function': '3.06*x1^2 + 1.58*x1*x3 + 5.27*x2*x3 + 5.19*x2*x4 + 4.9*x3^2 + 6.23*x3*x4 + 2.23*x2 + 2.24*x3',
    'constraints': [
        '20*x1 <= 236',
        '19*x2 <= 236',
        '1*x3 <= 236',
        '20*x4 <= 236',
        '19*x2 + 20*x4 >= 36',
        '1*x3 + 20*x4 >= 27',
        '20*x1 + 19*x2 >= 48',
        '20^2*x1^2 + 20^2*x4^2 >= 37',
        '19*x2 + 1*x3 >= 26',
        '20*x1 + 1*x3 + 20*x4 >= 35',
        '19*x2 + 1*x3 + 20*x4 >= 35',
        '20^2*x1^2 + 19^2*x2^2 + 20^2*x4^2 >= 35',
        '20*x1 + 19*x2 + 1*x3 >= 35',
        '20*x1 + 1*x3 + 20*x4 >= 39',
        '19*x2 + 1*x3 + 20*x4 >= 39',
        '20*x1 + 19*x2 + 20*x4 >= 39',
        '20*x1 + 19*x2 + 1*x3 >= 39',
        '20*x1 + 1*x3 + 20*x4 >= 53',
        '19*x2 + 1*x3 + 20*x4 >= 53',
        '20*x1 + 19*x2 + 20*x4 >= 53',
        '20*x1 + 19*x2 + 1*x3 >= 53',
        '20^2*x1^2 + 1^2*x3^2 + 20^2*x4^2 >= 54',
        '19*x2 + 1*x3 + 20*x4 >= 54',
        '20^2*x1^2 + 19^2*x2^2 + 20^2*x4^2 >= 54',
        '20*x1 + 19*x2 + 1*x3 >= 54',
        '7*x2 - 7*x3 - 7*x4 >= 0',
        '20^2*x1^2 + 20^2*x4^2 <= 162',
        '1^2*x3^2 + 20^2*x4^2 <= 84',
        '19*x2 * 20*x4 <= 196',
        '20^2*x1^2 + 1^2*x3^2 <= 125',
        '20*x1 + 19*x2 + 1*x3 <= 106',
        '20*x1 + 1*x3 + 20*x4 <= 180',
        '20*x1 + 19*x2 + 1*x3 + 20*x4 <= 180'
    ]
}
```

## 5: Write the Gurobi code
```python
import gurobi

def solve_optimization_problem():
    # Create a new Gurobi model
    model = gurobi.Model()

    # Define the variables
    x1 = model.addVar(name='x1', vtype=gurobi.GRB.INTEGER)  # hours worked by Mary
    x2 = model.addVar(name='x2', vtype=gurobi.GRB.CONTINUOUS)  # hours worked by Bobby
    x3 = model.addVar(name='x3', vtype=gurobi.GRB.INTEGER)  # hours worked by Bill
    x4 = model.addVar(name='x4', vtype=gurobi.GRB.INTEGER)  # hours worked by Laura

    # Objective function
    model.setObjective(3.06*x1**2 + 1.58*x1*x3 + 5.27*x2*x3 + 5.19*x2*x4 + 4.9*x3**2 + 6.23*x3*x4 + 2.23*x2 + 2.24*x3, gurobi.GRB.MAXIMIZE)

    # Constraints
    model.addConstr(20*x1 <= 236)
    model.addConstr(19*x2 <= 236)
    model.addConstr(x3 <= 236)
    model.addConstr(20*x4 <= 236)
    model.addConstr(19*x2 + 20*x4 >= 36)
    model.addConstr(x3 + 20*x4 >= 27)
    model.addConstr(20*x1 + 19*x2 >= 48)
    model.addConstr(400*x1**2 + 400*x4**2 >= 37)
    model.addConstr(19*x2 + x3 >= 26)
    model.addConstr(20*x1 + x3 + 20*x4 >= 35)
    model.addConstr(19*x2 + x3 + 20*x4 >= 35)
    model.addConstr(400*x1**2 + 361*x2**2 + 400*x4**2 >= 35)
    model.addConstr(20*x1 + 19*x2 + x3 >= 35)
    model.addConstr(20*x1 + x3 + 20*x4 >= 39)
    model.addConstr(19*x2 + x3 + 20*x4 >= 39)
    model.addConstr(20*x1 + 19*x2 + 20*x4 >= 39)
    model.addConstr(20*x1 + 19*x2 + x3 >= 39)
    model.addConstr(20*x1 + x3 + 20*x4 >= 53)
    model.addConstr(19*x2 + x3 + 20*x4 >= 53)
    model.addConstr(20*x1 + 19*x2 + 20*x4 >= 53)
    model.addConstr(20*x1 + 19*x2 + x3 >= 53)
    model.addConstr(400*x1**2 + x3**2 + 400*x4**2 >= 54)
    model.addConstr(19*x2 + x3 + 20*x4 >= 54)
    model.addConstr(400*x1**2 + 361*x2**2 + 400*x4**2 >= 54)
    model.addConstr(20*x1 + 19*x2 + x3 >= 54)
    model.addConstr(7*x2 - 7*x3 - 7*x4 >= 0)
    model.addConstr(400*x1**2 + 400*x4**2 <= 162)
    model.addConstr(x3**2 + 400*x4**2 <= 84)
    model.addConstr(19*x2 * 20*x4 <= 196)
    model.addConstr(400*x1**2 + x3**2 <= 125)
    model.addConstr(20*x1 + 19*x2 + x3 <= 106)
    model.addConstr(20*x1 + x3 + 20*x4 <= 180)
    model.addConstr(20*x1 + 19*x2 + x3 + 20*x4 <= 180)

    # Optimize the model
    model.optimize()

    # Print the solution
    if model.status == gurobi.GRB.OPTIMAL:
        print('Objective: ', model.objVal)
        print('x1: ', x1.varValue)
        print('x2: ', x2.varValue)
        print('x3: ', x3.varValue)
        print('x4: ', x4.varValue)
    else:
        print('No solution found')

solve_optimization_problem()
```