// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//	Nombre del reporte en el sistema: Impresión de documentos.
//
//  Sistema: AdminPAQ v1.1
// 
//	Este reporte perteneciente al módulo de ventas y compras, imprime un listado de documentos y en 
//  la modalidad de impresión detallada, se listan los movimientos del documento y opcionalmente,
//  las características y componentes de paquetes de productos.
//
//	Consideraciones especiales:
//  La impresión de documentos tiene múltiples variantes, a saber:
//    Ventas:
//      1. Impresión de documentos ordenado por fecha
//      2. Impresión de documentos detallado ordenado por fecha
//      3. Impresión de documentos ordenado por serie-folio
//      4. Impresión de documentos detallado ordenado por serie-folio
//      5. Impresión de documentos agrupados por cliente ordenado por fecha
//      6. Impresión de documentos detallado agrupados por cliente ordenado por fecha
//      7. Impresión de documentos agrupados por agente ordenado por fecha
//      8. Impresión de documentos detallado agrupados por agente ordenado por fecha
//      9. Impresión de documentos agrupados por concepto ordenado por fecha
//      10.Impresión de documentos detallado agrupados por concepto ordenado por fecha
//
//  *** Se consideraron los siguientes reportes para Punto de Venta:
//      11.Impresión de Notas de Venta ordenado por fecha
//      12.Impresión de Notas de Venta detallado ordenado por fecha
//      13.Impresión de Notas de Venta ordenado por serie-folio
//      14.Impresión de Notas de Venta detallado ordenado por serie-folio
//      15.Impresión de Notas de Venta agrupados por cliente ordenado por fecha
//      16.Impresión de Notas de Venta detallado agrupados por cliente ordenado por fecha
//
//      17.Impresión de Devoluciones de Notas de Venta ordenado por fecha
//      18.Impresión de Devoluciones de Notas de Venta detallado ordenado por fecha
//      19.Impresión de Devoluciones de Notas de Venta agrupados por cliente ordenado por fecha
//      20.Impresión de Devoluciones de Notas de Venta detallado agrupados por cliente ordenado por fecha
//
//      Autor: Roberto Del Alto Torres
//      Fecha: 26 de Marzo del 2003.
//  ***
//    Compras:
//      1. Impresión de documentos ordenado por fecha
//      2. Impresión de documentos detallado ordenado por fecha
//      3. Impresión de documentos ordenado por serie-folio
//      4. Impresión de documentos detallado ordenado por serie-folio
//      5. Impresión de documentos agrupados por proveedor ordenado por fecha
//      6. Impresión de documentos detallado agrupados por proveedor ordenado por fecha
//      9. Impresión de documentos agrupados por concepto ordenado por fecha
//      10.Impresión de documentos detallado agrupados por concepto ordenado por fecha
//  
//	Elaboró:    Eduardo Pérez Figueroa
//	Fecha: 	    03 de Julio del 2001.
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Historia de modificaciones
//  Fecha      Nombre   IDLotus                     Descripcion
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// 23/05/2007		ELVS		N.C.146			Se agrega documento modelo cotización del proveedor.
// 13/05/2009   ELVS    N.D.5789    ERROR EN EL TOTAL DEL IMPUESTO Y POR ENDE EL TOTAL GENERAL EN
//                                  LOS REPORTES DE NOTAS DE VENTA ORDENADOS POR FECHA, POR SERIE Y FOLIO 
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

// *************************************************************************************************
// Funciones de librería
// *************************************************************************************************
Incluye LibAdminPAQ.Rpt

// *************************************************************************************************
//	Parámetros del reporte:
// *************************************************************************************************
Parametro pFechaInicial   = '20100801'  // Fecha inicial del rango
Parametro pFechaFinal     = '20100830'  // Fecha final del rango
Parametro pSerie          = ' '         // Serie del documento (única)
Parametro pFolioInicial   =   1         // Folio inicial del rango
Parametro pFolioFinal     = 999         // Folio final del rango
Parametro pDocumentoDe    =  0         // 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)
                                        // Notas de Venta (35)
                                        // Devoluciones de Notas de Venta (36)
																				// Cotización del Proveedor (38) //N.C.146
Parametro pCteProvInicial     = ' '     // Cliente inicial del rango (' ' = Primero)
Parametro pCteProvFinal       = ' '     // Cliente final del rango (' ' = Último)
Parametro pAgenteInicial      = ' '     // Agente inicial del rango (' ' = Primero)
Parametro pAgenteFinal        = ' '     // Agente final del rango (' ' = Último)
Parametro pIdConcepto         = ' '     // Rango discontinuo de conceptos separados por coma
Parametro pImprimirDocumentos = 0       // 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
Parametro pTipoReporte        = 5       // Tipo de reporte de ventas o compras:
                                        // 1 = Ordenado por fecha
                                        // 2 = Ordenado por serie-folio
                                        // 3 = Agrupado por cliente o proveedor
                                        // 4 = Agrupado por agente
                                        // 5 = Agrupado por concepto
Parametro pDetallado          = 1       // Reporte detallado o concentrado
                                        // 0 = Concentrado 
                                        // 1 = Detallado
Parametro pVentas             = 1       // Indica si el reporte es de ventas o de compras
                                        // 0 = Compras
                                        // 1 = Ventas


// *************************************************************************************************
//	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 tDetalleProducto = tEmpresa['MGW10004']  // Productos
tDetalleProducto.Usaindice['']                    // Indice primario: cIdProducto

UsaTabla tDocumento = tEmpresa['MGW10008']        // Documentos
tDocumento.Usaindice['iDocumentoDeFechaSerieFol'] // cIdDocumentoDe+cFecha+cSerie+cFolio
                                                  // iDoctoDeSerieFolio: cIdDocumentoDe+cSerie+cFolio
                                                  // iDocumentoDeClienteFecha: cIdDocumentoDe+cIdCliente+cFecha+cSerie+cFolio
                                                  // iDocumentoDeAgenteFecha: cIdDocumentoDe+cIdAgente+cFecha+cSerie+cFolio
                                                  // iConceptoFecha: cIdConcepto+cFecha+cSerie+cFolio

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

UsaTabla tMovimientoOculto = tEmpresa['MGW10010'] Alias 'MovtoOculto' // Movimientos
tMovimientoOculto.Usaindice['iMovtoOwnerAfectaExist']      // cIdMovtoOwner+cAfectaExistencias

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
// *************************************************************************************************
Columnas 18;5,0

// 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,2.09,0.15,2.09,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
gMascarillaProducto = ''  // Mascarilla para el código del producto
gMascarillaAgente = ''    // Mascarilla para el código del agente
gMascarillaClientes = ''  // Mascarilla para el código del cliente/proveedor

gIndiceTotalGeneral = 0   // Indice de la hoja de trabajo para acumular el total general
gIndiceTotalOtro = 10     // Indice de la hoja de trabajo para acumular otros totales
gTotalDoctosGral = 0      // Total de documentos impresos
gTotalMovtosGral = 0      // Total de movimientos impresos
gTotalDoctosOtro = 0      // Total de documentos impresos
gTotalMovtosOtro = 0      // Total de movimientos impresos
gMonedasMaximo = 10       // Diez monedas máximo por acumular

gTotalImpuestos = 0.0     // Aplica a Docto. Sop. 35 y 36. Si y solo si el IVA es el primer impuesto. Representa el acumulado de IVA de todos los Movtos.
gTotalDocumentos = 0.0    // Aplica a Docto. Sop. 35 y 36. Si y solo si el IVA es el primer impuesto. Representa el acumulado de cTotal calculado de todos los Doctos.
gBanImprimeGranTotal = 0

gTotalImpuestosOtro = 0.0 // Total de Impuestos por Bloques.
gTotalOtro = 0.0          // Total de Documentos por Bloques.


// *************************************************************************************************
// Función área sensible al contexto
// *************************************************************************************************
// =================================================================================================
DefFunc ContextoDetalleDocumento(aNumeroColumna; aValor)
    EJECUTA tEmpresa->SysDirDatos & '\Reportes\AdminPAQ\ImpDoctos.RTW';@Escoge(aValor;0),@Escoge(aValor;0),@Escoge(aValor;1),@Escoge(aValor;2),@Escoge(aValor;2),@Escoge(aValor;3),pCteProvInicial,pCteProvFinal,pAgenteInicial,pAgenteFinal,pIdConcepto,0,pImprimirCancelados,1,1,2,1,pVentas;tEmpresa->Directorio
    
