// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//
//	ImpPed.rpt
//	Nombre del reporte en el sistema: Impresión de pedidos.
//
//  Sistema: AdminPAQ v1.1.3
// 
//	Este reporte imprime un listado de pedidos, Cotizaciones, Remisiones, cotizaciones del prov, ordenes de compra y consignaciones  agrupado por
//  cliente, agente o producto
//  se puede imprimir el reporte en diferentes monedas y se pueden desplegar las 
//  características de productos.
//
//	Consideraciones especiales:
//  La impresión de documentos tiene múltiples variantes, a saber:
//       1. Reporte Detallado de pedidos agrupados por cliente
//       2. Reporte Detallado de pedidos agrupado por agente
//       3. Reporte Detallado de pedidos agrupado por productos
//       4. Reporte Detallado de Cotizaciones agrupado por cliente
//       5. Reporte Detallado de Cotizaciones agrupado por agente
//       6. Reporte Detallado de Cotizaciones agrupado por producto
//       7. Reporte Detallado de Remisiones agrupado por cliente
//       8. Reporte Detallado de Remisiones agrupado por agente
//       9. Reporte Detallado de Remisiones agrupado por producto
//      10. Reporte Detallado de ordenes de compra agrupado por proveedor
//      11. Reporte Detallado de ordenes de compra agrupadas por producto
//      12. Reporte Detallado de consignaciones agrupadas por proveedor
//      13. Reporte Detallado de consignaciones agrupadas por producto
//			14. Reporte Detallado de Cotizaciones del Proveedor agrupado por Proveedor
//			15. Reporte Detallado de Cotizaciones del Proveedor agrupado por Producto
//  
//	Elaboró:    Antonio Velazco Jimenez
//	Fecha: 	    14 de Febreroo del 2002.
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//  Historia de revisiones: 
//  Fecha      Nombre   IDLotus                     Descripcion
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// 23/05/2007		ELVS		N.C.146			Se agrega documento modelo cotización del proveedor.	 	
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<


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

// *************************************************************************************************
//	Parámetros del reporte:
// *************************************************************************************************
Parametro pTipoReporte        = 1 //      1. Impresión de pedidos agrupados por cliente
                                  //      2. Reportes de pedidos agrupado por agente
                                  //      3. Reporte de pedidos agrupado por productos
                                  //      4.Reporte de Cotizaciones agrupado por cliente
                                  //      5.Reporte de Cotizaciones agrupado por agente
                                  //      6.Reporte de Cotizaciones agrupado por producto
                                  //      7.Reporte de Remisiones agrupado por cliente
                                  //      8.Reporte de Remisiones agrupado por agente
                                  //      9.Reporte de Remisiones agrupado por producto
                                  //      10.Reporte de ordenes de compra agrupado por proveedor
                                  //      11.Reporte de ordenes de compra agrupadas por producto
                                  //      12.Reporte de consignaciones agrupadas por proveedor
                                  //      13.Reporte de consignaciones agrupadas por producto
                                  //      14.Reporte de cotizaciones del proveedor agrupadas por proveedor
                                  //      15.Reporte de cotizaciones del proveedor agrupadas por producto
													
Parametro pFechaInicial 		  = '20120212'    // Fecha inicial del rango
Parametro pFechaFinal 			  = '20120212'    // Fecha final del rango
Parametro pProductoInicial 		= ' '					//Producto inicial del rango
Parametro pProductoFinal 			= ' '					//Producto final del rango
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 pSerie              = ' '         // Serie de los documentos
Parametro pFolioInicial       = 0           // Folio del documento
Parametro pFolioFinal         = 999999999 
Parametro pConSinMovimientos  = 1           // Inclusión de movimientos
                                            // 0 - No incluir movimientos
                                            // 1 - Incluir movimientos		
Parametro pStatus             = 0
                                            //0 = Todos
                                            //1 = Surtidos
                                            //2 = Parcialmente surtidos o sin surtir
Parametro pCancelados         = 0						// Filtro de cancelados
                                            // 0 - No incluir doctos cancelados
                                            // 1 - Incluir doctos cancelados
Parametro pCaracteristicas    = 0          	// Imprimir características de productos
Parametro pMonedaReporte      = 1
Parametro pIdClase1   = 0
Parametro pIdClase2   = 0
Parametro pIdClase3   = 0
Parametro pIdClase4   = 0 
Parametro pIdClase5   = 0   
Parametro pIdClase6   = 0 //Clasificaciones
	  	                                      

// *************************************************************************************************
//	Tablas a utilizar e Indices de búsqueda por omisión
// *************************************************************************************************
Columnas 18;5,0
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 tMovimientoDestino = tEmpresa['MGW10010'] Alias 'MovtoDestino' // Movimientos
tMovimientoDestino.Usaindice['cIdMovtoOrigen']      // cIdMovtoOrigen

UsaTabla tMovimientoOwner = tEmpresa['MGW10010'] Alias 'MovtoOwner' // Movimientos
tMovimientoOwner.Usaindice['']      // cIdMovimiento

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

Usatabla tTiposCambio = tEmpresa['mgw10035'] // Tipos de cambio por día
tTiposCambio.Usaindice['iMonedaFecha']                                 

UsaTabla tClasificaciones = tEmpresa['mgw10020']
tClasificaciones.Usaindice['']


// *************************************************************************************************
// 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  19 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.75,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:
// *************************************************************************************************
gDocumentoTotalCantidad = 0
gDocumentoTotalSurtidas = 0
gDocumentoTotalDevueltas = 0
gDocumentoTotalPendientes = 0
gDoctoTotalCantidadPaquetes = 0
gDoctoTotalSurtidasPaquetes = 0
gDoctoTotalDevueltasPaquetes = 0
gDoctoTotalPendientesPaquetes = 0
gDocumentoTotalNeto = 0

//Variables para los totales del reporte
gTotalCantidad = 0
gTotalSurtidas = 0
gTotalDevueltas = 0
gTotalPendientes = 0
gTotalCantidadPaquetes = 0
gTotalSurtidasPaquetes = 0
gTotalDevueltasPaquetes = 0
gTotalPendientesPaquetes = 0
gTotalNeto = 0

//Variables para los totales por dia del reporte
gDiaTotalCantidad = 0
gDiaTotalSurtidas = 0
gDiaTotalDevueltas = 0
gDiaTotalPendientes = 0
gDiaTotalCantidadPaquetes = 0
gDiaTotalSurtidasPaquetes = 0
gDiaTotalDevueltasPaquetes = 0
gDiaTotalPendientesPaquetes = 0
gDiaTotalNeto = 0

//Variables para los totales por cliente del reporte
gClienteTotalCantidad = 0
gClienteTotalSurtidas = 0
gClienteTotalDevueltas = 0
gClienteTotalPendientes = 0
gCteTotalCantidadPaquetes = 0
gCteTotalSurtidasPaquetes = 0
gCteTotalDevueltasPaquetes = 0
gCteTotalPendientesPaquetes = 0
gClienteTotalNeto = 0

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 = 0        // 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
// S.C.220 Bandera para saber si se han impreso los datos del cliente, producto y/o almacén
gDatosCliente 	= 0
gDatosProducto = 0
gDatosAgente   = 0
gIdMonedaCte   = 1
gTipo   = 0


// *************************************************************************************************
//	Esta función verifica el estado de un movimiento Sin surtir, Parcial, Surtidos
//  y así determinar si se imprime o no el movimiento.
//
//  Parámetros 
//   Tabla de movimientos
//  Salidas 
//    0 = Se discrimina el movimiento
//    1 = No se discrimina el movimiento
// *************************************************************************************************
DefFunc fDiscriminaStatusMovimiento(atMovimiento: Tabla)	
	// Discrimina documentos según su estado de surtido
	Si pStatus = 0
		Retorna 1
	FinSi
	// N.D.4312 Muestra algunos movimientos como parciales cuando ya están surtidos
	Si (pStatus = 1) y (atMovimiento(cUnidadesPendientes) <= 0.0000001) //!N.D.4312 = 0)
		Retorna 1
	SiNo
		Si (pStatus = 2) y (atMovimiento(cUnidadesPendientes) > 0.0000001) //!N.D.4312 > 0)
			Retorna 1
		SiNo
			Retorna 0
		FinSi
	FinSi
	Retorna 0
FinFunc

// *************************************************************************************************
//  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)
		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

	// N.D.4250 Obtención del nombre y decimales de la Moneda
	tMoneda.Busca[@str(pMonedaReporte;0)]	
	gNombreMoneda = tMoneda(cNombreMoneda)
	gDecimalesMoneda = tMoneda(cDecimalesMoneda)
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
// Variable para determinar la columna en la que se escribira un dato
Local	lColumna

	// 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

    // Determina la columna a partir de la cual se escribira la información
		//N.C.146
    Si (pTipoReporte = 3) o (pTipoReporte = 6) o (pTipoReporte = 9) o (pTipoReporte = 11) o (pTipoReporte = 13) o (pTipoReporte = 15)
      lColumna = 6
    Sino
      lColumna = 2
    FinSi

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

		// Cantidad
		lColumna = lColumna + 2
		vImprime[lColumna] = atMovimientoOculto(cUnidadesCapturadas)

		// Unidad de peso o medida
		lColumna = lColumna + 2    
    // Las unidades se muestran en la unidad base siempre
		Si tProducto(cIdUnidadBase)	  
			tUnidad.Busca[@Str(tProducto(cIdUnidadBase);0)]
			Si tUnidad->Encontro
				vImprime[lColumna] = tUnidad(cDespliegue)
			FinSi
		FinSi

		Lista vImprime
	FinSi
FinFunc

// *************************************************************************************************
//	Esta función imprime los datos del agente.
//  Parámetros 
//  Salidas 
// *************************************************************************************************
DefFunc fImprimeProducto(atProducto: Tabla)

	// No imprimir el producto si ya se imprimio
	Si gDatosProducto = 1
		Retorna 1
	FinSi

	// Redefine el ancho de las columnas
	// C0 9 caracteres
	// C1 11 caracteres
	Columnas 16; 1.34, 2.99,0.15
	
	vImprime = ' '[C0..C15]
	NEGRITAS TRUE

	vImprime = 'Producto: '[C0]
	lCodigoEditado = fMascarilla(tProducto(cCodigoProducto); gMascarillaProducto)
	vImprime = @Col(lCodigoEditado;0)[C1]
	Lista vImprime[c0,c1]

	vImprime = ' '[C0..C15]
	// Redefine el ancho de las columnas
	// C0 9 caracteres
	// C1 37 caracteres
	Columnas 16; 1.34, 7.47, 0.15

	vImprime = 'Nombre: '[C0]
	vImprime = atProducto(cNombreProducto)[C1]
	Lista vImprime[c0,c1]
	Saltalin

	NEGRITAS FALSE
	
	// Redefine el ancho de las columnas para el documento
	Columnas 18;1.75,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

	// Activar bandera para indicar que se imprimio el producto
	gDatosProducto = 1
FinFunc

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

	// No imprimir el agente si ya se imprimio
	Si gDatosAgente = 1
		Retorna 1
	FinSi

	// Redefine el ancho de las columnas
	// C0 9 caracteres
	// C1 11 caracteres
	Columnas 16; 1.34, 2.99,0.15
	
	vImprime = ' '[C0..C15]
	NEGRITAS TRUE

	Si atAgente(cIdAgente) = 0
		vImprime = 'Agente: '[C0]
		Lista vImprime[c0]
		Columnas 16; 7.47, 7.47, 0.15
		vImprime = 'Nombre: '[C0]
		vImprime = 'DOCUMENTOS SIN ASIGNAR A UN AGENTE'[C1]
		Lista vImprime[c0,c1]
	Sino
		vImprime = 'Agente: '[C0]
		lCodigoEditado = fMascarilla(tAgente(cCodigoAgente); gMascarillaAgentes)
		vImprime = @Col(lCodigoEditado;0)[C1]
		Lista vImprime[c0,c1]
		vImprime = ' '[C0..C15]
		// Redefine el ancho de las columnas
		// C0 9 caracteres
		// C1 37 caracteres
		Columnas 16; 1.34, 7.47, 0.15
		vImprime = 'Nombre: '[C0]
		vImprime = atAgente(cNombreAgente)[C1]
		Lista vImprime[c0,c1]
	FinSi
	Saltalin

	NEGRITAS FALSE
	
	// Redefine el ancho de las columnas para el documento
	Columnas 18;1.75,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

	// Activar bandera para indicar que se imprimio el Agente
	gDatosAgente = 1
