// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//
//	ImpDocDet.rpt
//	Nombre del reporte en el sistema: Impresión de documentos detallado.
//
//  Sistema: AdminPAQ v1.1
// 
//	Este reporte perteneciente al módulo de ventas y compras, imprime
//  un listado de documentos para un rango de fechas dado. Además de los datos
//  del documento, se listan los movimientos del documento y opcionalmente,
//  las características y componentes de paquetes de productos.
//
//	Consideraciones especiales:
//  
//	Elaboró:    Eduardo Pérez Figueroa
//	Fecha: 	    03 de Julio del 2001.
//
//  Historia de revisiones:
//	Autor:
//	Fecha:
//
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<


// *****************************************************************************
// Funciones de librería

Incluye LibAdminPAQ.Rpt


// *****************************************************************************
//	Parámetros del reporte:

Parametro pFechaInicial = '20010701'    // Fecha inicial del rango
Parametro pFechaFinal = '20010731'      // Fecha final del rango
Parametro pDocumentoDe = 4              // Documentos a imprimir
                                        // Ventas:
                                        // Cotizaciones (1)
                                        // Pedidos (2)
                                        // Remisiones (3)
                                        // Facturas (4)
                                        // Devoluciones s/venta (5)
                                        // Devoluciones de remisión (6)
                                        // Compras:
                                        // Ordenes de compra (17)
                                        // Productos en consignación (18)
                                        // Compras (19)
                                        // Devoluciones al proveedor (20)
                                        // Devoluciones de consignación (21)
Parametro pImprimirDocumentos = 1       // Documentos a imprimir:
                                        // 0 = Todos
                                        // 1 = Documentos afectados
                                        // 2 = Documentos sin afectar
Parametro pImprimirCancelados = 1       // Imprimir documentos cancelados
                                        // 0 = No incluir cancelados
                                        // 1 = Incluir cancelados
Parametro pCaracteristicas = 1          // Imprimir características de productos
                                        // 0 = No imprimir características
                                        // 1 = Imprimir características
Parametro pComponentes = 1              // Imprimir componentes de paquetes de productos
                                        // 0 = No imprimir componentes
                                        // 1 = Imprimir componentes


// *****************************************************************************
//	Tablas a utilizar e Indices de búsqueda por omisión

UsaEmpresa tEmpresa;'ADMINPAQW'                   // Parámetros

UsaTabla tProducto = tEmpresa['MGW10005']         // Productos
tProducto.Usaindice['']                           // Indice primario: cIdProducto

UsaTabla tComponente = tEmpresa['MGW10005']       // Productos (componentes)
tComponente.Usaindice['']                         // Indice primario: cIdProducto

UsaTabla tDetalleProducto = tEmpresa['MGW10004']  // Productos
tDetalleProducto.Usaindice['']                    // Indice primario: cIdProducto

UsaTabla tDocumento = tEmpresa['MGW10008']        // Documentos
tDocumento.Usaindice['iDocumentoDeFechaSerieFol'] // cIdDocumentoDe+cFecha+cSerie+cFolio

UsaTabla tMovimiento = tEmpresa['MGW10010']       // Movimientos
tMovimiento.Usaindice['iDoctoNumeroMovto']        // cIdDocumento+cNumeroMovimiento

UsaTabla tMovimientoOculto = tEmpresa['MGW10010'] // Movimientos
tMovimientoOculto.Usaindice['cIdMovtoOwner']      // cIdMovtoOwner

UsaTabla tMoneda = tEmpresa['MGW10034']           // Monedas
tMoneda.Usaindice['']                             // Indice primario: cIdMoneda

UsaTabla tUnidad = tEmpresa['MGW10026']           // Unidades de peso y medida
tUnidad.Usaindice['']                             // Indice primario: cIdUnidad

UsaTabla tConcepto = tEmpresa['MGW10006']         // Conceptos de documentos
tConcepto.Usaindice['']                           // Indice primario: cIdConceptoDocumento

UsaTabla tClienteProveedor = tEmpresa['MGW10002'] // Clientes/Proveedores
tClienteProveedor.Usaindice['']                   // Indice primario: cIdClienteProveedor

UsaTabla tAgente = tEmpresa['MGW10001']           // Agentes
tAgente.Usaindice['']                             // Indice primario: cIdAgente

