Saltar a contenido

PDF-010F - B2B Commercial Price Rules and Server-Side Pricing Design

Fecha: 2026-06-23

Estado: DISENO DOCUMENTAL / CONFIRMACION COMERCIAL PENDIENTE / SIN WRITES / PENDING_BUSINESS_CONFIRMATION

portal_visible = yes

Scope: tenant

tenant_id: alpuntodeventa

Destino funcional: SOURCE-001 Clientes + SOURCE-002 Productos -> WooCommerce La Directa

Owner: Gabi / Carlos Canu

A. SAFE POINT inicial

Control Resultado
git status -sb ## main...origin/main
git rev-parse HEAD bd9fe78e73a6fcf4843ff98241ed53db3d8f22b8
git rev-parse origin/main bd9fe78e73a6fcf4843ff98241ed53db3d8f22b8
git log -1 --oneline bd9fe78 docs: add pdf-010e b2b customer price dry-run

Safe point esperado confirmado:

  • HEAD coincide con bd9fe78e73a6fcf4843ff98241ed53db3d8f22b8.
  • origin/main coincide con bd9fe78e73a6fcf4843ff98241ed53db3d8f22b8.
  • repo con cambios documentales pendientes al inicio.
  • ultimo commit esperado confirmado.

Alcance de esta tarea:

  • documentar decision comercial candidate;
  • disenar calculo server-side de precios por cliente logueado;
  • definir bloqueos y riesgos B2B;
  • no ejecutar WooCommerce API;
  • no tocar PostgreSQL con writes;
  • no ejecutar sync, scheduler, cron ni pipelines;
  • no hacer push ni deploy.

B. Documentacion leida

Documentacion base revisada:

  • docs/tenants/alpuntodeventa/business-observer/production/PDF-010A-B2B-PRICE-LISTS-CUSTOMER-SYNC-CONTRACT.md
  • docs/tenants/alpuntodeventa/business-observer/production/PDF-010B-B2B-PRICE-LIST-AUTHORITY-READ-ONLY-VALIDATION.md
  • docs/tenants/alpuntodeventa/business-observer/production/PDF-010D-SOURCE-001-VCLIENTES-READ-ONLY-SNAPSHOT.md
  • docs/tenants/alpuntodeventa/business-observer/production/PDF-010E-B2B-CUSTOMER-PRICE-DRY-RUN.md
  • docs/PROJECT-STATE.md
  • docs/ROADMAP.md
  • docs/governance/ACTIVE-CONTEXT.md
  • mkdocs.yml

C. Decision Lista_Precio -> L1..L9

Veredicto: SUPPORTED_BY_RUNTIME_CATALOG / PENDING_BUSINESS_CONFIRMATION.

PDF-010D confirma que SOURCE-001 contiene Lista_Precio real con valores 1..9, sin clientes sin lista y sin valores fuera de rango. PDF-010E confirma que SOURCE-002 expone PrecioL1..PrecioL9 y que la simulacion cliente/lista/SKU/precio es tecnicamente posible.

Decision comercial candidate:

Lista_Precio SOURCE-001 price_list_code candidate Campo SOURCE-002 candidate Estado
1 L1 PrecioL1 PENDING_BUSINESS_CONFIRMATION
2 L2 PrecioL2 PENDING_BUSINESS_CONFIRMATION
3 L3 PrecioL3 PENDING_BUSINESS_CONFIRMATION
4 L4 PrecioL4 PENDING_BUSINESS_CONFIRMATION
5 L5 PrecioL5 PENDING_BUSINESS_CONFIRMATION
6 L6 PrecioL6 PENDING_BUSINESS_CONFIRMATION
7 L7 PrecioL7 PENDING_BUSINESS_CONFIRMATION
8 L8 PrecioL8 PENDING_BUSINESS_CONFIRMATION
9 L9 PrecioL9 PENDING_BUSINESS_CONFIRMATION