FinFunc

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

	// No imprimir el cliente si ya se imprimio
	Si gDatosCliente = 1
		Retorna 1
	FinSi

	// Redefine el ancho de las columnas
	// C0 9 caracteres
	// C1 11 caracteres
	//N.C.146
  Si (pTipoReporte = 10) o (pTipoReporte = 12) o (pTipoReporte = 14)
		Columnas 16; 1.55, 0.15, 2.1, 0.15
  SiNo
    Columnas 16; 1.2, 0.15, 2.1, 0.15
  FinSi
	
	vImprime = ' '[C0..C15]
	NEGRITAS TRUE
	//N.C.146
  Si (pTipoReporte = 10) o (pTipoReporte = 12) o (pTipoReporte = 14)
    vImprime = 'Proveedor:'[C0]
  SiNo
     vImprime = 'Cliente:'[C0]
  FinSi
  lCodigoEditado = fMascarilla(atCliente(cCodigoCliente); gMascarillaClientes)
	vImprime = @Col(lCodigoEditado;0)[C2]
	Lista vImprime[c0,c2]

	vImprime = ' '[C0..C15]
	// Redefine el ancho de las columnas
	// C0 9 caracteres
	// C1 37 caracteres
  //N.C.146
  Si (pTipoReporte = 10) o (pTipoReporte = 12) o (pTipoReporte = 14)
    Columnas 16; 1.55, 0.15, 7.47, 0.15
  SiNo
    Columnas 16; 1.2, 0.15, 7.47, 0.15
  FinSi

	vImprime = 'Nombre:'[C0]
	vImprime = atCliente(cRazonSocial)[C2]

	Lista vImprime[c0,c2]
	Saltalin

	NEGRITAS FALSE
	
	// Redefine el ancho de las columnas para el documento
	Columnas 18;1.75,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

	// Activar bandera para indicar que se imprimio el cliente
	gDatosCliente = 1
FinFunc

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

//REVimprime pTipoReporte
	// redefine el ancho de las columnas
  Si pTipoReporte = 7 o pTipoReporte = 8 o pTipoReporte = 9 o pTipoReporte = 12 o pTipoReporte = 13
    Columnas 18;1.75, 0.15, 5.52, 0.15, 1.5, 0.15, 0.44, 0.15, 1.5, 0.15, 1.5, 0.15, 1.5, 0.15, 1.5, 0.15, 1.5
	  [C4, C8, C10, C12, C14].Coma
	  [C4, C8, C10, C12, C14].Decimales gDecimalesMoneda
  Sino
     Columnas 16;1.75, 0.15, 5.52, 0.15, 1.5, 0.15, 0.44, 0.15, 1.5, 0.15, 1.5, 0.15, 1.5, 0.15, 1.5
	  [C4, C8, C10, C12].Coma
	  [C4, C8, C10, C12].Decimales gDecimalesMoneda
  Finsi
	NEGRITAS TRUE
	// Imprime los textos del encabezado
	Texto C0;'Código'
	Texto C2;'Nombre (Producto)'
	Texto C4;'Cantidad'
	Si pTipoReporte = 7 o pTipoReporte = 8 o pTipoReporte = 9 o pTipoReporte = 12 o pTipoReporte = 13
 	  Texto C8;'Facturadas'
    Si pTipoReporte = 12 o pTipoReporte = 13
    	Texto C8;'Recibidas'
    Finsi
	  Texto C10;'Devueltas'
	  Texto C12;'Pendientes'
	  Texto C14;'Neto'		// S.C.220
	  Texto C16;'Estado'
  Sino
  	Texto C8;'Surtidas'
	  Texto C10;'Pendientes'
	  Texto C12;'Neto'		// S.C.220
	  Texto C14;'Estado'
  Finsi
	Imprime
	Texto C0;'@L{0}'
	Texto C1;'@L{1}'
	Texto C2;'@L{2}'
	Texto C3;'@L{3}'
	Texto C4;'@L{4}'
	Texto C5;'@L{5}'
	Texto C6;'@L{6}'
	Texto C7;'@L{7}'
	Texto C8;'@L{8}'
	Texto C9;'@L{9}'
	Texto C10;'@L{10}'
	Texto C11;'@L{11}'
	Texto C12;'@L{12}'
	Texto C13;'@L{13}'
	Texto C14;'@L{14}'
  Si pTipoReporte = 7 o pTipoReporte = 8 o pTipoReporte = 9 o pTipoReporte = 12 o pTipoReporte = 13
		Texto C15;'@L{15}'
    Texto C16;'@L{16}'
  Finsi
	NEGRITAS FALSE
	Imprime
FinFunc


// *************************************************************************************************
// fNetoMonedaReporte
// Descripcion : El importe neto del documento lo cambia al IdMoneda que recibe
// Entrada : 		aMovimiento: 	Indicador para saber si se va a convertir un movimiento o el documento
//															1 - Movimiento
//															0 - Documento
//          		aTblDocto : 	Documento que se convertira su importe
//          		aIdMoneda : 	ID de la moneda en que se quiere el importe
// Salida  :		Importe del documento o movimiento reflejado en la moneda que recibe 
// *************************************************************************************************
Deffunc fNetoMonedaReporte(aMovimiento; aDocumento:TABLA; aIdMoneda)
Local lTipoCambio , lRenglon 
Local lImporteDoctoMonedaRpt, lImporteDoctoMonedaBase, lTipoCambioRpt

	Si aDocumento(cIdMoneda) != aIdMoneda
		// Si la moneda del Reporte es distinta a la moneda del Documento, entonces transformar
		//	el importe a la moneda base tomando el tipo de cambio del documento
		Si aMovimiento
			lImporteDoctoMonedaBase = tMovimiento(cNeto) - tMovimiento(cDescuento1) - tMovimiento(cDescuento2) - tMovimiento(cDescuento3) - tMovimiento(cDescuento4) - tMovimiento(cDescuento5)
		SiNo	
			lImporteDoctoMonedaBase = (aDocumento(cNeto) - aDocumento(cDescuentoMov))
		FinSi
    Si aDocumento(cIdMoneda) != 1
			lImporteDoctoMonedaBase	= lImporteDoctoMonedaBase * aDocumento(cTipoCambio)
    FinSi
    lTipoCambioRpt = 1.00
		// Si el reporte es requerido en una Moneda distinta a la Moneda Base, transformar el
		//	importe utilizando la tabla de tipos de cambio
		Si aIdMoneda != 1
      Si gIdMonedaCte = aIdMoneda Y aDocumento(cTipoCambio) > 1.00
        lTipoCambioRpt = aDocumento(cTipoCambio)
      SiNo
        lTipoCambioRpt = fTipoCambio(aDocumento(cFecha); aIdMoneda; tTiposCambio)
      FinSi
		Finsi
		lImporteDoctoMonedaRpt = lImporteDoctoMonedaBase / lTipoCambioRpt
	Sino
		// Si la moneda del reporte es la misma moneda del documento tomar los importes tal cual
		Si aMovimiento
			lImporteDoctoMonedaRpt = tMovimiento(cNeto) - tMovimiento(cDescuento1) - tMovimiento(cDescuento2) - tMovimiento(cDescuento3) - tMovimiento(cDescuento4) - tMovimiento(cDescuento5)
		SiNo	
			lImporteDoctoMonedaRpt = aDocumento(cNeto) - aDocumento(cDescuentoMov)
		FinSi
	Finsi
	Retorna lImporteDoctoMonedaRpt
FinFunc

// *************************************************************************************************
//  Parámetros 	:	Tabla de documentos
//								aOpcion							1 Unidades Surtidas		
//																		2 Unidades Devueltas
//  Salidas 		: Unidades devueltas del documento
// *************************************************************************************************
DefFunc fUnidadesDocumento(atDocumento: Tabla; aOpcion)
Local lUnidades

	lUnidades = 0.0

	// Los documentos cancelados solamente calcularna las unidades totales
	Si atDocumento(cCancelado) = 1 y aOpcion != 1
		Retorna lUnidades
	FinSi

	// Recupera los movimientos del documento
	tMovimiento.Usaindice['iDoctoNumeroMovto']
	tMovimientoDestino.Usaindice['cIdMovtoOrigen']      
	Mientras [ tMovimiento.Busca[@Str(atDocumento(cIdDocumento);0)]; tMovimiento->Encontro; tMovimiento.Busca Siguiente[1] ]

		Escoge aOpcion
			Caso 1		// Unidades Surtidas
				Si pTipoReporte = 7 o pTipoReporte = 12
					Mientras [tMovimientoDestino.busca[@Str(tMovimiento(cIdMovimiento);0)];tMovimientoDestino->encontro;tMovimientoDestino.Busca Siguiente[1]]
						Si tMovimientoDestino(cIdDocumentoDe) = 4  // Factura
							lUnidades = lUnidades + tMovimientoDestino(cUnidadesOrigen)
						Finsi
						Si tMovimientoDestino(cIdDocumentoDe) = 19  // Compra
							lUnidades = lUnidades + tMovimientoDestino(cUnidadesOrigen)
						Finsi
				  Finmientras
				Sino
					lUnidades = lUnidades + tMovimiento(cUnidades) - tMovimiento(cUnidadesPendientes)
				FinSi
			FinCaso
			Caso 2		// Unidades Devueltas
				Si pTipoReporte = 7 o pTipoReporte = 12
					Mientras [tMovimientoDestino.busca[@Str(tMovimiento(cIdMovimiento);0)];tMovimientoDestino->encontro;tMovimientoDestino.Busca Siguiente[1]]
				    Si tMovimientoDestino(cIdDocumentoDe) = 6  // Dev. Remisión
							lUnidades = lUnidades + tMovimientoDestino(cUnidadesOrigen)
				 		Finsi
				    Si tMovimientoDestino(cIdDocumentoDe) = 21  // Dev. Consignación
							lUnidades = lUnidades + tMovimientoDestino(cUnidadesOrigen)
  			  	Finsi
				  Finmientras
				FinSi
			FinCaso	
		FinEscoge
	FinMientras

	Retorna lUnidades
FinFunc

// *************************************************************************************************
//	Esta función imprime los datos del documento
//  Parámetros 
//  Salidas 
// *************************************************************************************************
DefFunc fImprimeDocumento(atDocumento: Tabla)
Local vImprime, lFechaEditada, lDescuento, lImpuesto, lCodigoEditado
Local	lNetoDocumento
Local lColumna, lUnidades, lSurtidas, lDevueltas, lPendientes, lContinua

	Columnas 16;1.75,0.15,0.75,0.15,1.20,0.15,3.74
	vImprime = ' '[C0..C15]

	// Fecha del documento
	lFechaEditada = fFormateaFecha(atDocumento(cFecha); gIdioma)
	// Fecha
	vImprime = @Col(lFechaEditada;0)[C0]
	// Serie
	vImprime = atDocumento(cSerieDocumento)[C2]
	// Folio
	vImprime = @Str(atDocumento(cFolio);0)[C4]
	tConcepto.Busca[@Str(atDocumento(cIdConceptoDocumento);0)]
	Si tConcepto->Encontro
		vImprime = tConcepto(cNombreConcepto)[C6]
	FinSi
	// Reportes Detallados Por Cliente/Proveedor que no incluyen Movimientos
	//N.C.146
	Si (pTipoReporte = 1) o (pTipoReporte = 4) o (pTipoReporte = 7) o (pTipoReporte = 10) o (pTipoReporte = 12) o (pTipoReporte = 14)
		Si pConSinMovimientos = 0
			Columnas 19;1.75, 0.15, 0.75, 0.15, 1.20, 0.15, 3.74, 0.15, 1.5, 0.15, 1.5, 0.15, 1.5, 0.15, 1.5, 0.15, 1.5
			lColumna = 8
			
			// Cantidad
			lUnidades = atDocumento(cTotalUnidades)
			vImprime[lColumna] = @Col(lUnidades;0)

			// Unidades Surtidas
			lColumna = lColumna + 2
			lSurtidas = fUnidadesDocumento(atDocumento; 1)
			vImprime[lColumna] = @Col(lSurtidas;0)
		
			// Unidades Devueltas SOLO para Reportes Detallados de Remisiones y Consignaciones
			Si pTipoReporte = 7 o pTipoReporte = 12
				lColumna = lColumna + 2
				lDevueltas = fUnidadesDocumento(atDocumento; 2)
			  vImprime[lColumna] = @Col(lDevueltas;0)
		  Finsi

			// Unidades Pendientes
			lColumna = lColumna + 2
			Si atDocumento(cCancelado) = 1
				lPendientes = 0.0
			Sino
				lPendientes = atDocumento(cUnidadesPendientes)
			FinSi
		  vImprime[lColumna] = @val(@Col(lPendientes; 0))
			
			// Descartar los documentos segun su estado (Todos, surtidos, por surtir) y el 
			//	filtro respectivo (pStatus)
			Si (pStatus = 0) o ((pStatus = 1) y (lPendientes = 0)) o ((pStatus = 2) y (lPendientes > 0))

				// Total documento
				lColumna = lColumna + 2
				lNetoDocumento = fNetoMonedaReporte(0; atDocumento; pMonedaReporte)
			  vImprime[lColumna] = @Col(lNetoDocumento;0)

				// Acumular totales
				Si atDocumento(cCancelado) = 0
					gDiaTotalCantidad 		= gDiaTotalCantidad 		+ lUnidades
					gClienteTotalCantidad	= gClienteTotalCantidad	+ lUnidades
					gTotalCantidad 				= gTotalCantidad 				+ lUnidades

					gDiaTotalPendientes 		= gDiaTotalPendientes 		+ lPendientes
					gClienteTotalPendientes = gClienteTotalPendientes + lPendientes
					gTotalPendientes 				= gTotalPendientes 				+ lPendientes

					gDiaTotalSurtidas 		= gDiaTotalSurtidas 		+ lSurtidas
					gClienteTotalSurtidas = gClienteTotalSurtidas + lSurtidas
					gTotalSurtidas 				= gTotalSurtidas 				+ lSurtidas

					gDiaTotalNeto 			= gDiaTotalNeto 		+ lNetoDocumento
					gClienteTotalNeto 	= gClienteTotalNeto + lNetoDocumento
					gTotalNeto 				  = gTotalNeto 				+ lNetoDocumento
				
					Si pTipoReporte = 7 o pTipoReporte = 12
					  gDiaTotalDevueltas = gDiaTotalDevueltas + lDevueltas
			  		gClienteTotalDevueltas = gClienteTotalDevueltas + lDevueltas
						gTotalDevueltas = gTotalDevueltas +  lDevueltas
					FinSi
				FinSi

				// Leyenda				
				Si pTipoReporte = 7 o pTipoReporte = 12
					lColumna = 17
				Sino
					lColumna = 16
				FinSi
				Si atDocumento(cCancelado) = 1
					vImprime[lColumna] = 'Cancelado'
				Sino				
          // N.D.4312 Muestra algunos movimientos como parciales cuando ya están surtidos
					//N.D. 7984
					//0.0000001
					Si fFormateaNumero(atDocumento(cUnidadesPendientes);tParametros(cDecimalesUnidades)) <= 0.0000001 //!N.D.4312= 0
					 	vImprime[lColumna] = 'Surtido'						
					SiNo
						Si atDocumento(cUnidadesPendientes) = atDocumento(cTotalUnidades)
							vImprime[lColumna] = 'Sin Surtir'
				 		SiNo
							vImprime[lColumna] = 'Parcial'
				 		FinSi
					FinSi
				FinSi

				Lista vImprime
			FinSi
			Columnas 16;1.75, 0.15, 6.00, 0.15, 1.50, 0.15, 0.00, 0.00, 1.5, 0.15, 1.5, 0.15, 1.5, 0.15, 1.5
			Retorna
		FinSi
	FinSi
	Lista vImprime
