## lineasdoc
Titulo: Lineas de movimientos de artículos según su documento (lineasdoc)

Descripcion:
- Tabla con las líneas de compras, ventas, pedidos, presupuestos y órdenes de fabricación.
- Cada registro representa UNA línea de un documento de cabecera.
- La cabecera válida depende exclusivamente de `lineasdoc.tipodoc`.

Reglas de negocio:
- Cada registro pertenece a UNA y solo UNA cabecera.
- Fecha oficial del movimiento: `lineasdoc.fechamov`.
- Tipo del movimiento: `lineasdoc.tipodoc`.
- Puede representar movimientos de cliente o proveedor.
- El dominio (cliente/proveedor) se determina exclusivamente por `tipodoc`.
- Nunca deben mezclarse documentos de cliente con proveedor en una misma consulta.
- La tabla `precli` contiene tanto pedidos/presupuestos de cliente (PC) como órdenes de fabricación (OF).
- En `tipodoc='OF'` el documento NO representa una operación comercial.
- El significado funcional del documento depende EXCLUSIVAMENTE de `tipodoc`, no del patrón del JOIN.

---

@keys:
- PK tecnica (identificador fisico):
  - lineasdoc.id

- Clave funcional de linea (identifica una linea dentro de su documento):
  - Para documentos con cabecera precli o pedpro:
    (lineasdoc.tipodoc, lineasdoc.seriepre, lineasdoc.numpre, lineasdoc.linea)

  - Para documentos con cabecera albcli o albpro:
    (lineasdoc.tipodoc, lineasdoc.seriealb, lineasdoc.numalb, lineasdoc.linea)

  - Para documentos con cabecera faccli o facpro:
    (lineasdoc.tipodoc, lineasdoc.seriefac, lineasdoc.numfac, lineasdoc.linea)

Notas:
- `lineasdoc.id` NO debe usarse para joins funcionales.
- Para evitar duplicados, si se baja a nivel de linea se debe incluir siempre `lineasdoc.linea`.

---

@joins:
# El JOIN correcto depende EXCLUSIVAMENTE de tipodoc

- precli:
  lineasdoc.tipodoc  = precli.tipodoc
  AND lineasdoc.seriepre = precli.seriepre
  AND lineasdoc.numpre   = precli.numpre
  (solo si tipodoc IN ('PC','OF'))

- pedpro:
  lineasdoc.tipodoc  = pedpro.tipodoc
  AND lineasdoc.seriepre = pedpro.seriepre
  AND lineasdoc.numpre   = pedpro.numpre
  (solo si tipodoc = 'PP')

- albcli:
  lineasdoc.tipodoc  = 'SV'
  AND lineasdoc.seriealb = albcli.seriealb
  AND lineasdoc.numalb   = albcli.numalb

- faccli:
  lineasdoc.tipodoc  = 'SV'
  AND lineasdoc.seriefac = faccli.seriefac
  AND lineasdoc.numfac   = faccli.numfac

- albpro:
  lineasdoc.tipodoc  = 'EC'
  AND lineasdoc.seriealb = albpro.seriealb
  AND lineasdoc.numalb   = albpro.numalb

- facpro:
  lineasdoc.tipodoc  = 'EC'
  AND lineasdoc.seriefac = facpro.seriefac
  AND lineasdoc.numfac   = facpro.numfac

- cliente:
  cliente.codigoc = lineasdoc.codigoclipro
  AND lineasdoc.tipodoc IN ('PC','OF','SV')

- proveedor:
  proveedor.codigop = lineasdoc.codigoclipro
  AND lineasdoc.tipodoc IN ('PP','EC')

- articulo:
  articu.codart = lineasdoc.codart

- almacen:
  almacenes.alm = lineasdoc.alm

---