FinFunc


// *************************************************************************************************
//	Busca el Id de la moneda en la hoja de trabajo para acumulados de totales,
//  si lo encuentra regresa el índice de la hoja de trabajo, sino, lo dá de 
//  alta y regresa el índice.
//  Parámetros 
//  Salidas 
// *************************************************************************************************
DefFunc fBuscaMonedaIndice(atDocumento: Tabla)
Local lIndice, lIndiceOtro

  lIndice = 0[C0]
  Mientras lIndice < gMonedasMaximo
    Si @Col({lIndice};0) = 0 // El registro está vacío?
      // Lo dá de alta
      Si pTipoReporte = 5 
        // la llave de busqueda sera documento modelo y moneda en vez de solo moneda 
        {lIndice}[0] = atDocumento(cIdDocumentoDe)
        {lIndice}[1] = atDocumento(cIdMoneda) 
        lIndiceOtro = lIndice + gMonedasMaximo
        {lIndiceOtro}[0] = atDocumento(cIdDocumentoDe)
        {lIndiceOtro}[1] = atDocumento(cIdMoneda)
      Sino
        {lIndice}[0] = atDocumento(cIdMoneda)
        lIndiceOtro = lIndice + gMonedasMaximo
        {lIndiceOtro}[0] = atDocumento(cIdMoneda)
      FinSi 
      FinCiclo
    FinSi
    Si pTipoReporte = 5    
      Si @Col({lIndice};0) = atDocumento(cIdDocumentoDe) Y @Col({lIndice};1) = atDocumento(cIdMoneda) // Encontró la documentomodelo?
        lIndiceOtro = lIndice + gMonedasMaximo
        {lIndiceOtro}[0] = atDocumento(cIdMoneda)
        FinCiclo
      FinSi
    Sino
      Si @Col({lIndice};0) = atDocumento(cIdMoneda) // Encontró la moneda?
         lIndiceOtro = lIndice + gMonedasMaximo
         {lIndiceOtro}[0] = atDocumento(cIdMoneda)
         FinCiclo
      FinSi
    FinSi
    // Continúa buscando
    lIndice = lIndice + 1[C0]
  FinMientras
  Retorna lIndice
FinFunc

// *************************************************************************************************
//	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)
    gMascarillaProducto = tParametros(cMascarillaProducto) // mascarilla para el código del producto
    gMascarillaAgente = tParametros(cMascarillaAgente) // mascarilla para el código del agente
    gMascarillaClientes = tParametros(cMascarillaClientes) // mascarilla para el código del cliente/proveedor
  FinSi
FinFunc


// *************************************************************************************************
//	Esta función verifica el estado de cancelación y afectación del documento,
//  y así determinar si se imprime o no el documento.
//  Parámetros 
//  Salidas 
//    0 = Imprimir el documento (No discriminarlo)
//    1 = No imprimir el documento (Si discriminarlo)
// *************************************************************************************************
DefFunc fDiscriminaDocumento(atDocumento: Tabla)
  // Discrimina documentos según su estado de cancelación
  Si !pImprimirCancelados y atDocumento(cCancelado) = 1
    Retorna 1
  FinSi
  // Discrimina documentos según su estado de afectación
  // Solo aplica para documentos no cancelados
  Si !atDocumento(cCancelado) y pImprimirDocumentos
    Si pImprimirDocumentos != @Abs(atDocumento(cAfectado) - 2)
      Retorna 1
    FinSi
  FinSi
  Retorna 0
FinFunc

// *************************************************************************************************
//	Esta función imprime los datos del agente.
//  Parámetros 
//  Salidas 
// *************************************************************************************************
DefFunc fImprimeAgente(atAgente: Tabla)
Local vImprime, lCodigoEditado

  // Redefine el ancho de las columnas
  // C0 11 caracteres
  // C1 50 caracteres
  Columnas 18; 2.99,7.47,0.15
  vImprime = ' '[C0..C17]
  NEGRITAS TRUE

  vImprime = 'Agente: '[C0]
  lCodigoEditado = fMascarilla(tAgente(cCodigoAgente); gMascarillaAgente)
  vImprime = @Col(lCodigoEditado;0)[C1]
  Lista vImprime
  
  vImprime = 'Nombre: '[C0]
  vImprime = atAgente(cNombreAgente)[C1]
  Lista vImprime
  Saltalin
  NEGRITAS FALSE

  // Redefine el ancho de las columnas para el documento
  Si pTipoReporte = 2 // El reporte es ordenado por serie-folio-fecha
    Columnas 18;0.75,0.15,1.20,0.15,1.64,0.15,3.74,0.15,2.09,0.15,2.09,0.15,2.09,0.15,2.84,0.15,2.09,0.15
  Sino // El reporte es ordenado por fecha-serie-folio
    Columnas 18;1.64,0.15,0.75,0.15,1.20,0.15,3.74,0.15,2.09,0.15,2.09,0.15,2.09,0.15,2.84,0.15,2.09,0.15
  FinSi
FinFunc

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

  // Procesa solo si existen valores de características
  Si atDetalleProducto(cIdValorCaracteristica1) o atDetalleProducto(cIdValorCaracteristica2) o atDetalleProducto(cIdValorCaracteristica3)
    vImprime = ' '[C0..C17]
    lValoresCaracteristicas = ' '
    lTextoCaracteristicas = ' '

    // Lee los valores de las características
    // Caracteristica 1
    Si atDetalleProducto(cIdValorCaracteristica1)
      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
    FinSi

    // Caracteristica 2
    Si atDetalleProducto(cIdValorCaracteristica2)
      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
    FinSi

    // Caracteristica 3
    Si atDetalleProducto(cIdValorCaracteristica3)
      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
    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
    Si atMovimientoOculto(cIdUnidad)
      tUnidad.Busca[@Str(atMovimientoOculto(cIdUnidad);0)]
      Si tUnidad->Encontro
        vImprime = tUnidad(cDespliegue)[C6]
      FinSi
    FinSi
    Lista vImprime
  FinSi
FinFunc

// *************************************************************************************************
//	Esta función imprime los datos del cliente o proveedor.
//  Parámetros 
//  Salidas 
// *************************************************************************************************
DefFunc fImprimeCliente(atCliente: Tabla)
Local vImprime, lCodigoEditado

  // Redefine el ancho de las columnas
  // C0 11 caracteres
  // C1 50 caracteres
  Columnas 18; 2.99,7.47,0.15
  vImprime = ' '[C0..C17]
  NEGRITAS TRUE

  Si pVentas
    vImprime = 'Cliente: '[C0]
  Sino
    vImprime = 'Proveedor: '[C0]
  FinSi
  lCodigoEditado = fMascarilla(atCliente(cCodigoCliente); gMascarillaClientes)
  vImprime = @Col(lCodigoEditado;0)[C1]
  Lista vImprime
  
  vImprime = 'Nombre: '[C0]
  vImprime = atCliente(cRazonSocial)[C1]
  Lista vImprime
  Saltalin
  NEGRITAS FALSE

  // Redefine el ancho de las columnas para el documento
  Si pTipoReporte = 2 // El reporte es ordenado por serie-folio-fecha
    Columnas 18;0.75,0.15,1.20,0.15,1.64,0.15,3.74,0.15,2.09,0.15,2.09,0.15,2.09,0.15,2.84,0.15,2.09,0.15
  Sino // El reporte es ordenado por fecha-serie-folio
    Columnas 18;1.64,0.15,0.75,0.15,1.20,0.15,3.74,0.15,2.09,0.15,2.09,0.15,2.09,0.15,2.84,0.15,2.09,0.15
  FinSi
