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:
HEADcoincide conbd9fe78e73a6fcf4843ff98241ed53db3d8f22b8.origin/maincoincide conbd9fe78e73a6fcf4843ff98241ed53db3d8f22b8.- 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.mddocs/tenants/alpuntodeventa/business-observer/production/PDF-010B-B2B-PRICE-LIST-AUTHORITY-READ-ONLY-VALIDATION.mddocs/tenants/alpuntodeventa/business-observer/production/PDF-010D-SOURCE-001-VCLIENTES-READ-ONLY-SNAPSHOT.mddocs/tenants/alpuntodeventa/business-observer/production/PDF-010E-B2B-CUSTOMER-PRICE-DRY-RUN.mddocs/PROJECT-STATE.mddocs/ROADMAP.mddocs/governance/ACTIVE-CONTEXT.mdmkdocs.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_pricevigente. regular_pricevigente sigue respaldado porPrecioListaFinal.PrecioL1no se declara precio publico/default.L1solo puede convertirse en default publico si el usuario lo confirma explicitamente en un gate posterior.- no reemplazar
regular_priceporPrecioL1por 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:
- Identificar si el usuario esta logueado en WooCommerce.
- Si no esta logueado, usar
regular_pricevigente y no aplicar lista B2B. - Si esta logueado, resolver
wc_customer_id. - Buscar mapping vigente
wc_customer_id -> sgc_customer_id. - Validar estado comercial del cliente SGC.
- Obtener
price_list_codedesdeLista_Precio. - Resolver
sku + price_list_code -> price_total. - Recalcular server-side cada linea del carrito.
- Recalcular server-side antes de checkout/order creation.
- 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:
skusgc_customer_ido referencia interna no sensibleprice_list_codeapplied_priceregular_price_referencepricing_modesource_hasho referencia de snapshot/fuentecalculated_atpricing_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.mddocs/PROJECT-STATE.mddocs/ROADMAP.mddocs/governance/ACTIVE-CONTEXT.mdmkdocs.yml
Impacto:
- se documenta la decision commercial candidate
Lista_Precio 1..9 -> PrecioL1..PrecioL9; - se mantiene
PENDING_BUSINESS_CONFIRMATIONporque no hay confirmacion comercial explicita en este gate; - se preserva
regular_price = PrecioListaFinalpara 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:
- confirmar explicitamente
Lista_Precio 1..9 -> PrecioL1..PrecioL9; - confirmar o descartar explicitamente
L1como precio publico/default; - definir matching
wc_customer_id -> sgc_customer_idsin crear clientes; - disenar implementacion tecnica del hook/plugin WooCommerce o capa headless;
- 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.