fix(ecommerce): corrige origen de bodega Bogotá→Cali y activa redes/Cambios/FAQ
Build and Push Medusa / Escaneo de Secretos (Gitleaks) (push) Successful in 30s
Build and Push Frontend / Escaneo de Secretos (Gitleaks) (push) Successful in 21s
Build and Push Medusa / Construir y publicar Medusa (push) Successful in 19m40s
Build and Push Frontend / Construir y Subir Imagen (push) Successful in 9m12s

- ENVIOCLICK_ORIGIN_DANE_CODE en configmap.yaml estaba cargado con el
  código DANE de Bogotá (11001000) por error; corregido a Santiago de
  Cali, Valle del Cauca (76001000). Toda cotización real de envío hecha
  antes de esta fecha se calculó desde el origen equivocado.
- Corregido también el fallback stale en medusa-config.ts
  (originDaneCode) que seguía apuntando a Bogotá.
- Actualizado el texto de /envios y /contacto (misma dirección física,
  Cra 100 #42-65, solo cambia la ciudad).
- Footer: Instagram y Facebook reales enlazados (verificados en vivo
  contra los perfiles antes de linkear), y "Preguntas frecuentes" /
  "Cambios" ya apuntan a contenido real en vez de /catalog.
- Nuevas páginas /cambios (5 días hábiles, envío de devolución a cargo
  de ARI Shopping) y /preguntas-frecuentes.

Co-Authored-By: Claude Sonnet 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_012Y4df3Z7odr9Cg8F2nw6uV
This commit is contained in:
devopsandClaude Sonnet 5 committed 2026-09-13 17:34:18 +00:00
1 parent 3efab94e2b
commit 76b7d827c5
7 files changed
+154 -18

No files matched your search

+1 -1
View File
@@ -160,7 +160,7 @@ module.exports = defineConfig({
options: {
apiKey: required("ENVIOCLICK_API_KEY"),
sandbox: process.env.ENVIOCLICK_SANDBOX !== "false",
originDaneCode: process.env.ENVIOCLICK_ORIGIN_DANE_CODE || "11001000",
originDaneCode: process.env.ENVIOCLICK_ORIGIN_DANE_CODE || "76001000",
originAddress: required("ENVIOCLICK_ORIGIN_ADDRESS"),
originCompany: process.env.ENVIOCLICK_ORIGIN_COMPANY || "ARI Shopping",
originFirstName: process.env.ENVIOCLICK_ORIGIN_FIRST_NAME || "ARI",
+57
View File
@@ -0,0 +1,57 @@
import type { Metadata } from "next";
import { MessageCircle, PackageOpen, ShieldCheck, Truck } from "lucide-react";
import { Button } from "@/components/ui/button";
export const metadata: Metadata = { title: "Cambios | ARI Shopping" };
const WHATSAPP_URL = "https://wa.me/573016138155";
export default function CambiosPage() {
return (
<section className="mx-auto max-w-3xl px-4 py-14 lg:py-20">
<span className="text-xs font-black uppercase tracking-[.18em] text-ari-coral">Ayuda</span>
<h1 className="mt-3 text-4xl font-black tracking-tight sm:text-5xl">Cambios</h1>
<p className="mt-5 text-lg leading-8 text-slate-600">
Si tu pedido no es lo que esperabas, te ayudamos a cambiarlo.
</p>
<div className="mt-10 grid gap-6 sm:grid-cols-2">
<div className="rounded-2xl border border-slate-200 p-6">
<PackageOpen className="size-6 text-ari-marino" />
<h2 className="mt-3 font-black">5 días hábiles</h2>
<p className="mt-2 text-sm leading-6 text-slate-600">
Tenés 5 días hábiles desde que recibís tu pedido para solicitar un cambio.
</p>
</div>
<div className="rounded-2xl border border-slate-200 p-6">
<Truck className="size-6 text-ari-marino" />
<h2 className="mt-3 font-black">Envío de vuelta sin costo</h2>
<p className="mt-2 text-sm leading-6 text-slate-600">
ARI Shopping asume el costo del envío de vuelta del producto — no tenés que pagar nada extra.
</p>
</div>
<div className="rounded-2xl border border-slate-200 p-6">
<ShieldCheck className="size-6 text-ari-marino" />
<h2 className="mt-3 font-black">Condiciones</h2>
<p className="mt-2 text-sm leading-6 text-slate-600">
El producto debe estar sin usar, con su empaque y etiquetas originales.
</p>
</div>
<div className="rounded-2xl border border-slate-200 p-6">
<MessageCircle className="size-6 text-ari-marino" />
<h2 className="mt-3 font-black">¿Cómo lo pido?</h2>
<p className="mt-2 text-sm leading-6 text-slate-600">
Escribinos por WhatsApp con tu número de pedido y coordinamos la recolección y el cambio.
</p>
</div>
</div>
<Button asChild variant="primary" size="lg" className="mt-10">
<a href={WHATSAPP_URL} target="_blank" rel="noopener noreferrer">
<MessageCircle className="size-5" />
Solicitar un cambio por WhatsApp
</a>
</Button>
</section>
);
}
+1 -1
View File
@@ -49,7 +49,7 @@ export default function ContactoPage() {
<div className="mt-10 flex items-center justify-center gap-2 text-sm text-slate-500">
<MapPin className="size-4" />
Despachamos desde Bogotá D.C., Colombia
Despachamos desde Santiago de Cali, Colombia
</div>
<Button asChild variant="primary" size="lg" className="mt-10">
+2 -2
View File
@@ -17,7 +17,7 @@ export default function EnviosPage() {
<span className="text-xs font-black uppercase tracking-[.18em] text-ari-coral">Ayuda</span>
<h1 className="mt-3 text-4xl font-black tracking-tight sm:text-5xl">Envíos</h1>
<p className="mt-5 text-lg leading-8 text-slate-600">
Hacemos envíos a nivel nacional desde nuestra bodega en Bogotá D.C.
Hacemos envíos a nivel nacional desde nuestra bodega en Santiago de Cali, Valle del Cauca
</p>
<div className="mt-10 grid gap-6 sm:grid-cols-2">
@@ -49,7 +49,7 @@ export default function EnviosPage() {
<MapPinned className="size-6 text-ari-marino" />
<h2 className="mt-3 font-black">Cobertura</h2>
<p className="mt-2 text-sm leading-6 text-slate-600">
Envíos a todo el territorio nacional colombiano desde nuestra bodega en Bogotá D.C.
Envíos a todo el territorio nacional colombiano desde nuestra bodega en Santiago de Cali, Valle del Cauca
</p>
</div>
</div>
@@ -0,0 +1,72 @@
import type { Metadata } from "next";
import Link from "next/link";
import { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from "@/components/ui/accordion";
export const metadata: Metadata = { title: "Preguntas frecuentes | ARI Shopping" };
// Solo preguntas cuya respuesta es un hecho real del storefront (ver
// ADR 0009/0010) -- nada de metodos de pago, plazos u opciones que no
// esten realmente implementados.
const FAQS: { question: string; answer: React.ReactNode }[] = [
{
question: "¿Qué métodos de pago aceptan?",
answer: "Pagás por PSE, con transferencia directa desde tu banco. Podés pagar como persona natural o jurídica.",
},
{
question: "¿A qué ciudades hacen envíos?",
answer: "A todo el territorio nacional colombiano. El costo del envío se calcula automáticamente según tu dirección y lo ves en el checkout antes de pagar.",
},
{
question: "¿Cuánto tarda en llegar mi pedido?",
answer: (
<>
Depende de la transportadora asignada y tu ciudad — más detalle en{" "}
<Link href="/envios" className="font-bold text-ari-marino hover:underline">
Envíos
</Link>
.
</>
),
},
{
question: "¿Puedo cambiar un producto que no me sirvió?",
answer: (
<>
Sí, tenés 5 días hábiles desde que lo recibís y nosotros asumimos el envío de vuelta — más detalle en{" "}
<Link href="/cambios" className="font-bold text-ari-marino hover:underline">
Cambios
</Link>
.
</>
),
},
{
question: "Tengo otra pregunta, ¿cómo los contacto?",
answer: (
<>
Escribinos por WhatsApp o correo desde{" "}
<Link href="/contacto" className="font-bold text-ari-marino hover:underline">
Contacto
</Link>
, te respondemos lo antes posible.
</>
),
},
];
export default function PreguntasFrecuentesPage() {
return (
<section className="mx-auto max-w-3xl px-4 py-14 lg:py-20">
<span className="text-xs font-black uppercase tracking-[.18em] text-ari-coral">Ayuda</span>
<h1 className="mt-3 text-4xl font-black tracking-tight sm:text-5xl">Preguntas frecuentes</h1>
<Accordion type="single" collapsible className="mt-10">
{FAQS.map((faq) => (
<AccordionItem key={faq.question} value={faq.question}>
<AccordionTrigger>{faq.question}</AccordionTrigger>
<AccordionContent>{faq.answer}</AccordionContent>
</AccordionItem>
))}
</Accordion>
</section>
);
}
+6 -5
View File
@@ -38,12 +38,13 @@ data:
# reemplaza la tarifa fija. Solo config no sensible; ENVIOCLICK_API_KEY
# va en secrets.template.yaml. ENVIOCLICK_SANDBOX=true usa el endpoint
# de guía de pruebas (/shipment_sandbox) -- la cotización siempre usa
# tarifas reales, no tiene modo sandbox. Origen = bodega Bogotá
# ("Bodega principal ARI Shopping", sin dirección física real cargada
# todavía -- ENVIOCLICK_ORIGIN_ADDRESS es un placeholder hasta que la
# haya).
# tarifas reales, no tiene modo sandbox. Origen = bodega Santiago de
# Cali, Valle del Cauca ("Bodega principal ARI Shopping") -- corregido
# 2026-09-12: el código DANE cargado originalmente era el de Bogotá
# (11001000) por error; toda cotización real hecha antes de esta
# fecha calculó la tarifa desde el origen equivocado.
ENVIOCLICK_SANDBOX: "true"
ENVIOCLICK_ORIGIN_DANE_CODE: "11001000"
ENVIOCLICK_ORIGIN_DANE_CODE: "76001000"
ENVIOCLICK_ORIGIN_ADDRESS: "Cra 100 #42-65"
ENVIOCLICK_ORIGIN_COMPANY: "ARI Shopping"
ENVIOCLICK_ORIGIN_EMAIL: "[email protected]"
@@ -1,19 +1,25 @@
import Link from "next/link";
import { Facebook, Instagram, MessageCircle } from "lucide-react";
// "Envíos" y "Contacto" ya tienen paginas reales (app/envios,
// app/contacto -- contenido real: transportadoras de EnvioClick,
// WhatsApp/correo reales). "Preguntas frecuentes" y "Cambios" todavia
// no tienen contenido real decidido -- quedan apuntando a /catalog
// (no rotas, pero tampoco resueltas) hasta que se defina que van a
// decir.
// Las 4 paginas de "Ayuda" ya tienen contenido real (app/envios,
// app/cambios, app/preguntas-frecuentes, app/contacto).
const HELP_LINKS = [
{ label: "Preguntas frecuentes", href: "/catalog" },
{ label: "Preguntas frecuentes", href: "/preguntas-frecuentes" },
{ label: "Envíos", href: "/envios" },
{ label: "Cambios", href: "/catalog" },
{ label: "Cambios", href: "/cambios" },
{ label: "Contacto", href: "/contacto" },
];
// Cuentas reales confirmadas por el usuario (Instagram verificado en
// vivo antes de linkearlo -- la primera cuenta sugerida, @arishopping,
// no era la real). El link de WhatsApp usa el mismo numero real ya
// confirmado en /contacto y en el fallback del checkout.
const SOCIAL_LINKS = [
{ label: "Instagram", href: "https://www.instagram.com/ari_shopping1/", Icon: Instagram },
{ label: "Facebook", href: "https://www.facebook.com/share/1Dkmvko6HF/", Icon: Facebook },
{ label: "WhatsApp", href: "https://wa.me/573016138155", Icon: MessageCircle },
];
const SHOP_LINKS = [
{ label: "Novedades", href: "/catalog" },
{ label: "Juguetes", href: "/catalog" },
@@ -22,7 +28,7 @@ const SHOP_LINKS = [
];
export function Footer() {
return <footer className="bg-ari-marino text-white"><div className="mx-auto grid max-w-7xl gap-10 px-4 py-14 sm:grid-cols-2 lg:grid-cols-4"><div><div className="flex flex-col items-start gap-3"><img src="/images/brand/logo-ari.svg" alt="ARI shopping" className="h-11 w-auto" width={200} height={64} />{/* eslint-disable-line @next/next/no-img-element -- vector propio, next/image no optimiza SVG sin habilitar dangerouslyAllowSVG */}<p className="text-xs text-white/60">Tesoros para cada aventura.</p></div><div className="mt-5 flex gap-3"><Instagram /><Facebook /><MessageCircle /></div></div><FooterColumn title="Compra" links={SHOP_LINKS} /><FooterColumn title="Ayuda" links={HELP_LINKS} /><div><h3 className="font-black">Newsletter</h3><p className="mt-3 text-sm leading-6 text-white/60">Recibe lanzamientos y promociones especiales.</p><div className="mt-4 flex rounded-full bg-white p-1"><input className="min-w-0 flex-1 bg-transparent px-4 text-sm text-slate-950 outline-none" placeholder="Tu correo" /><button className="rounded-full bg-ari-coral px-4 text-sm font-black text-white">Unirme</button></div></div></div><div className="border-t border-white/10 py-5 text-center text-xs text-white/50">© 2026 ARI Shopping · Frontend headless v4.1 · GitOps</div></footer>;
return <footer className="bg-ari-marino text-white"><div className="mx-auto grid max-w-7xl gap-10 px-4 py-14 sm:grid-cols-2 lg:grid-cols-4"><div><div className="flex flex-col items-start gap-3"><img src="/images/brand/logo-ari.svg" alt="ARI shopping" className="h-11 w-auto" width={200} height={64} />{/* eslint-disable-line @next/next/no-img-element -- vector propio, next/image no optimiza SVG sin habilitar dangerouslyAllowSVG */}<p className="text-xs text-white/60">Tesoros para cada aventura.</p></div><div className="mt-5 flex gap-3">{SOCIAL_LINKS.map(({ label, href, Icon }) => <a key={label} href={href} target="_blank" rel="noopener noreferrer" aria-label={label} className="text-white/80 transition hover:text-ari-coral-claro"><Icon /></a>)}</div></div><FooterColumn title="Compra" links={SHOP_LINKS} /><FooterColumn title="Ayuda" links={HELP_LINKS} /><div><h3 className="font-black">Newsletter</h3><p className="mt-3 text-sm leading-6 text-white/60">Recibe lanzamientos y promociones especiales.</p><div className="mt-4 flex rounded-full bg-white p-1"><input className="min-w-0 flex-1 bg-transparent px-4 text-sm text-slate-950 outline-none" placeholder="Tu correo" /><button className="rounded-full bg-ari-coral px-4 text-sm font-black text-white">Unirme</button></div></div></div><div className="border-t border-white/10 py-5 text-center text-xs text-white/50">© 2026 ARI Shopping · Frontend headless v4.1 · GitOps</div></footer>;
}
function FooterColumn({ title, links }: { title: string; links: { label: string; href: string }[] }) {