## Problem Description and Formulation

The e-commerce company wants to maximize its daily profit from selling face masks and hand sanitizers. The goal is to determine the optimal number of each item to have in stock.

### Decision Variables

* $x$: Number of face masks to stock
* $y$: Number of hand sanitizers to stock

### Objective Function

The profit from selling $x$ face masks is $1x$ and from selling $y$ hand sanitizers is $1.5y$. The objective is to maximize the total profit:

Maximize: $1x + 1.5y$

### Constraints

1. **Budget Constraint**: The total cost of stocking $x$ face masks and $y$ hand sanitizers should not exceed the budget of $1000.
   - $1.5x + 3y \leq 1000$

2. **Face Mask Sales Constraint**: At least 80 but at most 500 face masks are sold each day.
   - $80 \leq x \leq 500$

3. **Hand Sanitizer Sales Constraint**: The number of hand sanitizers sold will be at most half the number of face masks sold.
   - $y \leq 0.5x$

4. **Non-Negativity Constraint**: The number of face masks and hand sanitizers cannot be negative.
   - $x \geq 0, y \geq 0$

Since $x$ and $y$ represent quantities of items, they should be integers. However, for the purpose of this linear programming formulation, we will first solve it as a continuous problem and then consider how to adjust for integer solutions if necessary.

## Gurobi Code

```python
import gurobi

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

    # Define decision variables
    x = model.addVar(lb=0, name="face_masks")
    y = model.addVar(lb=0, name="hand_sanitizers")

    # Objective function: Maximize profit
    model.setObjective(1*x + 1.5*y, gurobi.GRB.MAXIMIZE)

    # Budget constraint
    model.addConstr(1.5*x + 3*y <= 1000, name="budget_constraint")

    # Face mask sales constraints
    model.addConstr(x >= 80, name="min_face_masks")
    model.addConstr(x <= 500, name="max_face_masks")

    # Hand sanitizer sales constraint
    model.addConstr(y <= 0.5*x, name="hand_sanitizer_constraint")

    # Solve the model
    model.optimize()

    # Check if the model is optimized
    if model.status == gurobi.GRB.OPTIMAL:
        print(f"Optimal solution found: face masks = {x.varValue:.2f}, hand sanitizers = {y.varValue:.2f}")
        print(f"Maximum profit: {model.objVal:.2f}")
    else:
        print("No optimal solution found")

solve_optimization_problem()
```

This code sets up the optimization problem using Gurobi's Python interface, solves it, and prints out the optimal values for the number of face masks and hand sanitizers to stock, along with the maximum achievable profit. Note that the solution values are printed to two decimal places; if integer solutions are required, further processing would be needed.