Regla de avance:

  • la equivalencia tecnica queda documentada;
  • la equivalencia comercial no queda activada hasta confirmacion explicita del usuario o del negocio;
  • no aplicar precios B2B en WooCommerce mientras el estado sea PENDING_BUSINESS_CONFIRMATION.

D. Decision regular_price/default publico

Veredicto: regular_price vigente = PrecioListaFinal.

Regla default vigente:

Contexto Precio aplicable Estado
visitante no logueado regular_price vigente WooCommerce CONFIRMED_CURRENT_RULE
regular_price vigente respaldado por PrecioListaFinal CONFIRMED_CURRENT_RULE
L1 como precio publico/default no aprobado PENDING_VALIDATE

Reglas:

  • visitante no logueado usa regular_price vigente.
  • regular_price vigente sigue respaldado por PrecioListaFinal.
  • PrecioL1 no se declara precio publico/default.
  • L1 solo puede convertirse en default publico si el usuario lo confirma explicitamente en un gate posterior.
  • no reemplazar regular_price por PrecioL1 por inferencia.

E. Diseno server-side pricing

Objetivo runtime futuro: calcular y aplicar precio por cliente logueado en servidor, sin confiar en el precio visual renderizado.

Flujo candidate:

  1. Identificar si el usuario esta logueado en WooCommerce.
  2. Si no esta logueado, usar regular_price vigente y no aplicar lista B2B.
  3. Si esta logueado, resolver wc_customer_id.
  4. Buscar mapping vigente wc_customer_id -> sgc_customer_id.
  5. Validar estado comercial del cliente SGC.
  6. Obtener price_list_code desde Lista_Precio.
  7. Resolver sku + price_list_code -> price_total.
  8. Recalcular server-side cada linea del carrito.
  9. Recalcular server-side antes de checkout/order creation.
  10. Guardar evidencia minima en la orden y en cada linea.

Pseudologica candidate:

text if not is_logged_in: applied_price = product.regular_price pricing_mode = PUBLIC_DEFAULT else: wc_customer_id = current_user.wc_customer_id sgc_customer = find_customer_mapping(wc_customer_id) assert sgc_customer exists assert sgc_customer.status == CLIENTE ACTIVO price_list_code = normalize_lista_precio(sgc_customer.Lista_Precio) assert price_list_code in L1..L9 applied_price = find_price(sku, price_list_code) assert applied_price > 0

Puntos de aplicacion WooCommerce candidate:

Superficie Regla
catalogo/listado/ficha mostrar precio B2B solo si cliente logueado y mapping valido
carrito recalcular cada item server-side con la lista vigente
checkout recalcular nuevamente antes de crear la orden
orden persistir lista y precio aplicado por linea
admin/reportes mostrar evidencia de pricing aplicada sin exponer costos ni margenes

Metadata minima recomendada para orden/linea:

  • sku
  • sgc_customer_id o referencia interna no sensible
  • price_list_code
  • applied_price
  • regular_price_reference
  • pricing_mode
  • source_hash o referencia de snapshot/fuente
  • calculated_at
  • pricing_status

Regla de autoridad:

  • PostgreSQL/OpenClaw debe ser autoridad de listas multiples, vigencia, mapping, hash y auditoria.
  • WooCommerce puede almacenar el precio efectivo cobrado y metadata minima de trazabilidad.
  • WooCommerce no debe ser fuente maestra de PrecioL1..PrecioL9.

F. Bloqueos definidos

Caso Resultado Regla
cliente logueado sin lista BLOCKED_PRICE_LIST no inventar lista ni aplicar fallback silencioso
cliente suspendido o de baja BLOCKED_CUSTOMER_STATUS bloquear venta B2B salvo aprobacion comercial futura
SKU sin precio para la lista BLOCKED_PRICE_MISSING no reemplazar por regular_price sin autorizacion
cliente sin matching Woo/SGC BLOCKED_CUSTOMER_MAPPING no aplicar precio B2B hasta conciliacion
lista fuera de 1..9 BLOCKED_PRICE_LIST no mapear valores desconocidos
precio <= 0 BLOCKED_PRICE_MISSING bloquear linea/pedido
visitante no logueado PUBLIC_DEFAULT usar regular_price vigente

