Here's the formulation of the linear program and the Gurobi code to solve it:

**Decision Variables:**

* `x`: Number of units of Piano A stocked daily.
* `y`: Number of units of Piano B stocked daily.

**Objective Function:**

Minimize the total cost: `20x + 15y + 12x + 4y = 32x + 19y`

**Constraints:**

* **Budget Constraint:** `20x + 15y <= 450` (The total cost of purchasing the pianos should not exceed the daily budget).
* **Customer Attraction Constraint:** `25x + 10y >= 250` (The number of customers attracted should be at least 250).
* **Non-negativity Constraints:** `x >= 0`, `y >= 0` (The number of units stocked cannot be negative).


```python
import gurobipy as gp
from gurobipy import GRB

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

# Create decision variables
x = model.addVar(lb=0, vtype=GRB.INTEGER, name="Piano_A")
y = model.addVar(lb=0, vtype=GRB.INTEGER, name="Piano_B")

# Set objective function
model.setObjective(32*x + 19*y, GRB.MINIMIZE)

# Add constraints
model.addConstr(20*x + 15*y <= 450, "Budget_Constraint")
model.addConstr(25*x + 10*y >= 250, "Customer_Constraint")

# Optimize model
model.optimize()

# Print results
if model.status == GRB.OPTIMAL:
    print(f"Optimal Solution Found:")
    print(f"Number of Piano A units: {x.x}")
    print(f"Number of Piano B units: {y.x}")
    print(f"Total Cost: ${model.objVal}")
elif model.status == GRB.INFEASIBLE:
    print("Model is infeasible. No solution found.")
else:
    print(f"Optimization terminated with status: {model.status}")

```