@sql_rules:
- PROHIBIDO usar JOIN con OR.
- Elegir explícitamente la cabecera correcta según tipodoc.
- Si existen alternativas (albcli / faccli), usar CTEs o consultas separadas.
- OBLIGATORIO devolver siempre, salvo petición contraria:
  lineasdoc.tipodoc,
  lineasdoc.codigoclipro,
  lineasdoc.codart,
  lineasdoc.concepto
- NO usar lineasdoc.codigoc ni lineasdoc.codigop:
  SIEMPRE usar lineasdoc.codigoclipro.

---

@domains:
- DOMINIO CLIENTE
  tipodoc IN ('PC','OF','SV')

  joins_validos:
  - precli  (PC, OF)
  - albcli  (SV)
  - faccli  (SV)

  codigoclipro_ref:
  - codigoclipro = cliente.codigoc

- DOMINIO PROVEEDOR
  tipodoc IN ('PP','EC')

  joins_validos:
  - pedpro  (PP)
  - albpro  (EC)
  - facpro  (EC)

  codigoclipro_ref:
  - codigoclipro = proveedor.codigop

---

@notes:
- Seleccion de cabecera por tipodoc:
  - 'PC','OF' -> precli
  - 'PP'      -> pedpro
  - 'SV'      -> albcli o faccli
  - 'EC'      -> albpro o facpro

- Para 'SV' y 'EC':
  - El documento origen suele ser unico.
  - Unir alb* y fac* solo si se pide trazabilidad.

- "Pendiente de servir":
  - Por defecto:
    COALESCE(lineasdoc.servido,0) = 0
  - Parcialmente servido (solo si se pide explicitamente):
    COALESCE(lineasdoc.servido,0) < COALESCE(lineasdoc.cantidad,0)

- Para trazabilidad pedido -> albaran:
  - El albaran crea lineas nuevas con tipodoc='SV'
  - La referencia al pedido se detecta por:
    COALESCE(lineasdoc.numpre,0) > 0



## Campo: lineasdoc.tipodoc
TABLA: lineasdoc
CAMPO: tipodoc
TIPO: varchar(2)

DESCRIPCION:
- Identificador del tipo de documento. Define la familia documental y las reglas asociadas.

VALORES:
- PC = Pedido / Presupuesto de cliente
- OF = Orden de fabricación (en este caso, reutiliza precli)
- PP = Pedido de proveedor
- SV = Albarán de cliente / Factura de cliente
- EC = Albarán de proveedor / Factura de proveedor

REGLAS:
- Cada tabla solo admite uno o varios valores concretos de tipodoc.
- Nunca deben mezclarse documentos de cliente con proveedor.
- tipodoc determina las tablas válidas para joins y los flujos posteriores.
- En la tabla precli, tipodoc puede ser 'PC' si es pedido/presupuesto cliente 
- En la tabla precli, tipodoc puede ser 'OF' si es una orden de fabricación.
- En la tabla pedpro, tipodoc debe ser siempre 'PP'.
- En la tabla albcli, tipodoc debe ser siempre 'SV'.
- En la tabla faccli, tipodoc debe ser siempre 'SV'.
- En la tabla albpro, tipodoc debe ser siempre 'EC'.
- En la tabla facpro, tipodoc debe ser siempre 'EC'.


## Campo: lineasdoc.codigoclipro
TABLA: lineasdoc
CAMPO: codigoclipro
TIPO: varchar(9)

DESCRIPCION:
- Código del cliente o del proveedor asociado al movimiento.
- El significado del campo depende del tipo de documento (`lineasdoc.tipodoc`).
- En documentos de cliente identifica al cliente; en documentos de proveedor identifica al proveedor.

VALORES:
- Cliente:
  - tipodoc IN ('PC','OF','SV')
  - codigoclipro = cliente.codigoc
- Proveedor:
  - tipodoc IN ('PP','EC')
  - codigoclipro = proveedor.codigop

