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 <>
Novedades

Tesoros recién llegados

Desliza y encuentra nuevos favoritos.

Club ARI

Promociones, lanzamientos y mucha diversión.

Únete a nuestra comunidad y recibe primero las novedades del catálogo.

{/* No hay herramienta de generacion de imagenes disponible para crear un asset nuevo -- se reconstruye el mismo efecto (fondo punteado + fotos estilo polaroid) con CSS y fotos reales de producto ya