FinFunc

// *************************************************************************************************
//	Esta función imprime los datos del documento
//  Parámetros 
//  Salidas 
// *************************************************************************************************
DefFunc fImprimeProductoDocumento(atMovimiento: Tabla; aEstaCancelado; aTipoProducto)
Local idDocumento, vImprime, lFechaEditada, lDescuento, lImpuesto, lCodigoEditado
Local lColumna, LUnidades, LSurtidas, LPendientes, LDevueltas

  Si pTipoReporte = 7 o pTipoReporte = 8 o pTipoReporte = 9 o pTipoReporte = 12 o pTipoReporte = 13
    Columnas 21;1.75, 0.15, 0.75, 0.15, 1.2, 0.15, 4.5, 0.15, 1.5, 0.15, 0.44, 0.15, 1.5, 0.15, 1.5, 0.15, 1.5, 0.15, 1.5, 0.15, 1.5 //N.D.4379
    // N.D.4250 Ajustar la configuración de decimales
	  [C4, C8, C12, C14, C16].Coma
	  [C4].Decimales 0
	  [C8, C12, C14, C16].Decimales gDecimalesUnidades
	  [C18].Decimales gDecimalesMoneda
  Sino
	  Columnas 19;1.75, 0.15, 0.75, 0.15, 1.2, 0.15, 4.5, 0.15, 1.5, 0.15, 0.44, 0.15, 1.5, 0.15, 1.5, 0.15, 1.5, 0.15, 1.5 //N.D.4379
    // N.D.4250 Ajustar la configuración de decimales
	  [C4, C8, C12, C14].Coma
	  [C4].Decimales 0
	  [C8, C12, C14].Decimales gDecimalesUnidades
	  [C16].Decimales gDecimalesMoneda
  Finsi
	vImprime = ' '[C0..C18]
	tDocumento.Usaindice['']
	// Busqueda del documento
	Si atMovimiento(cIdDocumento) > 0
	  tDocumento.Busca[@Str(atMovimiento(cIdDocumento);0)]
	Sino
    tMovimientoOwner.Busca[@Str(tMovimiento(cIdMovtoOwner);0)] 
    Si !tMovimientoOwner->Encontro
      Retorna
    FinSi
    tDocumento.Busca[@Str(tMovimientoOwner(cIdDocumento);0)] 
	FinSi
	Si !tDocumento->Encontro
		Retorna
	FinSi
   gIdMonedaCte = 1
   tClienteProveedor.Busca[@Str(tDocumento(cIdClienteProveedor);0)]
   Si tClienteProveedor->Encontro
     gIdMonedaCte = tClienteProveedor(cIdMoneda)
   FinSi
   
	// 	Fecha del documento
	lFechaEditada = fFormateaFecha(tDocumento(cFecha); gIdioma)
	//	 Fecha
	vImprime = @Col(lFechaEditada;0)[C0]
	//	 Serie
	vImprime = tDocumento(cSerieDocumento)[C2]		
	//	 Folio
	vImprime = @Str(tDocumento(cFolio);0)[C4]
	tConcepto.Busca[@Str(tDocumento(cIdConceptoDocumento);0)]
	Si tConcepto->Encontro
		vImprime = tConcepto(cNombreConcepto)[C6]
	FinSi

	// Cantidad
	vImprime = atMovimiento(cUnidades)[C8]
	LUnidades = @Val(atMovimiento(cUnidades))
	gDocumentoTotalCantidad = gDocumentoTotalCantidad + LUnidades
	// Si el movimiento esta cancelado no totaliza unidades
	Si aEstaCancelado = 0
		gDiaTotalCantidad = gDiaTotalCantidad + LUnidades
		gClienteTotalCantidad = gClienteTotalCantidad + LUnidades
		// Acumular los totales
		Si aTipoProducto = 2
		  gTotalCantidadPaquetes = gTotalCantidadPaquetes + LUnidades
		Sino
		  gTotalCantidad = gTotalCantidad + LUnidades
		FinSi
	FinSi

  // Las unidades se muestran en la unidad base siempre
	// Unidad de peso o medida
	Si tProducto(cIdUnidadBase)
		tUnidad.Busca[@Str(tProducto(cIdUnidadBase);0)]
		Si tUnidad->Encontro
			vImprime = tUnidad(cDespliegue)[C10]
		FinSi
	FinSi

	// Si es el reporte de Remisiones o de Consignaciones buscar los movimientos 
	// destino para determinar si son facturas, compras o devoluciones
	Si pTipoReporte = 7 o pTipoReporte = 8 o pTipoReporte = 9 o pTipoReporte = 12 o pTipoReporte = 13 
		Si aEstaCancelado = 1
			LSurtidas = 0.0
			LDevueltas = 0.0
		  vImprime = @val(@Col(LSurtidas;0))[C12]
  	  vImprime = @val(@Col(LDevueltas;0))[C14]
		Sino
	    Mientras [tMovimientoDestino.busca[@Str(atMovimiento(cIdMovimiento);0)];tMovimientoDestino->encontro;tMovimientoDestino.Busca Siguiente[1]]
				Si tMovimientoDestino(cIdDocumentoDe) = 4  // Factura
					LSurtidas = LSurtidas + tMovimientoDestino(cUnidadesOrigen)
				Finsi
		  	Si tMovimientoDestino(cIdDocumentoDe) = 6  // Dev. Remisión
					LDevueltas = LDevueltas + tMovimientoDestino(cUnidadesOrigen)
				Finsi
		  	Si tMovimientoDestino(cIdDocumentoDe) = 19  // Compra
					LSurtidas = LSurtidas + tMovimientoDestino(cUnidadesOrigen)
				Finsi
			  Si tMovimientoDestino(cIdDocumentoDe) = 21  // Dev. Consignación
					LDevueltas = LDevueltas + tMovimientoDestino(cUnidadesOrigen)
		  	Finsi
		  Finmientras  // Hay movimientos destino
		  vImprime = @Col(LSurtidas;0)[C12]
  	  vImprime = @Col(LDevueltas;0)[C14]
		FinSi
		// La columna en la que se imprimio el ultimo valor es la 14, a partir de esta se
		//	escriben datos sumando dos a la columna
		lColumna = 14
	Sino  // No es reporte de Remisiones o Consignaciones
		// Los movimientos cancelados no tienen unidades surtidas o devueltas
		Si aEstaCancelado = 0
			// ActualizarTotales del reporte
  	  vImprime = (atMovimiento(cUnidades) - atMovimiento(cUnidadesPendientes))[C12]
	  	LSurtidas = (@Val(atMovimiento(cUnidades) - atMovimiento(cUnidadesPendientes)))
		Sino
	  	LSurtidas = 0.0
  	  vImprime = @val(@Col(LSurtidas;0))[C12]
		FinSi
    LDevueltas = 0.0
		// La columna en la que se imprimio el ultimo valor es la 12, a partir de esta se
		//	escriben datos sumando dos a la columna
		lColumna = 12
	Finsi

	// Totaliza las unidades Surtidas
	gDocumentoTotalSurtidas = gDocumentoTotalSurtidas + LSurtidas
	gDiaTotalSurtidas = gDiaTotalSurtidas + LSurtidas
	gClienteTotalSurtidas = gClienteTotalSurtidas +  LSurtidas	
  // Acumular los totales
  Si aTipoProducto = 2
    gTotalSurtidasPaquetes = gTotalSurtidasPaquetes + LSurtidas
  Sino
    gTotalSurtidas = gTotalSurtidas + LSurtidas
  FinSi
		
	// Totaliza las unidades Devueltas
	Si pTipoReporte = 7 o pTipoReporte = 8 o pTipoReporte = 9 o pTipoReporte = 12 o pTipoReporte = 13 
	  gDocumentoTotalDevueltas = gDocumentoTotalDevueltas + LDevueltas
	  gDiaTotalDevueltas = gDiaTotalDevueltas + LDevueltas
	  gClienteTotalDevueltas = gClienteTotalDevueltas + LDevueltas
    // Acumular los totales
    Si aTipoProducto = 2
      gTotalDevueltasPaquetes = gTotalDevueltasPaquetes + LDevueltas
    Sino
      gTotalDevueltas = gTotalDevueltas + LDevueltas
    FinSi
	Finsi

	// Pendientes
	lColumna = lColumna + 2
	// Los movimientos cancelados no tienen unidades pendientes
	Si aEstaCancelado = 0
	  LPendientes = @Val(atMovimiento(cUnidadesPendientes))
		vImprime[lColumna] = atMovimiento(cUnidadesPendientes)
	Sino
		LPendientes =0.0
		vImprime[lColumna] = @val(@Col(LPendientes;0))
	FinSi		

	// Totaliza las unidades Pendientes
	gDocumentoTotalPendientes = gDocumentoTotalPendientes + LPendientes
	gDiaTotalPendientes = gDiaTotalPendientes + LPendientes
	gClienteTotalPendientes = gClienteTotalPendientes + LPendientes
  // Acumular los totales
  Si aTipoProducto = 2
    gTotalPendientesPaquetes = gTotalPendientesPaquetes + LPendientes
  Sino
    gTotalPendientes = gTotalPendientes + LPendientes
  FinSi

	// Total
	lColumna = lColumna + 2
	// Se convierte el importe del movimiento a la moneda que se pidio
	ITotalMovimiento = fNetoMonedaReporte(1;tDocumento; pMonedaReporte)
 	vImprime[lColumna] = @Col(ITotalMovimiento;0)
	gDocumentoTotalNeto = gDocumentoTotalNeto + ITotalMovimiento
	// Si el movimiento esta cancelado no totaliza unidades
	Si aEstaCancelado = 0
		gDiaTotalNeto = gDiaTotalNeto + ITotalMovimiento
		gClienteTotalNeto = gClienteTotalNeto + ITotalMovimiento
		gTotalNeto = gTotalNeto + ITotalMovimiento	
	FinSi

	// Estado
	lColumna = lColumna + 2
	// Los movimientos de documentos cancelados tiene siempre la leyenda "Cancelado"
	Si aEstaCancelado = 1
		vImprime[lColumna] = 'Cancelado'
	Sino
		Si fFormateaNumero(tDocumento(cUnidadesPendientes);tParametros(cDecimalesUnidades)) <= 0.0000001 //!N.D.4312= 0
			vImprime[lColumna] = 'Surtido'						
		SiNo
			Si tDocumento(cUnidadesPendientes) = tDocumento(cTotalUnidades)
				vImprime[lColumna] = 'Sin Surtir'
			SiNo
				vImprime[lColumna] = 'Parcial'
			FinSi
		FinSi
  FinSi

	Si pTipoReporte = 7 o pTipoReporte = 8 o pTipoReporte = 9 o pTipoReporte = 12 o pTipoReporte = 13
		// Eliminación de @val ya que regresaba el folio con decimales
		vImprime = @col(vImprime;4)	[C4]
    vImprime = @val(@col(vImprime;8))	[C8]
    //vImprime = @val(@col(vImprime;10))	[C10]
    vImprime = @val(@col(vImprime;12))	[C12]
    vImprime = @val(@col(vImprime;14))	[C14]
	sino
		// Eliminación de @val ya que regresaba el folio con decimales
    vImprime = @col(vImprime;4)	[C4]
    vImprime = @val(@col(vImprime;8))	[C8]
    vImprime = @val(@col(vImprime;12))	[C12]
	finsi

	Lista vImprime
