vw_book consolida en una única salida el catálogo de libros con:
metadatos básicos (códigos, título, estado)
autores (concatenados)
materias (códigos y rutas jerárquicas via vw_materia)
proveedor principal (via vw_party)
precio vigente según lista definida por parámetro global parameter.key='PriceList'
costo vigente más reciente del libro
stock consolidado (suma en depósitos)
auditoría (transacciones de creación/actualización)
*Performance: la vista incluye varias subconsultas correlacionadas (autores, materias, isbn/barcode, stock). Para listados masivos se recomienda filtrar/paginar.
TODO: búsqueda por ISBN optimizada
SELECT book_id, int_code, title, authors_full, price, stock_total, active
FROM public.vw_book
WHERE active = true
ORDER BY title
LIMIT 50 OFFSET 0;
SELECT *
FROM public.vw_book
WHERE isbn = '9789871234567'
OR int_code = 'INT-000123';
SELECT main_provider_party_id, main_provider_name, COUNT(*) AS books, SUM(stock_total) AS stock
FROM public.vw_book
WHERE main_provider_party_id IS NOT NULL
GROUP BY main_provider_party_id, main_provider_name
ORDER BY books DESC;
| Columna | Descripción |
|---|---|
| book_id | ID único del libro. |
| int_code | Código interno del libro. |
| title | Título principal del libro. |
| subtitle | Subtítulo del libro. |
| author_display | Texto de autor visible definido en el registro del libro. |
| authors_full | Autores del libro concatenados en formato "Apellido, Nombre", separados por " |
| materia_codes | Códigos de materias asociadas al libro, separados por coma. |
| materia_paths | Rutas jerárquicas completas de materias (desde la raíz), separadas por " |
| book_character_id | ID del carácter del libro (referencia a book_character). |
| book_character_name | Nombre descriptivo del carácter del libro. |
| editorial_id | ID de la editorial. |
| editorial_name | Nombre de la editorial. |
| coleccion_id | ID de la colección. |
| coleccion_name | Nombre de la colección. |
| coleccion_number | Número del libro dentro de la colección. |
| isbn | ISBN principal del libro, determinado por el menor isbn_order. |
| barcode | Código de barras principal del libro, tomado del mismo registro que el ISBN principal. |
| main_provider_party_id | ID de identidad (party_id) del proveedor principal del libro. |
| main_provider_name | Nombre legal del proveedor principal (desde vw_party). |
| price | Precio de venta vigente según la lista de precios definida por el parámetro global "PriceList". |
| price_currency_id | ID de la moneda del precio. |
| price_symbol | Símbolo de la moneda del precio (ej: $, USD). |
| price_currency | Nombre de la moneda del precio. |
| cost | Costo vigente del libro, tomado desde public.cost. |
| stock_total | Stock físico total consolidado en todos los depósitos. |
| active | Indica si el libro está habilitado para operaciones comerciales. |
| move_stock | Indica si el libro impacta en movimientos de stock. |
| page_count | Cantidad de páginas del libro. |
| weight_kg | Peso del libro. Unidad según definición del campo original (asumido en kilogramos). |
| height | Altura física del libro. |
| width | Ancho físico del libro. |
| depth | Profundidad/espesor físico del libro. |
| creation_transaction_id | ID de la transacción que originó el registro del libro. |
| update_transaction_id | ID de la última transacción que modificó el registro del libro. |
Vista orientada a auditoría y sincronización incremental del catálogo. Devuelve las fechas clave de actividad del libro y calcula global_last_modification_at como indicador único de “última modificación”.
SELECT book_id, int_code, title, global_last_modification_at
FROM public.vw_book_audit
WHERE global_last_modification_at > '2025-06-01'::timestamp
ORDER BY global_last_modification_at;
Este módulo expone el catálogo de libros mediante vistas SQL optimizadas para dos propósitos distintos:
Detección eficiente de cambios (auditoría / sincronización incremental)
Obtención del detalle completo del libro (catálogo enriquecido)
La separación de responsabilidades permite escalar el sistema sin penalizar consultas frecuentes ni procesos batch.
vw_book_audit — Auditoría y detección de cambios
Vista liviana orientada a control y sincronización. Expone las fechas clave de actividad de cada libro y calcula un único timestamp de referencia:
global_last_modification_at
Este campo representa la fecha más reciente entre:
creación o edición de la ficha del libro,
último cambio de precio (según la lista definida por el parámetro global PriceList),
último movimiento real de stock.
👉 Uso principal: detectar qué libros cambiaron desde una fecha/hora.
Vista enriquecida que consolida:
metadatos del libro,
autores (concatenados),
materias jerárquicas (vía vw_materia),
proveedor principal (vía vw_party),
stock consolidado,
precio vigente según PriceList,
auditoría.
👉 Uso principal: obtener todos los datos del libro para UI, APIs o exportaciones.
Consultar vw_book_audit para identificar los libros modificados desde la última sincronización.
Usar los book_id obtenidos para consultar vw_book.
Procesar los resultados en orden, permitiendo paginación y reintentos seguros.
Este patrón evita escanear todo el catálogo y reduce significativamente el costo de sincronización.
-- :since = timestamp de última sincronización
WITH changed_books AS (
SELECT book_id, global_last_modification_at
FROM public.vw_book_audit
WHERE global_last_modification_at > '2025-06-01 00:00:00'::timestamp
)
SELECT
vb.*,
cb.global_last_modification_at
FROM public.vw_book vb
JOIN changed_books cb ON cb.book_id = vb.book_id
ORDER BY cb.global_last_modification_at ASC, vb.book_id;
Recomendado para procesos batch o APIs.
-- Cursor compuesto: (last_sync_at, last_book_id)
WITH changed_books AS (
SELECT book_id, global_last_modification_at
FROM public.vw_book_audit
WHERE (global_last_modification_at, book_id)
> ('2025-06-01 00:00:00'::timestamp, 0)
ORDER BY global_last_modification_at, book_id
LIMIT 500
)
SELECT
vb.*,
cb.global_last_modification_at
FROM public.vw_book vb
JOIN changed_books cb ON cb.book_id = vb.book_id
ORDER BY cb.global_last_modification_at, vb.book_id;
Permite:
guardar el último cursor procesado,
retomar sin duplicar registros,
procesar catálogos grandes de forma segura.
Útil para colas de reprocesamiento o validaciones rápidas.
SELECT book_id, global_last_modification_at
FROM public.vw_book_audit
WHERE global_last_modification_at > '2025-06-01 00:00:00'::timestamp
ORDER BY global_last_modification_at, book_id;
⚠️ Importante: el campo isbn en vw_book es derivado. Para que PostgreSQL use índice, el filtro debe hacerse sobre book_isbn.
WITH changed_books AS (
SELECT book_id, global_last_modification_at
FROM public.vw_book_audit
WHERE global_last_modification_at > '2025-06-01 00:00:00'::timestamp
)
SELECT
vb.*,
cb.global_last_modification_at
FROM changed_books cb
JOIN public.book_isbn bi ON bi.book_id = cb.book_id
JOIN public.vw_book vb ON vb.book_id = cb.book_id
WHERE bi.isbn = '9789871234567'
ORDER BY cb.global_last_modification_at, vb.book_id;
vw_book_audit está pensada para ser liviana y usada frecuentemente.
vw_book incluye subconsultas correlacionadas (autores, materias, ISBN, stock).
Usar siempre con filtros (WHERE, LIMIT) o para un conjunto acotado de libros.
Recordar restricción de búsqueda por ISBN.
| Columna | Descripción |
|---|---|
| book_id | ID único del libro. |
| int_code | Código interno del libro. |
| title | Título del libro. |
| created_at | Fecha y hora de alta del libro (transaction_date de creation_transaction). |
| created_by | Usuario que dio de alta el libro (nombre completo desde vw_transaction). |
| last_modified_at | Fecha y hora de la última edición de la ficha del libro (transaction_date de update_transaction). |
| last_modified_by | Usuario que realizó la última edición de la ficha (nombre completo desde vw_transaction). |
| last_price_change_at | Fecha/hora del último cambio de precio para la lista definida por el parámetro global "PriceList". |
| last_stock_movement_at | Fecha/hora del último movimiento real de stock (document.real_date) asociado al libro. |
| global_last_modification_at | Fecha más reciente entre: última edición de ficha, último cambio de precio o último movimiento de stock. Útil para sincronizaciones incrementales. |
vw_client es una vista consolidada del rol Cliente, que combina:
Identidad base (desde public.vw_party): nombre, tipo, tax_id, IVA, contactos y ubicación.
Atributos comerciales (desde public.client y catálogos): tipo de cliente, cuenta corriente, límites, moneda, condición de venta, lista de precios, zona.
Vendedor asignado: resuelto como otra identidad (vw_party) a partir de client.salesman_id.
SELECT party_id, client_code, legalname, tax_id, has_account
FROM public.vw_client
WHERE client_code = 'CL-000123';
SELECT client_code, name, sell_condition_name, price_list_name, salesman_name
FROM public.vw_client
ORDER BY name
LIMIT 50;
SELECT client_code, legalname, credit_limit, limit_currency_symbol
FROM public.vw_client
WHERE has_account = true
AND credit_limit IS NOT NULL
ORDER BY credit_limit DESC
LIMIT 100;
SELECT
salesman_id,
salesman_name,
COUNT(*) AS client_qty
FROM public.vw_client
WHERE salesman_id IS NOT NULL
GROUP BY salesman_id, salesman_name
ORDER BY client_qty DESC;
| Columna | Descripción |
|---|---|
| party_id | ID único global del sujeto (party) en el sistema. Clave principal lógica para personas y organizaciones. |
| party_type_id | Identificador del tipo de party (1 = Persona, 2 = Organización). |
| party_type_name | Descripción legible del tipo de party (Persona u Organización). |
| legalname | Nombre formal/legal del party. Persona: "Apellido, Nombre". Organización: razón social. |
| name | Nombre de uso común o comercial. Persona: "Nombre Apellido". Organización: nombre de fantasía. |
| tax_id | Identificador fiscal del party (CUIT/CUIL u otro según país). |
| iva_type_id | ID de la condición fiscal frente al IVA. |
| iva_type_name | Nombre descriptivo de la condición fiscal frente al IVA. |
| primary_email | Dirección de correo electrónico principal del party. Se asume un único email principal por party. |
| primary_phone | Número telefónico principal del party. Se asume un único teléfono principal por party. |
| address | Dirección física principal del party. |
| city_id | Identificador de la ciudad o localidad asociada a la dirección principal. |
| city | Nombre de la ciudad o localidad asociada a la dirección principal. |
| province_id | Identificador de la provincia asociada a la dirección principal. |
| province | Nombre de la provincia asociada a la dirección principal. |
| country_id | Identificador del país asociado a la dirección principal. |
| country | Nombre del país asociado a la dirección principal. |
| zipcode | Código postal de la dirección principal. |
| creation_transaction_id | ID de la transacción que originó la creación del party (trazabilidad/auditoría). |
| update_transaction_id | ID de la última transacción que modificó el party (trazabilidad/auditoría). |
| client_code | Código comercial único asignado al cliente. |
| client_type_id | ID de la categoría o tipo de cliente. |
| client_type_name | Nombre de la categoría de cliente (Ej: Minorista, Mayorista). |
| has_account | Indica si el cliente tiene habilitada una cuenta corriente. |
| credit_limit | Monto máximo de crédito permitido en cuenta corriente. |
| consign_limit | Monto máximo permitido para mercadería en consignación. |
| limit_currency_id | ID de la moneda del límite de crédito. |
| limit_currency_symbol | Símbolo de la moneda del límite de crédito. |
| sell_condition_id | ID de la condición de venta predeterminada. |
| sell_condition_name | Nombre de la condición de venta (Ej: Contado, 30 días). |
| price_list_id | ID de la lista de precios asignada. |
| price_list_name | Nombre de la lista de precios asociada. |
| zone_id | ID de la zona geográfica asignada. |
| zone_name | Nombre de la zona geográfica. |
| salesman_id | ID (party_id) del vendedor asignado. |
| salesman_name | Nombre completo del vendedor responsable. |
| creation_date | Fecha de registro del rol cliente. |
| creation_transaction_id | ID de transacción de creación de la identidad. |
| update_transaction_id | ID de última transacción de actualización de la identidad. |
vw_document es la vista base para consulta, auditoría y reporting de documentos del sistema. Abstrae la tabla public.document y enriquece cada registro con:
nombres legibles de tipo de documento (document_type_name),
una familia/grupo funcional (document_group) derivada de reglas de negocio,
información de sucursal,
auditoría completa de la transacción que originó el documento (usuario y fecha).
El mapeo de tipos y grupos se realiza mediante un CTE embebido (doc_types), que refleja directamente los enums utilizados en el código de la aplicación.
Importante: para los reportes lo más probable es que no se use esta vista, sino las vistas particulares de cada módulo. Esta vista se utiliza para simplificar la construcción de documentos en otras vistas.
Todos los documentos tienen fecha pero no todos tienen fecha contable. Dentro del sistema, si un documento no tiene fecha contable, se toma la fecha real como fecha contable.
Tipo de documento
Representado por document_type_id (valor numérico).
Traducido a document_type_name (ej: SALE_BILL, BUY_ORDER).
Agrupa documentos por función de negocio, facilitando filtros y reportes masivos.
Ejemplos de grupos:
BUY_ORDER
BUY_BILL
SALE_BILL
SALE_ORDER
SALE_PAYMENT
STOCK
BOOKKEEPING
RRMM_LIQUIDATION
PERSONAL
PERSONAL_PAYMENT
SELECT
document_id,
real_date,
document_type_name,
sucursal_name
FROM public.vw_document
WHERE document_group = 'STOCK'
ORDER BY real_date DESC;
SELECT
document_id,
document_type_name,
real_date,
account_date,
sucursal_name
FROM public.vw_document
WHERE document_group IN ('SALE_BILL', 'SALE_CREDIT_NOTE')
AND real_date BETWEEN '2025-01-01' AND '2025-01-31'
ORDER BY account_date;
SELECT
document_id,
document_type_name,
document_group,
transaction_date
FROM public.vw_document
WHERE user_id = 42
ORDER BY transaction_date DESC;
SELECT
sucursal_name,
document_group,
COUNT(*) AS qty
FROM public.vw_document
WHERE real_date >= NOW() - INTERVAL '7 days'
GROUP BY sucursal_name, document_group
ORDER BY sucursal_name, qty DESC;
Útil para control contable/impositivo.
SELECT
document_id,
document_type_name,
real_date,
account_date
FROM public.vw_document
WHERE real_date <> account_date
ORDER BY real_date DESC;
SELECT
transaction_date,
operator_name,
document_type_name,
sucursal_name
FROM public.vw_document
ORDER BY transaction_date DESC
LIMIT 100;
vw_document no reemplaza a public.document: la enriquece para lectura.
El mapeo de tipos está hardcodeado en la vista y debe mantenerse sincronizado con el enum del código.
Si un document_type_id no está contemplado en el mapeo:
document_type_name y document_group pueden quedar NULL
esto sirve como señal de desalineación entre base y aplicación.
vw_transaction: aporta auditoría (usuario y fecha).
vw_book_audit: utiliza real_date y transaction_date para calcular cambios globales.
vw_book: depende indirectamente de documentos para stock y precios.
| Columna | Descripción |
|---|---|
| document_id | ID único del documento (PK). |
| real_date | Fecha real/operativa del documento (evento o emisión). |
| account_date | Fecha contable/impositiva del documento (registración). |
| document_type_id | ID numérico del tipo de documento (enum en el código). |
| document_type_name | Nombre descriptivo del tipo de documento (mapeado desde document_type_id). |
| document_group | Familia/agrupador lógico del documento (STOCK, FINANCE, SALE_BILL, etc.) para reportes y filtros. |
| sucursal_id | ID de la sucursal donde se generó/imputó el documento. |
| sucursal_name | Nombre de la sucursal donde se generó/imputó el documento. |
| transaction_id | ID de la transacción asociada al documento (trazabilidad/auditoría). |
| user_id | ID del usuario operador asociado a la transacción (desde vw_transaction). |
| operator_name | Nombre completo del usuario operador (desde vw_transaction.user_full_name). |
| transaction_date | Fecha y hora de la transacción asociada al documento (desde vw_transaction.transaction_date). |
vw_materia expone el catálogo de materias como una jerarquía (árbol). Cada fila representa una materia y su relación padre/hijo, además de un campo full_path que describe la ruta completa desde una materia raíz hasta el nodo.
Contrato importante: la jerarquía debe ser acíclica (sin bucles en materia_padre_id).
SELECT materia_id, code, full_path
FROM public.vw_materia
ORDER BY full_path;
SELECT materia_id, full_path
FROM public.vw_materia
WHERE full_path ILIKE '%Historia%'
ORDER BY full_path;
SELECT *
FROM public.vw_materia
WHERE full_path LIKE (
SELECT full_path || '%'
FROM public.vw_materia
WHERE materia_id = 123
)
ORDER BY full_path;
| Columna | Descripción |
|---|---|
| materia_id | Identificador único del nodo de materia. |
| materia_padre_id | Identificador del nodo padre. NULL indica que la materia es raíz. |
| name | Nombre de la materia (etiqueta del nodo). |
| code | Código de la materia (si aplica). |
| full_path | Ruta jerárquica completa desde la raíz hasta el nodo, concatenada con " > ". Útil para búsquedas y visualización. |
vw_party es la vista base para trabajar con identidades (“party”) en el sistema. Unifica en una única salida tanto Personas como Organizaciones.
Las vistas de clientes, proveedores, vendedores y otros roles se construyen sobre esta vista.
Temas que resuelve:
Tipo de party (persona/organización)
Nombres “legal” y “comercial”
Identificación fiscal
Condición de IVA
Contactos principales (email y teléfono)
Ubicación principal (dirección, ciudad, provincia, país, CP)
Trazabilidad por transacción (creación y última actualización)
party_type_id: 1 = Persona, 2 = Organización.
legalname: "Apellido, Nombre"
name: "Nombre Apellido"
legalname: razón social (organization.legalname)
name: nombre de fantasía (organization.name)
Las direcciones que se muestran son las que corresponden al tipo de dirección principal.
SELECT party_id, party_type_name, legalname, tax_id
FROM public.vw_party
WHERE tax_id = '20304050607';
SELECT party_id, name, primary_email, primary_phone, city, province, country
FROM public.vw_party
ORDER BY name
LIMIT 50;
SELECT party_type_name, COUNT(*) AS qty
FROM public.vw_party
GROUP BY party_type_name
ORDER BY qty DESC;
| Columna | Descripción |
|---|---|
| party_id | ID único global del sujeto en el sistema (PK). |
| party_type_id | ID del tipo (1: Persona, 2: Organización). |
| party_type_name | Descripción legible del tipo de party. |
| legalname | Nombre formal/legal (Apellido, Nombre o Razón Social). |
| name | Nombre comercial o de fantasía. |
| tax_id | Identificador fiscal (CUIT/CUIL/RFC). |
| iva_type_id | ID de condición de IVA. |
| iva_type_name | Nombre de la condición de IVA. |
| primary_email | Email principal de contacto. |
| primary_phone | Teléfono principal de contacto. |
| address | Dirección de la ubicación principal. |
| city_id | ID de la ciudad/localidad. |
| city | Nombre de la ciudad/localidad. |
| province_id | ID de la provincia. |
| province | Nombre de la provincia. |
| country_id | ID del país. |
| country | Nombre del país. |
| zipcode | Código postal. |
| creation_transaction_id | ID de la transacción en la que se creó este registro. |
| update_transaction_id | ID de la última transacción que modificó este registro. |
Vista consolidada para reportes de pagos por medio, banco, sucursal y operador.
Recomendada para:
obtener el detalle de la forma de pago de un documento específico
arqueos de caja/banco
conciliaciones
reportes por medio de pago y fechas
| ID | Code | Descripción | Uso típico |
|---|---|---|---|
| 1 | CASH |
Pago en efectivo | Ventas en mostrador |
| 3 | CREDIT_CARD |
Tarjeta de crédito | Ventas en mostrador |
| 4 | OTHER_PAYMENT |
Otro medio de pago | Casos especiales |
| 9 | DEPOT |
Depósito bancario | Pago en cuenta bancaria |
| 10 | TRANSFER |
Transferencia bancaria | Cobro o pago vía transferencia |
| 8 | BANK_CREDIT |
Depósito o transferencia bancaria | Pago o cobro en cuenta bancaria |
| 22 | OWN_CREDIT_CARD |
Tarjeta de crédito propia | Gastos de la empresa |
| 11 | CREDIT_CARD_AUTOMATIC_DEBIT |
Débito automático en tarjeta | Suscripciones |
| 2 | CHECK |
Cheque propio | Pago a proveedores |
| 6 | THIRD_PARTY_CHECK |
Cheque de terceros recibido | Recibos de clientes |
| 15 | GIVED_THIRD_PARTY_CHECK |
Entrega de cheque de terceros | Pago a proveedor con cheque en cartera |
| 17 | RETENTION_PAYMENT |
Pago por retención | Retenciones impositivas |
| 13 | SALE_QUOTAS |
Venta en cuotas | Financiación directa del comercio |
| 18 | CASH_ON_DELIVERY |
Contrareembolso | Cobro al recibir mercadería. Fuera de uso |
| ID | Code | Descripción | Uso típico |
|---|---|---|---|
| 5 | SALE_ACCOUNT |
Cuenta corriente de venta | Recibos de clientes |
| 14 | BUY_ACCOUNT |
Cuenta corriente de compra | Pago a proveedores |
| 19 | RIGHT_HOLDER_ACCOUNT |
Cuenta de derecho habiente | Pago a derechohabientes |
| 20 | EMPLOYE_ACCOUNT |
Cuenta corriente de empleado | Pago a empleados |
| 7 | DOCUMENT_SALE_ACCOUNT |
Documento de venta | Aplicación de documento pendiente en cuenta corriente |
| 16 | DOCUMENT_BUY_ACCOUNT |
Documento de compra | Aplicación de documento pendiente en cuenta corriente |
| 21 | DOCUMENT_EMPLOYE_ACCOUNT |
Documento de empleado | Aplicación de documento pendiente en cuenta corriente |
SELECT payment_type_name, SUM(amount_converted) AS total_base
FROM public.vw_payment
WHERE document_date >= NOW() - INTERVAL '90 days'
GROUP BY payment_type_name
ORDER BY total_base DESC;
SELECT bank_name, SUM(amount_converted) AS total_base
FROM public.vw_payment
WHERE bank_name IS NOT NULL
AND document_date >= NOW() - INTERVAL '90 days'
GROUP BY bank_name
ORDER BY total_base DESC;
SELECT sucursal_name, operator_name, COUNT(*) AS qty, SUM(amount_converted) AS total_base
FROM public.vw_payment
WHERE document_date >= NOW() - INTERVAL '90 days'
GROUP BY sucursal_name, operator_name
ORDER BY total_base DESC;
| Columna | Descripción |
|---|---|
| payment_id | ID único del pago (PK lógico del registro de document_payment). |
| document_id | ID del documento al que pertenece el pago (referencia a document). |
| payment_type_id | ID numérico del medio de pago (enum en el código). |
| payment_type_name | Nombre del medio de pago (CASH, CHECK, CREDIT_CARD, etc.). |
| amount | Monto del pago en la moneda original (currency_id). |
| currency_id | ID de la moneda del pago. |
| currency_symbol | Símbolo de la moneda del pago (ej: $, USD). |
| quotation_ratio | Tipo de cambio/ratio utilizado para convertir el pago a la moneda base del sistema. |
| amount_converted | Monto convertido a moneda base usando quotation_ratio (amount * quotation_ratio). |
| reference_number | Referencia unificada según el tipo: número de cheque, cupón de tarjeta, número de depósito/transferencia o número de retención. |
| bank_name | Nombre del banco asociado al pago (emisor/receptor) según el tipo (cheque, depósito, transferencia). |
| document_date | Fecha real/operativa del documento asociado (vw_document.real_date). |
| document_type_name | Tipo de documento asociado (vw_document.document_type_name). |
| sucursal_name | Sucursal del documento asociado (vw_document.sucursal_name). |
| operator_name | Operador/usuario asociado al documento (vw_document.operator_name). |
vw_provider es la vista consolidada del rol Proveedor, que combina:
SELECT party_id, provider_code, legalname, tax_id
FROM public.vw_provider
WHERE provider_code = 'PR-000123';
SELECT provider_code, name, buy_condition_name, pay_term, order_gen_strategy_name
FROM public.vw_provider
ORDER BY name
LIMIT 50;
SELECT provider_code, legalname, use_cost, shipping_cost_pct, return_cost_pct
FROM public.vw_provider
WHERE use_cost = true
ORDER BY legalname;
| Columna | Descripción |
|---|---|
| party_id | ID único global de la identidad (party). |
| party_type_id | ID del tipo de party (1 = Persona, 2 = Organización). |
| party_type_name | Descripción legible del tipo de party. |
| legalname | Nombre formal/legal del proveedor (Persona: "Apellido, Nombre"; Organización: razón social). |
| name | Nombre de uso común o comercial del proveedor (Persona: "Nombre Apellido"; Organización: nombre de fantasía). |
| tax_id | Identificador fiscal del proveedor (CUIT/CUIL u otro según país). |
| iva_type_id | ID de la condición fiscal frente al IVA. |
| iva_type_name | Nombre de la condición fiscal frente al IVA. |
| primary_email | Email principal del proveedor. |
| primary_phone | Teléfono principal del proveedor. |
| address | Dirección física principal del proveedor. |
| city_id | ID de la ciudad/localidad de la dirección principal. |
| city | Nombre de la ciudad/localidad de la dirección principal. |
| province_id | ID de la provincia de la dirección principal. |
| province | Nombre de la provincia de la dirección principal. |
| country_id | ID del país de la dirección principal. |
| country | Nombre del país de la dirección principal. |
| zipcode | Código postal de la dirección principal. |
| provider_code | Código comercial/interno único asignado al proveedor. |
| provider_type_id | ID de la categoría/tipo de proveedor. |
| provider_type_name | Nombre de la categoría/tipo de proveedor (Ej: Editorial, Distribuidora). |
| default_discount | Descuento comercial predeterminado. Aclarar escala en el modelo: porcentaje (ej. 10 = 10%) o factor (0.10 = 10%). |
| default_price_factor | Factor multiplicador predeterminado aplicado a precios/costos según reglas del negocio. |
| buy_condition_id | ID de la condición de compra predeterminada. |
| buy_condition_name | Nombre de la condición de compra (Ej: contado, 30/60/90 días). |
| pay_term | Plazo de pago expresado en días. |
| account_numbers | Datos de cuentas bancarias/medios de pago del proveedor (formato según implementación: texto libre/JSON/array). |
| use_cost | Indica si el sistema debe utilizar el costo provisto por el proveedor en cálculos (márgenes/precios). |
| shipping_cost_pct | Costo de envío asociado al proveedor. Aclarar escala: porcentaje (ej. 10 = 10%) o factor (0.10 = 10%). |
| return_cost_pct | Costo de devolución asociado al proveedor. Aclarar escala: porcentaje (ej. 10 = 10%) o factor (0.10 = 10%). |
| order_gen_strategy_id | ID de la estrategia de generación automática de pedidos de compra. |
| order_gen_strategy_name | Nombre de la estrategia de generación automática de pedidos de compra. |
| replace_term | Plazo estimado de reposición en días (lead time). |
| creation_transaction_id | ID de la transacción que originó la creación de la identidad (trazabilidad/auditoría). |
| update_transaction_id | ID de la última transacción que modificó la identidad (trazabilidad/auditoría). |
vw_sale_concept expone los cargos y descuentos aplicados a documentos de venta que no corresponden a productos, como:
fletes
recargos financieros
descuentos comerciales
cargos administrativos
La vista unifica conceptos de Facturas Y conceptos de Notas de Crédito y devuelve los montos contablemente firmados, listos para sumarizar.
Útil para comparar lo facturado contra lo que realmente nos cobra el transporte.
SELECT
SUM(amount) AS recaudacion_fletes
FROM public.vw_sale_concept
WHERE concept_name ILIKE '%FLETE%'
AND real_date BETWEEN '2025-05-01' AND '2025-05-31';
Para saber qué conceptos están impactando más en la facturación total.
SELECT
concept_name,
COUNT(*) as cantidad_usos,
SUM(amount) as total_neto
FROM public.vw_sale_concept
WHERE real_date BETWEEN '2025-01-01' AND '2025-01-02'
GROUP BY concept_name
ORDER BY total_neto DESC;
Si tienes un concepto de "Descuento Especial" o "Bonificación", puedes auditar quiénes lo están recibiendo y bajo qué observación.
SELECT
real_date,
observation,
amount
FROM public.vw_sale_concept
WHERE amount < 0 -- Los descuentos resultan en montos negativos
ORDER BY real_date DESC;
Si quieres ver qué se le cobró a un cliente además de los libros en la factura ID 1500:
SELECT concept_name, observation, amount
FROM public.vw_sale_concept
WHERE document_id = 1500;
| Columna | Descripción |
|---|---|
| document_id | ID del documento de venta (Factura o Nota de Crédito). |
| real_date | Fecha real de emisión del documento (vw_document.real_date). |
| concept_id | ID del concepto adicional (referencia a sale_concept). |
| concept_name | Nombre del concepto adicional (Ej: Flete, Recargo Tarjeta, Descuento Comercial). |
| observation | Descripción u observación cargada manualmente en la línea del concepto. |
| amount | Monto final del concepto con signo aplicado. Resulta de: (signo del documento) × (signo del concepto) × monto base. Los descuentos o créditos se expresan como valores negativos. |
| reference_id | ID de referencia opcional asociado al concepto (uso libre según negocio). |
vw_sale_document unifica facturas (SALE_BILL) y notas de crédito (SALE_CREDIT_NOTE) en un esquema común para reporting y exportación. Incluye:
identificación legal (legal_number)
cliente y vendedor (desde vw_client / vw_salesman)
provincia y país del cliente (desde vw_client)
moneda y tipo de cambio histórico (exchange_rate)
totales firmados (ventas positivas, NC negativas)
desgloses agregados: IVA (vw_sale_tax) y conceptos (vw_sale_concept)
Regla de signo
Factura: sign = 1
Nota de crédito: sign = -1
Todos los totales permiten sumarizar sin CASE.
Importante:
La columna is_cancelled indica si el comprobante fue anulado. Los comprobantes anulados no deben incluirse en los reportes de ventas netas.
Todos los documentos tienen fecha pero no todos tienen fecha contable. Dentro del sistema, si un documento no tiene fecha contable, se toma la fecha real como fecha contable.
SELECT
account_date,
legal_number,
client_tax_id,
client_name,
total_net_taxable,
total_vat,
total_amount
FROM public.vw_sale_document
WHERE real_date BETWEEN '2025-01-01' AND '2025-01-31'
ORDER BY account_date, legal_number;
SELECT
SUM(total_amount) AS sales_net_total
FROM public.vw_sale_document
WHERE real_date BETWEEN '2025-01-01' AND '2025-01-31'
AND is_cancelled IS NOT TRUE;
SELECT
client_party_id,
client_name,
SUM(total_amount) AS total
FROM public.vw_sale_document
WHERE real_date >= '2025-01-01'
AND is_cancelled IS NOT TRUE
GROUP BY client_party_id, client_name
ORDER BY total DESC;
SELECT
salesman_party_id,
salesman_name,
SUM(total_amount) AS total
FROM public.vw_sale_document
WHERE real_date >= '2025-01-01'
AND is_cancelled IS NOT TRUE
GROUP BY salesman_party_id, salesman_name
ORDER BY total DESC;
SELECT
real_date,
legal_number,
document_type_name,
sucursal_name,
operator_name,
total_amount
FROM public.vw_sale_document
ORDER BY real_date DESC
LIMIT 100;
SELECT
legal_number,
currency_symbol,
exchange_rate,
total_amount,
total_amount_base
FROM public.vw_sale_document
WHERE real_date >= NOW() - INTERVAL '7 days'
ORDER BY real_date DESC;
Para auditar qué sucursales tienen más errores o cancelaciones.
SELECT
sucursal_name,
COUNT(*) FILTER (WHERE is_cancelled = true) AS cantidad_anuladas,
COUNT(*) FILTER (WHERE is_cancelled = false) AS cantidad_validas,
ROUND((COUNT(*) FILTER (WHERE is_cancelled = true) * 100.0 / COUNT(*)), 2) AS pct_error
FROM public.vw_sale_document
GROUP BY sucursal_name;
SELECT
c.country,
SUM(d.total_amount_base) AS total_sales_base
FROM public.vw_sale_document d
JOIN public.vw_client c
ON d.client_party_id = c.party_id
WHERE d.real_date BETWEEN DATE '2026-01-01' AND DATE '2026-01-31'
AND d.is_cancelled IS NOT TRUE
GROUP BY c.country
ORDER BY total_sales_base DESC;
```sql
### Diccionario de Columnas
| Columna | Descripción |
| :--- | :--- |
| **document_id** | ID único del documento de venta (PK de public.document). |
| **document_type_id** | ID numérico del tipo de documento (enum del código de aplicación). |
| **document_type_name** | Nombre descriptivo del tipo de documento (ej: SALE_BILL, SALE_CREDIT_NOTE). |
| **legal_number** | Número legal completo del comprobante, formateado como: Letra Prefijo-Número (ej: A 0001-00001234). |
| **real_date** | Fecha real u operativa del documento (emisión / suceso). |
| **account_date** | Fecha contable/impositiva del documento (utilizada para Libro IVA y reportes fiscales). |
| **client_party_id** | ID de identidad (party_id) del cliente asociado al documento. |
| **client_code** | Código comercial interno del cliente. |
| **client_name** | Nombre legal o razón social del cliente. |
| **client_tax_id** | Identificación fiscal del cliente (CUIT/CUIL/RFC, según país). |
| **client_iva_condition** | Condición de IVA del cliente al momento del reporte (ej: Responsable Inscripto, Exento). |
| **salesman_party_id** | ID de identidad (party_id) del vendedor asignado a la operación. |
| **salesman_name** | Nombre del vendedor responsable de la venta. |
| **currency_id** | ID de la moneda en la que está emitido el documento. |
| **currency_symbol** | Símbolo de la moneda del documento |
| **exchange_rate** | Cotización histórica de la moneda del documento a la fecha real (real_date). Se obtiene desde quotation_history usando la última cotización con date_from < real_date. Para moneda base, el valor es 1. |
| **sign** | Signo contable del documento: 1 para Facturas de Venta, -1 para Notas de Crédito. |
| **total_amount** | Importe total del documento en moneda original, con signo aplicado según el tipo de documento (Facturas positivas, Notas de Crédito negativas). Corresponde al monto de cabecera. |
| **total_net_taxable** | Suma de bases imponibles (neto gravado), firmada contablemente. Agregada desde vw_sale_tax. |
| **total_vat** | Importe total de IVA del documento, firmado contablemente. Agregado desde vw_sale_tax. |
| **total_concepts** | Importe total de conceptos adicionales (fletes, recargos, descuentos), firmado contablemente y agregado desde vw_sale_concept. |
| **total_amount_base** | Importe total del documento convertido a moneda base del sistema, utilizando exchange_rate histórico. |
| **total_vat_base** | Importe total de IVA convertido a moneda base del sistema, utilizando exchange_rate histórico. |
| **total_net_taxable_base** | Suma de bases imponibles (neto gravado) convertida a moneda base del sistema usando la cotización histórica. |
| **total_concepts_base** | Importe total de conceptos adicionales (fletes, cargos, descuentos) convertido a moneda base del sistema usando la cotización histórica. |
| **is_cancelled** | Indica si el documento fue anulado/cancelado. |
| **sucursal_name** | Nombre de la sucursal donde se generó el documento. |
| **operator_name** | Nombre del usuario operador que generó la transacción asociada al documento. |
| **transaction_id** | ID de la transacción asociada al documento, utilizada para trazabilidad técnica. |
| **client_province_id** | ID de la provincia asociada a la dirección principal del cliente. |
| **client_province** | Nombre de la provincia asociada a la dirección principal del cliente. |
| **client_country_id** | ID del país asociado a la dirección principal del cliente. |
| **client_country** | Nombre del país asociado a la dirección principal del cliente. |
## Sale Item
# Detalle de líneas de venta: vw_sale_item
vw_sale_item entrega una fila por cada ítem vendido/devolución, unificando facturas y notas de crédito.
Los importes y cantidades están con su correspondiente signo, por lo que pueden agregarse directamente.
Además expone dimensiones frecuentes de análisis para evitar joins adicionales: colección, costo, provincia y país del cliente.
## Casos de uso y queries
### 1) Top libros vendidos por cantidad (período)
```sql
SELECT
b.title,
SUM(si.quantity) AS qty
FROM public.vw_sale_item si
JOIN public.vw_book b ON si.book_id = b.book_id
WHERE si.report_date BETWEEN DATE '2025-01-01' AND DATE '2025-08-31'
GROUP BY b.title
ORDER BY qty DESC
LIMIT 20;
SELECT
salesman_name,
SUM(line_total_neto_base) AS subtotal_base
FROM public.vw_sale_item
WHERE report_date BETWEEN DATE '2025-01-01' AND DATE '2025-08-31'
GROUP BY salesman_name
ORDER BY subtotal_base DESC;
SELECT
c.country,
SUM(si.line_total_neto_base) AS subtotal_base
FROM public.vw_sale_item si
JOIN public.vw_sale_document sd ON si.document_id = sd.document_id
JOIN public.vw_client c ON sd.client_party_id = c.party_id
WHERE si.report_date >= DATE '2025-01-01'
GROUP BY c.country
ORDER BY subtotal_base DESC;
SELECT
legal_number,
client_name,
SUM(line_total_neto_base) AS refund_base
FROM public.vw_sale_item
WHERE sign = -1
AND report_date >= DATE '2025-01-01'
GROUP BY legal_number, client_name
ORDER BY refund_base ASC;
SELECT
report_date,
legal_number,
client_name,
title,
quantity,
unit_price,
discount_pct,
line_total_neto,
currency_symbol
FROM public.vw_sale_item
ORDER BY report_date DESC
LIMIT 50;
| Columna | Descripción |
|---|---|
| document_id | ID del documento de venta (Factura o Nota de Crédito). |
| legal_number | Número legal completo del comprobante (ej: A 0001-00001234). |
| real_date | Fecha real/operativa del documento (emisión/suceso). |
| report_date | Fecha de reporte: account_date si existe; de lo contrario real_date. Recomendada para Libro IVA y estadísticas. |
| sucursal_name | Sucursal donde se generó el documento. |
| client_name | Nombre/Razón social del cliente (desde vw_sale_document). |
| salesman_name | Nombre del vendedor asignado (desde vw_sale_document). |
| book_id | ID del libro/producto vendido (book_id). |
| int_code | Código interno del libro (int_code). |
| title | Título del libro. |
| editorial_name | Nombre de la editorial del libro. |
| materia_paths | Jerarquía completa de materias del libro (ruta desde la raíz, desde vw_book/vw_materia). |
| book_character_name | Carácter del libro (clasificación comercial). |
| main_provider_name | Proveedor principal del libro (desde vw_book/vw_party). |
| coleccion_id | ID de la colección del libro (desde vw_book). |
| coleccion_name | Nombre de la colección del libro (desde vw_book). |
| client_province_id | ID de la provincia del cliente asociado al documento (desde vw_sale_document/vw_client). |
| client_province | Nombre de la provincia del cliente asociado al documento. |
| client_country_id | ID del país del cliente asociado al documento (desde vw_sale_document/vw_client). |
| client_country | Nombre del país del cliente asociado al documento. |
| cost | Costo vigente del libro vendido (desde vw_book/public.cost). |
| item_id | ID de la línea/ítem dentro del documento (tabla física de ítems). |
| sign | Signo contable del documento: 1 para factura/venta, -1 para nota de crédito. |
| quantity | Cantidad firmada: positiva para ventas, negativa para devoluciones (NC). |
| unit_price | Precio unitario de la línea en moneda original del documento. |
| discount_pct | Porcentaje de descuento aplicado a la línea (0-100). |
| line_total_neto | Subtotal de la línea (sin impuestos) con descuento y signo aplicado, en moneda original. |
| line_total_neto_base | Subtotal de la línea convertido a moneda base usando exchange_rate histórico del documento. |
| currency_symbol | Símbolo de la moneda original del documento. |
| exchange_rate | Cotización histórica usada para convertir a moneda base (desde vw_sale_document). |
Al tener esta documentación y estructura, puedes generar el Reporte Impositivo Mensual de forma directa.
Ejemplo:
SELECT
aliquot_name,
percentage,
SUM(net_amount) AS total_neto_gravado,
SUM(tax_amount) AS total_iva_debito
FROM public.vw_sale_tax
WHERE real_date BETWEEN '2025-05-01' AND '2025-05-31'
GROUP BY
aliquot_name,
percentage
ORDER BY
percentage DESC;
| Columna | Descripción |
|---|---|
| document_id | ID único del documento (referencia a public.document). |
| real_date | Fecha real de emisión del comprobante (proveniente de la cabecera del documento). |
| iva_aliquot_id | ID de la alícuota de IVA (referencia a public.iva_aliquot). |
| aliquot_name | Nombre descriptivo de la alícuota (Ej: IVA 21%, IVA 10.5%, Exento). |
| percentage | Porcentaje numérico de la alícuota aplicada. |
| sign | Signo contable aplicado al grupo de documento (1 para Facturas/Ventas, -1 para Notas de Crédito). |
| net_amount | Importe Neto Gravado (Base imponible) con signo aplicado según el tipo de documento. |
| tax_amount | Importe del impuesto (IVA cuota) con signo aplicado según el tipo de documento. |
vw_salesman expone el catálogo de vendedores consolidando:
identidad base desde vw_party (nombres, tax_id y contacto),
datos comerciales del rol vendedor (salesman_code, comisiones),
zona geográfica asignada (tabla zone).
SELECT party_id, salesman_code, legalname, zone_name, primary_phone
FROM public.vw_salesman
ORDER BY legalname;
SELECT zone_name, COUNT(*) AS qty
FROM public.vw_salesman
GROUP BY zone_name
ORDER BY qty DESC;
SELECT
c.salesman_id,
c.salesman_name,
COUNT(*) AS client_qty
FROM public.vw_client c
WHERE c.salesman_id IS NOT NULL
GROUP BY c.salesman_id, c.salesman_name
ORDER BY client_qty DESC;
| Columna | Descripción |
|---|---|
| party_id | ID único global de la identidad del vendedor (party_id, proveniente de vw_party). |
| legalname | Nombre formal/legal del vendedor (ej: "Apellido, Nombre"). |
| name | Nombre de uso común o comercial del vendedor. |
| tax_id | Identificador fiscal/documento del vendedor (según país: CUIT/CUIL/DNI). |
| salesman_code | Código comercial interno asignado al vendedor. |
| commission_on_sales | Comisión predeterminada sobre ventas facturadas. Aclarar escala en el modelo: porcentaje (10=10%) o factor (0.10=10%). |
| commission_on_payments | Comisión predeterminada sobre cobranzas/pagos cobrados. Aclarar escala: porcentaje (10=10%) o factor (0.10=10%). |
| zone_id | ID de la zona geográfica asignada al vendedor (referencia a public.zone). |
| zone_name | Nombre descriptivo de la zona geográfica asignada. |
| primary_email | Correo electrónico principal del vendedor (desde vw_party). |
| primary_phone | Teléfono principal del vendedor (desde vw_party). |
| creation_transaction_id | ID de la transacción de creación de la identidad del vendedor (trazabilidad/auditoría). |
| update_transaction_id | ID de la última transacción que modificó la identidad del vendedor (trazabilidad/auditoría). |
public.vw_transaction es una vista de trazabilidad/auditoría que consolida registros de la tabla public.transaction y los enriquece con información de contexto (usuario y sucursal).
Además, convierte el campo numérico transaction_type en un nombre legible (transaction_type_name) mediante un mapeo embebido en la propia vista.
Cuando un tipo no está contemplado en el mapeo, se expone como UNKNOWN, lo cual permite detectar rápidamente tipos nuevos o inconsistencias entre base y aplicación.
Todas las entidades y documentos del sistema tienen su transacción. Se deberá acceder a esta vista para obtener su detalle.
Estado actual: además del PK transaction_id, la tabla public.transaction no tiene índices sobre transaction_date, user_id, sucursal_id ni transaction_type.
Si se quiere acceder por fecha, usuario, sucursal o tipo de transacción, se recomienda crear índices para mejorar el rendimiento de las consultas.
| Columna | Descripción |
|---|---|
| transaction_id | ID único de la transacción. |
| transaction_date | Fecha y hora del registro. |
| transaction_type_id | ID numérico del tipo de transacción. |
| transaction_type_name | Nombre descriptivo del tipo de transacción (mapeado desde el código de la app). |
| user_id | ID del usuario responsable. |
| user_login | Identificador de login del usuario (users.user_name). |
| user_full_name | Nombre completo derivado: TRIM(COALESCE(name,'' ) |
| sucursal_id | ID de la sucursal de origen. |
| sucursal_name | Nombre de la sucursal. |