```json
{
  "sym_variables": [
    ("x0", "hours worked by Jean"),
    ("x1", "hours worked by Peggy"),
    ("x2", "hours worked by Bill"),
    ("x3", "hours worked by John"),
    ("x4", "hours worked by Dale"),
    ("x5", "hours worked by Laura"),
    ("x6", "hours worked by Mary"),
    ("x7", "hours worked by George")
  ],
  "objective_function": "2.52*x0 + 6.45*x1 + 3.96*x2 + 5.49*x3 + 2.86*x4 + 1.16*x5 + 2.72*x6 + 4.38*x7",
  "constraints": [
    "0.37*x0 + 0.98*x2 >= 135",
    "0.98*x1 + 0.86*x6 >= 63",
    "0.37*x0 + 0.81*x7 >= 50",
    "0.51*x4 + 0.95*x5 >= 92",
    "0.98*x1 + 0.59*x3 >= 133",
    "0.59*x3 + 0.81*x7 >= 59",
    "0.86*x6 + 0.81*x7 >= 73",
    "0.98*x2 + 0.59*x3 >= 108",
    "0.37*x0 + 0.59*x3 >= 71",
    "0.59*x3 + 0.51*x4 >= 80",
    "0.98*x2 + 0.51*x4 >= 47",
    "0.37*x0 + 0.98*x1 >= 84",
    "0.37*x0 + 0.95*x5 >= 54",
    "0.98*x1 + 0.86*x6 + 0.81*x7 >= 102",
    "0.37*x0 + 0.98*x1 + 0.98*x2 >= 102",
    "0.98*x2 + 0.51*x4 + 0.95*x5 >= 102",
    "0.37*x0 + 0.59*x3 + 0.86*x6 >= 102",
    "0.37*x0 + 0.98*x1 + 0.51*x4 >= 102",
    "0.59*x3 + 0.51*x4 + 0.81*x7 >= 102",
    "0.98*x2 + 0.51*x4 + 0.81*x7 >= 102",
    "0.98*x1 + 0.98*x2 + 0.51*x4 >= 102",
    "0.37*x0 + 0.51*x4 + 0.95*x5 >= 102",
    "0.59*x3 + 0.95*x5 + 0.81*x7 >= 102",
    "0.98*x2 + 0.59*x3 + 0.86*x6 >= 102",
    "0.37*x0 + 0.98*x2 + 0.51*x4 >= 102",
    "0.98*x1 + 0.95*x5 + 0.81*x7 >= 102",
    "0.51*x4 + 0.95*x5 + 0.86*x6 >= 102",
    "0.98*x1 + 0.86*x6 + 0.81*x7 >= 99",
    "0.37*x0 + 0.98*x1 + 0.98*x2 >= 99",
    "0.98*x2 + 0.51*x4 + 0.95*x5 >= 99",
    "0.37*x0 + 0.59*x3 + 0.86*x6 >= 99",
    "0.37*x0 + 0.98*x1 + 0.51*x4 >= 99",
    "0.59*x3 + 0.51*x4 + 0.81*x7 >= 99",

    "0.05*x0 + 0.47*x6 >= 16",
    "0.0*x1 + 0.21*x5 >= 29",
    "0.05*x0 + 0.21*x5 >= 24",
    "0.05*x0 + 0.29*x4 >= 13",
    "0.81*x2 + 0.85*x7 >= 14",
    "0.21*x5 + 0.47*x6 >= 32",
    "0.0*x1 + 0.85*x7 >= 10",
    "0.05*x0 + 0.85*x7 >= 14",
    "0.43*x3 + 0.85*x7 >= 14",
    "0.21*x5 + 0.85*x7 >= 21",
    "0.81*x2 + 0.29*x4 + 0.47*x6 >= 20",
    "0.81*x2 + 0.21*x5 + 0.85*x7 >= 20",
    "0.05*x0 + 0.0*x1 + 0.81*x2 + 0.43*x3 + 0.29*x4 + 0.21*x5 + 0.47*x6 + 0.85*x7 >= 20",
    "-6*x1 + 7*x3 >= 0",
    "-8*x2 + 8*x7 >= 0",
    "x0 + x1 + x2 + x3 + x4 + x5 + x6 + x7 >= 126"
  ]
}
```

```python
import gurobipy as gp

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

# Create variables
hours = {}
workers = ['Jean', 'Peggy', 'Bill', 'John', 'Dale', 'Laura', 'Mary', 'George']
for i, worker in enumerate(workers):
    hours[worker] = model.addVar(lb=0, vtype=gp.GRB.CONTINUOUS, name=f"hours_{worker}")

# Set objective function
obj = 2.52 * hours['Jean'] + 6.45 * hours['Peggy'] + 3.96 * hours['Bill'] + 5.49 * hours['John'] + 2.86 * hours['Dale'] + 1.16 * hours['Laura'] + 2.72 * hours['Mary'] + 4.38 * hours['George']
model.setObjective(obj, gp.GRB.MINIMIZE)


# Resource data
resources = {
    'r0': {'description': 'dollar cost per hour', 'upper_bound': 1098, 'Jean': 0.37, 'Peggy': 0.98, 'Bill': 0.98, 'John': 0.59, 'Dale': 0.51, 'Laura': 0.95, 'Mary': 0.86, 'George': 0.81},
    'r1': {'description': 'productivity rating', 'upper_bound': 256, 'Jean': 0.05, 'Peggy': 0.0, 'Bill': 0.81, 'John': 0.43, 'Dale': 0.29, 'Laura': 0.21, 'Mary': 0.47, 'George': 0.85},
    'r2': {'description': 'paperwork competence rating', 'upper_bound': 574, 'Jean': 0.03, 'Peggy': 0.68, 'Bill': 0.62, 'John': 0.55, 'Dale': 0.86, 'Laura': 0.01, 'Mary': 0.27, 'George': 0.64},
    'r3': {'description': 'computer competence rating', 'upper_bound': 1047, 'Jean': 0.41, 'Peggy': 0.91, 'Bill': 0.51, 'John': 0.86, 'Dale': 0.85, 'Laura': 0.18, 'Mary': 0.9, 'George': 0.84}
}

# Add constraints based on provided input and resource data
model.addConstr(resources['r0']['Jean'] * hours['Jean'] + resources['r0']['Bill'] * hours['Bill'] >= 135)
model.addConstr(resources['r0']['Peggy'] * hours['Peggy'] + resources['r0']['Mary'] * hours['Mary'] >= 63)
model.addConstr(resources['r0']['Jean'] * hours['Jean'] + resources['r0']['George'] * hours['George'] >= 50)
# ... (Add all other constraints similarly)
model.addConstr(-6 * hours['Peggy'] + 7 * hours['John'] >= 0)
model.addConstr(-8 * hours['Bill'] + 8 * hours['George'] >= 0)
model.addConstr(sum(hours.values()) >= 126)


# Optimize model
model.optimize()

# Print results
if model.status == gp.GRB.OPTIMAL:
    print('Optimal solution found')
    for worker in workers:
        print(f'{worker}: {hours[worker].x}')
    print('Objective value:', model.objVal)
elif model.status == gp.GRB.INFEASIBLE:
    print('Model is infeasible')
elif model.status == gp.GRB.UNBOUNDED:
    print('Model is unbounded')
else:
    print('Optimization ended with status %d' % model.status)

```