FinFunc

// *************************************************************************************************
//	Esta función imprime los datos de un movimiento.
//  Parámetros 
//  Salidas 
// *************************************************************************************************
DefFunc fImprimeMovimiento(atMovimiento:Tabla; atProducto:Tabla; aEstaCancelado)
Local vImprime, lDescuento, lImpuesto, lCodigoEditado, ITotalMovimiento
Local lColumna, LUnidades, LSurtidas, LPendientes, LDevueltas

	Si pTipoReporte = 7 o pTipoReporte = 8 o pTipoReporte = 9 o pTipoReporte = 12 o pTipoReporte = 13 
 	  Columnas 18;1.75, 0.15, 5.52, 0.15, 1.5, 0.15, 0.44, 0.15, 1.5, 0.15, 1.5, 0.15, 1.5, 0.15, 1.5, 0.15, 1.5
    // N.D.4250 Ajustar la configuración de decimales
	  [C4, C8, C10, C12, C14].Coma
	  [C4, C8, C10, C12].Decimales gDecimalesUnidades
	  [C14].Decimales gDecimalesMoneda
	Sino
 	  Columnas 16;1.75, 0.15, 5.52, 0.15, 1.5, 0.15, 0.44, 0.15, 1.5, 0.15, 1.5, 0.15, 1.5, 0.15, 1.5
    // N.D.4250 Ajustar la configuración de decimales
	  [C4, C8, C10, C12, C14].Coma
	  [C4, C8, C10].Decimales gDecimalesUnidades
	  [C12].Decimales gDecimalesMoneda
  Finsi
	vImprime = ' '[C0..C15]

  // Identar los movimientos que correspondan a componentes de paquetes
	// Codigo del producto
	Si atMovimiento(cIdDocumento) = 0 Y atMovimiento(cMovtoOculto) = 1 
	  lCodigoEditado = '   ' & fMascarilla(atProducto(cCodigoProducto); gMascarillaProducto)
	Sino
	  lCodigoEditado = fMascarilla(atProducto(cCodigoProducto); gMascarillaProducto)
	FinSi
	vImprime = @Col(lCodigoEditado;0)[C0]
	// Descripcion del producto  
	vImprime = atProducto(cNombreProducto)[C2]
	// Cantidad
	vImprime = atMovimiento(cUnidades)[C4]
	LUnidades = @Val(atMovimiento(cUnidades))
  // Acumular los totales
	Si atProducto(cTipoProducto) = 2
	  gDoctoTotalCantidadPaquetes = gDoctoTotalCantidadPaquetes + LUnidades
	Sino
    gDocumentoTotalCantidad = gDocumentoTotalCantidad + LUnidades
	FinSi
	// No totalizar las unidades de los movimiento de documentos cancelados
	Si aEstaCancelado = 0
		// Acumular los totales
		Si atProducto(cTipoProducto) = 2
  		gDiaTotalCantidadPaquetes = gDiaTotalCantidadPaquetes + LUnidades
	  	gCteTotalCantidadPaquetes = gCteTotalCantidadPaquetes + LUnidades
		  gTotalCantidadPaquetes = gTotalCantidadPaquetes + LUnidades
		Sino
  		gDiaTotalCantidad = gDiaTotalCantidad + LUnidades
	  	gClienteTotalCantidad = gClienteTotalCantidad + LUnidades
		  gTotalCantidad = gTotalCantidad + LUnidades
		FinSi
	FinSi

  // Las unidades se muestran en la unidad base siempre
	// Unidad de peso o medida
	Si atProducto(cIdUnidadBase)
		tUnidad.Busca[@Str(atProducto(cIdUnidadBase);0)]
		Si tUnidad->Encontro
			vImprime = tUnidad(cDespliegue)[C6]
		FinSi
	FinSi

	// Unidades Surtidas / Unidades Devueltas
	// Si es el reporte de Remisiones o de Consignaciones buscar los movimientos 
	// destino para determinar si son facturas, compras o devoluciones
	Si pTipoReporte = 7 o pTipoReporte = 8 o pTipoReporte = 9 o pTipoReporte = 12 o pTipoReporte = 13 
		// Los documentos cancelados no tienen unidades surtidas ni devueltas
		Si aEstaCancelado = 1
			LSurtidas 	= 0.0
			LDevueltas 	= 0.0
	    vImprime = @val(@Col(LSurtidas;0))[C8]
  	  vImprime = @val(@Col(LDevueltas;0))[C10]
		Sino
			Mientras [tMovimientoDestino.busca[@Str(atMovimiento(cIdMovimiento);0)];tMovimientoDestino->encontro;tMovimientoDestino.Busca Siguiente[1]]
			 	Si tMovimientoDestino(cIdDocumentoDe) = 4  // Factura
					LSurtidas = LSurtidas + tMovimientoDestino(cUnidadesOrigen)
		 		Finsi
		    Si tMovimientoDestino(cIdDocumentoDe) = 6  // Dev. Remisión
					LDevueltas = LDevueltas + tMovimientoDestino(cUnidadesOrigen)
			 	Finsi
	    	Si tMovimientoDestino(cIdDocumentoDe) = 19  // Compra
					LSurtidas = LSurtidas + tMovimientoDestino(cUnidadesOrigen)
			 	Finsi
		    Si tMovimientoDestino(cIdDocumentoDe) = 21  // Dev. Consignación
					LDevueltas = LDevueltas + tMovimientoDestino(cUnidadesOrigen)
	    	Finsi
		  Finmientras  // Hay movimientos destino
  	  vImprime = @Col(LSurtidas;0)[C8]
    	vImprime = @Col(LDevueltas;0)[C10]
		FinSi
		// La columna en la que se imprimio el ultimo valor es la 10, a partir de esta se
		//	escriben datos sumando dos a la columna
		lColumna = 10
	Sino  // No es reporte de Remisiones o Consignaciones
		// Las unidades surtidas de los movimiento de documentos cancelados siempre serán cero
		Si aEstaCancelado = 1
			LSurtidas = 0.0
			vImprime = @val(@col(LSurtidas;0))[C8]
		Sino
		  LSurtidas = (@Val(atMovimiento(cUnidades) - atMovimiento(cUnidadesPendientes)))
	    vImprime = (atMovimiento(cUnidades) - atMovimiento(cUnidadesPendientes))[C8]
		FinSi
		// Los reportes que no son de remisiones ni consignaciones no tienen unidades devueltas
    LDevueltas = 0.0
		// La columna en la que se imprimio el ultimo valor es la 8, a partir de esta se
		//	escriben datos sumando dos a la columna
		lColumna = 8
	Finsi

	// Totaliza las unidades Surtidas
  // Acumular los totales
	Si atProducto(cTipoProducto) = 2
  	gDiaTotalSurtidasPaquetes = gDiaTotalSurtidasPaquetes + LSurtidas
	  gCteTotalSurtidasPaquetes = gCteTotalSurtidasPaquetes +  LSurtidas
	  gDoctoTotalSurtidasPaquetes = gDoctoTotalSurtidasPaquetes + LSurtidas
	  gTotalSurtidasPaquetes = gTotalSurtidasPaquetes + LSurtidas
	Sino
  	gDiaTotalSurtidas = gDiaTotalSurtidas + LSurtidas
	  gClienteTotalSurtidas = gClienteTotalSurtidas +  LSurtidas
    gDocumentoTotalSurtidas = gDocumentoTotalSurtidas + LSurtidas
    gTotalSurtidas = gTotalSurtidas +  LSurtidas
	FinSi

	// Totaliza las unidades Devueltas
	Si pTipoReporte = 7 o pTipoReporte = 8 o pTipoReporte = 9 o pTipoReporte = 12 o pTipoReporte = 13 
    // Acumular los totales
	  Si atProducto(cTipoProducto) = 2
	    gTotalDevueltasPaquetes = gTotalDevueltasPaquetes + LDevueltas
	    gDoctoTotalDevueltasPaquetes = gDoctoTotalDevueltasPaquetes + LDevueltas
  	  gDiaTotalDevueltasPaquetes = gDiaTotalDevueltasPaquetes + LDevueltas
	    gCteTotalDevueltasPaquetes = gCteTotalDevueltasPaquetes + LDevueltas
	  Sino
      gDocumentoTotalDevueltas = gDocumentoTotalDevueltas + LDevueltas
  	  gDiaTotalDevueltas = gDiaTotalDevueltas + LDevueltas
	    gClienteTotalDevueltas = gClienteTotalDevueltas + LDevueltas
	    gTotalDevueltas = gTotalDevueltas +  LDevueltas
	  FinSi
  Finsi

	// Pendientes
	lColumna = lColumna + 2
	// Los documentos cancelados no tienen unidades pendientes
	Si aEstaCancelado = 1
		LPendientes = 0.0
	Sino
		LPendientes = @val(atMovimiento(cUnidadesPendientes))
	FinSi	
	vImprime[lColumna] = @val(@col(LPendientes;0))

	// Totaliza las unidades Pendientes
  // Acumular los totales
  Si atProducto(cTipoProducto) = 2
    gDoctoTotalPendientesPaquetes = gDoctoTotalPendientesPaquetes + LPendientes
  	gDiaTotalPendientesPaquetes = gDiaTotalPendientesPaquetes + LPendientes
	  gCteTotalPendientesPaquetes = gCteTotalPendientesPaquetes + LPendientes
	  gTotalPendientesPaquetes = gTotalPendientesPaquetes + LPendientes
  Sino
    gDocumentoTotalPendientes = gDocumentoTotalPendientes + LPendientes
  	gDiaTotalPendientes = gDiaTotalPendientes + LPendientes
	  gClienteTotalPendientes = gClienteTotalPendientes + LPendientes
	  gTotalPendientes = gTotalPendientes + LPendientes
  FinSi

	// Total
	lColumna = lColumna + 2
	// Se convierte el importe del movimiento a la moneda que se pidio
  Si gTipo != 2
  	ITotalMovimiento = fNetoMonedaReporte(1;tDocumento; pMonedaReporte)
  Sino
    ITotalMovimiento = 0
  FinSi

  vImprime[lColumna] = @Col(ITotalMovimiento;0)
	gDocumentoTotalNeto = gDocumentoTotalNeto + ITotalMovimiento

	// No totalizar el importe de los movimientos cancelados
	Si aEstaCancelado = 0
		gDiaTotalNeto = gDiaTotalNeto + ITotalMovimiento
		gClienteTotalNeto = gClienteTotalNeto + ITotalMovimiento
		gTotalNeto = gTotalNeto + ITotalMovimiento	
	FinSi

	// Estado
	lColumna = lColumna + 2
	// Los movimientos de documentos cancelados tiene siempre la leyenda "Cancelado"
	Si aEstaCancelado = 1
		vImprime[lColumna] = 'Cancelado'
	Sino
		// N.D.4312 Muestra algunos movimientos como parciales cuando ya están surtidos
		//N.D.-7984:  Se reduce el número de decimales para q los que tienen 0.000001 sean 'Surtido'
		Si fFormateaNumero(atMovimiento(cUnidadesPendientes);tParametros(cDecimalesUnidades)) <= 0.0000001 //!N.D.4312= 0
		 	vImprime[lColumna] = 'Surtido'
		SiNo
			Si atMovimiento(cUnidadesPendientes) = atMovimiento(cUnidades)
				vImprime[lColumna] = 'Sin Surtir'
		 	SiNo
				vImprime[lColumna] = 'Parcial'
		 	FinSi
		FinSi
	FinSi

  Si pTipoReporte = 7 o pTipoReporte = 8 o pTipoReporte = 9 o pTipoReporte = 12 o pTipoReporte = 13
    vImprime = @val(@col(vImprime;4))	[C4]
    vImprime = @val(@col(vImprime;8))	[C8]
    vImprime = @val(@col(vImprime;10))[C10]
    vImprime = @val(@col(vImprime;12))[C12]
    vImprime = @val(@col(vImprime;14))[C14]
  sino
    vImprime = @val(@col(vImprime;4))	[C4]
    vImprime = @val(@col(vImprime;8))	[C8]
    vImprime = @val(@col(vImprime;10))[C10]
    vImprime = @val(@col(vImprime;12))[C12]
  finsi

	Lista vImprime  