UsaTabla tCaracteristica = tEmpresa['MGW10021']       // Características
tCaracteristica.Usaindice['']                         // Indice primario: cIdPadreCaracteristica

UsaTabla tValorCaracteristica = tEmpresa['MGW10022']  // Valores de características
tValorCaracteristica.Usaindice['']                    // Indice primario: cIdValorCaracteristica

UsaTabla tParametros = tEmpresa['MGW10000']       // Parámetros de la empresa
tParametros.Usaindice['']                         // Indice primario: cIdEmpresa


// *****************************************************************************
// Definiciones y asumidos globales para el reporte

// Ancho de columnas = caracteres / 17 * 2.54
// Se consideran columnas intermedias de un espacio
// *** Encabezado del documento ***
// C0 (Fecha) = 11 caracteres
// C2 (Serie) = 5 caracteres
// C4 (Folio) = 8 caracteres
// C6 (Concepto) = 25 caracteres
// C8 (Cliente/Proveedor) = 14 caracteres
// C10 (Moneda) = 10 caracteres
// C12 (Tipo de cambio) = 10 caracteres
// C14 (Agente) = 19 caracteres
// C16 (Estado) = 14 caracteres
// *** Movimientos del documento ***
// C0 (Código del producto) = 14 caracteres
// C2 (Nombre) = 37 caracteres
// C4 (Cantidad) = 10 caracteres
// C6 (Unidad de medida o peso) = 3 caracteres
// C8 (Precio) = 10 caracteres
// C10 (Neto) = 10 caracteres
// C12 (Descuento) = 9 caracteres
// C14 (Impuesto) = 9 caracteres
// C16 (Total) = 14 caracteres
Columnas 18;1.64,0.15,0.75,0.15,1.20,0.15,3.74,0.15,2.09,0.15,1.49,0.15,1.49,0.15,2.84,0.15,2.09,0.15

Usaletra 'Arial'
Altura 9


// *****************************************************************************
//	Variables de ámbito global:

gIdioma = 0             // Idioma del reporte
                        // 0 = Español
                        // 1 = Inglés
gDecimalesUnidades = 2      // Número de decimales en unidades
gDecimalesPrecioVenta = 2   // Número de decimales en precio de venta
gDecimalesMoneda = 2        // Número de decimales en la moneda
gTotalCantidad = 0          // Total cantidad
gTotalNeto = 0              // Total neto
gTotalDescuento = 0         // Total descuentos
gTotalImpuesto = 0          // Total impuestos
gTotalTotal = 0             // Total total documento


// *****************************************************************************
//  fConfiguraDecimales
//
//	Configura el número de decimales de las columnas de importes, basado 
//  en los parámetros de la empresa.
//
//  Parámetros 
//
//  Salidas 
// *****************************************************************************
DefFunc fConfiguraDecimales()

  // Busca el registro de la empresa
  tParametros.Busca Primero
  Si tParametros->Encontro // Si lo encontró
    gDecimalesUnidades = tParametros(cDecimalesUnidades)
    gDecimalesPrecioVenta = tParametros(cDecimalesPrecioVenta)
  FinSi

FinFunc


