SOURCE-001 Clientes Mapping¶
Fecha: 2026-06-09
Estado: MAPEO CONCEPTUAL FUTURO / NO IMPLEMENTADO
Scope: tenant
tenant_id: alpuntodeventa
Owner: Gabi / Carlos Canu
Fuente de verdad:
docs/tenants/alpuntodeventa/business-observer/mappings/SOURCE-001-CLIENTES-MAPPING.md
Autoridad base relacionada:
docs/tenants/alpuntodeventa/business-observer/source-authority/SOURCE-001-CLIENTES-VCLIENTES-AUTHORITY.md
Fuente funcional relacionada:
docs/tenants/alpuntodeventa/business-observer/sources/SOURCE-001-SGC-CLIENTES.md
Contrato relacionado:
docs/tenants/alpuntodeventa/business-observer/BUSINESS-OBSERVER-DATA-CONTRACT-001.md
Estandar global relacionado:
docs/governance/standards/DATA-DESIGN-STANDARD.md
1. Proposito¶
Este documento baja SOURCE-001 a un primer mapeo origen-destino campo por
campo, sin crear tablas, sin cerrar SQL fisico y sin abrir runtime.
La intencion es dejar documentado como deberia viajar cada dato de
ecommerce.dbo.VCLIENTES hacia bloques logicos futuros de la Data
Foundation de OpenClaw Business Observer.
2. Reglas obligatorias ya cerradas¶
tenant_id + codigo_clientees la clave logica fuerte del dominio cliente derivado deSOURCE-001codigo_clientedebe canonicalizarse comoNULLIF(LTRIM(RTRIM([Codigo])), '')estado_rawconserva el valor textual original deSGCcustomer_statusycan_sellson derivados y no reemplazanestado_rawWhatsAppdebe guardarse comoraw + normalized + quality_statusWhatsAppno es identificador unico del clienteTelefono / WhatsAppno debe usarse como clave unica ni como ancla de relacion entre grupos- clientes
CLIENTE DE BAJAyCLIENTE SUSPENDIDOno deben eliminarse - filtros de venta o facturacion deben vivir en vistas o capas de consumo
fecha_alta_sgcno equivale acreated_atcreated_atyupdated_atson timestamps internos deOpenClawextracted_atylast_seen_atcontrolan sincronizacion y reconciliacionsource_row_hashcontrola deteccion de cambios de filasync_batch_idpermite auditar la corrida de sync- la estrategia territorial canonica previa al diseno fisico final vive en:
docs/tenants/alpuntodeventa/business-observer/territory/TERRITORY-NORMALIZATION-STRATEGY.md - el catalogo documental inicial de aliases territoriales vive en:
docs/tenants/alpuntodeventa/business-observer/territory/TERRITORY-ALIAS-CATALOG-001.md customers_addressdebe preservar territorio comoraw + normalizedaunque los nombres fisicos finales sigan abiertos
3. Bloques logicos destino¶
Los bloques logicos recomendados para el primer mapeo documental son:
customers_corecustomers_contactcustomers_addresscustomers_taxcustomers_commercialcustomers_sales_ownercustomers_visit_schedulesource_001_customer_audit
Regla de interpretacion:
- estos bloques son logicos y no cierran todavia la estrategia final de tablas fisicas
- todos siguen subordinados al mismo cliente
SGC - todos deben relacionarse por
tenant_id + codigo_cliente
4. Matriz campo por campo¶
| Campo origen SGC | Alias / expresion autoridad | Campo destino recomendado | Bloque logico | Tipo PostgreSQL sugerido |
Naturaleza | Hash | Sensible | Indice | Uso futuro | Observaciones |
|---|---|---|---|---|---|---|---|---|---|---|
Codigo |
RTRIM([Codigo]) AS codigo_cliente |
codigo_cliente |
customers_core |
text |
normalized | si | no | si | operacion, BI, ML, IA, automatizacion, auditoria | clave logica fuerte junto con tenant_id; canonicalizar con NULLIF(LTRIM(RTRIM([Codigo])), '') |
Nombre, Nombre_en_Factura, Codigo |
COALESCE(NULLIF(RTRIM([Nombre]), ''), NULLIF(RTRIM([Nombre_en_Factura]), ''), RTRIM([Codigo])) AS cliente_nombre |
customer_name |
customers_core |
text |
derived | si | no | si | operacion, BI, ML, IA | nombre visible principal; no reemplaza razon_social |
Nombre_en_Factura |
RTRIM([Nombre_en_Factura]) AS razon_social |
legal_name |
customers_core |
text |
raw | si | si | si | operacion, BI, auditoria | puede coincidir con el nombre visible o venir vacio |
Direccion_de_pedidos |
RTRIM([Direccion_de_pedidos]) AS direccion_pedidos |
delivery_address_raw |
customers_address |
text |
raw | si | si | no | operacion, BI, IA | direccion operativa; no cerrar todavia parsing estructurado |
Localidad |
RTRIM([Localidad]) AS localidad |
city_raw |
customers_address |
text |
raw | si | si | si | operacion, BI, ML, IA | corrida real 2026-06-08 observo cobertura completa (11404/11404) y 516 valores distintos; preservar raw y resolver su equivalente canonico en localidad_normalized segun TERRITORY-NORMALIZATION-STRATEGY |
Localidad |
RTRIM([Localidad]) AS localidad |
city_normalized |
customers_address |
text |
normalized | no | si | si | operacion, BI, ML, IA | capa canonica para alias territoriales, puntuacion, abreviaturas y variantes como JOSE C. PAZ / JOSE C PAZ; debe gobernarse por TERRITORY-ALIAS-CATALOG-001 y no reemplaza el valor original |
Provincia |
RTRIM([Provincia]) AS provincia |
state_province_raw |
customers_address |
text |
raw | si | si | si | operacion, BI, ML, IA | corrida real 2026-06-08 observo cobertura completa (11404/11404) y 24 provincias distintas; preservar valor fuente exacto |
Provincia |
RTRIM([Provincia]) AS provincia |
state_province_normalized |
customers_address |
text |
normalized | no | si | si | operacion, BI, ML, IA | canon territorial fuerte para consumo analitico; no elimina el raw |
EntreCalles |
RTRIM([EntreCalles]) AS entre_calles |
cross_streets_raw |
customers_address |
text |
raw | si | si | no | operacion, IA | referencia complementaria de ubicacion |
Zona |
RTRIM([Zona]) AS zona |
logistic_zone_raw |
customers_address |
text |
raw | si | no | si | operacion, BI, ML, IA, automatizacion | corrida real 2026-06-08 observo cobertura casi completa (11403/11404), 365 valores distintos, 1522 casos NO DEFINIDA y mezcla multi-provincia en parte del catalogo; en SOURCE-001 debe leerse como agrupacion logistica para rutas y no como territorio comercial del vendedor |
Zona |
RTRIM([Zona]) AS zona |
logistic_zone_type |
customers_address |
text |
derived | no | no | si | operacion, BI, ML, IA, automatizacion | clasificacion canonica requerida para SOURCE-001: logistic_zone, undefined o unknown; NO DEFINIDA debe mapear a undefined y NULL/VACIO a unknown |
Zona |
RTRIM([Zona]) AS zona |
logistic_zone_normalized |
customers_address |
text |
normalized | no | no | si | operacion, BI, ML, IA, automatizacion | forma canonica futura de zona logistica; debe gobernarse por TERRITORY-ALIAS-CATALOG-001, preservar raw, admitir formatos Zona xx - Localidad y no confundir NO DEFINIDA con NULL/VACIO |
Nota_en_comprobante |
RTRIM([Nota_en_comprobante]) AS horarios_entrega |
delivery_notes_raw |
customers_address |
text |
raw | si | si | no | operacion, IA | hoy sirve como nota operativa; no asumir estructura de horario cerrada |
Telefono |
RTRIM([Telefono]) AS whatsapp |
whatsapp_raw |
customers_contact |
text |
raw | si | si | no | operacion, BI, IA, automatizacion, auditoria | no usar como identificador unico |
Telefono |
RTRIM([Telefono]) AS whatsapp |
whatsapp_normalized |
customers_contact |
text |
normalized | no | si | si | operacion, automatizacion, IA | normalizacion definitiva pendiente por formatos heterogeneos |
Telefono |
RTRIM([Telefono]) AS whatsapp |
whatsapp_quality_status |
customers_contact |
text |
derived | no | si | si | operacion, BI, automatizacion, auditoria | semaforo esperado al menos validado, observado, pendiente o equivalente |
Lista_Precio |
RTRIM([Lista_Precio]) AS lista_precio |
price_list_code_raw |
customers_commercial |
text |
raw | si | no | si | operacion, BI, ML, IA | utilidad comercial plausible; falta cierre de catalogo y vigencia real |
Ramo |
RTRIM([Ramo]) AS canal |
channel_raw |
customers_commercial |
text |
raw | si | no | si | operacion, BI, ML, IA | tratar como clasificacion comercial textual hasta validar catalogo |
Categoria |
RTRIM([Categoria]) AS categoria |
customer_category_raw |
customers_commercial |
text |
raw | si | no | si | operacion, BI, ML, IA | clasificacion comercial del cliente; puede requerir normalizacion posterior |
Codigo_vendedor |
RTRIM([Codigo_vendedor]) AS codigo_vendedor |
seller_code_raw |
customers_sales_owner |
text |
raw | si | no | si | operacion, BI, ML, IA, automatizacion | ownership comercial relevante; corrida real 2026-06-08 observo cobertura completa y relacion 1:1 con Nombre_Vendedor dentro de VCLIENTES |
Nombre_Vendedor |
RTRIM([Nombre_Vendedor]) AS nombre_vendedor |
seller_name_raw |
customers_sales_owner |
text |
raw | si | no | si | operacion, BI, IA | nombre visible del owner comercial |
Nombre_Vendedor |
derivado como vendedor_nombre |
seller_first_name |
customers_sales_owner |
text |
derived | no | no | no | operacion, IA | derivacion util para presentacion; no tratar como verdad fuerte mientras no se valide parsing |
Nombre_Vendedor |
derivado como vendedor_apellido |
seller_last_name |
customers_sales_owner |
text |
derived | no | no | no | operacion, IA | derivacion util para presentacion; mantener seller_name_raw como respaldo principal |
Fecha_Ultima_Compra |
CAST([Fecha_Ultima_Compra] AS date) AS fecha_ultima_compra |
last_purchase_date |
customers_commercial |
date |
normalized | si | no | si | operacion, BI, ML, IA, automatizacion | campo clave para riesgo comercial, recurrencia y reactivacion |
Fecha_Alta |
CAST([Fecha_Alta] AS date) AS fecha_alta |
fecha_alta_sgc |
customers_core |
date |
normalized | si | no | si | operacion, BI, ML, IA, auditoria | no equivale a created_at interno |
Fecha_Baja |
CAST([Fecha_Baja] AS date) AS fecha_baja |
fecha_baja_sgc |
customers_core |
date |
normalized | si | no | si | operacion, BI, ML, IA, auditoria | preserva hito comercial; no implica hard delete |
Condicion_de_venta |
RTRIM([Condicion_de_venta]) AS condicion_venta |
payment_terms_raw |
customers_commercial |
text |
raw | si | no | si | operacion, BI, automatizacion | termino comercial relevante para venta y facturacion |
Condicion_Iva |
RTRIM([Condicion_Iva]) AS condicion_iva |
vat_condition_raw |
customers_tax |
text |
raw | si | si | si | operacion, BI, auditoria | condicion fiscal textual del cliente |
Cuit |
RTRIM([Cuit]) AS cuit |
tax_id_raw |
customers_tax |
text |
raw | si | si | si | operacion, BI, auditoria, automatizacion | dato fiscal sensible; posible normalizacion posterior separada |
Cuit |
RTRIM([Cuit]) AS cuit |
tax_id_normalized |
customers_tax |
text |
normalized | no | si | si | operacion, BI, automatizacion | validacion simple ya mencionada en la evidencia, pero no cerrar todavia reglas fiscales finales |
Ing_Brutos |
RTRIM([Ing_Brutos]) AS ingresos_brutos |
gross_income_tax_id_raw |
customers_tax |
text |
raw | si | si | no | operacion, BI, auditoria | dato impositivo complementario |
Descuento |
RTRIM([Descuento]) AS descuento |
discount_rule_raw |
customers_commercial |
text |
raw | si | no | no | operacion, BI, ML | puede requerir futura separacion entre porcentaje, regla y vigencia |
Cobrar_PIB |
RTRIM([Cobrar_PIB]) AS cobrar_pib |
collect_pib_raw |
customers_tax |
text |
raw | si | si | no | operacion, BI, auditoria | significado operativo exacto aun pendiente |
Porc_PIB |
RTRIM([Porc_PIB]) AS porc_pib |
pib_percentage_raw |
customers_tax |
numeric(8,3) |
raw | si | si | no | operacion, BI, auditoria | conviene preservar valor fuente y, si hiciera falta, normalizar aparte |
Limite_Credito |
RTRIM([Limite_Credito]) AS limite_credito |
credit_limit_raw |
customers_commercial |
numeric(18,3) |
raw | si | si | no | operacion, BI, ML, automatizacion | no cerrar sin validar formato monetario real del origen |
MoraPermitida |
RTRIM([MoraPermitida]) AS mora_permitida |
allowed_arrears_raw |
customers_commercial |
text |
raw | si | si | no | operacion, BI, automatizacion | semantica exacta pendiente; no cerrar tipo final mas alla de recomendacion documental |
Estado |
RTRIM([Estado]) AS estado |
estado_raw |
customers_core |
text |
raw | si | no | si | operacion, BI, ML, IA, automatizacion, auditoria | debe conservar CLIENTE ACTIVO, CLIENTE SUSPENDIDO, CLIENTE DE BAJA |
Estado |
RTRIM([Estado]) AS estado |
customer_status |
customers_core |
text |
derived | no | no | si | operacion, BI, ML, IA, automatizacion | derivacion recomendada: active, suspended, inactive |
Estado |
RTRIM([Estado]) AS estado |
can_sell |
customers_core |
boolean |
derived | no | no | si | operacion, automatizacion, IA | derivado recomendado: true solo para CLIENTE ACTIVO |
Estado |
RTRIM([Estado]) AS estado_texto |
estado_texto_raw |
customers_core |
text |
raw | no | no | no | auditoria | alias duplicado del mismo valor; util solo si se quiere preservar compatibilidad con nomenclaturas fuente |
Fax |
RTRIM([Fax]) AS administracion |
admin_contact_raw |
customers_contact |
text |
raw | si | si | no | operacion, IA | hoy interpretado como contacto administrativo; semantica exacta dudosa |
mail |
RTRIM([mail]) AS email |
email_raw |
customers_contact |
text |
raw | si | si | si | operacion, BI, automatizacion, IA, auditoria | contacto sensible; puede haber multiples formatos invalidos |
mail |
RTRIM([mail]) AS email |
email_normalized |
customers_contact |
citext |
normalized | no | si | si | operacion, automatizacion, IA | util para contacto y matching liviano, nunca como clave unica cerrada por ahora |
CodFrec |
RTRIM([CodFrec]) AS cod_frec |
visit_frequency_code_raw |
customers_visit_schedule |
text |
raw | si | no | si | operacion, BI, automatizacion, IA | corrida real 2026-06-08 observo 4 codigos con mapeo 1:1 a Frecuencia: FVC001, FVC002, FVC003, FVC004 |
Frecuencia |
RTRIM([Frecuencia]) AS frecuencia |
visit_frequency_label_raw |
customers_visit_schedule |
text |
raw | si | no | si | operacion, BI, automatizacion, IA | consistencia real pendiente de validar |
lunes |
RTRIM([lunes]) AS lunes |
visit_monday_raw |
customers_visit_schedule |
text |
raw | si | no | no | operacion, BI, automatizacion | corrida real 2026-06-08 observo solo S, N y NULL/VACIO; mantener raw hasta cerrar modelo fisico |
martes |
RTRIM([martes]) AS martes |
visit_tuesday_raw |
customers_visit_schedule |
text |
raw | si | no | no | operacion, BI, automatizacion | mismo criterio documental que lunes; no hubo texto libre sorpresa en la corrida observada |
miercoles |
RTRIM([miercoles]) AS miercoles |
visit_wednesday_raw |
customers_visit_schedule |
text |
raw | si | no | no | operacion, BI, automatizacion | mismo criterio documental que lunes; no hubo texto libre sorpresa en la corrida observada |
jueves |
RTRIM([jueves]) AS jueves |
visit_thursday_raw |
customers_visit_schedule |
text |
raw | si | no | no | operacion, BI, automatizacion | mismo criterio documental que lunes; no hubo texto libre sorpresa en la corrida observada |
viernes |
RTRIM([viernes]) AS viernes |
visit_friday_raw |
customers_visit_schedule |
text |
raw | si | no | no | operacion, BI, automatizacion | mismo criterio documental que lunes; no hubo texto libre sorpresa en la corrida observada |
sabado |
RTRIM([sabado]) AS sabado |
visit_saturday_raw |
customers_visit_schedule |
text |
raw | si | no | no | operacion, BI, automatizacion | mismo criterio documental que lunes; sabado mostro mayor volumen de S pero sin salir del set S/N/NULL |
5. Auditoria y sync derivados de la fila completa¶
4.1 Regla critica sobre Zona y territorio comercial¶
ZonaenSOURCE-001representa una dimension logistica y no comercialZonasirve para rutas, reparto, logistica y agrupacion de localidadesZonano debe usarse para inferir vendedor responsable- el vendedor responsable sale de
seller_code_rawyseller_name_raw - la pregunta por territorio comercial del vendedor debe responderse desde su cartera real de clientes asignados
- ese territorio comercial debe poder cruzarse con localidad, provincia,
zona logistica, ventas,
SKU, marcas, proveedores y categorias
5. Auditoria y sync derivados de la fila completa¶
Estos campos no vienen como una sola columna puntual del SELECT, pero son
obligatorios a nivel de diseno documental para que SOURCE-001 cumpla el
DATA-DESIGN-STANDARD.
| Fuente origen | Campo destino recomendado | Bloque logico | Tipo PostgreSQL sugerido |
Naturaleza | Hash | Sensible | Indice | Uso futuro | Observaciones |
|---|---|---|---|---|---|---|---|---|---|
fila completa VCLIENTES |
source_row_hash |
source_001_customer_audit |
text |
derived | no | no | si | operacion, automatizacion, auditoria | hash de cambios de fila; debe incluir todos los campos relevantes ya canonicalizados |
| corrida de extraccion | sync_batch_id |
source_001_customer_audit |
text |
derived | no | no | si | operacion, auditoria | permite auditar cada corrida de sync |
| metadata de proceso | source_system |
source_001_customer_audit |
text |
derived | no | no | si | operacion, auditoria | valor esperado: mssql:mssql-sgc-ecommerce o alias oficial vigente |
| metadata de proceso | source_object |
source_001_customer_audit |
text |
derived | no | no | si | operacion, auditoria | valor esperado: ecommerce.dbo.VCLIENTES |
| metadata de proceso | source_query_version |
source_001_customer_audit |
text |
derived | no | no | no | auditoria | versiona la autoridad o la logica de extraccion usada |
| metadata de proceso | extracted_at |
source_001_customer_audit |
timestamptz |
derived | no | no | si | operacion, auditoria | marca cuando la fila fue leida del origen |
| metadata de proceso | last_seen_at |
source_001_customer_audit |
timestamptz |
derived | no | no | si | operacion, auditoria | clave para reconciliacion y desaparicion de filas |
metadata interna OpenClaw |
created_at |
source_001_customer_audit |
timestamptz |
derived | no | no | si | operacion, auditoria | timestamp interno de alta en OpenClaw; no copiar desde Fecha_Alta |
metadata interna OpenClaw |
updated_at |
source_001_customer_audit |
timestamptz |
derived | no | no | si | operacion, auditoria | timestamp interno de actualizacion en OpenClaw |
| metadata de calidad | validation_status |
source_001_customer_audit |
text |
derived | no | no | si | operacion, BI, auditoria | fila o lote validado, observado, pendiente o fallido |
| metadata de calidad | validation_notes |
source_001_customer_audit |
text |
derived | no | si | no | auditoria | notas de excepcion concretas; no reemplazan modelado |
6. Reglas de hash e indices recomendadas¶
Campos recomendados para participar del source_row_hash:
codigo_clientecliente_nombrerazon_socialdireccion_pedidoslocalidadprovinciaentre_calleszonahorarios_entregawhatsapplista_preciocanalcategoriacodigo_vendedornombre_vendedorfecha_ultima_comprafecha_altafecha_bajacondicion_ventacondicion_ivacuitingresos_brutosdescuentocobrar_pibporc_piblimite_creditomora_permitidaestadoadministracionemailcod_frecfrecuencialunesmartesmiercolesjuevesviernessabado
Indices documentales minimos recomendados:
tenant_id + codigo_clientetenant_id + customer_statustenant_id + seller_code_rawtenant_id + last_purchase_datetenant_id + visit_frequency_code_rawcuando la evidencia de frecuencia se confirmesource_row_hashlast_seen_atsync_batch_id
7. Decisiones que este documento no cierra todavia¶
Este mapeo no debe tomarse como cierre de diseno fisico final aunque ya exista evidencia util sobre vendedor, frecuencia y dias, porque todavia falta cerrar:
- normalizacion definitiva de
WhatsApp - diseno fisico final derivado de la estrategia territorial canonica para
Localidad,ProvinciayZona - estrategia fisica final de tablas, historicos y particion logica
Lectura obligatoria:
- el documento mapea bloques logicos, no tablas finales
- no define
DDL - no define migraciones
- no define politica final de historizacion fina por bloque
8. Pendientes preservados¶
- decidir si
customers_sales_ownerqueda solo como bloque embebido o si a futuro conviene entidad referencial adicional contra un maestro vendedor - decidir si
customers_visit_scheduleconviene quedar como bloquerawfortalecido o avanzar luego a una estructura semantica mas fuerte - validar reglas finales de normalizacion
WhatsApppara decidir si convieneE.164, un canon local controlado o doble representacion - cargar y aprobar humanamente el catalogo real de alias territoriales,
sinonimos y relaciones canonicas ya inventariado en
TERRITORY-ALIAS-CATALOG-001 - decidir si la capa territorial futura requerira geocodificacion posterior
- definir estrategia fisica final para estos bloques sin romper
tenant_id + codigo_cliente
9. Confirmaciones de alcance¶
- no se tocaron runtimes
- no se ejecutaron queries en esta tarea
- no se crearon tablas
- no se crearon migraciones
- no se cerro
SQLfisico