REGLAS:
- El campo es polimórfico: referencia a cliente o proveedor según tipodoc.
- Nunca debe mezclarse cliente y proveedor en el mismo documento.
- Para tipodoc IN ('PC','OF','SV'), codigoclipro debe existir en cliente.codigoc.
- Para tipodoc IN ('PP','EC'), codigoclipro debe existir en proveedor.codigop.
- El dominio del campo viene determinado exclusivamente por tipodoc.
- No es posible determinar si codigoclipro es cliente o proveedor sin conocer tipodoc.


## Campo: lineasdoc.fechamov
TABLA: lineasdoc
CAMPO: fechamov
TIPO: date

DESCRIPCION:
- Fecha oficial del movimiento del documento.
- Representa la fecha contable y operativa del movimiento de artículos.
- Es la fecha principal a utilizar para filtros temporales, informes y análisis.

VALORES:
- Fecha válida del calendario (YYYY-MM-DD).

REGLAS:
- Es la fecha de referencia del movimiento, independientemente de la fecha de creación o modificación del documento.
- Debe coincidir con la fecha del documento de cabecera asociado (pedido, albarán, factura u orden de fabricación).
- Se utiliza como fecha principal para:
  - Filtros por periodo.
  - Agrupaciones temporales (día, mes, año).
  - Informes de compras, ventas y producción.
- No debe interpretarse como fecha de contabilización fiscal salvo que el documento lo indique explícitamente.


## Campo: lineasdoc.seriepre
TABLA: lineasdoc
CAMPO: seriepre
TIPO: varchar(2)

DESCRIPCION:
- Serie del documento (pedido/presupuesto cliente/Orden de fabricación)

VALORES:

REGLAS:


## Campo: lineasdoc.seriealb
TABLA: lineasdoc
CAMPO: seriealb
TIPO: varchar(2)

DESCRIPCION:
- Serie del albarán asociado al movimiento.
- Se utiliza tanto para albaranes de cliente como de proveedor.
- Solo tiene significado en documentos de tipo albarán o en documentos que deriven de albaranes.

VALORES:
- Código de serie de albarán definido en el sistema (por ejemplo: 'A', 'B', '01', etc.).
- Cadena vacía ('') cuando no aplica.

REGLAS:
- El campo solo se informa cuando el movimiento corresponde a un albarán:
  - tipodoc = 'SV' (albarán de cliente)
  - tipodoc = 'EC' (albarán de proveedor)
- Para otros tipos de documento (PC, OF, PP) el campo debe ser cadena vacía ('').
- Forma parte de la clave de JOIN con:
  - albcli junto con (tipodoc, seriealb, numalb)
  - albpro junto con (tipodoc, seriealb, numalb)
- No debe utilizarse para identificar facturas; en ese caso se usan seriefac y numfac.


## Campo: lineasdoc.seriefac
TABLA: lineasdoc
CAMPO: seriefac
TIPO: varchar(2)

DESCRIPCION:
- Serie de la factura asociada al movimiento.
- Se utiliza tanto para facturas de cliente como de proveedor.
- Solo tiene significado en documentos de tipo factura o en movimientos derivados de facturas.

VALORES:
- Código de serie de factura definido en el sistema (por ejemplo: 'F', '01', etc.).
- Cadena vacía ('') cuando no aplica.

REGLAS:
- El campo solo se informa cuando el movimiento corresponde a una factura:
  - tipodoc = 'SV' (factura de cliente)
  - tipodoc = 'EC' (factura de proveedor)
- Para otros tipos de documento (PC, OF, PP) el campo debe ser cadena vacía ('').
- Forma parte de la clave de JOIN con:
  - faccli junto con (tipodoc, seriefac, numfac)
  - facpro junto con (tipodoc, seriefac, numfac)
- No debe utilizarse para identificar albaranes; en ese caso se usan seriealb y numalb.



## Campo: lineasdoc.numpre
TABLA: lineasdoc
CAMPO: numpre
TIPO: numeric(6)