// *****************************************************************************
//  fImprimeCaracteristicas
//
//	Esta función imprime las características de capturadas del movimiento
//
//  Parámetros 
//
//  Salidas 
// *****************************************************************************
DefFunc fImprimeCaracteristicas(atDetalleProducto: Tabla; atMovimientoOculto: Tabla; aTextoCaracteristicas)
Local vImprime, lValoresCaracteristicas, lTextoCaracteristicas

  vImprime = ' '[C0..C17]
  lValoresCaracteristicas = ' '
  lTextoCaracteristicas = ' '

  // Lee los valores de las características
  // Caracteristica 1
  tValorCaracteristica.Busca[@Str(atDetalleProducto(cIdValorCaracteristica1);0)]
  Si tValorCaracteristica->Encontro
    lValoresCaracteristicas = tValorCaracteristica(cValorCaracteristica)
    // Verifica si leer el nombre de la caracteristica
    Si !aTextoCaracteristicas
      tCaracteristica.Busca[@Str(tValorCaracteristica(cIdPadreCaracteristica);0)]
      Si tCaracteristica->Encontro
        lTextoCaracteristicas = tCaracteristica(cNombreCaracteristica)
      FinSi
    FinSi
  FinSi

  // Caracteristica 2
  tValorCaracteristica.Busca[@Str(atDetalleProducto(cIdValorCaracteristica2);0)]
  Si tValorCaracteristica->Encontro
    lValoresCaracteristicas = lValoresCaracteristicas & '-' & tValorCaracteristica(cValorCaracteristica)
    // Verifica si leer el nombre de la caracteristica
    Si !aTextoCaracteristicas
      tCaracteristica.Busca[@Str(tValorCaracteristica(cIdPadreCaracteristica);0)]
      Si tCaracteristica->Encontro
        lTextoCaracteristicas = lTextoCaracteristicas & '-' & tCaracteristica(cNombreCaracteristica)
      FinSi
    FinSi
  FinSi

  // Caracteristica 3
  tValorCaracteristica.Busca[@Str(atDetalleProducto(cIdValorCaracteristica3);0)]
  Si tValorCaracteristica->Encontro
    lValoresCaracteristicas = lValoresCaracteristicas & '-' & tValorCaracteristica(cValorCaracteristica)
    // Verifica si leer el nombre de la caracteristica
    Si !aTextoCaracteristicas
      tCaracteristica.Busca[@Str(tValorCaracteristica(cIdPadreCaracteristica);0)]
      Si tCaracteristica->Encontro
        lTextoCaracteristicas = lTextoCaracteristicas & '-' & tCaracteristica(cNombreCaracteristica)
      FinSi
    FinSi
  FinSi

  // Imprime características y valores
  // Verifica si se imprime la leyenda 
  Si !aTextoCaracteristicas
    vImprime = @Substr(lTextoCaracteristicas;0;15) & ': ' & @Col(lValoresCaracteristicas;0)[C2]
    // Enciende bandera de que el texto ya fue impreso
    aTextoCaracteristicas = 1
  Sino
    vImprime = '                 ' & @Col(lValoresCaracteristicas;0)[C2]
  FinSi

  // Cantidad
  vImprime = atMovimientoOculto(cUnidadesCapturadas)[C4]
  // Unidad de peso o medida
  tUnidad.Busca[@Str(atMovimientoOculto(cIdUnidad);0)]
  Si tUnidad->Encontro
    vImprime = tUnidad(cDespliegue)[C6]
  FinSi

  Lista vImprime

FinFunc


// *****************************************************************************
//  fImprimeComponente
//
//	Esta función imprime los datos del producto componente del paquete
//
//  Parámetros 
//
//  Salidas 
// *****************************************************************************
DefFunc fImprimeComponente(acIdProducto; atMovimientoOculto: Tabla; aTextoComponentes; aImprimirCantidad)
Local vImprime

  vImprime = ' '[C0..C17]

  // Verifica si se imprime la leyenda 
  Si !aTextoComponentes
    NEGRITAS TRUE
    Texto 'Componentes del paquete:'
    Imprime
    NEGRITAS FALSE
    // Enciende bandera de que el texto ya fue impreso
    aTextoComponentes = 1
  FinSi
  
  // Lee los datos del producto
  tComponente.Busca[@Str(acIdProducto;0)]
  Si tComponente->Encontro
    // Codigo del producto
    // OJO: Falta editar el código del producto
    vImprime = tComponente(cCodigoProducto)[C0]
    // Descripcion del producto  
    vImprime = tComponente(cNombreProducto)[C2]
  FinSi

  // Verifica si se imprime la cantidad y la unidad de medida y peso
  Si aImprimirCantidad
    // Cantidad
    vImprime = atMovimientoOculto(cUnidadesCapturadas)[C4]
    // Unidad de peso o medida
    tUnidad.Busca[@Str(atMovimientoOculto(cIdUnidad);0)]
    Si tUnidad->Encontro
      vImprime = tUnidad(cDespliegue)[C6]
    FinSi
  FinSi

  Lista vImprime

FinFunc