FinFunc

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

	Si pTipoReporte = 7 o pTipoReporte = 8 o pTipoReporte = 9 o pTipoReporte = 12 o pTipoReporte = 13
	  Texto C4;'@L{4}'
	  Texto C8;'@L{8}'
	  Texto C10;'@L{10}'
	  Texto C12;'@L{12}'
	  Texto C14;'@L{14}'
	  Imprime
	  ITotalDocumento =  0
	  vImprime = ' '[C0..C17]
	  vImprime = 'Total Documento'[C2]
	  vImprime = @Col(gDocumentoTotalCantidad;0)[C4]
	  // Total Surtidas
	  vImprime = @Col(gDocumentoTotalSurtidas;0)[C8]
	  //Total devueltas
	  vImprime = @Col(gDocumentoTotalDevueltas;0)[C10]
	  //Total pendientes
	  vImprime = @Col(gDocumentoTotalPendientes;0)[C12]
	  //Gran Total
	  vImprime = @Col(gDocumentoTotalNeto;0)[C14]
	  Lista vImprime
	  Si gDoctoTotalCantidadPaquetes > 0
	    vImprime = ' '[C0..C17]
	    vImprime = 'Total Paquete Documento'[C2]
	    // Total Cantidad
	    vImprime = @Col(gDoctoTotalCantidadPaquetes;0)[C4]
	    // Total Surtidas
  	  vImprime = @Col(gDoctoTotalSurtidasPaquetes;0)[C8]
	    // Total devueltas
	    vImprime = @Col(gDoctoTotalDevueltasPaquetes;0)[C10]
	    // Total pendientes
  	  vImprime = @Col(gDoctoTotalPendientesPaquetes;0)[C12]
  	  Lista vImprime
	  FinSi
	Sino
	  Texto C4;'@L{4}'
	  Texto C8;'@L{8}'
	  Texto C10;'@L{10}'
	  Texto C12;'@L{12}'
	  Imprime
	  ITotalDocumento =  0
	  vImprime = ' '[C0..C17]
	  vImprime = 'Total Documento'[C2]
	  vImprime = @Col(gDocumentoTotalCantidad;0)[C4]
	  // Total Surtidas
	  vImprime = @Col(gDocumentoTotalSurtidas;0)[C8]
	  //Total pendientes
	  vImprime = @Col(gDocumentoTotalPendientes;0)[C10]
	  //Gran Total
	  vImprime = @Col(gDocumentoTotalNeto;0)[C12]
	  Lista vImprime
	  Si gDoctoTotalCantidadPaquetes > 0
	    vImprime = ' '[C0..C17]
	    vImprime = 'Total Paquete Documento'[C2]
	    // Total Cantidad
	    vImprime = @Col(gDoctoTotalCantidadPaquetes;0)[C4]
	    // Total Surtidas
  	  vImprime = @Col(gDoctoTotalSurtidasPaquetes;0)[C8]
	    // Total pendientes
  	  vImprime = @Col(gDoctoTotalPendientesPaquetes;0)[C10]
  	  Lista vImprime
	  FinSi
	Finsi
	Saltalin 2
	gDocumentoTotalCantidad = 0
	gDocumentoTotalSurtidas = 0
  gDocumentoTotalDevueltas = 0
	gDocumentoTotalPendientes = 0
	gDocumentoTotalNeto = 0
	// Inicializar lo totales
	gDoctoTotalCantidadPaquetes = 0
	gDoctoTotalSurtidasPaquetes = 0
  gDoctoTotalDevueltasPaquetes = 0
	gDoctoTotalPendientesPaquetes = 0
FinFunc

// *************************************************************************************************
//	Esta función imprime los totales de un día.
//  Parámetros 
//  Salidas 
// *************************************************************************************************
DefFunc fImprimeTotalesDia()
Local lTotalPaquete
	//N.C.146
	Si (pTipoReporte = 3) o (pTipoReporte = 6) o (pTipoReporte = 9) o (pTipoReporte = 11) o (pTipoReporte = 13) o (pTipoReporte = 15)
		Si pTipoReporte = 9 o pTipoReporte = 13
     	Columnas 21;1.75, 0.15, 0.75, 0.15, 1.2, 0.15, 4.5, 0.15, 1.5, 0.15, 0.44, 0.15, 1.5, 0.15, 1.5, 0.15, 1.5, 0.15, 1.5, 0.15, 1.5 //N.D.4379
		 	Texto C8;'@L{8}'
		 	Texto C12;'@L{12}'
		 	Texto C14;'@L{14}'
		 	Texto C16;'@L{16}'
      Texto C18; '@L{18}'  
     Sino
		 	Columnas 19;1.75, 0.15, 0.75, 0.15, 1.2, 0.15, 4.5, 0.15, 1.5, 0.15, 0.44, 0.15, 1.5, 0.15, 1.5, 0.15, 1.5, 0.15, 1.5 //N.D.4379
		 	Texto C8;'@L{8}'
		 	Texto C12;'@L{12}'
		 	Texto C14;'@L{14}'
		 	Texto C16;'@L{16}'
    Finsi
		Imprime
  
		vImprime = ' '[C0..C19]
		lTotalPaquete = ' '[C0..C19]
 		lTotalPaquete = 'Total Paquetes Día'[C6]
		vImprime = 'Total Día'[C6]
    Si pTipoReporte = 9 o pTipoReporte = 13
		  // Total Cantidad
		  vImprime = @Col(gDiaTotalCantidad;0)[C8]
		  // Total Surtidas
		  vImprime = @Col(gDiaTotalSurtidas;0)[C12]
      // Total Devueltas
      vImprime = @Col(gDiaTotalDevueltas;0)[C14]  
		  //Total pendientes
		  vImprime = @Col(gDiaTotalPendientes;0)[C16]
		  //Gran Total
		  vImprime = @Col(gDiaTotalNeto;0)[C18]
		  Si gDiaTotalCantidadPaquetes > 0
		    // Total Cantidad
		    lTotalPaquete = @Col(gDiaTotalCantidadPaquetes;0)[C8]
		    // Total Surtidas
		    lTotalPaquete = @Col(gDiaTotalSurtidasPaquetes;0)[C12]
        // Total Devueltas
        lTotalPaquete = @Col(gDiaTotalDevueltasPaquetes;0)[C14]  
		    // Total pendientes
		    lTotalPaquete = @Col(gDiaTotalPendientesPaquetes;0)[C16]
		  FinSi
    Sino
		  // Total Cantidad
		  vImprime = @Col(gDiaTotalCantidad;0)[C8]
		  // Total Surtidas
		  vImprime = @Col(gDiaTotalSurtidas;0)[C12]
		  //Total pendientes
		  vImprime = @Col(gDiaTotalPendientes;0)[C14]
		  Si gDiaTotalCantidadPaquetes > 0
	  	  // Total Cantidad
  		  lTotalPaquete = @Col(gDiaTotalCantidadPaquetes;0)[C8]
		    // Total Surtidas
		    lTotalPaquete = @Col(gDiaTotalSurtidasPaquetes;0)[C12]
	  	  // Total pendientes
  		  lTotalPaquete = @Col(gDiaTotalPendientesPaquetes;0)[C14]
  		FinSi
		  //Gran Total
		  vImprime = @Col(gDiaTotalNeto;0)[C16]
		Finsi
	SiNo
		Si pTipoReporte = 7 o pTipoReporte = 8 o pTipoReporte = 12
			Texto C4;'@L{4}'
		  Texto C8;'@L{8}'
		  Texto C10;'@L{10}'
		  Texto C12;'@L{12}'
		  Texto C14;'@L{14}'
		Sino
  		Texto C4;'@L{4}'
		  Texto C8;'@L{8}'
		  Texto C10;'@L{10}'
		  Texto C12;'@L{12}'
    Finsi
		Imprime
 	 
		vImprime = ' '[C0..C19]
		vImprime = 'Total Día'[C2]
		lTotalPaquete = ' '[C0..C19]
 		lTotalPaquete = 'Total Paquetes Día'[C2]
    Si pTipoReporte = 7 o pTipoReporte = 8 o pTipoReporte = 12
		  // Total Cantidad
		  vImprime = @Col(gDiaTotalCantidad;0)[C4]
		  // Total Surtidas
		  vImprime = @Col(gDiaTotalSurtidas;0)[C8]
		  //Total devueltas
		  vImprime = @Col(gDiaTotalDevueltas;0)[C10]	
		  //Total pendientes
		  vImprime = @Col(gDiaTotalPendientes;0)[C12]	
		  //Gran Total
		  vImprime = @Col(gDiaTotalNeto;0)[C14]
		  Si gDiaTotalCantidadPaquetes > 0
		    // Total Cantidad
		    lTotalPaquete = @Col(gDiaTotalCantidadPaquetes;0)[C4]
	  	  // Total Surtidas
  		  lTotalPaquete = @Col(gDiaTotalSurtidasPaquetes;0)[C8]
		    // Total devueltas
		    lTotalPaquete = @Col(gDiaTotalDevueltasPaquetes;0)[C10]	
	  	  // Total pendientes
  		  lTotalPaquete = @Col(gDiaTotalPendientesPaquetes;0)[C12]	
		  FinSi
		Sino
		  // Total Cantidad
		  vImprime = @Col(gDiaTotalCantidad;0)[C4]
		  // Total Surtidas
		  vImprime = @Col(gDiaTotalSurtidas;0)[C8]
		  //Total pendientes
		  vImprime = @Col(gDiaTotalPendientes;0)[C10]	
		  //Gran Total
			vImprime = @Col(gDiaTotalNeto;0)[C12]
		  Si gDiaTotalCantidadPaquetes > 0
	  	  // Total Cantidad
  		  lTotalPaquete = @Col(gDiaTotalCantidadPaquetes;0)[C4]
		    // Total Surtidas
		    lTotalPaquete = @Col(gDiaTotalSurtidasPaquetes;0)[C8]
	  	  // Total pendientes
  		  lTotalPaquete = @Col(gDiaTotalPendientesPaquetes;0)[C10]	
		  FinSi
		Finsi
	FinSi
	Lista vImprime
	gDiaTotalCantidad = 0
	gDiaTotalSurtidas = 0
  gDiaTotalDevueltas = 0
	gDiaTotalPendientes = 0
	gDiaTotalNeto = 0
	Si gDiaTotalCantidadPaquetes > 0
	  Lista lTotalPaquete
	FinSi
	gDiaTotalCantidadPaquetes = 0
	gDiaTotalSurtidasPaquetes = 0
  gDiaTotalDevueltasPaquetes = 0
	gDiaTotalPendientesPaquetes = 0
	Saltalin  2
FinFunc

// *************************************************************************************************
//	Esta función imprime los totales de un cliente.
//  Parámetros 
//  Salidas 
// *************************************************************************************************
DefFunc fImprimeTotalesAgrupador()
Local lTotalPaquetes
  
	vImprime = ' '[C0..C17]
	lTotalPaquetes = ' '[C0..C17]
	//N.C.146
	Si (pTipoReporte = 1) o (pTipoReporte = 4) o(pTipoReporte = 7) o(pTipoReporte = 10) o(pTipoReporte = 12) o (pTipoReporte = 14)
		Si pTipoReporte = 7 o pTipoReporte = 12
		  Texto C4;'@L{4}'
		  Texto C8;'@L{8}'
		  Texto C10;'@L{10}'
		  Texto C12;'@L{12}'
		  Texto C14;'@L{14}'
		  Imprime
			//N.C.146
		  Si (pTipoReporte = 10) o (pTipoReporte = 12) o (pTipoReporte = 14)
			 	vImprime = 'Total Proveedor'[C2]
		  SiNo
			 	vImprime = 'Total Cliente'[C2]
      	lTotalPaquetes = 'Total Paquetes Cliente'[C2]
		  FinSi
		  // Total Cantidad
		  vImprime = @Col(gClienteTotalCantidad;0)[C4]
		  // Total Surtidas
		  vImprime = @Col(gClienteTotalSurtidas;0)[C8]
		  //Total Devueltas
		  vImprime = @Col(gClienteTotalDevueltas;0)[C10]
		  //Total pendientes
		  vImprime = @Col(gClienteTotalPendientes;0)[C12]
		  //Gran Total
		  vImprime = @Col(gClienteTotalNeto;0)[C14]
		  Si gCteTotalCantidadPaquetes > 0
		    // Total Cantidad
		    lTotalPaquetes = @Col(gCteTotalCantidadPaquetes;0)[C4]
	  	  // Total Surtidas
  		  lTotalPaquetes = @Col(gCteTotalSurtidasPaquetes;0)[C8]
		    // Total Devueltas
		    lTotalPaquetes = @Col(gCteTotalDevueltasPaquetes;0)[C10]
	  	  // Total pendientes
  		  lTotalPaquetes = @Col(gCteTotalPendientesPaquetes;0)[C12]
		  FinSI
		Sino
		  Texto C4;'@L{4}'
		  Texto C8;'@L{8}'
		  Texto C10;'@L{10}'
		  Texto C12;'@L{12}'
		  Imprime
			//N.C.146
		  Si (pTipoReporte = 10) o (pTipoReporte =12) o (pTipoReporte = 14)
			 	vImprime = 'Total Proveedor'[C2]
		  SiNo
			 	vImprime = 'Total Cliente'[C2]
      	lTotalPaquetes = 'Total Paquetes Cliente'[C2]
		  FinSi
		  // Total Cantidad
		  vImprime = @Col(gClienteTotalCantidad;0)[C4]
		  // Total Surtidas
		  vImprime = @Col(gClienteTotalSurtidas;0)[C8]
		  //Total pendientes
		  vImprime = @Col(gClienteTotalPendientes;0)[C10]
		  //Gran Total
		  vImprime = @Col(gClienteTotalNeto;0)[C12]
		  Si gCteTotalCantidadPaquetes > 0
  		  // Total Cantidad
	  	  lTotalPaquetes = @Col(gCteTotalCantidadPaquetes;0)[C4]
		    // Total Surtidas
		    lTotalPaquetes = @Col(gCteTotalSurtidasPaquetes;0)[C8]
		    // Total pendientes
		    lTotalPaquetes = @Col(gCteTotalPendientesPaquetes;0)[C10]
		  FinSi
		Finsi
	FinSi

	Si (pTipoReporte = 2) o (pTipoReporte = 5) o(pTipoReporte = 8)
   	lTotalPaquetes = 'Total Paquetes Agente'[C2]
		Si pTipoReporte = 8
		  Texto C4;'@L{4}'
		  Texto C8;'@L{8}'
		  Texto C10;'@L{10}'
		  Texto C12;'@L{12}'
		  Texto C14;'@L{14}'
		  Imprime
		  vImprime = 'Total Agente'[C2]	
		  // Total Cantidad
		  vImprime = @Col(gClienteTotalCantidad;0)[C4]
		  // Total Surtidas
		  vImprime = @Col(gClienteTotalSurtidas;0)[C8]
		  // Total devueltas
		  vImprime = @Col(gClienteTotalDevueltas;0)[C10]
		  // Total pendientes
		  vImprime = @Col(gClienteTotalPendientes;0)[C12]
		  // Gran Total
		  vImprime = @Col(gClienteTotalNeto;0)[C14]
		  Si gCteTotalCantidadPaquetes > 0
		    // Total Cantidad
		    lTotalPaquetes = @Col(gCteTotalCantidadPaquetes;0)[C4]
	  	  // Total Surtidas
  		  lTotalPaquetes = @Col(gCteTotalSurtidasPaquetes;0)[C8]
		    // Total devueltas
		    lTotalPaquetes = @Col(gCteTotalDevueltasPaquetes;0)[C10]
	  	  // Total pendientes
  		  lTotalPaquetes = @Col(gCteTotalPendientesPaquetes;0)[C12]
		  FinSi
		Sino
		  Texto C4;'@L{4}'
		  Texto C8;'@L{8}'
		  Texto C10;'@L{10}'
		  Texto C12;'@L{12}'
		  Imprime
		  vImprime = 'Total Agente'[C2]	
		  // Total Cantidad
		  vImprime = @Col(gClienteTotalCantidad;0)[C4]
		  // Total Surtidas
		  vImprime = @Col(gClienteTotalSurtidas;0)[C8]
		  //Total pendientes
		  vImprime = @Col(gClienteTotalPendientes;0)[C10]
		  //Gran Total
		  vImprime = @Col(gClienteTotalNeto;0)[C12]
		  Si gCteTotalCantidadPaquetes > 0
	  	  // Total Cantidad
  		  lTotalPaquetes = @Col(gCteTotalCantidadPaquetes;0)[C4]
		    // Total Surtidas
		    lTotalPaquetes = @Col(gCteTotalSurtidasPaquetes;0)[C8]
	  	  // Total pendientes
  		  lTotalPaquetes = @Col(gCteTotalPendientesPaquetes;0)[C10]
		  FinSi
		Finsi
	FinSi
	//N.C.146
	Si (pTipoReporte = 3) o (pTipoReporte = 6) o(pTipoReporte = 9) o(pTipoReporte = 11) o(pTipoReporte = 13) o (pTipoReporte = 15)
		Si pTipoReporte = 9 o pTipoReporte = 13
		  Texto C8;'@L{8}'
		  Texto C12;'@L{12}'
		  Texto C14;'@L{14}'
		  Texto C16;'@L{16}'
		  Texto C18;'@L{18}'
		  Imprime
		  vImprime = 'Total Producto'[C6]		
		  // Total Cantidad
		  vImprime = @Col(gClienteTotalCantidad;0)[C8]
		  // Total Surtidas
		  vImprime = @Col(gClienteTotalSurtidas;0)[C12]
		  //Total devueltas
		  vImprime = @Col(gClienteTotalDevueltas;0)[C14]
		  //Total pendientes
		  vImprime = @Col(gClienteTotalPendientes;0)[C16]
		  //Gran Total
		  vImprime = @Col(gClienteTotalNeto;0)[C18]
		Sino
		  Texto C8;'@L{8}'
		  Texto C12;'@L{12}'
		  Texto C14;'@L{14}'
		  Texto C16;'@L{16}'
		  Imprime
		  vImprime = 'Total Producto'[C6]		
		  // Total Cantidad
		  vImprime = @Col(gClienteTotalCantidad;0)[C8]
		  // Total Surtidas
		  vImprime = @Col(gClienteTotalSurtidas;0)[C12]
		  //Total pendientes
		  vImprime = @Col(gClienteTotalPendientes;0)[C14]
		  //Gran Total
		  vImprime = @Col(gClienteTotalNeto;0)[C16]
		Finsi
	FinSi
	Lista vImprime
	gClienteTotalCantidad = 0
	gClienteTotalSurtidas = 0
  gClienteTotalDevueltas = 0
	gClienteTotalPendientes = 0
	gClienteTotalNeto = 0
	Si gCteTotalCantidadPaquetes > 0
	  Lista lTotalPaquetes
	FinSi
	gCteTotalCantidadPaquetes = 0
	gCteTotalSurtidasPaquetes = 0
  gCteTotalDevueltasPaquetes = 0
	gCteTotalPendientesPaquetes = 0
	Saltalin 2
FinFunc

// *************************************************************************************************
//	Esta función imprime los totales de todo el reporte.
//  Parámetros 
//  Salidas 
// *************************************************************************************************
DefFunc fImprimeTotalesReporte()
Local lTotalPaquete
	//N.C.146
	Si (pTipoReporte = 3) o (pTipoReporte = 6) o (pTipoReporte = 9) o (pTipoReporte = 11) o (pTipoReporte = 13) o (pTipoReporte = 15)
		Si pTipoReporte = 9 o pTipoReporte = 13
		  Texto C8;'======================================================='
		  Texto C12;'======================================================='
		  Texto C14;'======================================================='
		  Texto C16;'======================================================='
		  Texto C18;'======================================================='
		  Imprime
		  vImprime = ' '[C0..C17]		  
		  //Texto
		  vImprime = 'Total Reporte'[C6]
		  // Total Cantidad
		  vImprime = @Col(gTotalCantidad;0)[C8]
		  // Total Surtidas
		  vImprime = @Col(gTotalSurtidas;0)[C12]
		  //Total devueltas
		  vImprime = @Col(gTotalDevueltas;0)[C14]	
		  //Total pendientes
		  vImprime = @Col(gTotalPendientes;0)[C16]	
		  //Gran Total
		  vImprime = @Col(gTotalNeto;0)[C18]
      // Totales por paquete		  
		  lTotalPaquete = ' '[C0..C17]
		  lTotalPaquete = 'Total Paquetes Reporte'[C6]
		  // Total Cantidad
		  lTotalPaquete = @Col(gTotalCantidadPaquetes;0)[C8]
		  // Total Surtidas
		  lTotalPaquete = @Col(gTotalSurtidasPaquetes;0)[C12]
		  //Total devueltas
		  lTotalPaquete = @Col(gTotalDevueltasPaquetes;0)[C14]	
		  //Total pendientes
		  lTotalPaquete = @Col(gTotalPendientesPaquetes;0)[C16]	
    Sino
		  Texto C8;'======================================================='
		  Texto C12;'======================================================='
		  Texto C14;'======================================================='
		  Texto C16;'======================================================='
		  Imprime
		  vImprime = ' '[C0..C17]
		  vImprime = 'Total Reporte'[C6]
		  // Total Cantidad
		  vImprime = @Col(gTotalCantidad;0)[C8]
		  // Total Surtidas
		  vImprime = @Col(gTotalSurtidas;0)[C12]
		  //Total pendientes
		  vImprime = @Col(gTotalPendientes;0)[C14]	
		  //Gran Total
		  vImprime = @Col(gTotalNeto;0)[C16]
      // Totales por paquete		  
		  lTotalPaquete = ' '[C0..C17]
		  lTotalPaquete = 'Total Paquetes Reporte'[C6]
		  // Total Cantidad
		  lTotalPaquete = @Col(gTotalCantidadPaquetes;0)[C8]
		  // Total Surtidas
		  lTotalPaquete = @Col(gTotalSurtidasPaquetes;0)[C12]
		  //Total pendientes
		  lTotalPaquete = @Col(gTotalPendientesPaquetes;0)[C14]	
    Finsi
	SiNo
    Si pTipoReporte = 7 o pTipoReporte = 8 o pTipoReporte = 12
		  Texto C4;'@L{4}'
		  Texto C8;'@L{8}'
		  Texto C10;'@L{10}'
		  Texto C12;'@L{12}'
		  Texto C14;'@L{14}'
		  Imprime
		  vImprime = ' '[C0..C17]
		  vImprime = 'Total Reporte'[C2]
		  // Total Cantidad
		  vImprime = @Col(gTotalCantidad;0)[C4]
		  // Total Surtidas
		  vImprime = @Col(gTotalSurtidas;0)[C8]
		  //Total devueltas
		  vImprime = @Col(gTotalDevueltas;0)[C10]	
		  //Total pendientes
		  vImprime = @Col(gTotalPendientes;0)[C12]	
		  //Gran Total
		  vImprime = @Col(gTotalNeto;0)[C14]
      // Totales por paquete		  
		  lTotalPaquete = ' '[C0..C17]
		  lTotalPaquete = 'Total Paquetes Reporte'[C2]
		  // Total Cantidad
		  lTotalPaquete = @Col(gTotalCantidadPaquetes;0)[C4]
		  // Total Surtidas
		  lTotalPaquete = @Col(gTotalSurtidasPaquetes;0)[C8]
		  //Total devueltas
		  lTotalPaquete = @Col(gTotalDevueltasPaquetes;0)[C10]	
		  //Total pendientes
		  lTotalPaquete = @Col(gTotalPendientesPaquetes;0)[C12]	
    Sino
		  Texto C4;'@L{4}'
		  Texto C8;'@L{8}'
		  Texto C10;'@L{10}'
		  Texto C12;'@L{12}'
		  Imprime
		  vImprime = ' '[C0..C17]
		  vImprime = 'Total Reporte'[C2]
		  // Total Cantidad
		  vImprime = @Col(gTotalCantidad;0)[C4]
		  // Total Surtidas
		  vImprime = @Col(gTotalSurtidas;0)[C8]
		  //Total pendientes
		  vImprime = @Col(gTotalPendientes;0)[C10]	
		  //Gran Total
		  vImprime = @Col(gTotalNeto;0)[C12]
      // Totales por paquete		  
		  lTotalPaquete = ' '[C0..C17]
		  lTotalPaquete = 'Total Paquetes Reporte'[C2]
		  // Total Cantidad
		  lTotalPaquete = @Col(gTotalCantidadPaquetes;0)[C4]
		  // Total Surtidas
		  lTotalPaquete = @Col(gTotalSurtidasPaquetes;0)[C8]
		  //Total pendientes
		  lTotalPaquete = @Col(gTotalPendientesPaquetes;0)[C10]	
    Finsi
	FinSi
	Lista vImprime	
	gTotalCantidad = 0
	gTotalSurtidas = 0
  gTotalDevueltas = 0
	gTotalPendientes = 0
	gTotalNeto = 0
	Si gTotalCantidadPaquetes > 0 
	  Lista lTotalPaquete
	FinSi
  gTotalCantidadPaquetes = 0
  gTotalSurtidasPaquetes = 0
  gTotalDevueltasPaquetes = 0
  gTotalPendientesPaquetes = 0
	Saltalin 2
