To solve this optimization problem, we first need to define the decision variables and the objective function. Let's denote:
- \(x\) as the number of face masks to be sold.
- \(y\) as the number of hand sanitizers to be sold.

The objective is to maximize daily profit. The profit from selling each face mask is $1, and the profit from selling each hand sanitizer is $1.5. Therefore, the total profit can be represented as:
\[ \text{Profit} = x + 1.5y \]

We have several constraints based on the problem description:
1. **Budget Constraint**: The cost of purchasing face masks and hand sanitizers must not exceed $1000. Each face mask costs $1.5, and each hand sanitizer costs $3.
\[ 1.5x + 3y \leq 1000 \]
2. **Lower Bound on Face Masks Sold**: At least 80 face masks are sold each day.
\[ x \geq 80 \]
3. **Upper Bound on Face Masks Sold**: At most 500 face masks are sold each day.
\[ x \leq 500 \]
4. **Constraint on Hand Sanitizers Sold**: The number of hand sanitizers sold is at most half the number of face masks sold.
\[ y \leq 0.5x \]

To solve this problem using Gurobi, we will translate these constraints and the objective function into a linear programming model.

```python
from gurobipy import *

# Create a new model
m = Model("Ecommerce_Optimization")

# Define decision variables
x = m.addVar(lb=80, ub=500, vtype=GRB.CONTINUOUS, name="face_masks")
y = m.addVar(vtype=GRB.CONTINUOUS, name="hand_sanitizers")

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

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

# Constraint on hand sanitizers sold
m.addConstr(y <= 0.5*x, "hand_sanitizer_constraint")

# Optimize model
m.optimize()

# Print solution
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Face Masks: {x.x}")
    print(f"Hand Sanitizers: {y.x}")
    print(f"Maximum Profit: {m.objVal}")
else:
    print("No optimal solution found")
```