// *****************************************************************************
//  fImprimeDocumento
//
//	Esta función imprime los datos del documento
//
//  Parámetros 
//
//  Salidas 
// *****************************************************************************
DefFunc fImprimeDocumento(atDocumento: Tabla)
Local vImprime, lFechaEditada

  // Redefine el ancho de las columnas para el documento
  Columnas 18;1.64,0.15,0.75,0.15,1.20,0.15,3.74,0.15,2.09,0.15,1.49,0.15,1.49,0.15,2.84,0.15,2.09,0.15
  [C12].Coma
  [C2,C4].Decimales 0
  [C2,C4].Blanco ''
  NEGRITAS TRUE
  // Imprime los textos del encabezado
  Texto C0;'Fecha'
  Texto C2;'Serie'
  Texto C4;'Folio'
  Texto C6;'Concepto'
  // Si el reporte es de ventas
  Si pDocumentoDe >= 1 y pDocumentoDe <= 6
    Texto C8;'Cliente'
  Sino // entonces es un reporte de compras
    Texto C8;'Proveedor'
  FinSi
  Texto C10;'Moneda'
  Texto C12;'^T.C.'
  // Si el reporte es de ventas
  Si pDocumentoDe >= 1 y pDocumentoDe <= 6
    Texto C14;'Agente'
  FinSi
  Texto C16;'Estado'
  Imprime
	Texto '@TC{0,0,0}@L{-1}'
	NEGRITAS FALSE
	Imprime
  vImprime = ' '[C0..C17]

  // Fecha del documento
  lFechaEditada = fFormateaFecha(atDocumento(cFecha); gIdioma)
  vImprime = lFechaEditada[C0]
  // Serie
  vImprime = atDocumento(cSerieDocumento)[C2]
  // Folio
  vImprime = atDocumento(cFolio)[C4]
  // lee el concepto del documento
  tConcepto.Busca[@Str(atDocumento(cIdConceptoDocumento);0)]
  Si tConcepto->Encontro
    vImprime = tConcepto(cNombreConcepto)[C6]
  FinSi
  // Lee el cliente o proveedor
  tClienteProveedor.Busca[@Str(atDocumento(cIdClienteProveedor);0)]
  Si tClienteProveedor->Encontro
    // OJO: Falta editar el código del cliente/proveedor
    vImprime = tClienteProveedor(cCodigoCliente)[C8]
  FinSi
  // Moneda
  tMoneda.Busca[@Str(atDocumento(cIdMoneda);0)]
  Si tMoneda->Encontro
    vImprime = tMoneda(cNombreMoneda)[C10]
    // Configura los decimales para tipo de cambio
    [C12].Decimales tMoneda(cDecimalesMoneda)
    // Guarda el número de decimales de la moneda
    gDecimalesMoneda = tMoneda(cDecimalesMoneda)
  Sino
    [C12].Decimales 2
    gDecimalesMoneda = 2
  FinSi
  // Tipo de cambio
  vImprime = atDocumento(cTipoCambio)[C12]
  // Agente
  // Si el reporte es de ventas
  Si pDocumentoDe >= 1 y pDocumentoDe <= 6
    tAgente.Busca[@Str(atDocumento(cIdAgente);0)]
    Si tAgente->Encontro
      // OJO: Falta editar el código del agente
      vImprime = tAgente(cCodigoAgente)[C14]
    FinSi
  FinSi

// *** Esta sección no funciona con la versión 1.04 alfa ***
// pues los campos cCancelado y cAfectado no existen.
// Al agregarse éstos campos en lugar del campo cEstado,
// deberá de habilitarse éste código comentariado
  // Estado del documento
//  Si atDocumento(cCancelado)
//    vImprime = 'Cancelado'[C16]
//  Sino
//    Si !atDocumento(cAfectado)
//      vImprime = 'Sin afectar'[C16]
//    Sino
//      vImprime = 'Afectado'[C16]
//    FinSi
//  FinSi

// *** Esta sección es provisional ***
// pues el campo cAfectado será sustituido por los campos cCancelado y cAfectado
  Si atDocumento(cEstado) = 4
    vImprime = 'Cancelado'[C16]
  Sino
    Si atDocumento(cEstado) = 1
      vImprime = 'Sin afectar'[C16]
    Sino
      vImprime = 'Afectado'[C16]
    FinSi
  FinSi

  Lista vImprime
  Saltalin
  
FinFunc