DESCRIPCION:
- Número del documento (pedido/presupuesto cliente/Orden de fabricación)

VALORES:

REGLAS:


## Campo: lineasdoc.numalb
TABLA: lineasdoc
CAMPO: numalb
TIPO: numeric(6)

DESCRIPCION:

VALORES:

REGLAS:


## Campo: lineasdoc.numfac
TABLA: lineasdoc
CAMPO: numfac
TIPO: numeric(6)

DESCRIPCION:

VALORES:

REGLAS:


## Campo: lineasdoc.linea
TABLA: lineasdoc
CAMPO: linea
TIPO: numeric(4)

DESCRIPCION:

VALORES:

REGLAS:


## Campo: lineasdoc.codart
TABLA: lineasdoc
CAMPO: codart
TIPO: varchar(13)

DESCRIPCION:

VALORES:

REGLAS:


## Campo: lineasdoc.alm
TABLA: lineasdoc
CAMPO: alm
TIPO: varchar(2)

DESCRIPCION:

VALORES:

REGLAS:


## Campo: lineasdoc.concepto
TABLA: lineasdoc
CAMPO: concepto
TIPO: varchar(50)

DESCRIPCION:

VALORES:

REGLAS:


## Campo: lineasdoc.cantidad
TABLA: lineasdoc
CAMPO: cantidad
TIPO: numeric(19,6)

DESCRIPCION:

VALORES:

REGLAS:


## Campo: lineasdoc.dto
TABLA: lineasdoc
CAMPO: dto
TIPO: numeric(4,1)

DESCRIPCION:

VALORES:

REGLAS:


## Campo: lineasdoc.precio
TABLA: lineasdoc
CAMPO: precio
TIPO: numeric(19,6)

DESCRIPCION:

VALORES:

REGLAS:


## Campo: lineasdoc.iva
TABLA: lineasdoc
CAMPO: iva
TIPO: numeric(4,1)

DESCRIPCION:

VALORES:

REGLAS:


## Campo: lineasdoc.tlinea
TABLA: lineasdoc
CAMPO: tlinea
TIPO: numeric(19,6)

DESCRIPCION:

VALORES:

REGLAS:


## Campo: lineasdoc.precioii
TABLA: lineasdoc
CAMPO: precioii
TIPO: numeric(19,6)

DESCRIPCION:

VALORES:

REGLAS:


## Campo: lineasdoc.tlineaii
TABLA: lineasdoc
CAMPO: tlineaii
TIPO: numeric(19,6)

DESCRIPCION:

VALORES:

REGLAS:


## Campo: lineasdoc.dtogral
TABLA: lineasdoc
CAMPO: dtogral
TIPO: numeric(4,1)

DESCRIPCION:
- Descuento general que se aplica al documento, por defecto según tabla “Cliente”  

VALORES:

REGLAS:


## Campo: lineasdoc.dtopp
TABLA: lineasdoc
CAMPO: dtopp
TIPO: numeric(4,1)

DESCRIPCION:
- Descuento por pronto pago que se aplica al documento, por defecto según tabla “Cliente”  

VALORES:

REGLAS:


## Campo: lineasdoc.cajas
TABLA: lineasdoc
CAMPO: cajas
TIPO: numeric(19,6)

DESCRIPCION:

VALORES:

REGLAS:


## Campo: lineasdoc.unidades
TABLA: lineasdoc
CAMPO: unidades
TIPO: numeric(19,6)

DESCRIPCION:

VALORES:

REGLAS:


## Campo: lineasdoc.sacogranel
TABLA: lineasdoc
CAMPO: sacogranel
TIPO: varchar(1)

DESCRIPCION:

VALORES:

REGLAS:


## Campo: lineasdoc.preciocosto
TABLA: lineasdoc
CAMPO: preciocosto
TIPO: numeric(19,6)

DESCRIPCION:

VALORES:

REGLAS:


## Campo: lineasdoc.precioventa
TABLA: lineasdoc
CAMPO: precioventa
TIPO: numeric(19,6)

DESCRIPCION:

VALORES:

REGLAS:


## Campo: lineasdoc.largo
TABLA: lineasdoc
CAMPO: largo
TIPO: numeric(19,6)

DESCRIPCION:

VALORES:

REGLAS:


## Campo: lineasdoc.ancho
TABLA: lineasdoc
CAMPO: ancho
TIPO: numeric(19,6)

DESCRIPCION:

VALORES:

REGLAS:


## Campo: lineasdoc.alto
TABLA: lineasdoc
CAMPO: alto
TIPO: numeric(19,6)

DESCRIPCION:

VALORES:

REGLAS:


## Campo: lineasdoc.comandacerrada
TABLA: lineasdoc
CAMPO: comandacerrada
TIPO: boolean

DESCRIPCION:

VALORES:

REGLAS:


## Campo: lineasdoc.hora
TABLA: lineasdoc
CAMPO: hora
TIPO: varchar(5)

DESCRIPCION:

VALORES:

REGLAS:


## Campo: lineasdoc.lineafra
TABLA: lineasdoc
CAMPO: lineafra
TIPO: numeric(4)

DESCRIPCION:

VALORES:

REGLAS:


## Campo: lineasdoc.tipotara
TABLA: lineasdoc
CAMPO: tipotara
TIPO: varchar(1)

DESCRIPCION:

VALORES:

REGLAS:


## Campo: lineasdoc.pesotara
TABLA: lineasdoc
CAMPO: pesotara
TIPO: numeric(19,6)

DESCRIPCION:

VALORES:

REGLAS:


## Campo: lineasdoc.transaccion
TABLA: lineasdoc
CAMPO: transaccion
TIPO: varchar(21)

DESCRIPCION:

VALORES:

REGLAS:


## Campo: lineasdoc.numlotei
TABLA: lineasdoc
CAMPO: numlotei
TIPO: varchar(20)

DESCRIPCION:

VALORES:

REGLAS:


## Campo: lineasdoc.numlotep
TABLA: lineasdoc
CAMPO: numlotep
TIPO: varchar(20)

DESCRIPCION:

VALORES:

REGLAS:


## Campo: lineasdoc.fcaduca
TABLA: lineasdoc
CAMPO: fcaduca
TIPO: date

DESCRIPCION:

VALORES:

REGLAS:


## Campo: lineasdoc.servido
TABLA: lineasdoc
CAMPO: servido
TIPO: numeric(19,6)

DESCRIPCION:

VALORES:

REGLAS:


## Campo: lineasdoc.lineapre
TABLA: lineasdoc
CAMPO: lineapre
TIPO: numeric(4)

DESCRIPCION:

VALORES:

REGLAS:


## Campo: lineasdoc.escanda
TABLA: lineasdoc
CAMPO: escanda
TIPO: varchar(13)

DESCRIPCION:

VALORES:

REGLAS:


## Campo: lineasdoc.tkilos
TABLA: lineasdoc
CAMPO: tkilos
TIPO: numeric(8,3)

DESCRIPCION:

VALORES:

REGLAS:


## Campo: lineasdoc.lnomprima
TABLA: lineasdoc
CAMPO: lnomprima
TIPO: boolean

DESCRIPCION:

VALORES:

REGLAS:


## Campo: lineasdoc.tipomov
TABLA: lineasdoc
CAMPO: tipomov
TIPO: varchar(3)

DESCRIPCION:

VALORES:

REGLAS:


## Campo: lineasdoc.numetiq
TABLA: lineasdoc
CAMPO: numetiq
TIPO: numeric(6)

DESCRIPCION:

VALORES:

REGLAS:


## Campo: lineasdoc.tipoetiq
TABLA: lineasdoc
CAMPO: tipoetiq
TIPO: varchar(1)

DESCRIPCION:

VALORES:

REGLAS:

