SOURCE-001 Clientes VCLIENTES Authority¶
Fecha: 2026-06-05
Estado: AUTORIDAD PRESERVADA / EVIDENCIA CERRADA
Owner: Gabi / Carlos Canu
Version: v2
Proposito¶
Preservar como autoridad documental completa la query SELECT_CUSTOMERS_SQL
tomada textual del script de sincronizacion de clientes aportado por Gabi:
C:\APV\gestor-de-negocios\backend\app\scheduler\scripts\sync_sgc_customers_canonical.py
Regla de autoridad¶
- esta copia debe tratarse como autoridad funcional de
SOURCE-001 - la autoridad proviene del script de sincronizacion aportado por
Gabi - no corresponde reinterpretar alias, filtros, derivaciones ni orden del
SELECT Telefonodebe considerarseWhatsAppdel cliente porque la query lo expresa textual comoRTRIM([Telefono]) AS whatsapp- la extraccion base preservada solo filtra
Codigonulo y no debe reinterpretarse agregandoWHERE Estado = 'CLIENTE ACTIVO' - todo campo derivado desde esta query pertenece al mismo cliente
SGCidentificado porCodigo - si en una capa futura se separan grupos logicos como
customers_core,customers_contact,customers_address,customers_tax,customers_commercial,customers_sales_ownerocustomers_visit_schedule, esa separacion debe leerse como descomposicion logica del mismo cliente y no como multiplicacion de clientes - la sync futura debe preservar
CLIENTE ACTIVO,CLIENTE SUSPENDIDOyCLIENTE DE BAJA - el valor textual de
EstadoenSGCdebe guardarse comoestado_raw - el estado operativo derivado recomendado es:
CLIENTE ACTIVO -> active / can_sell = true - el estado operativo derivado recomendado es:
CLIENTE SUSPENDIDO -> suspended / can_sell = false - el estado operativo derivado recomendado es:
CLIENTE DE BAJA -> inactive / can_sell = false - si
EstadooFecha_Bajaindican suspension o baja comercial, esa condicion no implica eliminacion del cliente del dominio historico - los clientes suspendidos o de baja deben preservarse para analisis historico, perdida de territorio, recuperacion comercial, reactivacion, masa comercial total, recomposicion de masa comercial y desempeno por zona, vendedor y periodo
- la desaparicion completa del registro en una extraccion futura debe
tratarse distinto de
Estado = CLIENTE DE BAJA - el futuro diseno
Postgresno debe habilitar hard delete por baja comercial - la forma canonica recomendada en destino para ese identificador es:
codigo_cliente = NULLIF(LTRIM(RTRIM([Codigo])), '') - la clave logica recomendada para relacionar cualquier grupo derivado de
SOURCE-001es:tenant_id + codigo_cliente
Regla de relacion entre grupos derivados¶
La autoridad preservada no cierra todavia el diseno fisico de tablas.
Si mas adelante la salida de VCLIENTES se clasifica en grupos logicos
separados, todos deben seguir subordinados al mismo cliente SGC.
Campo origen comun observado:
Codigo
Forma observada en la query autoridad:
RTRIM([Codigo]) AS codigo_cliente
Forma canonica recomendada en destino:
codigo_cliente = NULLIF(LTRIM(RTRIM([Codigo])), '')
Interpretacion obligatoria:
- todos los grupos logicos derivados de
VCLIENTESpertenecen al mismo clienteSGC - todos los grupos deben relacionarse por
tenant_id + codigo_cliente - ningun grupo debe interpretarse como cliente independiente
- la separacion entre grupos futuros sera documental o logica hasta definir diseno fisico, no una decision de multiplicar clientes
Query autoridad preservada¶
SELECT
RTRIM([Codigo]) AS codigo_cliente,
COALESCE(
NULLIF(RTRIM([Nombre]), ''),
NULLIF(RTRIM([Nombre_en_Factura]), ''),
RTRIM([Codigo])
) AS cliente_nombre,
RTRIM([Nombre_en_Factura]) AS razon_social,
RTRIM([Direccion_de_pedidos]) AS direccion_pedidos,
RTRIM([Localidad]) AS localidad,
RTRIM([Provincia]) AS provincia,
RTRIM([EntreCalles]) AS entre_calles,
RTRIM([Zona]) AS zona,
RTRIM([Nota_en_comprobante]) AS horarios_entrega,
RTRIM([Telefono]) AS whatsapp,
RTRIM([Lista_Precio]) AS lista_precio,
RTRIM([Ramo]) AS canal,
RTRIM([Categoria]) AS categoria,
RTRIM([Codigo_vendedor]) AS codigo_vendedor,
RTRIM([Nombre_Vendedor]) AS nombre_vendedor,
REPLACE(
CASE
WHEN CHARINDEX(' ', LTRIM(RTRIM([Nombre_Vendedor]))) > 0
THEN LEFT(LTRIM(RTRIM([Nombre_Vendedor])),
CHARINDEX(' ', LTRIM(RTRIM([Nombre_Vendedor]))) - 1)
ELSE LTRIM(RTRIM([Nombre_Vendedor]))
END,
'-', ''
) AS vendedor_nombre,
REPLACE(
CASE
WHEN CHARINDEX(' ', LTRIM(RTRIM([Nombre_Vendedor]))) > 0
THEN REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
SUBSTRING(
LTRIM(RTRIM([Nombre_Vendedor])),
CHARINDEX(' ', LTRIM(RTRIM([Nombre_Vendedor]))) + 1,
CASE
WHEN CHARINDEX(' ', LTRIM(RTRIM([Nombre_Vendedor])),
CHARINDEX(' ', LTRIM(RTRIM([Nombre_Vendedor]))) + 1) > 0
THEN CHARINDEX(' ', LTRIM(RTRIM([Nombre_Vendedor])),
CHARINDEX(' ', LTRIM(RTRIM([Nombre_Vendedor]))) + 1)
- CHARINDEX(' ', LTRIM(RTRIM([Nombre_Vendedor]))) - 1
ELSE LEN(LTRIM(RTRIM([Nombre_Vendedor])))
END
),
'0',''),'1',''),'2',''),'3',''),'4',''),'5',''),'6',''),'7',''),'8',''),'9','')
ELSE NULL
END,
'-', ''
) AS vendedor_apellido,
CAST([Fecha_Ultima_Compra] AS date) AS fecha_ultima_compra,
CAST([Fecha_Alta] AS date) AS fecha_alta,
CAST([Fecha_Baja] AS date) AS fecha_baja,
RTRIM([Condicion_de_venta]) AS condicion_venta,
RTRIM([Condicion_Iva]) AS condicion_iva,
RTRIM([Cuit]) AS cuit,
RTRIM([Ing_Brutos]) AS ingresos_brutos,
RTRIM([Descuento]) AS descuento,
RTRIM([Cobrar_PIB]) AS cobrar_pib,
RTRIM([Porc_PIB]) AS porc_pib,
RTRIM([Limite_Credito]) AS limite_credito,
RTRIM([MoraPermitida]) AS mora_permitida,
RTRIM([Estado]) AS estado,
RTRIM([Estado]) AS estado_texto,
RTRIM([Fax]) AS administracion,
RTRIM([mail]) AS email,
RTRIM([CodFrec]) AS cod_frec,
RTRIM([Frecuencia]) AS frecuencia,
RTRIM([lunes]) AS lunes,
RTRIM([martes]) AS martes,
RTRIM([miercoles]) AS miercoles,
RTRIM([jueves]) AS jueves,
RTRIM([viernes]) AS viernes,
RTRIM([sabado]) AS sabado
FROM [ecommerce].[dbo].[VCLIENTES]
WHERE [Codigo] IS NOT NULL;
Regla de consumo futuro¶
- esta autoridad preserva la base sincronizable de clientes y no una vista filtrada solo a clientes vendibles
- cualquier filtro para venta o facturacion debe vivir en vistas o capas de consumo derivadas
- la tabla o base sincronizada debe conservar clientes activos, suspendidos y de baja
Evidencia de origen¶
- script fuente:
C:\APV\gestor-de-negocios\backend\app\scheduler\scripts\sync_sgc_customers_canonical.py - constante observada:
SELECT_CUSTOMERS_SQL - ejecucion observada en el mismo script:
cursor.execute(SELECT_CUSTOMERS_SQL)
Cierre¶
SOURCE-001queda cerrada como autoridad documental preservada- la fuente autoridad completa es
ecommerce.dbo.VCLIENTES Telefonoqueda preservado comoWhatsAppdel cliente- no se implemento runtime,
SQLnuevo,API,Docker,VPSniOpenClaw