diff --git a/workloads/commerce-backend/src/api/store/payments/pse-banks/route.ts b/workloads/commerce-backend/src/api/store/payments/pse-banks/route.ts
index cbd491d..09e5f62 100644
--- a/workloads/commerce-backend/src/api/store/payments/pse-banks/route.ts
+++ b/workloads/commerce-backend/src/api/store/payments/pse-banks/route.ts
@@ -12,6 +12,12 @@ import { createEpaycoClient, type EpaycoEnv } from "../../../../lib/epayco";
// contra el sandbox real en esta sesion -- se prueban los nombres de
// campo mas probables (bankCode/bankName y variantes) y se degrada a
// lista vacia si no matchea nada, en vez de romper el checkout entero.
+//
+// Verificado en vivo despues (navegador real, Playwright): el sandbox
+// real de ePayco incluye un primer elemento placeholder
+// (bankCode "0", "A continuación seleccione su banco...") mezclado con
+// los bancos reales -- ningun banco PSE real tiene codigo "0", asi que
+// se filtra explicitamente en vez de mostrarlo como opcion seleccionable.
const CACHE_TTL_MS = 6 * 60 * 60 * 1000;
let cache: { banks: Array<{ pseCode: string; description: string }>; fetchedAt: number } | null = null;
@@ -42,7 +48,7 @@ export async function GET(req: MedusaRequest, res: MedusaResponse) {
? { pseCode: String(pseCode), description: String(description ?? pseCode) }
: null;
})
- .filter((bank): bank is { pseCode: string; description: string } => bank !== null);
+ .filter((bank): bank is { pseCode: string; description: string } => bank !== null && bank.pseCode !== "0");
cache = { banks, fetchedAt: Date.now() };
res.json({ banks });
diff --git a/workloads/ecommerce/app/page.tsx b/workloads/ecommerce/app/page.tsx
index ff98cbf..8cad8ca 100644
--- a/workloads/ecommerce/app/page.tsx
+++ b/workloads/ecommerce/app/page.tsx
@@ -21,9 +21,13 @@ export default async function HomePage() {
// ADR 0010: el banner toma primero productos destacados (curaduria
// explicita del admin via el flag "featured"); si no hay ninguno,
// cae a los mismos "tesoros" (nuevos/destacados) de la seccion de
- // abajo para no repetir la logica de seleccion.
- const featuredProducts = products.filter((product) => product.featured);
- const bannerProducts = featuredProducts.length > 0 ? featuredProducts : treasures;
+ // abajo para no repetir la logica de seleccion. Se exige ademas
+ // "available" -- encontrado probando en vivo con un navegador real
+ // (Playwright): un producto featured pero sin stock disponible salio
+ // primero en el carrusel con boton "Comprar ahora" hacia una pagina
+ // donde en realidad no se puede comprar.
+ const featuredProducts = products.filter((product) => product.featured && product.available);
+ const bannerProducts = featuredProducts.length > 0 ? featuredProducts : treasures.filter((product) => product.available);
return <>
Desliza y encuentra nuevos favoritos.
Únete a nuestra comunidad y recibe primero las novedades del catálogo.