Análisis DB iPrintPOS ERP — Agente Cotizador

iP
iPrintPOS ERP
Análisis de Base de Datos

Análisis DB
iPrintPOS ERP

Esquema completo, módulos, flujo de cotización y arquitectura de datos para construir un agente cotizador con IA.

PostgreSQL 16.13 · Django Backend

~110 tablas · Multi-empresa

Preparado para: Felipe

Marzo 2026

Resumen General

Motor
PostgreSQL 16.13
Ubuntu 24.04 · pg_dump
Backend
Django (Python)
JWT auth · Audit log · REST API
Tablas
~110 tablas
35,984 líneas de SQL dump
Arquitectura
Multi-empresa
company_id en todas las tablas core

Empresas registradas

IDNombreCiudadPaísMoneda
1IprintPOSDallas, TexasUSAUSD
2Area 862Ciudad 862USAMoneda 5
3Empresa ABCCiudad EmpresaABCUSAUSD
4Empresa ACiudad Empresa AUSAUSD
7–9Empresa 3, 4, 5VariasUSAUSD

Nota: Los datos actuales son mayormente de prueba/demo (~8 clientes, ~40 productos). La estructura está lista para producción con datos reales.

Mapa de Módulos

El sistema se organiza en módulos Django independientes. Cada prefijo de tabla corresponde a un módulo.

product_*
Productos
Catálogo, precios, fórmulas, procesos, templates, costos extra, sustratos, unidades de venta
14 tablas
sales_*
Ventas
Órdenes, sub-órdenes, detalles, cotizaciones, estados, entregas, aprobación de artes
14 tablas
matrix_*
Matrices de Precio
Matrices por producto, templates, valores por fila/columna, matrices de procesos
6 tablas
customer_*
Clientes
Clientes, direcciones, contactos, crédito, nivel (mayoreo/menudeo)
4 tablas
invoices_*
Facturación
Facturas, pagos, tipos de pago, cuentas por cobrar, configuración
5 tablas
purchase_*
Compras
Órdenes de compra, productos, documentos, recepciones de proveedor
4 tablas
base_config_*
Configuración
Niveles, impuestos, plazos, orígenes, departamentos, unidades de medida
8 tablas
supplier_*
Proveedores
Proveedores, direcciones, contactos, crédito de proveedor
4 tablas
Otros
Soporte
Chat, notificaciones, emails, equipos, inventario, gastos, paquetes, secuencias
~20 tablas
Core para cotizador
Módulos de soporte

Productos — Estructura Core

La tabla product_product es el corazón del catálogo. Cada producto define cómo se calcula su precio.

product_product — Campos principales

idbigint PK
namevarchar(64)
internalCodevarchar(64)
skuCodevarchar(64)
costnumeric(32,2)
priceSuggestnumeric(32,2)
pricePurchasenumeric(32,2)
taxboolean
turnaroundinteger (días)
can_beSALE | PURCHASE
price_typebase | formula | matrix
dinamic_costboolean
company_idFK → company
department_idFK → department
matrix_idFK → matrix
template_idFK → producttemplate

Tipos de Precio — Clave para Cotizar

base

Precio fijo simple. Se multiplica por cantidad. Ejemplo: "Producto 1" → $9.00

formula

Calculado con fórmula matemática usando dimensiones. Ejemplo: Vinyl → precio × (ancho × alto)

matrix

Tabla de precios por rangos (cantidad vs tamaño). Ejemplo: Tarjetas de presentación

Tablas relacionadas al producto

productprices— Precios por nivel y/o cliente
productiondetails— Procesos (diseño, coating, etc.)
productionsubdetails— Sub-opciones de procesos
extracosts— Costos adicionales fijos
productsoldby— Unidades de venta + fórmula
productsustrate— Sustratos/materiales base
producttemplate— Templates reutilizables
priceformula— Fórmulas (Área, Perímetro…)

Fórmulas y Matrices de Precio

product_priceformula — Fórmulas registradas

Las fórmulas se almacenan como array de tokens PostgreSQL: varchar(30)[]. Variables: var_1=precio, var_2=ancho, var_3=alto, var_4=horas, var_5=minutos, var_6=separación, var_7-9=variantes.

Área var_1 × (var_2 × var_3) precio × (ancho × alto)
Perímetro var_1 × 2 × (var_2 + var_3) precio × 2 × (ancho + alto)
Lineal var_1 × var_3 precio × alto
Volumen var_1 × var_2 × var_3 precio × ancho × alto
Tiempo var_4 + var_5 / 60 horas + minutos/60 (fija)
Ojillos 2 × (var_2 + var_3) / var_6 2 × (ancho+alto) / separación (fija)

matrix_* — Sistema de Matrices

Para productos tipo matrix, los precios se organizan en tablas bidimensionales (ej: cantidad × tamaño).

matrix_matrix

• Vinculada al producto vía product_id

• matrix_type: tipo de datos

• rows_title[]: títulos de filas (array PG)

• deep: profundidad de la matriz

• Opcionalmente por nivel y detalle

matrix_matrixvalue

• row_name: nombre de la fila