// *****************************************************************************
//  fImprimeEncabezadoMovimiento
//
//	Esta función imprime los datos del encabezado del movimiento.
//
//  Parámetros 
//
//  Salidas 
// *****************************************************************************
DefFunc fImprimeEncabezadoMovimiento()

  // redefine el ancho de las columnas
  Columnas 18;2.09,0.15,5.53,0.15,1.49,0.15,0.45,0.15,1.49,0.15,1.49,0.15,1.34,0.15,1.34,0.15,2.09,0.15
  [C4,C8,C10,C12,C14,C16].Coma
  // Configura el número de decimales por columna
  [C4].Decimales gDecimalesUnidades
  [C8].Decimales gDecimalesPrecioVenta
  [C10,C12,C14,C16].Decimales gDecimalesMoneda
  NEGRITAS TRUE
  // Imprime los textos del encabezado
  Texto C0;'Código'
  Texto C2;'Nombre (Producto)'
  Texto C4;'^Cantidad'
  Texto C8;'^Precio'
  Texto C10;'^Neto'
  Texto C12;'^Descuento'
  Texto C14;'^Impuesto'
  Texto C16;'^Total'
  Imprime
	Texto '@TC{0,0,0}@L{-1}'
	NEGRITAS FALSE
	Imprime

FinFunc


// *****************************************************************************
//  fImprimeMovimiento
//
//	Esta función imprime los datos de un movimiento.
//
//  Parámetros 
//
//  Salidas 
// *****************************************************************************
DefFunc fImprimeMovimiento(atMovimiento: Tabla; atProducto: Tabla)
Local vImprime, lDescuento, lImpuesto

  vImprime = ' '[C0..C17]

  // Codigo del producto
  // OJO: Falta editar el código del producto
  vImprime = atProducto(cCodigoProducto)[C0]
  // Descripcion del producto  
  vImprime = atProducto(cNombreProducto)[C2]
  // Cantidad
  vImprime = atMovimiento(cUnidadesCapturadas)[C4]
  // Acumula al total del documento
  gTotalCantidad = gTotalCantidad + atMovimiento(cUnidadesCapturadas)
  // Unidad de peso o medida
  Si atMovimiento(cIdUnidad)
    tUnidad.Busca[@Str(atMovimiento(cIdUnidad);0)]
    Si tUnidad->Encontro
      vImprime = tUnidad(cDespliegue)[C6]
    FinSi
  FinSi
  // Precio
  vImprime = atMovimiento(cPrecio)[C8]
  // Neto
  vImprime = atMovimiento(cNeto)[C10]
  // Acumula al total del documento
  gTotalNeto = gTotalNeto + atMovimiento(cNeto)
  // Descuento
  lDescuento = atMovimiento(cDescuento1) + atMovimiento(cDescuento2) + atMovimiento(cDescuento3) + atMovimiento(cDescuento4) + atMovimiento(cDescuento5)
  vImprime = @Col(lDescuento;0)[C12]
  // Acumula al total del documento
  gTotalDescuento = gTotalDescuento + lDescuento
  // Impuesto
  lImpuesto = atMovimiento(cImpuesto1) + atMovimiento(cImpuesto2) + atMovimiento(cImpuesto3)
  vImprime = @Col(lImpuesto;0)[C14]
  // Acumula al total del documento
  gTotalImpuesto = gTotalImpuesto + lImpuesto
  // Total
  vImprime = atMovimiento(cTotal)[C16]
  // Acumula al total del documento
  gTotalTotal = gTotalTotal + atMovimiento(cTotal)

  Lista vImprime  

FinFunc


// *****************************************************************************
//  fImprimeTotales
//
//	Esta función imprime los totales del documento.
//
//  Parámetros 
//
//  Salidas 
// *****************************************************************************
DefFunc fImprimeTotales(aTotalCantidad; aTotalNeto; aTotalDescuento; aTotalImpuesto; aTotalTotal)
Local vImprime

	Texto C4;'@L{4}'
	Texto C10;'@L{10}'
	Texto C12;'@L{12}'
	Texto C14;'@L{14}'
	Texto C16;'@L{16}'
	Imprime
  
  vImprime = ' '[C0..C17]
  vImprime = @Col(aTotalCantidad;0)[C4]
  vImprime = @Col(aTotalNeto;0)[C10]
  vImprime = @Col(aTotalDescuento;0)[C12]
  vImprime = @Col(aTotalImpuesto;0)[C14]
  vImprime = @Col(aTotalTotal;0)[C16]
  Lista vImprime
  Saltalin 2
FinFunc