G. Riesgos B2B

Riesgo Impacto Control recomendado
cache por cliente precio viejo o de otra lista invalidar por wc_customer_id, sgc_customer_id, lista, SKU y source_hash
precio visual vs carrito reclamo por precio cobrado distinto recalculo server-side obligatorio en carrito y checkout
seguridad comercial exposicion de listas, descuentos, costos o margenes no exponer endpoints publicos de listas completas ni margenes
performance frontend catalogo lento por resolver precio linea a linea cache precomputada por sku + price_list_code e indices
duplicados CUIT/email/WhatsApp cliente mal matcheado y precio incorrecto usar Codigo SGC como clave fuerte; CUIT/email/WhatsApp solo como senales
cliente sin email mapping Woo incompleto proceso de conciliacion previo; no crear cliente automaticamente
cliente suspendido/de baja venta no permitida validar estado antes de resolver precio
L1 default no confirmado precio publico incorrecto mantener PrecioListaFinal como regular_price
SKU sin precio de lista margen incorrecto o venta indebida bloquear y reportar BLOCKED_PRICE_MISSING

H. Archivos creados/modificados

Creado:

  • docs/tenants/alpuntodeventa/business-observer/production/PDF-010F-B2B-COMMERCIAL-PRICE-RULES-SERVER-SIDE-PRICING-DESIGN.md

Actualizados:

  • docs/tenants/alpuntodeventa/business-observer/production/README.md
  • docs/PROJECT-STATE.md
  • docs/ROADMAP.md
  • docs/governance/ACTIVE-CONTEXT.md
  • mkdocs.yml

Impacto:

  • se documenta la decision commercial candidate Lista_Precio 1..9 -> PrecioL1..PrecioL9;
  • se mantiene PENDING_BUSINESS_CONFIRMATION porque no hay confirmacion comercial explicita en este gate;
  • se preserva regular_price = PrecioListaFinal para visitante/default;
  • se disena el calculo server-side para cliente logueado, carrito, checkout y orden;
  • no se habilita implementacion runtime ni writes.

I. Validaciones requeridas

Validaciones de cierre de este gate:

  • git diff --check
  • .\.venv-portal\Scripts\mkdocs.exe build --strict

J. Estado final Git

Estado esperado al cierre:

  • commit documental local creado al cierre autorizado;
  • repo sin cambios pendientes de este gate;
  • sin push;
  • sin deploy.

K. Recomendacion de commit

Commit local autorizado para el cierre de este gate documental:

docs: add pdf-010f b2b commercial pricing design

No hacer push ni deploy desde este gate.

L. Proximo paso recomendado

Abrir gate separado de confirmacion comercial:

  1. confirmar explicitamente Lista_Precio 1..9 -> PrecioL1..PrecioL9;
  2. confirmar o descartar explicitamente L1 como precio publico/default;
  3. definir matching wc_customer_id -> sgc_customer_id sin crear clientes;
  4. disenar implementacion tecnica del hook/plugin WooCommerce o capa headless;
  5. ejecutar dry-run de carrito y checkout antes de cualquier write runtime.

M. Restricciones preservadas

Durante este gate:

  • no se toco WooCommerce API;
  • no se toco PostgreSQL con writes;
  • no se ejecuto SQL write;
  • no se imprimieron secretos;
  • no se leyo ni publico .env;
  • no se crearon ni modificaron clientes WooCommerce;
  • no se crearon ni modificaron productos WooCommerce;
  • no se ejecuto sync;
  • no se activo scheduler, cron ni pipelines;
  • no se hizo push;
  • no se hizo deploy;
  • se creo commit documental local de cierre.