FinFunc

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

  gTipo = atProducto(cTipoProducto)
 
	// 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

	  // Busca el producto del movimiento oculto
	  Si tDetalleProducto(cTipoProducto) = 0
  	  atProducto.Busca[@Str(tMovimientoOculto(cIdProducto);0)]
  	Sino
  	  atProducto.Busca[@Str(tDetalleProducto(cIdProductoPadre);0)]
  	FinSi
    Si !atProducto->Encontro
   	  Continua
 	  FinSi

		Si aTipoProductoVisible = 2    
			// Si se solicitó imprimir componentes
			Si pComponentes
				// Si el movimiento oculto pertenece a un producto (componente del paquete)
				Si tDetalleProducto(cTipoProducto) = 0
					fImprimeMovimiento(tMovimientoOculto; atProducto; aEstaCancelado) 
				Sino // El movimiento oculto pertenece a un detalle de características del componente del paquete
					fImprimeMovimiento(tMovimientoOculto; atProducto; aEstaCancelado) 
					// 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)
					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 
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//  Historia de revisiones: 
//  Fecha      Nombre   IDLotus                     Descripcion
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// 17/12/2010		ALRH		N.D.6684		ERROR EL REPORTE DETALLADO DE REMISIONES POR CLIENTE 
//                                  QUE SE GENERA DESDE EL MENU REPORTES/ REPORTE DE VENTAS, 
//                                  NO MUESTRA LA MISMA INFORMACION CUANDO SE CAMBIA EL FILTRO DE 
//                                  IMPRIMIR MOVIMIENTOS SI O NO CUANDO SE TIENE DOCUMENTOS SIN SURTIR 
//                                  Y PARCIALMENTE SURTIDOS .	 	
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// *************************************************************************************************
DefFunc fProcesaMovimientos(atDocumento: Tabla; aEstaCancelado)
Local lSaltaLin, lDatosDocumento, SeProcesoInformacion

	lDatosDocumento = 0
	SeProcesoInformacion = 0
	// Recupera los movimientos del documento
	Mientras [ tMovimiento.Busca[@Str(atDocumento(cIdDocumento);0)]; tMovimiento->Encontro; tMovimiento.Busca Siguiente[1] ]
    // HVA resetear el valor del producto del movimiento por si anteriormente se proceso un componente de paquete.
    gTipo = 0
	
		// Lee el producto del movimiento
		tProducto.Busca[@Str(tMovimiento(cIdProducto);0)]
		Si !tProducto->Encontro
			Continua
		FinSi
		// N.D. 6684 (ALRH)
		Si atDocumento(cCancelado) = 1
			lPendientes = 0.0
		Sino
			lPendientes = atDocumento(cUnidadesPendientes)
		FinSi
		Si (pStatus = 0) O (pStatus = 1 Y lPendientes <= 0.0000001) O (pStatus = 2 Y lPendientes > 0.0000001)
			Si !lDatosDocumento
				//N.C.146
				Si (pTipoReporte = 1) o (pTipoReporte = 4) o (pTipoReporte = 7) o (pTipoReporte = 10) o (pTipoReporte = 12) o (pTipoReporte = 14)
					fImprimeCliente(tClienteProveedor)
				FinSi
				Si (pTipoReporte = 2) o (pTipoReporte = 5) o (pTipoReporte = 8)
					fImprimeAgente(tAgente)
				FinSi
				fImprimeDocumento(atDocumento)
				// Primero imprime el encabezado del movimiento
				fImprimeEncabezadoMovimiento()
				lDatosDocumento = 1 // Indica que ya se imprimieron los datos del cliente
			FinSi
			// S.C.223 enviar a la impresión del movimiento aEstaCancelado
			// Imprime el movimiento
			fImprimeMovimiento(tMovimiento; tProducto; aEstaCancelado) 
			// Los componentes siempre se imprimen ya que no es por parametros
			// Si se pidió que se imprimieran características o componentes
			Si (pCaracteristicas = 1) O (tProducto(cTipoProducto) = 2)
			  // Mensaje de impresión de los componentes			  
			  Si pComponentes Y tProducto(cTipoProducto) = 2
			    Texto  '   ' & 'Componentes del Paquete: ' 
			    Imprime
			  FinSi
			  // Enviar la tabla de productos y el tipo de producto visible
				lSaltaLin = fProcesaMovimientosOcultos(tMovimiento; tProducto; tProducto(cTipoProducto); aEstaCancelado)
			FinSi
			SeProcesoInformacion = 1
		FinSi
	FinMientras
	Retorna SeProcesoInformacion
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 lPendientes

	// Pedidos, cotizaciones, remisiones, ordenes de compra y Consignaciones por 
	// 	Cliente/Proveedor sin movimientos
	//N.C.146
	Si (pTipoReporte = 1) o (pTipoReporte = 4) o (pTipoReporte = 7) o (pTipoReporte = 10) o (pTipoReporte = 12) o (pTipoReporte = 14)
		Si pConSinMovimientos = 0
			Si atDocumento(cCancelado) = 1
				lPendientes = 0.0
			Sino
				lPendientes = atDocumento(cUnidadesPendientes)
				//N.D. 7984: Redondear 6 decimaleS
				lPendientes = fFormateaNumero(lPendientes;6)
			FinSi
			// Descartar los documentos segun su estado (Todos, surtidos, por surtir) y el filtro respectivo
			// N.D.4312 Muestra algunos movimientos como parciales cuando ya están surtidos
			Si (pStatus = 0) O (pStatus = 1 Y lPendientes <= 0.0000001) O (pStatus = 2 Y lPendientes > 0.0000001)
				fImprimeCliente(tClienteProveedor)
				fImprimeDocumento(atDocumento)
				Retorna 1
			SiNo
				Retorna 0
			FinSi
		FinSi
	FinSi

	// Imprime el documento
	// Enviar el estado del documento al procesar los movimientos para identificar si están cancelados o no		
	Si fProcesaMovimientos(atDocumento;atDocumento(cCancelado))
		fImprimeTotalesDocumento(atDocumento)
		Retorna 1
	FinSi

	Retorna 0
FinFunc

// *************************************************************************************************
//	Esta función lee los documentos agrupados por cliente o proveedor.
//  Parámetros 
//  Salidas 
// *************************************************************************************************
DefFunc fProcesaPorClienteProveedor()
Local lFecha, lProcesoInformacion, lImpTotCte, lImpTotRep

   gIdMonedaCte = 1
	// Establece el índice de recorrido para documentos
	tDocumento.Usaindice['iDocumentoDeClienteFecha'] // cIdDocumentoDe+cIdClienteProveedor+cFecha+cSerie+cFolio
	lImpTotRep = 0
	Mientras [ tClienteProveedor.Busca[pCteProvInicial & '..' & pCteProvFinal]; tClienteProveedor->Encontro; tClienteProveedor.Busca Siguiente[1] ]
		// S.C.220 No se han impreso los datos del nuevo cliente
		gDatosCliente = 0

    gIdMonedaCte = tClienteProveedor(cIdMoneda)

		lImpTotCte = 0
		lFecha = pFechaInicial
		// Obtiene los documentos en el rango de fechas especificado en el reporte
		Mientras lFecha <= pFechaFinal  
			lProcesoInformacion = 0
			// Si encontro algún documento en esa fecha, recupera todos los documentos en esa fecha
			Mientras [tDocumento.Busca[pDocumentoDe & ':' & tClienteProveedor(cIdClienteProveedor) & ':' & lFecha]; tDocumento->Encontro; tDocumento.Busca Siguiente[3] ]
				Si pFolioInicial != 0 y tDocumento(cFolio) < pFolioInicial
					Continua
				FinSi
				Si pFolioFinal != 0 y tDocumento(cFolio) > pFolioFinal
					Continua
				FinSi
				Si pSerie != ' ' y tDocumento(cSerieDocumento) != pSerie
					Continua
				FinSi
				Si pCancelados = 0 y tDocumento(cCancelado) = 1
					Continua
				FinSi
				// Si no se han impreso los datos del cliente, los imprime
				Si fProcesaDocumento(tDocumento)
					lProcesoInformacion = 1
					lImpTotCte = 1
					lImpTotRep = 1
				FinSi
			FinMientras
			Si lProcesoInformacion
				fImprimeTotalesDia()
			FinSi
			// Busca en la siguiente fecha
			lFecha = fFechaSiguiente(lFecha)
		FinMientras
		Si lImpTotCte
			fImprimeTotalesAgrupador()
			lImpTotCte = 0
		FinSi
	FinMientras
	Si lImpTotRep
		fImprimeTotalesReporte()
	FinSi
FinFunc

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

	// Establece el índice de recorrido para documentos
	tDocumento.Usaindice['iDocumentoDeAgenteFecha'] // cIdDocumentoDe+cIdAgente+cFecha+cSerie+cFolio
	lImpTotRep = 0
	Mientras [ tAgente.Busca[pAgenteInicial & '..' & pAgenteFinal]; tAgente->Encontro; tAgente.Busca Siguiente[1] ]
		// S.C.220 No se han impreso los datos del nuevo agente
		gDatosAgente = 0

		lImpTotAge = 0
		lFecha = pFechaInicial
		// Obtiene los documentos en el rango de fechas especificado en el reporte
		Mientras lFecha <= pFechaFinal  
			lProcesoInformacion = 0
			// Si encontro algún documento en esa fecha, recupera todos los documentos en esa fecha
			Mientras [tDocumento.Busca[pDocumentoDe & ':' & tAgente(cIdAgente) & ':' & lFecha]; tDocumento->Encontro; tDocumento.Busca Siguiente[3] ]
				Si pCancelados = 0 y tDocumento(cCancelado) = 1
					Continua
				FinSi
            gIdMonedaCte = 1
            tClienteProveedor.Busca[@Str(tDocumento(cIdClienteProveedor);0)]
            Si tClienteProveedor->Encontro
              gIdMonedaCte = tClienteProveedor(cIdMoneda)
            FinSi
				// Si no se han impreso los datos del agente, los imprime
				Si fProcesaDocumento(tDocumento)
					lProcesoInformacion = 1
					lImpTotAge = 1
					lImpTotRep = 1
				FinSi
			FinMientras
			Si lProcesoInformacion
				fImprimeTotalesDia()
			FinSi
			// Busca en la siguiente fecha
			lFecha = fFechaSiguiente(lFecha)
		FinMientras
		Si lImpTotCte
			fImprimeTotalesAgrupador()
			lImpTotCte = 0
		FinSi
	FinMientras
	Si lImpTotRep
		fImprimeTotalesReporte()
	FinSi
FinFunc

// *************************************************************************************************
//	Esta función lee los documentos agrupados por producto.
//  Parámetros 
//  Salidas 
// *************************************************************************************************
DefFunc fProcesaPorProducto()
Local IEntroProducto, IEntro, lFecha
 
	IEntroProducto = 0
  tProducto.Usaindice['iCodigoTipo']
	Mientras [ tProducto.Busca[pProductoInicial & '..' & pProductoFinal];tProducto->Encontro;tProducto.Busca Siguiente[1]]
    Si gNumDeClases > 0
      Si !fMiembroDeUnaClase( tProducto ;gNumDeClases;gListIdDeClases;2)
        Continua
      Finsi
    Finsi

		// Establece el índice de recorrido para movimientos
		tMovimiento.Usaindice['iProductoDoctoDeAfecFecha'] // cidProducto+cFecha+cAfectaExistencia
		// No se han impreso los datos del nuevo producto
		gDatosProducto = 0

		IFecha = pFechaInicial
		tMovimiento.Busca[@Str(tProducto(cIdProducto);0)]
		// Obtiene los movimientos en el rango de fechas especificado en el reporte
		Mientras IFecha <= pFechaFinal  
			IEntro = 0
			// Si encontro algún movimiento en esa fecha, recupera todos los movimientos en esa fecha
			Mientras [tMovimiento.Busca[tProducto(cidProducto) & ':' & pDocumentoDe];tMovimiento->Encontro;tMovimiento.Busca Siguiente[2]]
        //Si (tMovimiento(cMovtoOculto) != 1) y (tMovimiento(cFecha) = IFecha)
        Si (tMovimiento(cFecha) = IFecha)
					Si !fDiscriminaStatusMovimiento(tMovimiento)
						Continua
					FinSi
					tDocumento.Usaindice['']
					// Busqueda del Documento del movimiento
					Si tMovimiento(cIdDocumento)
					  // Movimiento real
					  tDocumento.Busca[@Str(tMovimiento(cIdDocumento);0)]
					Sino
					  // No incluir los segundos movimientos de traspasos/remisiones
					  Si tMovimiento(cTipoTraspaso) = 3
					    Continua
					  FinSi
            tMovimientoOwner.Busca[@Str(tMovimiento(cIdMovtoOwner);0)] 
            Si !tMovimientoOwner->Encontro
              Continua
            FinSi
            tDocumento.Busca[@Str(tMovimientoOwner(cIdDocumento);0)]
					FinSi
					Si !tDocumento->Encontro
						Continua
					FinSi
					Si pCancelados = 0 y tDocumento(cCancelado) = 1
						Continua
					FinSi
          gIdMonedaCte = 1
          tClienteProveedor.Busca[@Str(tDocumento(cIdClienteProveedor);0)]
          Si tClienteProveedor->Encontro
            gIdMonedaCte = tClienteProveedor(cIdMoneda)
          FinSi
					// Si no se han impreso los datos del Producto, los imprime
					fImprimeProducto(tProducto)
					fImprimeProductoDocumento(tMovimiento; tDocumento(cCancelado); tProducto(cTipoProducto))
					// Si se pidió que se imprimieran características o componentes
					Si pCaracteristicas = 1
					  // Enviar la tabla de productos y el tipo del producto visible
						lSaltaLin = fProcesaMovimientosOcultos(tMovimiento; tProducto; tProducto(cTipoProducto); tDocumento(cCancelado))
					FinSi
					IEntro = 1
					IEntroProducto = 1
				FinSi
			FinMientras
			Si IEntro
				Saltalin 2
				fImprimeTotalesDia()
				IEntro = 0
			FinSi	
			// Busca en la siguiente fecha
			IFecha = fFechaSiguiente(IFecha)
		FinMientras
		Si IEntroProducto
			fImprimeTotalesAgrupador()
			IEntroProducto = 0
		FinSi
	FinMientras
	fImprimeTotalesReporte()
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
	//N.C.146
	Si (pTipoReporte = 1) o (pTipoReporte = 4) o (pTipoReporte =7) o (pTipoReporte =10) o (pTipoReporte =12) o (pTipoReporte = 14)
		// 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 = 2) o (pTipoReporte = 5) o (pTipoReporte = 8)
		// 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

  // Si el recorrido es por producto
	//N.C.146
	Si (pTipoReporte = 3) o (pTipoReporte = 6) o (pTipoReporte = 9) o (pTipoReporte = 11) o (pTipoReporte = 13) o (pTipoReporte = 15)
		// Establece el índice de codigos para el recorrido para productos 
		//	NO utilizar el primario ya que no traera todos los productos.
  	tProducto.Usaindice['iCodigoTipo']
		// Si el rango inicial es el primer agente, recupera el código del primero
		Si pProductoInicial = ' '
			tProducto.Busca Primero
			Si tProducto->Encontro
				pProductoInicial = tProducto(cCodigoProducto)
			FinSi
		FinSi

		// Si el rango final es el último agente, recupera el código del último
		Si pProductoFinal = ' '
			tProducto.Busca Ultimo
			Si tProducto->Encontro
				pProductoFinal = tProducto(cCodigoProducto)
			FinSi
		FinSi
		// Restuaro el indica anterior por si alguna funcion lo necesita
		tProducto.Usaindice[''] //Primario
	FinSi