// *****************************************************************************
//  fProcesaMovimientosOcultos
//
//	Esta función lee los movimientos ocultos para desplegar caracteristicas
//  o paquetes de productos.
//
//  Parámetros 
//
//  Salidas 
// *****************************************************************************
DefFunc fProcesaMovimientosOcultos(atMovimiento: Tabla; atProducto: Tabla)
Local lTextoComponentes, lTextoCaracteristicas, lComponente

  // Inicializa los valores de las banderas de textos
  lTextoComponentes = 0 // No se ha impreso el texto "Componentes del paquete"
  lTextoCaracteristicas = 0 // No se ha impreso el texto "Características"
  lComponente = 0 // No se ha impreso el componente que tiene características

  // Busca los movimientos ocultos del movimiento
  Mientras [ tMovimientoOculto.Busca[@Str(atMovimiento(cIdMovimiento);0)]; tMovimientoOculto->Encontro; tMovimientoOculto.Busca Siguiente[1] ]
    // Verifica si el documento es una remisión o una devolución de remisiones (clientes)
    // En este caso al ser un traspaso entre almacenes, tenemos que discriminar uno de los movimientos ocultos
    Si pDocumento = 3 // Si es una remisión
      // Discrimina los movimientos de Entrada
      Si atMovimiento(cAfectaExistencia) = 1
        Continua
      FinSi
    FinSi
    Si pDocumento = 6 // Si es una devolución de remisión
      // Discrimina los movimientos de Salida
      Si atMovimiento(cAfectaExistencia) = 2
        Continua
      FinSi
    FinSi

    // Busca el producto del movimiento de detalle
    tDetalleProducto.Busca[@Str(tMovimientoOculto(cIdProducto);0)]
    SI !tDetalleProducto->Encontro
      Continua
    FinSi

    // Si el producto tiene componentes
    Si atProducto(cTipoProducto) = 2    
      // Si se solicitó imprimir componentes
      Si pComponentes
        // Si el movimiento oculto pertenece a un producto (componente del paquete)
        Si tDetalleProducto(cTipoProducto) = 0
          // Imprime el componente
          fImprimeComponente(tMovimientoOculto(cIdProducto); tMovimientoOculto; &lTextoComponentes; 1)
        Sino // El movimiento oculto pertenece a un detalle de características del componente del paquete
          // Imprime el componente
          // Siempre y cuando no haya ya sido impreso
          Si !lComponente
            fImprimeComponente(tMovimientoOculto(cIdProductoPadre); tMovimientoOculto; &lTextoComponentes; 0)
            lComponente = 1
          FinSi
          // Si se solicitó imprimir características
          Si pCaracteristicas
            // Imprime la característica
            fImprimeCaracteristicas(tDetalleProducto; tMovimientoOculto; &lTextoCaracteristicas)
          Sino // No tiene caso seguir buscando características del componente
            FinCiclo
          FinSi // Si pCaracteristicas
        FinSi // Si tDetalleProducto(cTipoProducto) = 0
      FinSi // Si pComponentes
    Sino // El producto tiene características
      // Si se solicitó imprimir características
      Si pCaracteristicas
        fImprimeCaracteristicas(tDetalleProducto; tMovimientoOculto; &lTextoCaracteristicas)
      FinSi
    FinSi
  FinMientras
FinFunc


// *****************************************************************************
//  fProcesaMovimientos
//
//	Esta función lee los movimientos de un documento.
//
//  Parámetros 
//
//  Salidas 
// *****************************************************************************
DefFunc fProcesaMovimientos(atDocumento: Tabla)

  // Primero imprime el encabezado del movimiento
  fImprimeEncabezadoMovimiento()
  // Recupera los movimientos del documento
  Mientras [ tMovimiento.Busca[@Str(atDocumento(cIdDocumento);0)]; tMovimiento->Encontro; tMovimiento.Busca Siguiente[1] ]
    // Lee el producto del movimiento
    tProducto.Busca[@Str(tMovimiento(cIdProducto);0)]
    Si !tProducto->Encontro
      Continua
    FinSi
    // Imprime el movimiento
    fImprimeMovimiento(tMovimiento; tProducto)
    // Si se pidió que se imprimieran características o componentes
    Si pCaracteristicas = 1 o pComponentes = 1
      fProcesaMovimientosOcultos(tMovimiento; tProducto)
    FinSi
  FinMientras
FinFunc


// *****************************************************************************
// Encabezado del reporte