• col_title[]: encabezados columna

• values[]: array numérico de precios

• item_value: datos extra (jsonb)

• matrix_id: FK a la matriz padre

Niveles de Precio (base_config_level)

Mayoreo
Company 1 y 2
Menudeo
Company 1 y 2
Mostrador
Company 2
Delivery
Company 2

El nivel del cliente determina qué precio se usa de product_productprices.

Clientes y Ventas

customer_customer — Campos clave

company_name, first_name, last_nameIdentificación
email, phoneContacto
taxboolean — ¿aplica IVA?
has_creditboolean — ¿tiene crédito?
level_idFK → level (Mayoreo/Menudeo)
specialCliente especial
origin_idCómo llegó el cliente
starsRating (0-5)

sales_order — Orden de Venta

nameOrder, codeIdentificador
date, promise_date, dateDoneFechas del ciclo
subtotal, tax, totalnumeric(32,2)
discount, deliveryAjustes al total
mainStatusEstado general
customer_idFK → cliente
salesman_idFK → vendedor

sales_orderproduct (Sub-orden)

name, code — Producto en la orden

price, quantity, subtotal, total, tax

dimensions — jsonb con medidas

quoteSelect — opción de cotización

status_id — FK → orderstatus

product_id — FK → producto

sales_orderdetails (Detalles proceso)

price — Precio del proceso

priceString — Expresión legible

dimensions — jsonb con medidas

detail_id — FK → productiondetails

subdetail_id — FK → subdetails

subOrder_id — FK → orderproduct

sales_quotation — Cotizaciones

code — Número de cotización

productsjsonb con snapshot

state — Estado actual

order_id — FK → orden asociada

customer_id, salesman_id

date, mail_date

Facturación, Compras y Soporte

Facturación (invoices_*)

invoices_invoice
invoice_number, status, balance, total, subtotal, tax, date. FK → order, receivable, company
invoices_payment
payment_number, amount, date, canceled, reference. FK → invoice, type_payment
invoices_receivable
Cuentas por cobrar: code, date_init, date_end, deadline, balance, state. FK → customer
invoices_paymenttype
Tipos de pago configurables por empresa (efectivo, tarjeta, transferencia...)

Compras (purchase_*)

purchase_purchaseorder
nameOrder, date, expected_date, subtotal, tax, total, discount, mainStatus. FK → supplier
purchase_purchaseorderproduct
Productos en la OC con precio, cantidad, dimensiones, total
purchase_purchasedocument
Documentos asociados: code, products (jsonb), state, date
purchase_reception
Recepciones de mercancía del proveedor

Proveedores (supplier_*)

supplier_supplier — nombre, email, teléfono, tax, activo

supplier_supplieraddress — direcciones

supplier_suppliercontact — contactos

supplier_suppliercredit — límite de crédito + plazo

Configuración (base_config_*)

globaltax — Impuestos por empresa (nombre + %)

level — Niveles de precio

term — Plazos de crédito (días)

soldby — Unidades: Box, ft, in, m, cm, mm, Unit

origins — Origen de clientes

productiondepartment — Deptos + equipo

Módulos de Soporte

Chat
Chat interno por orden con mensajes y adjuntos
Notificaciones
Push, email, in-app con tipos configurables
Emails
SMTP credentials, templates, historial de envíos
Equipos
Modelos de equipo + mantenimiento programado
Inventario
Movimientos de stock con cantidades
Gastos
Categorías, cuentas, registros de gastos
Paquetes
Envíos con tracking y pagos
Secuencias
Auto-numeración con prefijos EN/ES

Flujo de Cotización — Agente IA

El flujo que debe replicar el agente cotizador, mapeado a las tablas de la DB.

1. Identificar Cliente customer_customer

Buscar por nombre/teléfono/email. Obtener su level_id (Mayoreo/Menudeo) y si tax=true. Si es nuevo, crear registro.

2. Seleccionar Producto product_product

Buscar en catálogo activo. Identificar price_type (base/formula/matrix) y can_be=SALE.

3. Calcular Precio Base productprices | priceformula | matrix

base → Buscar precio en productprices por level_id del cliente

formula → Pedir dimensiones, evaluar fórmula con precio del nivel

matrix → Pedir cantidad/tamaño, buscar en matrixvalue el rango correcto

4. Agregar Procesos / Acabados productiondetails + subdetails

Preproducción (Diseño), Producción (Colores, Coating), Postproducción (Entrega), Extras (Montaje). Cada uno suma costo.

5. Totalizar

subtotal = (precio_base × cantidad) + procesos + extras

tax = subtotal × % impuesto (si cliente.tax AND producto.tax)

total = subtotal + tax − descuento + envío

6. Generar Cotización sales_quotation

Crear registro con snapshot de productos (jsonb), vincular a orden, asignar código secuencial.

Variables que el agente debe preguntar

1. ¿Quién eres? (cliente)

2. ¿Qué producto necesitas?

3. ¿Dimensiones? (ancho × alto)

4. ¿Cantidad?

5. ¿Qué acabados? (procesos)

6. ¿Necesitas envío?

Desliza o usa las flechas para navegar