FinFunc


// *************************************************************************************************
// ENCABEZADO 
// *************************************************************************************************
Encab
	Texto '@TC{255,0,0}@S{8}AdminPAQ - ImpPed'
	Hoja '"@TC{0,0,0}@S{8}Hoja: '
	Imprime
	Texto '@TC{0,0,0}@S{8}Moneda: '& gNombreMoneda
	Imprime
	Texto '"@TC{0,0,0}@S{8}Fecha: ' & fFormateaFecha(@Hoy();gIdioma)
	Imprime
	Texto '^@TC{0,0,0}@S{22}' & tEmpresa->Nombre
	Imprime
	Escoge pStatus
		Caso 0
			lStatus = ' (TODOS) '
		FinCaso
		Caso 1
			lStatus = ' (SURTIDOS) '
		FinCaso
		Caso 2
			lStatus = ' (PARCIALES Y SIN SURTIR) '
		FinCaso
	FinEscoge
	Escoge pTipoReporte
		Caso 1 //Impresión de pedidos agrupado por cliente ordenado por fecha
			Texto '^@TC{0,0,0}@S{14}REPORTE DETALLADO DE PEDIDOS' & lStatus & 'AGRUPADOS POR CLIENTE '
		FinCaso
		Caso 2 //Reportes de pedidos agrupado por agente
			Texto '^@TC{0,0,0}@S{14}REPORTE DETALLADO DE PEDIDOS' & lStatus & ' AGRUPADO POR AGENTE '
		FinCaso
		Caso 3 //Reporte de pedidos agrupado por producto
			Texto '^@TC{0,0,0}@S{14}REPORTE DETALLADO DE PEDIDOS' & lStatus & ' AGRUPADO POR PRODUCTO '
		FinCaso
		Caso 4 //Reporte de pedidos agrupado por producto
			Texto '^@TC{0,0,0}@S{14}REPORTE DETALLADO DE COTIZACIONES' & lStatus & ' AGRUPADO POR CLIENTE '
		FinCaso
		Caso 5 //Reporte de pedidos agrupado por producto
			Texto '^@TC{0,0,0}@S{14}REPORTE DETALLADO DE COTIZACIONES' & lStatus & ' AGRUPADO POR AGENTE '
		FinCaso
		Caso 6 //Reporte de pedidos agrupado por producto
			Texto '^@TC{0,0,0}@S{14}REPORTE DETALLADO DE COTIZACIONES' & lStatus & ' AGRUPADO POR PRODUCTO '
		FinCaso
		Caso 7 //Reporte de pedidos agrupado por producto
			Texto '^@TC{0,0,0}@S{14}REPORTE DETALLADO DE REMISIONES' & lStatus & ' AGRUPADO POR CLIENTE '
		FinCaso
		Caso 8 //Reporte de pedidos agrupado por producto
			Texto '^@TC{0,0,0}@S{14}REPORTE DETALLADO DE REMISIONES' & lStatus & ' AGRUPADO POR AGENTE '
		FinCaso
		Caso 9 //Reporte de pedidos agrupado por producto
			Texto '^@TC{0,0,0}@S{12}REPORTE DETALLADO DE REMISIONES' & lStatus & ' AGRUPADO POR PRODUCTO '
		FinCaso
		Caso 10 //Reporte de pedidos agrupado por producto
			Texto '^@TC{0,0,0}@S{12}REPORTE DETALLADO DE ORDENES DE COMPRA' & lStatus & ' AGRUPADO POR PROVEEDOR '
		FinCaso
		Caso 11 //Reporte de pedidos agrupado por producto
			Texto '^@TC{0,0,0}@S{12}REPORTE DETALLADO DE ORDENES DE COMPRA' & lStatus & ' AGRUPADO POR PRODUCTO '
		FinCaso
		Caso 12 //Reporte de pedidos agrupado por producto
			Texto '^@TC{0,0,0}@S{12}REPORTE DETALLADO DE CONSIGNACIONES' & lStatus & ' AGRUPADO POR PROVEEDOR '
		FinCaso
		Caso 13 //Reporte de pedidos agrupado por producto
			Texto '^@TC{0,0,0}@S{12}REPORTE DETALLADO DE CONSIGNACIONES' & lStatus & ' AGRUPADO POR PRODUCTO '
		FinCaso
		//N.C.146
		Caso 14 //Reporte de cotizaciones del proveedor agrupado por proveedor
			Texto '^@TC{0,0,0}@S{12}REPORTE DETALLADO DE COTIZACIONES DEL PROVEEDOR' & lStatus & ' AGRUPADO POR PROVEEDOR '
		FinCaso
		Caso 15 //Reporte de cotizaciones del proveedor agrupado por producto
			Texto '^@TC{0,0,0}@S{12}REPORTE DETALLADO DE COTIZACIONES DEL PROVEEDOR' & lStatus & ' AGRUPADO POR PRODUCTO '
		FinCaso
	FinEscoge
	Imprime
	Texto '^@TC{0,0,0}@S{12}ORDENADO POR FECHA'	
	Imprime
	Texto '^@TC{0,0,0}@S{12}Del: ' & fFormateaFecha(pFechaInicial;gIdioma) & ' Al: ' & fFormateaFecha(pFechaFinal;gIdioma)
	Imprime 1
	Color @RGB(0;0;0)
	Altura 9

	//Estos son todos los reportes agrupados por producto
	Si (pTipoReporte = 3) o (pTipoReporte = 6) o (pTipoReporte = 9) o (pTipoReporte = 11) o (pTipoReporte = 13) o (pTipoReporte = 15)//N.D.4379
		Si pTipoReporte = 9 o pTipoReporte = 13
    	Columnas 21;1.75, 0.15, 0.75, 0.15, 1.2, 0.15, 4.5, 0.15, 1.5, 0.15, 0.44, 0.15, 1.5, 0.15, 1.5, 0.15, 1.5, 0.15, 1.5, 0.15, 1.5
    Sino
		  Columnas 19;1.75, 0.15, 0.75, 0.15, 1.2, 0.15, 4.5, 0.15, 1.5, 0.15, 0.44, 0.15, 1.5, 0.15, 1.5, 0.15, 1.5, 0.15, 1.5 //N.D.4379
    Finsi
		Texto C0;'Fecha'
		Texto C2;'Serie'
		Texto C4;'Folio'
		Texto C6;'Concepto'
		Texto C8;'Cantidad'
    Si pTipoReporte = 9 o pTipoReporte = 13
  		Texto C12;'Facturadas'
      Si pTipoReporte = 13
    	  Texto C12;'Recibidas'
      Finsi
      Texto C14; 'Devueltas' 
		  Texto C16;'Pendientes'
		  Texto C18;'Neto'	// S.C.220
		  Texto C20;'Estado'
    Sino
  	  Texto C12;'Surtidas'
		  Texto C14;'Pendientes'
		  Texto C16;'Neto'	// S.C.220
		  Texto C18;'Estado'
    Finsi
		Imprime 
		Texto '@TC{0,0,0}@L{-1}'
		Imprime 
	SiNo
		// Imprime encabezado del reporte Fecha         Serie  Folio       Concepto
		// C0 (Fecha) = 11 caracteres
		// C2 (Serie) = 5 caracteres
		// C4 (Folio) = 8 caracteres
		// C6 (Concepto) = 25 caracteres

		// Reporte de pedidos sin imprimir los movimientos
		//N.C.146
		Si (pTipoReporte = 1) o (pTipoReporte = 4) o (pTipoReporte = 7) o (pTipoReporte = 10) o (pTipoReporte = 12) O (pTipoReporte = 14)
			Si pConSinMovimientos = 0
				Si pTipoReporte = 7 o pTipoReporte = 12
			 	  Columnas 19;1.75, 0.15, 0.75, 0.15, 1.20, 0.15, 3.74, 0.15, 1.5, 0.15, 1.5, 0.15, 1.5, 0.15, 1.5, 0.15, 1.5
					Texto C8; 'Cantidad'
					Si pTipoReporte = 7
						Texto C10; 'Facturadas'
					Sino
						Si pTipoReporte = 12
							Texto C10; 'Recibidas'
						Sino
							Texto C10; 'Surtidas'
						FinSi
					FinSi
					Texto C12; 'Devueltas'
					Texto C14; 'Pendientes'
					Texto C16; 'Neto'	// S.C.220
					Texto C17; 'Estado'
				Sino
			 	  Columnas 16;1.75, 0.15, 0.75, 0.15, 1.20, 0.15, 3.74, 0.15, 1.5, 0.15, 1.5, 0.15, 1.5, 0.15, 1.5
					Texto C8; 'Cantidad'
					Texto C10; 'Surtidas'
					Texto C12; 'Pendientes'
					Texto C14; 'Neto'	// S.C.220
					Texto C16; 'Estado'
				FinSi
			FinSi
		Sino
			Columnas 6;1.75,0.15,0.75,0.15,1.20,0.15,3.74
		FinSi
		Texto C0;'Fecha'
		Texto C2;'Serie'
		Texto C4;'Folio'
		Texto C6;'Concepto'
		Imprime 
		Texto '@TC{0,0,0}@L{-1}'
		Imprime 
	FinSi
  // Se Revisan las clasificaciones, para recuperarlas e imprimirlas en el encabezado
  fRevisaClases(tClasificaciones )
FinEncab


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

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

// Documentos de venta Pedidos, Cotizaciones, Remisiones agrupados por cliente
Si (pTipoReporte = 1) o (pTipoReporte = 4) o (pTipoReporte = 7)
	Escoge pTipoReporte
		Caso 1 // Pedidos
			pDocumentoDe = 2
		FinCaso
		Caso 4 // Cotizaciones
			pDocumentoDe = 1
		FinCaso
		Caso 7 // Remisiones
			pDocumentoDe = 3
		FinCaso
	FinEscoge
	// Incluir componentes de paquetes
	pComponentes = 1
	fProcesaPorClienteProveedor()
FinSi

// Documentos de venta Pedidos, Cotizaciones, Remisiones agrupados por agente
Si (pTipoReporte = 2) o (pTipoReporte = 5) o (pTipoReporte = 8)
	Escoge pTipoReporte
		Caso 2 // Pedidos
			pDocumentoDe = 2
		FinCaso
		Caso 5 // Cotizaciones
			pDocumentoDe = 1
		FinCaso
		Caso 8 // Remisiones
			pDocumentoDe = 3
		FinCaso
	FinEscoge
	// Incluir componentes de paquetes
	pComponentes = 1
	fProcesaPorAgente()
FinSi

// Documentos de venta Pedidos, Cotizaciones, Remisiones agrupados por producto
Si (pTipoReporte = 3) o (pTipoReporte = 6) o (pTipoReporte = 9)
	Escoge pTipoReporte
		Caso 3 // Pedidos
			pDocumentoDe = 2
		FinCaso
		Caso 6 // Cotizaciones
			pDocumentoDe = 1
		FinCaso
		Caso 9 // Remisiones
			pDocumentoDe = 3
		FinCaso
	FinEscoge
	// No incluir componentes de paquetes, ya que la imprimir movimientos en base a los
	//  productos no tiene ningun caso
	pComponentes = 0
	fProcesaPorProducto()
FinSi

//Documentos de Compras Ordenes de compra, consignaciones, cotizaciones del proveedor agrupadas por proveedor
//N.C.146	
Si (pTipoReporte = 10) o (pTipoReporte = 12) o (pTipoReporte = 14)
	Escoge pTipoReporte
		Caso 10 // Ordenes de compra
			pDocumentoDe = 17
		FinCaso
		Caso 12 // Consignaciones
			pDocumentoDe = 18
		FinCaso
		Caso 14 // Cotizaciones del Proveedor
			pDocumentoDe = 38
		FinCaso
	FinEscoge
	// No Incluir componentes de paquetes
	pComponentes = 1
	fProcesaPorClienteProveedor()
FinSi

//Documentos de Compras Ordenes de compra, consignaciones, cotizaciones del proveedor agrupadas por producto
//N.C.146
Si (pTipoReporte = 11) o (pTipoReporte = 13) o (pTipoReporte = 15)
	Escoge pTipoReporte
		Caso 11 // Ordenes de compra
			pDocumentoDe = 17
		FinCaso
		Caso 13 // Consignaciones
			pDocumentoDe = 18
		FinCaso
		//N.C.146
		Caso 15 // Cotizaciones del Proveedor
			pDocumentoDe = 38
		FinCaso
	FinEscoge
	// No Incluir componentes de paquetes
	pComponentes = 0
	fProcesaPorProducto()
FinSi