Encab
	Texto '@TC{255,0,0}@S{8}AdminPAQ'
	Hoja '"@TC{0,0,0}@S{8}Hoja: '
	Imprime
	Texto '"@TC{0,0,0}@S{8}Fecha: ' & fFormateaFecha(@Hoy();gIdioma)
  Imprime

	Texto '^@TC{0,0,0}@S{22}' & tEmpresa->Nombre
	Imprime

	Texto '^@TC{0,0,0}@S{16}IMPRESION DE DOCUMENTOS DETALLADO'
	Imprime
	Texto '^@TC{0,0,0}@S{16}ORDENADO POR FECHA'
	Imprime
	Texto '^@TC{0,0,0}@S{16}Del: ' & fFormateaFecha(pFechaInicial;gIdioma) & ' Al: ' & fFormateaFecha(pFechaFinal;gIdioma)
	Imprime 1

	Color @RGB(0;0;0)
	Altura 9
FinEncab


// *****************************************************************************
// Cuerpo del reporte

// Imprime los parámetros del reporte para verificar los datos de entrada durante
// el proceso de integración de los reportes en la aplicación
// Utiliza la columna C6
vParametro = ' '[C0..C17]
vParametro = 'pFechaInicial: ' & pFechaInicial[C6]
Lista vParametro
vParametro = 'pFechaFinal: ' & pFechaFinal[C6]
Lista vParametro
vParametro = 'pDocumentoDe: ' & pDocumentoDe[C6]
Lista vParametro
vParametro = 'pImprimirDocumentos: ' & pImprimirDocumentos[C6]
Lista vParametro
vParametro = 'pImprimirCancelados: ' & pImprimirCancelados[C6]
Lista vParametro
vParametro = 'pCaracteristicas: ' & pCaracteristicas[C6]
Lista vParametro
vParametro = 'pComponentes: ' & pComponentes[C6]
Lista vParametro
Saltalin

// Configura el número de decimales del reporte
fConfiguraDecimales()

// Obtiene los documentos en el rango de fechas especificado en el reporte
Mientras pFechaInicial <= pFechaFinal  
  // Si encontro algún documento en esa fecha, recupera todos los documentos en esa fecha
  Mientras [tDocumento.Busca[pDocumentoDe & ':' & pFechaInicial]; tDocumento->Encontro; tDocumento.Busca Siguiente[2] ]

// *** Esta sección no funciona con la versión 1.04 alfa ***
// pues los campos cCancelado y cAfectado no existen.
// Al agregarse éstos campos en lugar del campo cEstado,
// deberá de habilitarse éste código comentariado
    // Discrimina documentos según su estado de cancelación
//    Si !pImprimirCancelados y tDocumento(cCancelado) = 1
//      Continua
//    FinSi
    // Discrimina documentos según su estado de afectación
    // Solo aplica para documentos no cancelados
//    Si !tDocumento(cCancelado) y pImprimirDocumentos
//      Si pImprimirDocumentos != @Abs(tDocumento(cAfectado) - 2)
//        Continua
//      FinSi
//    FinSi

// *** Esta sección es provisional ***
// pues el campo cAfectado será sustituido por los campos cCancelado y cAfectado
    // Discrimina documentos según su estado de cancelación
    Si !pImprimirCancelados y tDocumento(cEstado) = 4
      Continua
    FinSi
    // Discrimina documentos según su estado de afectación
    // Solo aplica para documentos no cancelados
    Si tDocumento(cEstado) != 4 y pImprimirDocumentos
      Si (pImprimirDocumentos = 1 y tDocumento(cEstado) != 2) o (pImprimirDocumentos = 2 y tDocumento(cEstado) != 1)
        Continua
      FinSi
    FinSi

    // Inicializa los totales del documento
    gTotalCantidad = 0
    gTotalNeto = 0
    gTotalDescuento = 0
    gTotalImpuesto = 0
    gTotalTotal = 0

    // Imprime el documento
    fImprimeDocumento(tDocumento)
    // Ahora lee sus movimientos
    fProcesaMovimientos(tDocumento)    
    // Imprime el total del documento
    fImprimeTotales(gTotalCantidad; gTotalNeto; gTotalDescuento; gTotalImpuesto; gTotalTotal)
  FinMientras
  // Busca en la siguiente fecha
  pFechaInicial = fFechaSiguiente(pFechaInicial)
FinMientras

