To solve the given optimization problem, we need to translate the natural language description into a mathematical formulation and then express it in Gurobi code. The objective function to be maximized is:

7.28 * (hours worked by Mary)^2 + 3.0 * (hours worked by Mary) * (hours worked by Jean) + 3.69 * (hours worked by Jean)^2 + 8.12 * (hours worked by Mary) + 8.29 * (hours worked by Jean)

Subject to the constraints:

1. Organization score constraint for Mary: 3.15 * (hours worked by Mary)
2. Paperwork competence rating constraint for Mary: 2.73 * (hours worked by Mary)
3. Organization score constraint for Jean: 3.19 * (hours worked by Jean)
4. Paperwork competence rating constraint for Jean: 1.4 * (hours worked by Jean)
5. Minimum combined organization score: 3.15 * (hours worked by Mary) + 3.19 * (hours worked by Jean) >= 5
6. Minimum combined paperwork competence rating: 2.73 * (hours worked by Mary) + 1.4 * (hours worked by Jean) >= 18
7. Constraint involving hours worked by Mary and Jean: -1 * (hours worked by Mary) + 7 * (hours worked by Jean) >= 0
8. Maximum combined organization score: 3.15 * (hours worked by Mary) + 3.19 * (hours worked by Jean) <= 21
9. Since constraints 8 and 9 are essentially the same, we only keep one.
10. Maximum combined paperwork competence rating: 2.73 * (hours worked by Mary) + 1.4 * (hours worked by Jean) <= 36

Given that hours worked by Mary must be a whole number and hours worked by Jean can be fractional, we define Mary's hours as an integer variable and Jean's hours as a continuous variable.

```python
from gurobipy import *

# Create a model
m = Model("Optimization_Problem")

# Define variables
mary_hours = m.addVar(vtype=GRB.INTEGER, name="hours_worked_by_Mary")
jean_hours = m.addVar(vtype=GRB.CONTINUOUS, name="hours_worked_by_Jean")

# Objective function
obj_fn = 7.28 * mary_hours**2 + 3.0 * mary_hours * jean_hours + 3.69 * jean_hours**2 + 8.12 * mary_hours + 8.29 * jean_hours
m.setObjective(obj_fn, GRB.MAXIMIZE)

# Constraints
m.addConstr(3.15 * mary_hours + 3.19 * jean_hours >= 5, "min_org_score")
m.addConstr(2.73 * mary_hours + 1.4 * jean_hours >= 18, "min_paperwork_rating")
m.addConstr(-1 * mary_hours + 7 * jean_hours >= 0, "hours_constraint")
m.addConstr(3.15 * mary_hours + 3.19 * jean_hours <= 21, "max_org_score")
m.addConstr(2.73 * mary_hours + 1.4 * jean_hours <= 36, "max_paperwork_rating")

# Optimize the model
m.optimize()

# Print results
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Hours worked by Mary: {mary_hours.x}")
    print(f"Hours worked by Jean: {jean_hours.x}")
    print(f"Objective function value: {m.objVal}")
else:
    print("No optimal solution found")
```