FinFunc

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

  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
  tProducto.Busca[@Str(acIdProducto;0)]
  Si tProducto->Encontro
    // Codigo del producto
    lCodigoEditado = fMascarilla(tProducto(cCodigoProducto); gMascarillaProducto)
    vImprime = @Col(lCodigoEditado;0)[C0]
    // Descripcion del producto  
    vImprime = tProducto(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
    Si atMovimientoOculto(cIdUnidad)
      tUnidad.Busca[@Str(atMovimientoOculto(cIdUnidad);0)]
      Si tUnidad->Encontro
        vImprime = tUnidad(cDespliegue)[C6]
      FinSi
    FinSi
  FinSi
  Lista vImprime
FinFunc

// *************************************************************************************************
//	Esta función imprime los datos del concepto.
//  Parámetros 
//  Salidas 
// *************************************************************************************************
DefFunc fImprimeConcepto(atConcepto: Tabla)
Local vImprime

  // Redefine el ancho de las columnas
  // C0 11 caracteres
  // C1 50 caracteres
  Columnas 18; 2.99,7.47,0.15
  vImprime = ' '[C0..C17]
  NEGRITAS TRUE

  vImprime = 'Concepto: '[C0]
  vImprime = atConcepto(cNombreConcepto)[C1]
  Lista vImprime
  
  Saltalin
  NEGRITAS FALSE

  // Redefine el ancho de las columnas para el documento
  Si pTipoReporte = 2 // El reporte es ordenado por serie-folio-fecha
    Columnas 18;0.75,0.15,1.20,0.15,1.64,0.15,3.74,0.15,2.09,0.15,2.09,0.15,2.09,0.15,2.84,0.15,2.09,0.15
  Sino // El reporte es ordenado por fecha-serie-folio
    Columnas 18;1.64,0.15,0.75,0.15,1.20,0.15,3.74,0.15,2.09,0.15,2.09,0.15,2.09,0.15,2.84,0.15,2.09,0.15
  FinSi
FinFunc

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

  // Redefine el ancho de las columnas para el documento
  Si pTipoReporte = 2 // El reporte es ordenado por serie-folio-fecha
    Columnas 18;0.75,0.15,1.20,0.15,1.64,0.15,3.74,0.15,2.09,0.15,2.09,0.15,2.09,0.15,2.84,0.15,2.09,0.15
  Sino // El reporte es ordenado por fecha-serie-folio
    Columnas 18;1.64,0.15,0.75,0.15,1.20,0.15,3.74,0.15,2.09,0.15,2.09,0.15,2.09,0.15,2.84,0.15,2.09,0.15
  FinSi

  [C8,C10,C12,C14,C16].Coma
  Si pTipoReporte = 2 // El reporte es ordenado por serie-folio-fecha
    [C0,C2].Decimales 0
    [C0,C2].Blanco ''
  Sino
    [C2,C4].Decimales 0
    [C2,C4].Blanco ''
  FinSI

  NEGRITAS TRUE

  // Si el reporte es concentrado, imprime una línea divisoria
  Si !pDetallado
  	Texto '@TC{0,0,0}@L{-1}'
    Imprime
  FinSi

  // Imprime los textos del encabezado
  Si pTipoReporte = 2 // El reporte es ordenado por serie-folio-fecha
    Texto C0;'Serie'
    Texto C2;'^Folio'
    Texto C4;'Fecha'
  Sino
    Texto C0;'Fecha'
    Texto C2;'Serie'
    Texto C4;'^Folio'
  FinSi
  Texto C6;'Concepto'
  // Si el reporte es de ventas
  Si pVentas
    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 pVentas
    Texto C14;'Agente'
  FinSi
  Texto C16;'Estado'
  Imprime

  // Si el reporte es concentrado, imprime los datos adicionales del documento
  Si !pDetallado
    Texto C8;'^Cantidad'
    Texto C10;'^Neto'
    Texto C12;'^Descuento'
    Texto C14;'^Impuesto'
    Texto C16;'^Total'
    Imprime
  FinSi
	Texto '@TC{0,0,0}@L{-1}'
	Imprime
	NEGRITAS FALSE

  // Si el reporte es concentrado, deja una línea en blanco
  Si !pDetallado
  	Saltalin
  FinSi
FinFunc

// *************************************************************************************************
//	Esta función imprime los datos del documento
//  Parámetros 
//  Salidas
// *************************************************************************************************
DefFunc fImprimeDocumento(atDocumento: Tabla; aIndice)
Local vImprime, lFechaEditada, lDescuento, lImpuesto, lCodigoEditado, lIndiceOtro, lSerieDocto, lNetoPV

  vImprime = ' '[C0..C17]

  // Fecha del documento
  lFechaEditada = fFormateaFecha(atDocumento(cFecha); gIdioma)
  DEFREGION ContextoDetalleDocumento
  Si atDocumento(cSerieDocumento) = ''
    lSerieDocto = ' '
  Sino
    lSerieDocto = atDocumento(cSerieDocumento)
  FinSi
  Si pTipoReporte = 2 // El reporte es ordenado por serie-folio-fecha
    // Serie
    vImprime = atDocumento(cSerieDocumento)[C0]
    // Folio
    vImprime = atDocumento(cFolio)[C2]
    Si !pDetallado
      [C2].REGIONINFO atDocumento(cFecha) & ',' & lSerieDocto & ',' & atDocumento(cFolio) & ',' & atDocumento(cIdDocumentoDe)
    FinSi
    // Fecha
    vImprime = @Col(lFechaEditada;0)[C4]
  Sino
    // Fecha
    vImprime = @Col(lFechaEditada;0)[C0]
    // Serie
    vImprime = atDocumento(cSerieDocumento)[C2]
    // Folio
    vImprime = atDocumento(cFolio)[C4]
    Si !pDetallado
      [C4].REGIONINFO atDocumento(cFecha) & ',' & lSerieDocto & ',' & atDocumento(cFolio) & ',' & atDocumento(cIdDocumentoDe)
    FinSi
  FinSi
  // lee el concepto del documento si no ha sido ya leido
  Si pTipoReporte != 5
    tConcepto.Busca[@Str(atDocumento(cIdConceptoDocumento);0)]
    Si tConcepto->Encontro
      vImprime = tConcepto(cNombreConcepto)[C6]
    FinSi
  Sino
    vImprime = tConcepto(cNombreConcepto)[C6]
  FinSi
    
  // Lee el cliente o proveedor si no ha sido ya leido
  Si pTipoReporte != 3
    tClienteProveedor.Busca[@Str(atDocumento(cIdClienteProveedor);0)]
    Si tClienteProveedor->Encontro
      lCodigoEditado = fMascarilla(tClienteProveedor(cCodigoCliente); gMascarillaClientes)
      vImprime = @Col(lCodigoEditado;0)[C8]
    FinSi
  Sino
    lCodigoEditado = fMascarilla(tClienteProveedor(cCodigoCliente); gMascarillaClientes)
    vImprime = @Col(lCodigoEditado;0)[C8]
  FinSi

  // Moneda
  tMoneda.Busca[@Str(atDocumento(cIdMoneda);0)]
  Si tMoneda->Encontro
    vImprime = tMoneda(cNombreMoneda)[C10]
    [C12].Decimales 4
    gDecimalesMoneda = tMoneda(cDecimalesMoneda)
  Sino
    [C12].Decimales 4
    gDecimalesMoneda = 2
  FinSi

  // Tipo de cambio
  vImprime = atDocumento(cTipoCambio)[C12]

  // Agente
  // Si el reporte es de ventas
  Si pVentas
    // Lee el agente si no ha sido ya leido
    Si pTipoReporte != 4
      tAgente.Busca[@Str(atDocumento(cIdAgente);0)]
      Si tAgente->Encontro
        lCodigoEditado = fMascarilla(tAgente(cCodigoAgente); gMascarillaAgente)
        vImprime = @Col(lCodigoEditado;0)[C14]
      FinSi
    Sino
      lCodigoEditado = fMascarilla(tAgente(cCodigoAgente); gMascarillaAgente)
      vImprime = @Col(lCodigoEditado;0)[C14]
    FinSi
  FinSi

  // Estado del documento
  Si atDocumento(cCancelado)
    vImprime = 'Cancelado'[C16]
  Sino
    Si !atDocumento(cAfectado)
      vImprime = 'Sin afectar'[C16]
    Sino
      vImprime = 'Afectado'[C16]
    FinSi
  FinSi

  Lista vImprime

  [C12].Decimales gDecimalesMoneda

  // Si el reporte es concentrado, imprime los datos adicionales del documento
  Si !pDetallado
    // Configura el número de decimales por columna
    [C8].Decimales gDecimalesUnidades
    [C10,C12,C14,C16].Decimales gDecimalesMoneda
    vImprime = ' '[C0..C17]
    // cantidad
    vImprime = atDocumento(cTotalUnidades)[C8]
    // Neto		
		Si tDocumento(Csistorig)!= '101'//N.D.6369
  		vImprime = tDocumento(cNeto)[C10]
		Sino
    	lNetoPV = tDocumento(cNeto) + tDocumento(cDescuen01)
			vImprime  = @Col(lNetoPV;0)[C10]
		FinSi
    // Descuento
    lDescuento = atDocumento(cDescuentoMov)
    vImprime = @Col(lDescuento;0)[C12]
    // Impuesto
    lImpuesto = atDocumento(cImpuesto1) + atDocumento(cImpuesto2) + atDocumento(cImpuesto3)
    vImprime = @Col(lImpuesto;0)[C14]
    // Total
    vImprime = atDocumento(cTotal)[C16]

    Lista vImprime

    Si !atDocumento(cCancelado)   //Si no esta cancelado
      // acumula a totales generales y otros totales
      lIndiceOtro = aIndice + gMonedasMaximo
      {aIndice} = {aIndice} + atDocumento(cTotalUnidades)[C8]     
      {lIndiceOtro} = {lIndiceOtro} + atDocumento(cTotalUnidades)[C8]     

      Si tDocumento(Csistorig)!= '101'//N.D.6369
  			{aIndice} = {aIndice} + atDocumento(cNeto)[C10]
        {lIndiceOtro} = {lIndiceOtro} + atDocumento(cNeto)[C10]
		  Sino
				{aIndice} = {aIndice} + tDocumento(cDescuen01) + tDocumento(cNeto)[C10] 
        {lIndiceOtro} = {lIndiceOtro} + tDocumento(cDescuen01) + tDocumento(cNeto)[C10]	
		  FinSi

      {aIndice} = {aIndice} + atDocumento(cDescuentoMov)[C12]
      {lIndiceOtro} = {lIndiceOtro} + atDocumento(cDescuentoMov)[C12]
      {aIndice} = {aIndice} + @Col(lImpuesto;0)[C14]
      {lIndiceOtro} = {lIndiceOtro} + @Col(lImpuesto;0)[C14]
      {aIndice} = {aIndice} + atDocumento(cTotal)[C16]
      {lIndiceOtro} = {lIndiceOtro} + atDocumento(cTotal)[C16] 
    FinSi

  FinSi

  // Deja un renglón en blanco, siempre que el reporte sea detallado
  Si pDetallado
    Saltalin
  FinSi
  
  Si !atDocumento(cCancelado)   //Si no esta cancelado
    // acumula al total de documentos impresos
    gTotalDoctosGral = gTotalDoctosGral + 1
    gTotalDoctosOtro = gTotalDoctosOtro + 1
  FinSi
FinFunc

// *************************************************************************************************
//	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,2.09,0.15,0.45,0.15,2.09,0.15,2.09,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

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

  vImprime = ' '[C0..C17]

  Si atProducto(cIdProducto) != 0
    // Codigo del producto
    lCodigoEditado = fMascarilla(atProducto(cCodigoProducto); gMascarillaProducto)
    vImprime = @Col(lCodigoEditado;0)[C0]
    // Descripcion del producto  
    vImprime = atProducto(cNombreProducto)[C2]
    // Cantidad
    vImprime = atMovimiento(cUnidadesCapturadas)[C4]
    // Unidad de peso o medida
    Si atMovimiento(cIdUnidad)
      tUnidad.Busca[@Str(atMovimiento(cIdUnidad);0)]
      Si tUnidad->Encontro
        vImprime = tUnidad(cDespliegue)[C6]
      FinSi
    FinSi
    // Precio   
     Si tDocumento(Csistorig)!= '101'//N.D.6369
      vImprime = atMovimiento(cPrecioCapturado)[C8]
     Sino
      lPrecioPV = atMovimiento(cPrecioCapturado) + atMovimiento(cDescuento1) + atMovimiento(cDescuento2) + atMovimiento(cDescuento3) + atMovimiento(cDescuento4) + atMovimiento(cDescuento5)
      vImprime = @Col(lPrecioPV;0)[C8]
     FinSi
  FinSi
  // Neto  
	Si tDocumento(Csistorig)!= '101' //N.D.6369   
  	vImprime = atMovimiento(cNeto)[C10]    
	Sino    
    lNetoPV  = atMovimiento(cNeto) + atMovimiento(cDescuento1) + atMovimiento(cDescuento2) + atMovimiento(cDescuento3) + atMovimiento(cDescuento4) + atMovimiento(cDescuento5)
		vImprime = @Col(lNetoPV;0)[C10]    
	Finsi
  // Descuento
  lDescuento = atMovimiento(cDescuento1) + atMovimiento(cDescuento2) + atMovimiento(cDescuento3) + atMovimiento(cDescuento4) + atMovimiento(cDescuento5)
  vImprime = @Col(lDescuento;0)[C12]
  // Impuesto
  lImpuesto = atMovimiento(cImpuesto1) + atMovimiento(cImpuesto2) + atMovimiento(cImpuesto3)
  vImprime = @Col(lImpuesto;0)[C14]
  // Total
  vImprime = atMovimiento(cTotal)[C16]

  Lista vImprime  

  Si !tDocumento(cCancelado)
    // acumula al total de movimientos impresos
    gTotalMovtosGral = gTotalMovtosGral + 1
    gTotalMovtosOtro = gTotalMovtosOtro + 1
  FinSi
FinFunc

// *************************************************************************************************
//	Esta función imprime los totales generales u otros totales.
//  Parámetros 
//  Salidas 
// *************************************************************************************************
DefFunc fImprimeTotales(aIndice; aFecha)
Local lIndice, vImprime, lGlobal, lLoop, lReg1
Local lDecimales

  vImprime = ' '[C0..C17]
  lReg1 = 1

  Si aIndice = 0
    Si pDetallado
    	Texto C4;'======================'
    Sino
    	Texto C8;'======================'
    FinSi
	  Texto C10;'======================'
  	Texto C12;'======================'
	  Texto C14;'======================'
  	Texto C16;'======================'
    lGlobal = 1 // Total global
    lMaximo = gMonedasMaximo
  Sino
    Si pDetallado
    	Texto C4;'@L{4}'
    Sino
    	Texto C8;'@L{8}'
    FinSi
	  Texto C10;'@L{10}'
  	Texto C12;'@L{12}'
	  Texto C14;'@L{14}'
  	Texto C16;'@L{16}'

    lGlobal = 0 // Otro total
  FinSi
  Imprime

  lLoop = 0[C0]
  Mientras lLoop < gMonedasMaximo
    lIndice = aIndice + lLoop // Contiene el indice a verificar, puede ser global u otro
    // Verifica la variable de acumulados globales
    Si @Col({lLoop};0) = 0 // Ya no hay más acumulados?
      FinCiclo
    FinSi
    // Verifica la variable de otros acumulados
    Si @Col({lIndice};0) != 0 // Existe el acumulado?
      vImprime = ' '[C0..C17]
      Si pDetallado
        vImprime = {lIndice}[C4]
      Sino
        vImprime = {lIndice}[C8]
      FinSi
      vImprime = {lIndice}[C10]
      vImprime = {lIndice}[C12]
      Si ((pDocumentoDe = 35 O pDocumentoDe = 36) Y tParametros(cNumImpuestoIva) = 1) 
        Si gBanImprimeGranTotal = 1
          gTotalImpuestos = fFormateaNumero(gTotalImpuestos;gDecimalesMoneda)
          vImprime = @col(gTotalImpuestos;0)[C14]
        Sino
          gTotalImpuestosOtro = fFormateaNumero(gTotalImpuestosOtro;gDecimalesMoneda)
          vImprime = @col(gTotalImpuestosOtro;0)[C14]
        FinSi
      Sino
        vImprime = {lIndice}[C14]
      FinSi

      Si ((pDocumentoDe = 35 O pDocumentoDe = 36) Y tParametros(cNumImpuestoIva) = 1) 
        Si gBanImprimeGranTotal = 1
 					gTotalDocumentos = fFormateaNumero(gTotalDocumentos;gDecimalesMoneda)
          vImprime = @col(gTotalDocumentos;0)[C16]
        Sino
        	gTotalOtro = fFormateaNumero(gTotalOtro;gDecimalesMoneda)
					vImprime = @col(gTotalOtro;0)[C16]
				FinSi
      Sino
        vImprime = {lIndice}[C16]
      FinSi

      Si lGlobal
        Si pTipoReporte = 5  //hva
          Si pDetallado
            Escoge @col({lIndice};0)
              Caso 1 
                vImprime = 'Total Cotizaciones '[C2]
              FinCaso
              Caso 2 
                vImprime = 'Total Pedidos '[C2]
              FinCaso
              Caso 3 
                vImprime = 'Total Remisiones '[C2]
              FinCaso
              Caso 4 
                vImprime = 'Total Facturas '[C2]
              FinCaso
              Caso 5 
                vImprime = 'Total Devoluciones Vta '[C2]
              FinCaso
              Caso 6
                vImprime = 'Total Devs Rems. '[C2]
              FinCaso 
              Caso 17 
                vImprime = 'Total Ordenes Compra '[C2]
              FinCaso
              Caso 18 
                vImprime = 'Total Consignaciones '[C2]
              FinCaso
              Caso 19 
                vImprime = 'Total Compras '[C2]
              FinCaso
              Caso 20 
                vImprime = 'Total Devs Compras '[C2]
              Caso 21
                vImprime = 'Total Devs Consigs'[C2]
              FinCaso
							//N.C.146
              Caso 38
                vImprime = 'Total Cotizac. Prov.'[C2]
              FinCaso
            FinEscoge
          Sino
            Escoge @col({lIndice};0)
              Caso 1 
                vImprime = 'Total Cotizaciones '[C6]
              FinCaso
              Caso 2 
                vImprime = 'Total Pedidos '[C6]
              FinCaso
              Caso 3 
                vImprime = 'Total Remisiones '[C6]
              FinCaso
              Caso 4 
                vImprime = 'Total Facturas '[C6]
              FinCaso
              Caso 5 
                vImprime = 'Total Devoluciones Vta '[C6]
              FinCaso
              Caso 6
                vImprime = 'Total Devs Rems. '[C6]
              FinCaso             
              Caso 17 
                vImprime = 'Total Ordenes Compra '[C6]
              FinCaso
              Caso 18 
                vImprime = 'Total Consignaciones '[C6]
              FinCaso
              Caso 19 
                vImprime = 'Total Compras '[C6]
              FinCaso
              Caso 20 
                vImprime = 'Total Devs Compras '[C6]
              Caso 21
                vImprime = 'Total Devs Consigs'[C6]
							//N.C.146
							Caso 38
                vImprime = 'Total Cotizac. Prov.'[C6]              
              FinCaso             
            FinEscoge  
          FinSi
        FinSi
      Sino
        Si pDetallado
          vImprime = 'Total'[C2]
        Sino
          vImprime = 'Total'[C6]
        FinSi
      FinSi

      Si @Col({lReg1};0) != 0 // Hay más de una moneda?
        Si pTipoReporte = 5
          tMoneda.Busca[@Str(@Col({lIndice};1);0)]
        Sino
          tMoneda.Busca[@Str(@Col({lIndice};0);0)]
        FinSi
        Si tMoneda->Encontro    
          Si pDetallado
            vImprime = @Col(vImprime;2) & ' en ' & tMoneda(cPlural)[C2]
          Sino
            vImprime = @Col(vImprime;6) & ' en ' & tMoneda(cPlural)[C6]
          FinSi
        FinSi
      FinSi
      Si pTipoReporte = 1 y !lGlobal // Reporte ordenado por fecha?
        Si pDetallado
          vImprime = @Col(vImprime;2) & ' al ' & fFormateaFecha(aFecha; gIdioma)[C2]
        Sino
          vImprime = @Col(vImprime;6) & ' al ' & fFormateaFecha(aFecha; gIdioma)[C6]
        FinSi
      FinSi
      Si pDetallado
          vImprime = @Col(vImprime;2) & ':'[C2]
      Sino
          vImprime = @Col(vImprime;6) & ':'[C6]
      FinSi

      Lista vImprime  
    FinSi

    lLoop = lLoop + 1[C0]
  FinMientras

  Saltalin
  vImprime = ' '[C0..C17]
  Si pDetallado
    vImprime = 'Total de documentos impresos:'[C2]
    [C4].Decimales 0
  Sino
    vImprime = 'Total de documentos impresos:'[C6]
    [C8].Decimales 0
  FinSi
  Si lGlobal
    Si pDetallado
      vImprime = @Col(gTotalDoctosGral;0)[C4]
    Sino
      vImprime = @Col(gTotalDoctosGral;0)[C8]
    FinSi
  Sino
    Si pDetallado
      vImprime = @Col(gTotalDoctosOtro;0)[C4]
    Sino
      vImprime = @Col(gTotalDoctosOtro;0)[C8]
    FinSi
  FinSi
  Lista vImprime

  Si pDetallado
    vImprime = ' '[C0..C17]
    vImprime = 'Total de movimientos impresos:'[C2]
    Si lGlobal
      vImprime = @Col(gTotalMovtosGral;0)[C4]
    Sino
      vImprime = @Col(gTotalMovtosOtro;0)[C4]
    FinSi
    Lista vImprime
    [C4].Decimales gDecimalesUnidades
  Sino
    [C8].Decimales gDecimalesUnidades
  FinSi

  Saltalin 2
FinFunc

// *************************************************************************************************
//	Esta función imprime los totales del documento.
//  Parámetros 
//  Salidas 
// *************************************************************************************************
DefFunc fImprimeTotalesDocumento(atDocumento:Tabla; aIndice)
Local vImprime, lDescuento, lImpuesto, lIndiceOtro

	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 = atDocumento(cTotalUnidades)[C4]
  Si tDocumento(Csistorig)!= '101'//N.D.6369
  	vImprime = tDocumento(cNeto)[C10]
  Sino
    lNetoPV = tDocumento(cNeto) + tDocumento(cDescuen01)
		vImprime  = @Col(lNetoPV;0)[C10]
  FinSi
  //vImprime = atDocumento(cNeto)[C10]
  lDescuento = atDocumento(cDescuentoMov)
  vImprime = @Col(lDescuento;0)[C12]
  lImpuesto = atDocumento(cImpuesto1) + atDocumento(cImpuesto2) + atDocumento(cImpuesto3)
  vImprime = @Col(lImpuesto;0)[C14]
  vImprime = atDocumento(cTotal)[C16]
  Lista vImprime
  Saltalin 2

  Si !atDocumento(cCancelado)   //Si no esta cancelado
    // acumula a totales generales y otros totales
    lIndiceOtro = aIndice + gMonedasMaximo
    {aIndice} = {aIndice} + atDocumento(cTotalUnidades)[C4]
    {lIndiceOtro} = {lIndiceOtro} + atDocumento(cTotalUnidades)[C4]
   
    Si tDocumento(Csistorig)!= '101'//N.D.6369
  		{aIndice} = {aIndice} + atDocumento(cNeto)[C10]
      {lIndiceOtro} = {lIndiceOtro} + atDocumento(cNeto)[C10]
		Sino
			{aIndice} = {aIndice} + tDocumento(cDescuen01) + tDocumento(cNeto)[C10]
      {lIndiceOtro} = {lIndiceOtro} + tDocumento(cDescuen01) + tDocumento(cNeto)[C10]			 
		FinSi

    {aIndice} = {aIndice} + atDocumento(cDescuentoMov)[C12]
    {lIndiceOtro} = {lIndiceOtro} + atDocumento(cDescuentoMov)[C12]
    {aIndice} = {aIndice} + @Col(lImpuesto;0)[C14]
    {lIndiceOtro} = {lIndiceOtro} + @Col(lImpuesto;0)[C14]
    {aIndice} = {aIndice} + atDocumento(cTotal)[C16]
    {lIndiceOtro} = {lIndiceOtro} + atDocumento(cTotal)[C16] 
  FinSi
FinFunc

// *************************************************************************************************
//	Esta función limpia los acumulados de totales.
//  Parámetros 
//  Salidas 
// *************************************************************************************************
DefFunc fLimpiaTotales(aIndice)
Local lIndice

  lIndice = 0
  Mientras lIndice < gMonedasMaximo
    {aIndice} = 0[C0]
    {aIndice} = ' '[C1..C17]
    aIndice = aIndice + 1[C0]
    lIndice = lIndice + 1[C0]
  FinMientras
FinFunc

// *************************************************************************************************
//	Esta función lee los movimientos ocultos para desplegar caracteristicas o paquetes de productos.
//  Parámetros 
//  Salidas 
// *************************************************************************************************
DefFunc fProcesaMovimientosOcultos(atMovimiento: Tabla; acTipoPaquete)
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"

  // 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 pDocumentoDe = 3 // Si es una remisión
      // Discrimina los movimientos de Entrada
      Si tMovimientoOculto(cAfectaExistencia) = 1
        Continua
      FinSi
    FinSi
    Si pDocumentoDe = 6 // Si es una devolución de remisión
      // Discrimina los movimientos de Salida
      Si tMovimientoOculto(cAfectaExistencia) = 2
        Continua
      FinSi
    FinSi

		// No se debe procesar los movimientos ocultos que sean productos con características y 
		// formen parte de un paquete
		SI tMovimientoOculto(cMovtoOculto) = 2
			Continua
		FinSi

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

    // Si el producto tiene componentes
    Si acTipoPaquete = 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
          fImprimeComponente(tDetalleProducto(cIdProductoPadre); tMovimientoOculto; &lTextoComponentes; 1)
          // Si se solicitó imprimir características
          Si pCaracteristicas
            lTextoCaracteristicas = 0 // No se ha impreso el texto "Características"
            // 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

  Retorna lTextoComponentes
FinFunc

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

  lSaltaLin = 0 // Indica si saltar linea despues de imprimir componentes
  Si pDetallado 
    // Primero imprime el encabezado del movimiento
    fImprimeEncabezadoMovimiento()
  FinSi

  // Recupera los movimientos del documento
  Mientras [ tMovimiento.Busca[@Str(atDocumento(cIdDocumento);0)]; tMovimiento->Encontro; tMovimiento.Busca Siguiente[1] ]
    Si lSaltaLin
      SaltaLin
    FinSi
     
    Si pDetallado
      // Lee el producto del movimiento
      tProducto.Busca[@Str(tMovimiento(cIdProducto);0)]
      Si !tProducto->Encontro
        Continua
      FinSi
    FinSi

    Si ((pDocumentoDe = 35 O pDocumentoDe = 36) Y tParametros(cNumImpuestoIva) = 1) Y atDocumento(cCancelado) = 0
      lTotalDescuentos = tMovimiento(cDescuento1) + tMovimiento(cDescuento2) + tMovimiento(cDescuento3) + tMovimiento(cDescuento4) + tMovimiento(cDescuento5)
      lNetoMenosDescuentos = tMovimiento(cNeto) - lTotalDescuentos
      //N.D.5789 Ya no se calcula el Impuesto1 ahora se lee el importe del impuesto directamente del movimiento            
			lTotalImpuestos = tMovimiento(cImpuesto1) + tMovimiento(cImpuesto2) + tMovimiento(cImpuesto3)
      lTotalRetenciones = tMovimiento(cRetencion1) + tMovimiento(cRetencion2)
      // Total Global
      gTotalImpuestos = gTotalImpuestos  + lTotalImpuestos
      gTotalDocumentos = gTotalDocumentos +  tMovimiento(cNeto) + lTotalImpuestos - lTotalDescuentos - lTotalRetenciones
      // Total por Bloque 
      gTotalImpuestosOtro = gTotalImpuestosOtro + lTotalImpuestos
      gTotalOtro = gTotalOtro + tMovimiento(cNeto) + lTotalImpuestos - lTotalDescuentos - lTotalRetenciones
    FinSi

    Si pDetallado
      // Imprime el movimiento
      fImprimeMovimiento(tMovimiento; tProducto)
      // Si se pidió que se imprimieran características o componentes
      Si pCaracteristicas = 1 o pComponentes = 1
        lSaltaLin = fProcesaMovimientosOcultos(tMovimiento; tProducto(cTipoProducto))
      FinSi
    FinSi
  FinMientras
FinFunc

// *************************************************************************************************
//	Esta función se utiliza como controladora de la impresión del documento,
//  sus movimientos y el total del documento
//  Parámetros 
//  Salidas 
// *************************************************************************************************
DefFunc fProcesaDocumento(atDocumento: Tabla)
Local lIndice

  // Si el reporte es detallado, imprime el encabezado del documento
  Si pDetallado
    fImprimeEncabezadoDocumento()
  FinSi

  lIndice = fBuscaMonedaIndice(atDocumento)

  // Imprime el documento
  fImprimeDocumento(atDocumento; lIndice)

  // Si el reporte es detallado, lee los movimientos del documento o si
  // se trata de Notas de Venta, Devoluciones de Nota de Venta cuyo Número de impuesto de I.V.A. sea el número 1 de la configuración general.
  Si pDetallado O ((pDocumentoDe = 35 O pDocumentoDe = 36) Y tParametros(cNumImpuestoIva) = 1)
    fProcesaMovimientos(atDocumento)    
    Si pDetallado 
      // Imprime el total del documento
      fImprimeTotalesDocumento(atDocumento; lIndice)
    FinSi
  FinSi
FinFunc

// *************************************************************************************************
//	Esta función lee los documentos agrupados por agente.
//  Parámetros 
//  Salidas 
// *************************************************************************************************
DefFunc fProcesaPorAgente()
Local lDatosAgente, lFecha

  Mientras[tAgente.Busca[pAgenteInicial & '..' & pAgenteFinal]; tAgente->Encontro; tAgente.Busca Siguiente[1]]
    // Limpia los acumulados de otros totales
    fLimpiaTotales(gIndiceTotalOtro)
    gTotalDoctosOtro = 0    
    gTotalMovtosOtro = 0
    gTotalImpuestosOtro = 0.0
    gTotalOtro = 0.0

    // No se han impreso los datos del agente
    lDatosAgente = 0

    // N.D.4048 Búsqueda de un movimiento del producto a la fecha inicial del reporte
    gFechaBusqueda = pFechaInicial
    // NOTA: Es obligatorio volver a fijar el índice a fin de que las búsquedas parciales funcionen correctamente
    tDocumento.Usaindice['iDocumentoDeAgenteFecha']
    tDocumento.Busca[pDocumentoDe & ':' & tAgente(cIdAgente) & ':' & gFechaBusqueda]
    Si !tDocumento->ENCONTRO
      // Busquedas parciales: Cursor en el registro más cercano que cumple con la llave
      // NOTA: La propiedad Llave de la tabla nos regresa la llave más cercana que cumple con el criterio de la búsqueda
      //       La llave está en formato cadena y no tiene ningún separador entre los campos, por lo que es necesario revisar
      //      en FoxPro la definición del índice para descomponer los elementos de la Llave
      Si @Val(@SUBSTR(tDocumento->Llave;0;11)) = pDocumentoDe
        Si @Val(@SUBSTR(tDocumento->Llave;11;11)) = tAgente(cIdAgente)
          Si @SUBSTR(tDocumento->Llave;22;8) >= pFechaInicial Y @SUBSTR(tDocumento->Llave;22;8) <= pFechaFinal
            // Realizar nuevamente la búsqueda a fin de posicionarnos en el registro y activar la propiedad Encontro
            gFechaBusqueda = @SUBSTR(tDocumento->Llave;22;8)
            tDocumento.Busca[pDocumentoDe & ':' & tAgente(cIdAgente) & ':' & gFechaBusqueda]
          FinSi
        FinSi
      FinSi        
    FinSi

    Mientras tDocumento->Encontro Y (tDocumento(cFecha) <= pFechaFinal)
      // Discrimina documentos según parámetro de cancelación y afectación
      Si fDiscriminaDocumento(tDocumento)
        tDocumento.BUSCA SIGUIENTE[2]
        Continua
      FinSi
      // Si no se han impreso los datos del agente, los imprime
      Si !lDatosAgente
        fImprimeAgente(tAgente)
        lDatosAgente = 1 // Indica que ya se imprimieron los datos del agente
      FinSi
      fProcesaDocumento(tDocumento)
      tDocumento.BUSCA SIGUIENTE[2]
    FinMientras
    tDocumento.Usaindice['']
    // Se imprimio al menos un documento?
    Si gTotalDoctosOtro
      fImprimeTotales(gIndiceTotalOtro; '')
    FinSi
  FinMientras
FinFunc

// *************************************************************************************************
//	Esta función lee los documentos agrupados por cliente o proveedor.
//  Parámetros 
//  Salidas 
// *************************************************************************************************
DefFunc fProcesaPorCliente()
Local lDatosCliente

  Mientras[tClienteProveedor.Busca[pCteProvInicial & '..' & pCteProvFinal]; tClienteProveedor->Encontro; tClienteProveedor.Busca Siguiente[1]]
    // Limpia los acumulados de otros totales
    fLimpiaTotales(gIndiceTotalOtro)
    gTotalDoctosOtro = 0    
    gTotalMovtosOtro = 0
    gTotalImpuestosOtro = 0.0
    gTotalOtro = 0.0

    // No se han impreso los datos del cliente
    lDatosCliente = 0

    // N.D.4048 Búsqueda de un movimiento del producto a la fecha inicial del reporte
    gFechaBusqueda = pFechaInicial
    // NOTA: Es obligatorio volver a fijar el índice a fin de que las búsquedas parciales funcionen correctamente
    tDocumento.Usaindice['iDocumentoDeClienteFecha']
    tDocumento.Busca[pDocumentoDe & ':' & tClienteProveedor(cIdClienteProveedor) & ':' & gFechaBusqueda]
    Si !tDocumento->ENCONTRO
      // Busquedas parciales: Cursor en el registro más cercano que cumple con la llave
      // NOTA: La propiedad Llave de la tabla nos regresa la llave más cercana que cumple con el criterio de la búsqueda
      //       La llave está en formato cadena y no tiene ningún separador entre los campos, por lo que es necesario revisar
      //      en FoxPro la definición del índice para descomponer los elementos de la Llave
      Si @Val(@SUBSTR(tDocumento->Llave;0;11)) = pDocumentoDe
        Si @Val(@SUBSTR(tDocumento->Llave;11;11)) = tClienteProveedor(cIdClienteProveedor)
          Si @SUBSTR(tDocumento->Llave;22;8) >= pFechaInicial Y @SUBSTR(tDocumento->Llave;22;8) <= pFechaFinal
            // Realizar nuevamente la búsqueda a fin de posicionarnos en el registro y activar la propiedad Encontro
            gFechaBusqueda = @SUBSTR(tDocumento->Llave;22;8)
            tDocumento.Busca[pDocumentoDe & ':' & tClienteProveedor(cIdClienteProveedor) & ':' & gFechaBusqueda]
          FinSi
        FinSi
      FinSi        
    FinSi

    Mientras tDocumento->Encontro Y (tDocumento(cFecha) <= pFechaFinal)
      // Discrimina documentos según parámetro de cancelación y afectación
      Si fDiscriminaDocumento(tDocumento)
        tDocumento.BUSCA SIGUIENTE[2]
        Continua
      FinSi
      // Si no se han impreso los datos del cliente, los imprime
      Si !lDatosCliente
        fImprimeCliente(tClienteProveedor)
        lDatosCliente = 1 // Indica que ya se imprimieron los datos del cliente
      FinSi
      fProcesaDocumento(tDocumento)
      tDocumento.BUSCA SIGUIENTE[2]
    FinMientras
    tDocumento.Usaindice['']
    // Se imprimio al menos un documento?
    Si gTotalDoctosOtro
      fImprimeTotales(gIndiceTotalOtro; '')
    FinSi
  FinMientras
FinFunc

// *************************************************************************************************
//	Esta función lee los documentos agrupados por concepto del documento.
//  Parámetros 
//  Salidas 
// *************************************************************************************************
DefFunc fProcesaPorConcepto()
Local lDatosConcepto, i, lIdConcepto

  i = 0
  InicioRepite
    // Limpia los acumulados de otros totales
    fLimpiaTotales(gIndiceTotalOtro)
    gTotalDoctosOtro = 0    
    gTotalMovtosOtro = 0
    // Limpia los acumulados de otros totales para Docto. Sop. 35 y 36.
    gTotalImpuestosOtro = 0.0
    gTotalOtro = 0.0

    lIdConcepto = @Escoge(pIdConcepto;i)
    i = i + 1
    Si lIdConcepto != ''
      tConcepto.Busca[@Str(lIdConcepto;0)]
      Si tConcepto->Encontro
        // No se han impreso los datos del concepto
        lDatosConcepto = 0

        // N.D.4048 Búsqueda de un movimiento del producto a la fecha inicial del reporte
        gFechaBusqueda = pFechaInicial
        // NOTA: Es obligatorio volver a fijar el índice a fin de que las búsquedas parciales funcionen correctamente
        tDocumento.Usaindice['iConceptoFecha']
        tDocumento.Busca[lIdConcepto & ':' & gFechaBusqueda]
        Si !tDocumento->ENCONTRO
          // Busquedas parciales: Cursor en el registro más cercano que cumple con la llave
          // NOTA: La propiedad Llave de la tabla nos regresa la llave más cercana que cumple con el criterio de la búsqueda
          //       La llave está en formato cadena y no tiene ningún separador entre los campos, por lo que es necesario revisar
          //      en FoxPro la definición del índice para descomponer los elementos de la Llave
          Si @Val(@SUBSTR(tDocumento->Llave;0;11)) = lIdConcepto
            Si @SUBSTR(tDocumento->Llave;11;8) >= pFechaInicial Y @SUBSTR(tDocumento->Llave;11;8) <= pFechaFinal
              // Realizar nuevamente la búsqueda a fin de posicionarnos en el registro y activar la propiedad Encontro
              gFechaBusqueda = @SUBSTR(tDocumento->Llave;11;8)
              tDocumento.Busca[lIdConcepto & ':' & gFechaBusqueda]
            FinSi
          FinSi        
        FinSi

        Mientras tDocumento->Encontro Y (tDocumento(cFecha) <= pFechaFinal)
          // Discrimina documentos según parámetro de cancelación y afectación
          Si fDiscriminaDocumento(tDocumento)
            tDocumento.BUSCA SIGUIENTE[1]
            Continua
          FinSi
          // Si no se han impreso los datos del concepto, los imprime
          Si !lDatosConcepto
            fImprimeConcepto(tConcepto)
            lDatosConcepto = 1 // Indica que ya se imprimieron los datos del concepto
          FinSi
          fProcesaDocumento(tDocumento)
          tDocumento.BUSCA SIGUIENTE[1]
        FinMientras
      Finsi
    Finsi
    tDocumento.Usaindice['']
    // Se imprimio al menos un documento?
    Si gTotalDoctosOtro
      fImprimeTotales(gIndiceTotalOtro; '')
    FinSi
  Repite lIdConcepto != ''
FinFunc

// *************************************************************************************************
//	Esta función lee los documentos ordenados por fecha.
//  Parámetros 
//  Salidas 
// *************************************************************************************************
DefFunc fProcesaPorFecha()

  // N.D.4048 Búsqueda de un movimiento del producto a la fecha inicial del reporte
  gFechaBusqueda = pFechaInicial
  // NOTA: Es obligatorio volver a fijar el índice a fin de que las búsquedas parciales funcionen correctamente
  tDocumento.Usaindice['iDocumentoDeFechaSerieFol']
  tDocumento.Busca[pDocumentoDe & ':' & gFechaBusqueda]
  Si !tDocumento->ENCONTRO
    // Busquedas parciales: Cursor en el registro más cercano que cumple con la llave
    // NOTA: La propiedad Llave de la tabla nos regresa la llave más cercana que cumple con el criterio de la búsqueda
    //       La llave está en formato cadena y no tiene ningún separador entre los campos, por lo que es necesario revisar
    //      en FoxPro la definición del índice para descomponer los elementos de la Llave
    Si @Val(@SUBSTR(tDocumento->Llave;0;11)) = pDocumentoDe
      Si @SUBSTR(tDocumento->Llave;11;8) >= pFechaInicial Y @SUBSTR(tDocumento->Llave;11;8) <= pFechaFinal
        // Realizar nuevamente la búsqueda a fin de posicionarnos en el registro y activar la propiedad Encontro
        gFechaBusqueda = @SUBSTR(tDocumento->Llave;11;8)
        tDocumento.Busca[pDocumentoDe & ':' & gFechaBusqueda]
      FinSi
    FinSi        
  FinSi

  Mientras tDocumento->Encontro Y (tDocumento(cFecha) <= pFechaFinal)
    // Limpia los acumulados de otros totales
    fLimpiaTotales(gIndiceTotalOtro)
    gTotalDoctosOtro = 0
    gTotalMovtosOtro = 0
    gTotalImpuestosOtro = 0.0
    gTotalOtro = 0.0
    gFechaBusqueda = tDocumento(cFecha)
    Mientras gFechaBusqueda = tDocumento(cFecha)
      // Discrimina documentos según parámetro de cancelación y afectación
      Si fDiscriminaDocumento(tDocumento)
        tDocumento.BUSCA SIGUIENTE[1]
        Continua
      FinSi
      fProcesaDocumento(tDocumento)
      tDocumento.BUSCA SIGUIENTE[1]
    FinMientras
    // Se imprimio al menos un documento?
    Si gTotalDoctosOtro
      fImprimeTotales(gIndiceTotalOtro; gFechaBusqueda)
    FinSi      
  FinMientras
FinFunc

// *************************************************************************************************
//	Esta función lee los documentos ordenados por serie-folio.
//  Parámetros 
//  Salidas 
// *************************************************************************************************
DefFunc fProcesaPorSerieFolio()

  // N.D.4048 Búsqueda de un movimiento del producto a la fecha inicial del reporte
  // NOTA: Es obligatorio volver a fijar el índice a fin de que las búsquedas parciales funcionen correctamente
  Si pSerie = ''
    pSerie = ' '
  FinSi
  tDocumento.Usaindice['iDoctoDeSerieFolio']
  tDocumento.Busca[pDocumentoDe & ':' & pSerie & ':' & pFolioInicial]
  Si !tDocumento->ENCONTRO
    // Busquedas parciales: Cursor en el registro más cercano que cumple con la llave
    // NOTA: La propiedad Llave de la tabla nos regresa la llave más cercana que cumple con el criterio de la búsqueda
    //       La llave está en formato cadena y no tiene ningún separador entre los campos, por lo que es necesario revisar
    //      en FoxPro la definición del índice para descomponer los elementos de la Llave
    Si @Val(@SUBSTR(tDocumento->Llave;0;11)) = pDocumentoDe
      Si @Val(@SUBSTR(tDocumento->Llave;11;11)) = pSerie
        Si @SUBSTR(tDocumento->Llave;22;19) >= pFolioInicial Y @SUBSTR(tDocumento->Llave;22;19) <= pFolioFinal
          // Realizar nuevamente la búsqueda a fin de posicionarnos en el registro y activar la propiedad Encontro
          tDocumento.Busca[pDocumentoDe & ':' & pSerie & ':' & @SUBSTR(tDocumento->Llave;22;19)]
        FinSi
      FinSi
    FinSi        
  FinSi

  // Obtiene los documentos en el rango de folios especificado en el reporte
  Mientras tDocumento->Encontro Y tDocumento(cFolio) <= pFolioFinal
    // Discrimina documentos según parámetro de cancelación y afectación
    Si !fDiscriminaDocumento(tDocumento)
      fProcesaDocumento(tDocumento)
    FinSi    
    tDocumento.BUSCA SIGUIENTE[2]  
  FinMientras
FinFunc


// *************************************************************************************************
//  Esta función verifica los datos de los parámetros pCliente y pAAgente, de tal forma que si se 
//  tienen valores vacíos, se modifican de acuerdo a los códigos del primer y último registro de su 
//  respectiva tabla.
//  Parámetros 
//  Salidas 
// *************************************************************************************************
DefFunc fVerificaParametros()

  // Si el recorrido es por cliente o proveedor
  Si pTipoReporte = 3
    // Establece el índice de recorrido para clientes
    tClienteProveedor.Usaindice['iCodigoTipo'] // cCodigoCliente+cTipoCliente
    // Si el rango inicial es el primer cliente o proveedor, recupera el código del primero
    Si pCteProvInicial = ' '
      tClienteProveedor.Busca Primero
      Si tClienteProveedor->Encontro
        pCteProvInicial = tClienteProveedor(cCodigoCliente)
      FinSi
    FinSi

    // Si el rango final es el último cliente o proveedor, recupera el código del último
    Si pCteProvFinal = ' '
      tClienteProveedor.Busca Ultimo
      Si tClienteProveedor->Encontro
        pCteProvFinal = tClienteProveedor(cCodigoCliente)
      FinSi
    FinSi
  FinSi

  // Si el recorrido es por agente
  Si pTipoReporte = 4
    // Establece el índice de recorrido para agentes
    tAgente.Usaindice['iCodigoTipo'] // cCodigoAgente+cTipoAgente
    // Si el rango inicial es el primer agente, recupera el código del primero
    Si pAgenteInicial = ' '
      tAgente.Busca Primero
      Si tAgente->Encontro
        pAgenteInicial = tAgente(cCodigoAgente)
      FinSi
    FinSi

    // Si el rango final es el último agente, recupera el código del último
    Si pAgenteFinal = ' '
      tAgente.Busca Ultimo
      Si tAgente->Encontro
        pAgenteFinal = tAgente(cCodigoAgente)
      FinSi
    FinSi
  FinSi
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

  Si pDocumentoDe = 35
     Si pDetallado
       lEncabezado = 'NOTAS DE VENTA DETALLADAS'
     Sino
       lEncabezado = 'NOTAS DE VENTA'
     FinSi
  SiNo
     Si pDocumentoDe = 36
        Si pDetallado
          lEncabezado = 'DEVOLUCIONES DE NOTAS DE VENTA DETALLADAS'
        Sino
          lEncabezado = 'DEVOLUCIONES DE NOTAS DE VENTA'
        FinSi
     SiNo
        Si pDetallado
          lEncabezado = 'DOCUMENTOS DETALLADOS'
        Sino
          lEncabezado = 'DOCUMENTOS'
        FinSi
     FinSi
  FinSi

  Si pTipoReporte = 3
    Si pVentas
      lEncabezado = lEncabezado & (pDocumentoDe=36 O pDocumentoDe=35? ' AGRUPADAS POR CLIENTE':' AGRUPADOS POR CLIENTE')
    Sino
      lEncabezado = lEncabezado & (pDocumentoDe=36 O pDocumentoDe=35? ' AGRUPADAS POR PROVEEDOR':' AGRUPADOS POR PROVEEDOR')
    FinSi
  FinSi
  Si pTipoReporte = 4
    lEncabezado = lEncabezado & (pDocumentoDe=36 O pDocumentoDe=35? ' AGRUPADAS POR AGENTE':' AGRUPADOS POR AGENTE')
  FinSi
  Si pTipoReporte = 5
    lEncabezado = lEncabezado & (pDocumentoDe=36 O pDocumentoDe=35? ' AGRUPADAS POR CONCEPTO':' AGRUPADOS POR CONCEPTO')
  FinSi
	Texto '^@TC{0,0,0}@S{16}' & lEncabezado
	Imprime

  Si pTipoReporte = 2
  	Texto '^@TC{0,0,0}@S{16}' & (pDocumentoDe=36 O pDocumentoDe=35?'ORDENADAS POR SERIE-FOLIO':'ORDENADOS POR SERIE-FOLIO')
    Imprime 1
  Sino
  	Texto '^@TC{0,0,0}@S{16}' & (pDocumentoDe=36 O pDocumentoDe=35?'ORDENADAS POR FECHA':'ORDENADOS POR FECHA')
  	Texto '^@TC{0,0,0}@S{16}'
    Imprime
    Texto '^@TC{0,0,0}@S{16}Del: ' & fFormateaFecha(pFechaInicial;gIdioma) & ' Al: ' & fFormateaFecha(pFechaFinal;gIdioma)
	  Imprime 1
  FinSi
	Color @RGB(0;0;0)
	Altura 9
FinEncab


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

// Verifica los parámetros pCteProv y pAgente
fVerificaParametros()

// Limpia los acumulados de totales
fLimpiaTotales(gIndiceTotalGeneral)

// Si el reporte es concentrado, imprime el encabezado del documento una sola vez
Si !pDetallado
  fImprimeEncabezadoDocumento()
FinSi

// Según el tipo de reporte, es la rutina de proceso que se manda llamar
Escoge pTipoReporte
  Caso 1 // Ordenados por fecha
    fProcesaPorFecha()
  FinCaso
  Caso 2 // Ordenados por serie-folio
    fProcesaPorSerieFolio()
  FinCaso
  Caso 3 // Agrupados por cliente
    fProcesaPorCliente()
  FinCaso
  Caso 4 // Agrupados por agente
    fProcesaPorAgente()
  FinCaso
  Caso 5 // Agrupados por concepto
    fProcesaPorConcepto()
  FinCaso

FinEscoge

// Si se imprimió al menos un documento
Si gTotalDoctosGral
  gBanImprimeGranTotal = 1
  fImprimeTotales(gIndiceTotalGeneral; '')
FinSi
