// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//
//	DiarioCompraVenta.rpt
//	Nombre del reporte en el sistema: Diario de Compras/Ventas por Almacén
//
//  Sistema: AdminPAQ v1.1
// 
//	Este reporte perteneciente al módulo de inventarios.
//
//	Consideraciones especiales:
//  Este reporte aunque está programado como uno solo, representa en realidad
//  dos reportes en el ámbito del sistema:
//    Diario de Compras por Almacén
//    Diario de Ventas por Almacén
//  
//	Elaboró:    Leonardo Aguilar Pizano
//	Fecha: 	    20 de Septiembre de 2002
//  Lotus Notes:  S.C.243, S.C.244
//
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Historia de modificaciones
//  Fecha      Nombre   IDLotus     Descripcion
//  30/10/2002 LAP      1456        Modificación de las busquedas de los movimientos
//                                  a fin de considerar que las compras que vienen
//                                  de consignaciones no están afectadas en inventarios
//                                  - Cuerpo del reporte
//  02/03/2004 LAP			2615				Optimización de velocidad y mejora en la presentación
//																	con salida a Excel.
//                                  - Cuerpo del reporte
//                                  - fImprimeDocumento
//                                  - fImprimeProducto 			
//                                  - fImprimeTotalAlmacen
//                                  - fImprimeTotalReporte
//																	- Apertura de Tablas e indices
//																  - fImprimeAlmacen
//  28/04/2005 LAP       N.D.3240   Expresar los importes de los documentos en la moneda 
//                                  del reporte. Considerando que los documentos en moneda 
//                                  base tienen el tipo de cambio de la moneda del cliente 
//                                  a la moneda base. Utilizar fCambiarMonedaDoctoAReporte y
//                                  fCambiarMonedaImporteAReporte de LibAdminPAQ.rpt
//                                  - fCambiarMonedaImporteAReporte (ELIMINACION)
//  05/02/2008  JENL    N.D.5062    ERROR TARDA 6 MINUTOS AL MOMENTO DE CONVERTIR UN PEDIDO EN FACTURA
//                                  Se modifico:
//                                  -Cuerpo del reporte
//	02/12/2008	MAJU		N.C.224			Se deben considerar los movimientos que están con el 
//																	campo cAfectadoInventario = 2, se agrega marca y leyenda
//																	de que esos movimientos están en captura.
//  03/04/2009  ELVS    N.D.5724    REPORTES DE INVENTARIO En Excel - CUANDO EL PRODUCTO ESTA EN CAPTURA
//                                  Hace falta el nombre de la columna "Error"  Rep de Diario de ventas
//                                  detallado /compras detallado,  inventario actual por alm/ global en importes.
//  09/07/2009  ELVS    N.D.3863    REPORTES. ERROR NO PONE EL COSTO UNITARIO DEL PRODUCTO QUE SE VENDIO
//                                  POR MEDIO DE UN PAQUETE EN EL REPORTE DIARIO DE VENTA POR ALMACEN.
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

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


// *********************************************************************************************
// P A R A M E T R O S
// *********************************************************************************************
Parametro pTipoReporte			= 2						// 1 - Diario de Compras
																					// 2 - Diario de Ventas
Parametro pFechaInicial 		= '20020101'  // Fecha inicial del rango
Parametro pFechaFinal 			= '20021231'  // Fecha final del rango
Parametro pProductoInicial 	= ' '        	// Código del producto inicial del rango (' ' = Todos)
Parametro pProductoFinal 		= ' '         // Código del producto final del rango (' ' = Todos)
Parametro pAlmacenInicial 	= ' '         // Código del almacén inicial del rango (' ' = Todos)
Parametro pAlmacenFinal 		= ' '         // Código del almacén final del rango (' ' = Todos)
Parametro pImprimirProductos = 1        	// Productos a imprimir:
                                        	// 0 = Todos
                                        	// 1 = Sólo productos con movimientos 
Parametro pEstadoProducto 	= 0           // Incluir productos con estado:
                                       		// 0 = Todos
                                        	// 1 = Activos
                                        	// 2 = Inactivos
Parametro	pImprimirCaracteristicas 	= 0		// Incluir características
																					// 0 - No
																					// 1 - Si
Parametro	pMostrarConsignaciones		=	1		// Incluir consignaciones (Solo reportes de COMPRAS)
																					// 0 - No
																					// 1 - Si
Parametro pIdClase1 				= 0         	// Clasificaciones del produto (0 = Ninguna)
Parametro pIdClase2 				= 0          	// Estos seis parámetros corresponden a las seis 
Parametro pIdClase3 				= 0          	// clasificaciones del producto, y pueden contener 
Parametro pIdClase4 				= 0          	// una lista de IDs de clasificaciones separados 
Parametro pIdClase5 				= 0           // por coma.
Parametro pIdClase6 				= 0               
Parametro pIdMonedaReporte 	= 1          	// Id de la moneda a expresar el reporte
Parametro pExcel						= 0						// 0 - Concentrado en el Reporteador
																					// 1 - Detallado en Excel


// *********************************************************************************************
//	Tablas a utilizar e Indices de búsqueda por omisión
// *********************************************************************************************
UsaEmpresa tEmpresa;'ADMINPAQW'                   // Parámetros

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

UsaTabla tProducto = tEmpresa['MGW10005']         // Productos
tProducto.Usaindice['iCodigoTipo']								// cCodigoProducto, cTipoProducto

UsaTabla tProductoIdent = tEmpresa['MGW10004']    // Identificadores de Productos
tProductoIdent.Usaindice['']											// cIdProducto

UsaTabla tDocumento = tEmpresa['MGW10008']        // Documentos
tDocumento.Usaindice['']                          // cIdDocumento

UsaTabla tMovimiento = tEmpresa['MGW10010']   Alias 'Movtos'    // Movimientos
//tMovimiento.Usaindice['iProductoAlmacenFechaAfec']// cIdProducto, cIdDocumentoDe,
																									//	cAfectadoInventario, cFecha
tMovimiento.Usaindice['iProductoAlmacenFechaAfec'] // cIdProducto+cIdAlmacen+CAFECTADOINVENTARIO+cFecha N.D.5062
// N.D.2615 tMovimiento.Usaindice['iProductoDoctoDeAfecFecha']// cIdProducto, cIdDocumentoDe,
//																									//	cAfectadoInventario, cFecha

UsaTabla tMovtoDatos = tEmpresa['MGW10010'] Alias 'MovtoDatos'  // Movimientos
tMovtoDatos.Usaindice['']													// cIdMovimiento

UsaTabla tMovtoOwner = tEmpresa['MGW10010'] Alias 'MovtoOwner'  // Movimientos
tMovtoOwner.Usaindice['iMovtoOwnerMovto']					// cIdMovtoOwner, cIdMovimiento

//N.D.3863
UsaTabla tProductoAux = tEmpresa['MGW10005'] Alias 'tProductoAux'  // Productos
tProductoAux.Usaindice['']                                         // IdProducto

UsaTabla tEjercicio = tEmpresa['MGW10031']        // Ejercicios
tEjercicio.Usaindice['cNumeroEjercicio']					// cNumeroEjercicio

UsaTabla tAlmacen = tEmpresa['MGW10003']          // Almacenes
tAlmacen.Usaindice['cCodigoAlmacen']              // cCodigoAlmacen

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

UsaTabla tTiposCambioLib = tEmpresa['MGW10035']       // Tipo de cambio
tTiposCambioLib.Usaindice['iMonedaFecha']							// cIdMoneda, cFecha

UsaTabla tValoresDeClasif = tEmpresa['MGW10020']	// Valores de Clasificación
tValoresDeClasif.UsaIndice['']                    // cIdValorClasificacion

UsaTabla tCaracteristica = tEmpresa['MGW10021']   // Características
tCaracteristica.Usaindice['']											// cIdCaracteristica

UsaTabla tValorCaracteristica = tEmpresa['MGW10022'] // Valores de Caracteristica
tValorCaracteristica.Usaindice['']								// cIdValorCaracteristica

UsaTabla tConceptoDocto = tEmpresa['MGW10006']		// Conceptos
tConceptoDocto.Usaindice['']											// cIdConceptoDocumento

UsaTabla tDocumentoDe = tEmpresa['MGW10007']			// Documentos Modelo
tDocumentoDe.Usaindice['']												// cIdDocumentoDe

UsaTabla tCliente = tEmpresa['MGW10002']					// Clientes / proveedores
tCliente.Usaindice['']														// cIdClienteProveedor


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

// Ancho de columnas = caracteres / 17 * 2.54
// Se consideran columnas intermedias de un espacio
// C1 (Fecha) 							= 10 caracteres
// C3 (Documento modelo) 		= 11 caracteres
// C5 (Serie) 							=  5 caracteres
// C7 (Folio) 							= 12 caracteres
// C9 (Concepto documento)	= 20 caracteres
// C11 (Unidades) 					= 12 caracteres
// C13 (Costo Unitario) 		= 12 caracteres
// C15 (Neto) 							= 12 caracteres
// C17 (Proveedor) 					= 25 caracteres
// Si el Reporte es diario de compras y se desean imprimir las consignaciones la columna
//	del documento modelo tendrá un ancho de 1.70, de otra forma no tendrá tamaño y dara
//	la apariencia de no existir
Si pTipoReporte = 1 y pMostrarConsignaciones = 1
	Columnas 19;0.70,1.50,0.15,1.70,0.15,0.75,0.15,1.80,0.15,3.00,0.15,1.80,0.15,1.80,0.15,1.80,0.15,4.00,0.30 //N.C.224
Sino
	Columnas 19;0.70,1.50,0.15,0.00,0.15,0.75,0.15,1.80,0.15,3.00,0.15,1.80,0.15,1.80,0.15,1.80,0.15,4.00,0.30 //N.C.224
FinSi
Usaletra 'Arial'
Altura 9


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

gIdioma = 0               // Idioma del reporte
                          // 0 = Español
                          // 1 = Inglés
// Las siguientes variables se utilizan en el cuerpo principal del reporte
gPeriodo = 0              // Numero de período que corresponde a la fecha de corte del reporte
gIdEjercicio = 0          // ID del ejercicio que contiene la fecha de corte del reporte
gUnidad = pUnidad         // Almacenamiento del parámetro pUnidad
gMascarillaProducto = ''  // Mascarilla para el código del producto
gMascarillaAlmacen 	= ''  // Mascarilla para el código del almacén
gMascarillaCliente	= ''	// Mascarilla para el código del cliente

gTotalAlmacen 	= 0.00				// Total del almacén
gAlmacenConMovimientos	= 0		// Bandera para saber si el almacén tiene movimientos
gImpresoAlmacen	= 0						// Bandera para saber si el almacén ya se imprimio
gTotalProducto 	= 0.0					// Total del producto
gProductoConMovimientos = 0		// Bandera para saber si el producto tiene movimientos
gImpresoProducto	= 0					// Bandera para saber si el producto ya se imprimio
gTotalReporte		= 0.00				// Total del reporte
gTieneMovtosEnCaptura = 0			// Si el movimiento esta aún en captura //N.C.224

// Obtención de las mascarillas
tParametros.Busca Primero
Si tParametros->Encontro
	gMascarillaAlmacen 	= tParametros(cMascarillaAlmacen)
	gMascarillaProducto	= tParametros(cMascarillaProducto)
	gMascarillaCliente	= tParametros(cMascarillaClientes)
FinSi

// Obtención de la moneda del reporte y de sus decimales
tMoneda.Busca[@Str(pIdMonedaReporte;0)]
Si tMoneda->Encontro
	gDecimalesMonedaReporte = tMoneda(cDecimalesMoneda)
	gNombreMonedaReporte 		= tMoneda(cNombreMoneda)
Sino
	gDecimalesMonedaReporte = 2    // Número de decimales en la moneda
	gNombreMonedaReporte 		= 'Peso Mexicano'
FinSi
// Fin Busqueda de la moneda del reporte

// gNombreConsignacion guarda el nombre del Documento Modelo de consignación al proveedor
// gNombreDocumentoDe guarda el nombre del Documento Modelo que se va a utilizar
// gModeloBusqueda		guarda el Id del Documento Modelo que se va a utilizar
// Para	el reporte de Diario de Compras se buscaran modelos de Facturas ID = 4
// Para	el reporte de Diario de Ventas se buscaran modelos de Compras ID = 19
Si pTipoReporte = 1
	tDocumentoDe.Busca['18']
	gNombreConsignacion = tDocumentoDe(cDescripcion)
	tDocumentoDe.Busca['19']
	gNombreDocumentoDe = tDocumentoDe(cDescripcion)
	gModeloBusqueda = '19'
  gListIdDoctosDe = '19' // FBCS POS
  gNumIdDoctos    =  1   // FBCS POS
Sino
	tDocumentoDe.Busca['4']
	gNombreDocumentoDe = tDocumentoDe(cDescripcion)
	gModeloBusqueda = '4'
  gListIdDoctosDe = '4,35' // FBCS POS
  gNumIdDoctos    =  2     // FBCS POS
Finsi  

// *******************************************************************************************
// Definicion de constantes de EXCEL
// *******************************************************************************************
Si pExcel = 1
	constante xlCentrarEnSeleccion      7
	constante xlAutomatico          -4105
	constante xlManual              -4135
	constante xlInferior            -4107
	constante xlSubrayadoDoble      -4119
	constante xlIzquierda           -4131
	constante xlMediano             -4138
	constante xlNinguno             -4142
	constante xlDerecha             -4152
	constante xlSuperior            -4160
	constante xlHojaCalculo         -4167
	constante xlLineaSimple					    1
	constante xlBordeSuperior				    8
	constante xlBordeInferior				    9
	constante xlBordeIzquierda			    7
	constante xlBordeDerecha				   10
	constante xlCentro							-4108
	// Acceso a los objetos de excel. 
	// Crea un objeto de Excel con la funcion @CreaObjeto(). A esta funcion se le 
	// pasa un identificador de OLE de la aplicacion que se desea crear. En este 
	// caso el identificador es Excel.Application.5
	Objeto Excel = @CreaObjeto('Excel.Application')
	// Invoca el metodo de EXCEL Libros y luego el metodo Agregar para crear un libro 
	// de hoja de calculo representado por la constante de EXCEL (xlHojaCalculo).
	// Es importante notar que estos metodos NO LOS EJECUTA EL REPORTEADOR sino que 
	// los hace EXCEL y estan documentados en el Help de EXCEL
	Objeto wb = Excel.WorkBooks.Add(xlHojaCalculo)
	// Accesa la hoja de calculo (HojasCalculo) numero 1 del Libro creado anteriormente
	// y representado por la variable wb, de la instruccion anterior
	Objeto ws = wb.Worksheets(1)
	// Hace visible a EXCEL. Para Excel, TRUE o VERDADERO es -1, FALSE o FALSO es 0
	Excel.ActiveWindow.DisplayGridlines = FALSE[C0]
	Excel.Visible = -1[C0]
	RenActual = 1
	// Pone la longitud de cada columna
	// Codigo-Almacen
	ws.Columns(1).ColumnWidth = 10[C0]
	// Nombre-Almacen
	ws.Columns(2).ColumnWidth = 15[C0]
	// Codigo-Producto
	ws.Columns(3).ColumnWidth = 10[C0]
	// Nombre-Producto
	ws.Columns(4).ColumnWidth = 25[C0]
	// Fecha
	ws.Columns(5).ColumnWidth = 12[C0]
	// Documento_Modelo, solo tendrá tamaño si el reporte es el Diario de Compras y se
	//	desean incluir las consignaciones, de otra forma su tamaño será cero y dara la
	//	apariencia de no existir dicha columna
	Si pTipoReporte = 1	y pMostrarConsignaciones = 1 // Compras y consignaciones
		ws.Columns(6).ColumnWidth = 25[C0]
	Sino
		ws.Columns(6).ColumnWidth = 0[C0]
	FinSi
	// Serie
	ws.Columns(7).ColumnWidth = 5[C0]
	// Folio
	ws.Columns(8).ColumnWidth = 12[C0]
	// Concepto Documento
	ws.Columns(9).ColumnWidth = 30[C0]
	// Unidades
	ws.Columns(10).ColumnWidth = 10[C0]
	// Costo unitario
	ws.Columns(11).ColumnWidth = 12[C0]
	// Neto
	ws.Columns(12).ColumnWidth = 15[C0]
	// Impuesto 1
	ws.Columns(13).ColumnWidth = 15[C0]
	// Impuesto 2
	ws.Columns(14).ColumnWidth = 15[C0]
	// Total
	ws.Columns(15).ColumnWidth = 15[C0]
	// Codigo proveedor
	ws.Columns(16).ColumnWidth = 10[C0]
	// Nombre proveedor
	ws.Columns(17).ColumnWidth = 30[C0]
	// Error
	ws.Columns(18).ColumnWidth = 5[C0]	//N.D.5724
	
FinSi
// Fin si Configuración si el reporte tiene salida a Excel


// *********************************************************************************************
// F U N C I O N E S
// *********************************************************************************************
// *********************************************************************************************
// Proceso:			fConfiguraDecimales
// Descripción:	Configura el número de decimales de las columnas de importes, basado en
//  						en los parámetros de la empresa y los decimales de la moneda del reporte
//
// Parámetros 
//
// Salidas 
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Historia de modificaciones
//  Fecha      Nombre   IDLotus                     Descripcion
// *********************************************************************************************
DefFunc fConfiguraDecimalesyMascaras()
LOCAL lDigDecimales, lDecimales, lNumDecimales, lFormato

	
	Si pExcel = 0			// El reporte tiene salida al Reporteador

		// La columna del folio no debe de tener decimales
		[C7].Decimales 0	
		// Decimales en unidades
		[C11].Decimales tParametros(cDecimalesUnidades)
		// Decimales en costos
	 	[C13].Decimales tParametros(cDecimalesCostos)
		// Decimales en importes
  	[C15].Decimales gDecimalesMonedaReporte

	Sino							// El reporte tiene salida en Excel

	  lDigDecimales = '0000000000'

		// Decimales en unidades
	  lDecimales = @SUBSTR(lDigDecimales; 1; tParametros(cDecimalesUnidades))
  	lFormato   = '#,##0.' & lDecimales & '_);(#,##0.' & lDecimales & ')'
		ws.Columns(10).NumberFormat = lFormato[C0]

		// Decimales en costos
	  lDecimales = @SUBSTR(lDigDecimales; 1; tParametros(cDecimalesCostos))
  	lFormato   = '#,##0.' & lDecimales & '_);(#,##0.' & lDecimales & ')'
		ws.Columns(11).NumberFormat = lFormato[C0]

		// Decimales en importes
	  lDecimales = @SUBSTR(lDigDecimales; 1; gDecimalesMonedaReporte)
  	lFormato   = '#,##0.' & lDecimales & '_);(#,##0.' & lDecimales & ')'
		ws.Columns(12).NumberFormat = lFormato[C0]
		ws.Columns(13).NumberFormat = lFormato[C0]
		ws.Columns(14).NumberFormat = lFormato[C0]
	 	ws.Columns(15).NumberFormat = lFormato[C0]

	FinSi
	// Fin si Tipo de salida del reporte

FinFunc
// Fin método: fConfiguraDecimalesyMascaras


// *********************************************************************************************
// Proceso:			fVerificaParametros
// Descripción:	En caso de que no se reciba nada en los parametros de rangos de almacenes y/o
//								productos. Se considera que se dese imprimir del primer al último código.
//								Así que se modifican los parametros para que tomen dichos códigos
//
//  Parámetros 
//
//  Salidas 
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Historia de modificaciones
//  Fecha      Nombre   IDLotus                     Descripcion
// *********************************************************************************************
DefFunc fVerificaParametros()

	// Si el rango inicial es el primer almacén, recupera el código del primero
	Si pAlmacenInicial = ' '
		tAlmacen.Busca Primero
		Si tAlmacen->Encontro
			pAlmacenInicial = tAlmacen(cCodigoAlmacen)
		FinSi
	FinSi 
	// Fin si Estandariza el almacén inicial

	// Si el rango final es el último almacén, recupera el código del último
	Si pAlmacenFinal = ' '
		tAlmacen.Busca Ultimo
		Si tAlmacen->Encontro
			pAlmacenFinal = tAlmacen(cCodigoAlmacen)
		FinSi
	FinSi
	// Fin si Estandariza el almacén final

	// Si el rango inicial es el primer producto, recupera el código del primero
	Si pProductoInicial = ' '
		tProducto.Busca Primero
		Si tProducto->Encontro
			pProductoInicial = tProducto(cCodigoProducto)
		FinSi
	FinSi
	// Fin si Estandariza el producto inicial

	// Si el rango final es el último producto, recupera el código del último
	Si pProductoFinal = ' '
		tProducto.Busca Ultimo
		Si tProducto->Encontro
			pProductoFinal = tProducto(cCodigoProducto)
		FinSi
	FinSi
	// Fin si Estandariza el producto final

FinFunc
// Fin método: fVerificaParametros


// ==========================================================================================
// fImporteMonedaReporte
// Descripcion : El importe lo expresa en la moneda del Reporte
// Entrada : 		aImporte 					: 	Importe a cambiar
//							aIdMonedaDocto		:   Id de la moneda en la que esta el importe
//          		aTipoCambioDocto	: 	Tipo de cambio a la moneda base
//							aFecha						:		Fecha para buscar el tipo de cambio de la moneda base
//																			a la moneda del reporte
// Salida  :		Importe expresado en la moneda del reporte
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Historia de modificaciones
//  Fecha      Nombre   IDLotus                     Descripcion
// ==========================================================================================
//! N.D.3240 Deffunc fImporteMonedaReporte(aImporte; aIdMonedaLocal; aTipoCambio; aFecha)
//! N.D.3240 Local lImporteMonedaRpt, lImporteMonedaBase, lTipoCambio
//! N.D.3240 
//! N.D.3240 	Si aIdMonedaLocal != pIdMonedaReporte	// Si la moneda del importe es diferente a la del reporte
//! N.D.3240 		// Transforma el importe a la moneda base tomando el tipo de cambio del documento
//! N.D.3240 		lImporteMonedaBase	= aImporte * aTipoCambio
//! N.D.3240 		// Si la moneda del reporte es diferente a la base convierte tomando el tipo de cambio
//! N.D.3240 		Si pIdMonedaReporte != 1				
//! N.D.3240 			lTipoCambio    		= fTipoCambio(aFecha; pIdMonedaReporte; tTiposCambioLib)
//! N.D.3240 			lImporteMonedaRpt = lImporteMonedaBase / lTipoCambio
//! N.D.3240 		Sino
//! N.D.3240 			lImporteMonedaRpt = lImporteMonedaBase
//! N.D.3240 		FinSi		
//! N.D.3240 		// Fin si Conversión a la moneda del reporte
//! N.D.3240 	Sino																	// No realizar calculo ya que las monedas son iguales
//! N.D.3240 		lImporteMonedaRpt = aImporte
//! N.D.3240 	FinSi
//! N.D.3240 
//! N.D.3240 	Retorna lImporteMonedaRpt
//! N.D.3240 FinFunc
// Fin método: fImporteMonedaReporte


// *********************************************************************************************
// Proceso:			fImprimeMovtoCaracteristicas
// Descripción:	Esta función imprime las características y unidades de los movimientos de 
//								detalles de características
//
// Parámetros 	atMovtoOwner	- Movimiento de detalle de características
//
// Salidas 
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Historia de modificaciones
//  Fecha      Nombre   IDLotus                     Descripcion
// *********************************************************************************************
DefFunc fImprimeValorCaracteristicas(atMovtoOwner:Tabla)
Local lPadrecaracteristica, lValorCaracteristica

	lPadreCaracteristica = ' '
	lValorCaracteristica = ' '

	// Ubica el producto identificador del movimiento
	tProductoIdent.Busca[@Str(atMovtoOwner(cIdProducto);0)]
	Si tProductoIdent->Encontro
		// Característica 1
		Si tProductoIdent(cIdValorCaracteristica1)
			// Busqueda del valor y asignación a la cadena de valores de características
			tValorCaracteristica.Busca[@Str(tProductoIdent(cIdValorCaracteristica1);0)]
			Si tValorCaracteristica->Encontro
				// Busqueda del nombre de la característica y asignación a la cadena de padre de características
				tCaracteristica.Busca[@Str(tValorCaracteristica(cIdPadreCaracteristica);0)]
				Si tCaracteristica->Encontro
					lPadreCaracteristica = tCaracteristica(cNombreCaracteristica)
					lValorCaracteristica = tValorCaracteristica(cValorCaracteristica)
				FinSi				
			FinSi		
		FinSi
		// Característica 2
		Si tProductoIdent(cIdValorCaracteristica2)
			// Busqueda del valor y contatenación a la cadena de valores de características
			tValorCaracteristica.Busca[@Str(tProductoIdent(cIdValorCaracteristica2);0)]
			Si tValorCaracteristica->Encontro
				lValorCaracteristica = lValorCaracteristica & ', ' & tValorCaracteristica(cValorCaracteristica)
			FinSi		
		FinSi
		// Característica 3
		Si tProductoIdent(cIdValorCaracteristica3) 
			// Busqueda del valor y contatenación a la cadena de valores de características
			tValorCaracteristica.Busca[@Str(tProductoIdent(cIdValorCaracteristica3);0)]
			Si tValorCaracteristica->Encontro
				lValorCaracteristica = lValorCaracteristica & ', ' & tValorCaracteristica(cValorCaracteristica)
			FinSi		
		FinSi
	FinSi
	// Fin si Ubicación del producto identificador y obtención de las características

	// Impresión del valor de característica y sus unidades (Si existe)
	Si lValorCaracteristica != ' '
		// la salida es aExcel o al Reporteador ?
		Si pExcel = 0
			// Valor Característica
			lImprime[9] = lPadreCaracteristica & ': ' & lValorCaracteristica
			// Unidades
			lImprime = atMovtoOwner(cUnidades)[C11]
  		Lista lImprime
		Sino
			// Avanza de renglon
  		RenActual = RenActual + 1[C0]
	  	ws.Range('H' & RenActual & ':J' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
 			ws.Range('H' & RenActual & ':J' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0]
	  	ws.Range('H' & RenActual & ':J' & RenActual).Borders(xlIzquierda).LineStyle= xlLineaSimple[C0]
 			ws.Range('H' & RenActual & ':J' & RenActual).Borders(xlDerecha).LineStyle  = xlLineaSimple[C0]

			// Padre Característica
 			ws.Range('H' & RenActual).Value = lPadreCaracteristica & ':'[C0]
			// Valor Característica
 			ws.Range('I' & RenActual).Value = lValorCaracteristica[C0]
			// Unidades
  		ws.Range('J' & RenActual).Value = atMovtoOwner(cUnidades)[C0]
		FinSi
		// Fin tipo de salida
	FinSi
	// Fin impresión del valor de la característica y sus unidades

FinFunc
// Fin método: fImprimeValorCaracteristicas


// *********************************************************************************************
// Proceso:			fImprimeMovtoCaracteristicas
// Descripción:	Esta función imprime los detalles de características de un movimiento
//
// Parámetros 	atMovimiento	- Movimiento del producto padre de características
//							atProducto		- Registro del producto padre
//
// Salidas 
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Historia de modificaciones
//  Fecha      Nombre   IDLotus                     Descripcion
// *********************************************************************************************
DefFunc fImprimeMovtosCaracteristicas(atMovimiento:Tabla; atProducto:Tabla)
Local	lValorModulo

	//	El campo cControlExistencia es un mapa de bits. 
	// 	00001	= Unidades					 1
	//	00010 = Caracteristicas		 2	
	//	00100 = Series						 4
	//	01000 = Pedimentos				 8
	//	10000 = Lotes							16
	//														32	
  lValorModulo = atProducto(cControlExistencia)
	lValorModulo = lValorModulo % 32
  lValorModulo = lValorModulo % 16  // descarto el bit de Lotes
  lValorModulo = lValorModulo %  8  // descarto el bit de Pedimentos
  lValorModulo = lValorModulo %  4  // descarto el bit de Series
			
	// Verifica si el producto maneja características con o sin unidades
	Si lValorModulo >= 2
		// Recorre los movimientos de detalle y ejecuta fImprimeValorCaracteristicas para
		//	imprimir la característica y sus unidades
		// No considerar los movimientos de componentes de paquetes
		Mientras[tMovtoOwner.Busca[atMovimiento(cIdMovimiento) & '..' & atMovimiento(cIdMovimiento)]; tMovtoOwner->Encontro; tMovtoOwner.Busca Siguiente[1]]
			fImprimeValorCaracteristicas(tMovtoOwner)
		FinMientras
	FinSi
	
FinFunc
// Fin método: fImprimeMovtoCaracteristicas

// *********************************************************************************************
// Proceso:			fImprimeDocumento
// Descripción:	Esta función imprime el movimiento
//	DISEÑO:
//	Imprimir Documento(cFecha), Concepto del Documento, Documento(cSerie), Documento(cFolio), Movimientos2(cUnidades), Movimientos2(cCostoEspecifico) / Movimientos2(cUnidades), Movimientos2.cNeto
//	Si pTipoReporte = 1	// Detallado en Excel
//		Imprimir Movimientos2(cImpuesto1), Movimientos2(cImpuesto2), Movimientos2(cTotal)
//	FinSi
//	Imprimir Nombre del Proveedor del Documento
//	Si pImprimirCaracteristicas y el producto actual tiene caracteristicas
//		Mientras existan movimiento ocultos
//			Imprime nombres de las caracteristicas separadas por "-" y el numero de unidades en el movimiento oculto
//		FinMientras
//	FinSi
//	Acumular totales por Almacen
//	Acumular totales generales
// Parámetros 
//
// Salidas 
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Historia de modificaciones
//  Fecha      Nombre   IDLotus                     Descripcion
//  02/03/2004 LAP			2615				Mejora en la presentación	con salida a Excel.
//  09/07/2009 ELVS			3863        Imprime los costos de los componentes de un paquete.
// *********************************************************************************************
DefFunc fImprimeDocumento(atDocumento:Tabla; atMovimiento:Tabla; atAlmacen:Tabla; atProducto:Tabla; aImprimirCosto)
Local lImprime, lImporte, lTotalDescuentos
Local lCostoUnitario
Local lIdMonedaCliente

	lImporte = 0

	// Ubica el cliente del documento
	tCliente.Busca[@Str(atDocumento(cIdClienteProveedor);0)]
	// Ubica el concepto del documento
  tConceptoDocto.Busca[@Str(atDocumento(cIdConceptoDocumento);0)]
  
  // N.D.3240 Id de la moneda del cliente / proveedor
  Si tCliente->Encontro
    lIdMonedaCliente = tCliente(cIdMoneda)
  Sino
    lIdMonedaCliente = atDocumento(cIdMoneda)
  FinSi

	// Imprime los datos dependiendo del tipo de salida
	// Salida a Excel o al reporteador ?
	Si pExcel = 0
		lImprime = ' '[C0..C17]
		// Fecha
		lImprime = @Col(fFormateaFecha(atDocumento(cFecha); gIdioma);0)[C1]
		// Documento Modelo
		Si gConsignacion
			lImprime = @Col(gNombreConsignacion;0)[C3]
		Sino
			lImprime = 'Aqui va en documentoDe '[C3]//@Col(gNombreDocumentoDe;0)[C3]
		FinSi
		// Serie
		lImprime = @Col(atDocumento(cSerieDocumento);0)[C5]
		// Folio
		lImprime = @Col(atDocumento(cFolio);0)[C7]
		
		//N.D.3863
    // Concepto
    lImprime = @Col(tConceptoDocto(cNombreConcepto);0)[C9]
    // Unidades
    lImprime = @Col(atMovimiento(cUnidades);0)[C11]
    lImporte[11] = atMovimiento(cUnidades)
		Si aImprimirCosto = 1 //Cuando es producto normal		  
		  // Costo_Unitario
		  // NOTA: El costo siempre está expresado en la moneda base: 1		
		  //! N.D.3240 lImporte[13] = fImporteMonedaReporte(atMovimiento(cCostoEspecifico) / atMovimiento(cUnidades); 1; 1; atDocumento(cFecha))	
			lImporte[13] = fCambiarMonedaImporteAReporte(atDocumento; tTiposCambioLib; atMovimiento(cCostoEspecifico) / atMovimiento(cUnidades); 1; pIdMonedaReporte; lIdMonedaCliente)
			lImprime = lImporte[C13]			 	
		FinSi
		//Fin N.D.3863
				
		// Neto
		Si pTipoReporte = 1	// Reporte de Compras
			//! N.D.3240 lImporte[15] = fImporteMonedaReporte(atMovimiento(cNeto); atDocumento(cIdMoneda); atDocumento(cTipoCambio); atDocumento(cFecha))
			lImporte[15] = fCambiarMonedaDoctoAReporte(atDocumento; tTiposCambioLib; atMovimiento(cNeto); pIdMonedaReporte; lIdMonedaCliente)
		Sino								// Reporte de Ventas
			// Neto = cNeto - Descuentos
			lTotalDescuentos = atMovimiento(cDescuento1) + atMovimiento(cDescuento2) + atMovimiento(cDescuento3) + atMovimiento(cDescuento4) + atMovimiento(cDescuento5)
			//! N.D.3240 lImporte[15] = fImporteMonedaReporte(atMovimiento(cNeto)-lTotalDescuentos; atDocumento(cIdMoneda); atDocumento(cTipoCambio); atDocumento(cFecha))
			lImporte[15] = fCambiarMonedaDoctoAReporte(atDocumento; tTiposCambioLib; atMovimiento(cNeto)-lTotalDescuentos; pIdMonedaReporte; lIdMonedaCliente)
		FinSi
		lImprime = lImporte[C15]
		// Proveedor
		lImprime = @Col(tCliente(cRazonSocial);0)[C17]
		
		//N.D.3863
		Si aImprimirCosto = 2 
			lImprime = ' '[C0..C8] 			
			//Código del Producto (Componente)
			lImprime = @Col(atProducto(CCODIGOPRODUCTO);0)[C9] 	  				
			lImprime = ' '[C10..C12]
			//Costo Unitario  	
  		lImporte[13] = fCambiarMonedaImporteAReporte(atDocumento; tTiposCambioLib; atMovimiento(cCostoEspecifico) / atMovimiento(cUnidades); 1; pIdMonedaReporte; lIdMonedaCliente)
	  	lImprime = lImporte[C13]  	
	  	lImprime = ' '[C14..C18]
		FinSi			
		//Fin N.D.3863
		
		//N.C.224 Si el documento aun esta en captura se mostrará un (*)
		Si gTieneMovtosEnCaptura = 1
		  lImprime = '(*)'[C18]
  		gTieneMovtosEnCaptura = 0
		FinSi
		//Fin N.C.224
		
	  Lista lImprime
	Sino
		// Avanza de renglon
	  RenActual = RenActual + 1[C0]
	  //N.D.3863
	  Si aImprimirCosto != 2
	  	//N.D.5724	  
    	ws.Range('A' & RenActual & ':R' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
    	ws.Range('A' & RenActual & ':R' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0]
    	ws.Range('A' & RenActual & ':R' & RenActual).Borders(xlIzquierda).LineStyle= xlLineaSimple[C0]
    	ws.Range('A' & RenActual & ':R' & RenActual).Borders(xlDerecha).LineStyle  = xlLineaSimple[C0]    	
    FinSi
    //Fin N.D.3863    	

		// Codigo almacen
		ws.Range('A' & RenActual).Value = @Chr(39) & fMascarilla(atAlmacen(cCodigoAlmacen); gMascarillaAlmacen)[C0]
		// Nombre almacen
		ws.Range('B' & RenActual).Value = atAlmacen(cNombreAlmacen)[C0]
		// Codigo producto
  	ws.Range('C' & RenActual).Value = @Chr(39) & fMascarilla(atProducto(cCodigoProducto); gMascarillaProducto)[C0]
		// Nombre producto
  	ws.Range('D' & RenActual).Value = atProducto(cNombreProducto)[C0]
		// Fecha
		ws.Range('E' & RenActual).Value = @Col(fFormateaFecha(atDocumento(cFecha); gIdioma);0)[C0]
		// Documento modelo
		Si gConsignacion
			ws.Range('F' & RenActual).Value = @Col(gNombreConsignacion;0)[C0]
		Sino
			ws.Range('F' & RenActual).Value = @Col(gNombreDocumentoDe;0)[C0]
		FinSi
		// Serie
  	ws.Range('G' & RenActual).Value = atDocumento(cSerieDocumento)[C0]
		// Folio
  	ws.Range('H' & RenActual).Value = atDocumento(cFolio)[C0]
		// Concepto
  	ws.Range('I' & RenActual).Value = tConceptoDocto(cNombreConcepto)[C0]
		// Unidades
  	ws.Range('J' & RenActual).Value = atMovimiento(cUnidades)[C0]
    lImporte[9] = atMovimiento(cUnidades)
    //N.D.3863
    // Costo unitario
    // NOTA: El costo siempre está expresado en la moneda base: 1
    //! N.D.3240 lImporte[10] = fImporteMonedaReporte(atMovimiento(cCostoEspecifico) / atMovimiento(cUnidades); 1; 1; atDocumento(cFecha))
    Si aImprimirCosto = 1 
      lImporte[10] = fCambiarMonedaImporteAReporte(atDocumento; tTiposCambioLib; atMovimiento(cCostoEspecifico) / atMovimiento(cUnidades); 1; pIdMonedaReporte; lIdMonedaCliente)			
      ws.Range('K' & RenActual).Value = lImporte[C10]
    FinSi  		
    //Fin N.D.3863
		
		// Neto
		Si pTipoReporte = 1 // Reporte de compras
			//! N.D.3240 lImporte[11] = fImporteMonedaReporte(atMovimiento(cNeto); atDocumento(cIdMoneda); atDocumento(cTipoCambio); atDocumento(cFecha))
			lImporte[11] = fCambiarMonedaDoctoAReporte(atDocumento; tTiposCambioLib; atMovimiento(cNeto); pIdMonedaReporte; lIdMonedaCliente)
		Sino								// Reporte de ventas
			// Neto = cNeto - Descuentos
			lTotalDescuentos = atMovimiento(cDescuento1) + atMovimiento(cDescuento2) + atMovimiento(cDescuento3) + atMovimiento(cDescuento4) + atMovimiento(cDescuento5)
			//! N.D.3240 lImporte[11] = fImporteMonedaReporte(atMovimiento(cNeto)-lTotalDescuentos; atDocumento(cIdMoneda); atDocumento(cTipoCambio); atDocumento(cFecha))
			lImporte[11] = fCambiarMonedaDoctoAReporte(atDocumento; tTiposCambioLib; atMovimiento(cNeto)-lTotalDescuentos; pIdMonedaReporte; lIdMonedaCliente)
		FinSi
  	ws.Range('L' & RenActual).Value = lImporte[C11]
		// Impuesto 1
		//! N.D.3240 lImporte[12] = fImporteMonedaReporte(atMovimiento(cImpuesto1); atDocumento(cIdMoneda); atDocumento(cTipoCambio); atDocumento(cFecha))
		lImporte[12] = fCambiarMonedaDoctoAReporte(atDocumento; tTiposCambioLib; atMovimiento(cImpuesto1); pIdMonedaReporte; lIdMonedaCliente)
  	ws.Range('M' & RenActual).Value = lImporte[C12]
		// Impuesto 2
		//! N.D.3240 lImporte[13] = fImporteMonedaReporte(atMovimiento(cImpuesto2); atDocumento(cIdMoneda); atDocumento(cTipoCambio); atDocumento(cFecha))
		lImporte[13] = fCambiarMonedaDoctoAReporte(atDocumento; tTiposCambioLib; atMovimiento(cImpuesto2); pIdMonedaReporte; lIdMonedaCliente)
  	ws.Range('N' & RenActual).Value = lImporte[C13]
		// Total
		//! N.D.3240 lImporte[14] = fImporteMonedaReporte(atMovimiento(cTotal); atDocumento(cIdMoneda); atDocumento(cTipoCambio); atDocumento(cFecha))
		lImporte[14] = fCambiarMonedaDoctoAReporte(atDocumento; tTiposCambioLib; atMovimiento(cTotal); pIdMonedaReporte; lIdMonedaCliente)
  	ws.Range('O' & RenActual).Value = lImporte[C14]
		// Codigo proveedor
  	ws.Range('P' & RenActual).Value = @Chr(39) & fMascarilla(tCliente(cCodigoCliente); gMascarillaCliente)[C0]
		// Nombre proveedor
  	ws.Range('Q' & RenActual).Value = tCliente(cRazonSocial)[C0]
  	
    //N.D.3863
    Si aImprimirCosto = 2 
      ws.Range('I' & RenActual & ':K' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
      ws.Range('I' & RenActual & ':K' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0]
      ws.Range('I' & RenActual & ':K' & RenActual).Borders(xlIzquierda).LineStyle= xlLineaSimple[C0]
      ws.Range('I' & RenActual & ':K' & RenActual).Borders(xlDerecha).LineStyle  = xlLineaSimple[C0]				
		
      lImprime = ' '[C0]
      ws.Range('A' & RenActual).Value = ' '[C0]
      ws.Range('B' & RenActual).Value = ' '[C0]
      ws.Range('C' & RenActual).Value = ' '[C0]
      ws.Range('D' & RenActual).Value = ' '[C0]
      ws.Range('E' & RenActual).Value = ' '[C0]
      ws.Range('F' & RenActual).Value = ' '[C0]
      ws.Range('G' & RenActual).Value = ' '[C0]
      ws.Range('H' & RenActual).Value = ' '[C0]			
			 			
      //Código del Producto (Componente)
      ws.Range('I' & RenActual).Value = atProducto(CCODIGOPRODUCTO)[C0]
  		
      ws.Range('J' & RenActual).Value = ' '[C0]

      //Costo Unitario  	
      lImporte[10] = fCambiarMonedaImporteAReporte(atDocumento; tTiposCambioLib; atMovimiento(cCostoEspecifico) / atMovimiento(cUnidades); 1; pIdMonedaReporte; lIdMonedaCliente)			
      ws.Range('K' & RenActual).Value = lImporte[C10]  		
  		
      ws.Range('L' & RenActual).Value = ' '[C0]
      ws.Range('M' & RenActual).Value = ' '[C0]
      ws.Range('N' & RenActual).Value = ' '[C0]
      ws.Range('O' & RenActual).Value = ' '[C0]
      ws.Range('P' & RenActual).Value = ' '[C0]
      ws.Range('Q' & RenActual).Value = ' '[C0]
    FinSi					
    //Fin N.D.3863  	
  	
  	//N.C.224 Si el documento actual esta en captura, se mostrará un (*)
  	Si gTieneMovtosEnCaptura = 1
  		ws.Range('R' & RenActual).Value = '(*)'[C18]
  		gTieneMovtosEnCaptura = 0
  	FinSi
	FinSi
	// Fin tipo de salida
	
	//N.D.3863 Cuando se trata de un componente de un paquete no suma en el total.
	Si aImprimirCosto != 2 
		// Actualización de los acumulados
		gTotalProducto 	= gTotalProducto 	+ lImporte	
		gTotalAlmacen 	= gTotalAlmacen 	+ lImporte
		gTotalReporte		= gTotalReporte		+ lImporte
	FinSi	
	

	// Impresión de los detalles de características, si el parametro así lo indica
	Si pImprimirCaracteristicas
		fImprimeMovtosCaracteristicas(atMovimiento; atProducto)
	FinSi

FinFunc
// Fin método: fImprimeDocumento

// *********************************************************************************************
// Proceso:			fImprimeMovtoComponentes
// Descripción:	Esta función imprime los componentes de un paquete, se pocisiona en el movimiento
//              correspondiente del componente perteneciente a un paquete				
//
// Parámetros 	atatDocumento - Documento
//							atMovimiento	- Movimiento del producto padre del paquete
//              atAlmacen     - Almacén
//							atProducto		- Registro del producto padre
//
// Salidas 
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Historia de modificaciones
//  Fecha       Nombre   IDLotus                     Descripcion
//  09/07/2009  ELVS     N.D.3863                    REPORTES ERROR NO PONE EL COSTO UNITARIO DEL
//                                                   PRODUCTO QUE SE VENDIO POR MEDIO DE UN PAQUETE
//                                                   EN EL REPORTE DIARIO DE VENTA POR ALMACEN.
// *********************************************************************************************
DefFunc fImprimeMovtoComponentes(atDocumento:Tabla; atMovimiento:Tabla; atAlmacen:Tabla; atProducto:Tabla)

Mientras[tMovtoOwner.Busca[@Str(atMovimiento(CIDMOVIMIENTO);0)]; tMovtoOwner->Encontro; tMovtoOwner.Busca Siguiente[1]]
  tProductoAux.Busca[@Str(tMovtoOwner(CIDPRODUCTO);0)]
  Si tProductoAux->Encontro	  
	  fImprimeDocumento(atDocumento; tMovtoOwner; atAlmacen; tProductoAux; 2)		            			  
  FinSi          		
FinMientras 

FinFunc
// Fin método: fImprimeMovtoComponentes

// *********************************************************************************************
// Proceso:			fImprimeProducto
// Descripción:	Esta función imprime los datos del producto
//
// Parámetros 
//
// Salidas 
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Historia de modificaciones
//  Fecha      Nombre   IDLotus                     Descripcion
//  02/03/2004 LAP			2615				Mejora en la presentación	con salida a Excel.
// *********************************************************************************************
DefFunc fImprimeProducto(atProducto:Tabla; atAlmacen:Tabla; aImpresion)
Local lImprime, lCodigoEditado

	// Si ya está impreso salir
	Si gImpresoProducto
		Retorna
	FinSi

	// Salida a Excel o al Reporteador ?
	Si pExcel = 0
		Columnas 7;0.25,1.50,0.15,4.00,0.15,1.00,0.00
  	lImprime = ' '[C0..C4]
	  // Codigo / Estado
  	lCodigoEditado = fMascarilla(atProducto(cCodigoProducto); gMascarillaProducto)
		lImprime = 'Producto:'[C1]
		// Si el filtro de estado del producto está apagado, imprimir el estado del producto
		Si pEstadoProducto = 0
			Si atProducto(cStatusProducto) = 1
				lImprime = @Col(lCodigoEditado;0) & '   (Activo)'[C3]
			Sino
				lImprime = @Col(lCodigoEditado;0) & '   (Inactivo)'[C3]
			FinSi
		Sino
	  	lImprime = @Col(lCodigoEditado;0)[C3]
		FinSi
		// Fin estado del producto
	  Lista lImprime

		Columnas 5;0.25,1.50,0.15,10.00,0.00
		// Nombre
	  lImprime = 'Nombre:'[C1]
  	lImprime = atProducto(cNombreProducto)[C3]
	  Lista lImprime

		// Activa la bandera para indicar que ya se imprimio el producto
		gImpresoProducto = 1

		Saltalin

		// Restaura las columnas originales	
		Si pTipoReporte = 1 y pMostrarConsignaciones = 1
			Columnas 19;0.70,1.50,0.15,1.70,0.15,0.75,0.15,1.80,0.15,3.00,0.15,1.80,0.15,1.80,0.15,1.80,0.15,4.00,0.30 //N.C.224
		Sino
			Columnas 19;0.70,1.50,0.15,0.00,0.15,0.75,0.15,1.80,0.15,3.00,0.15,1.80,0.15,1.80,0.15,1.80,0.15,4.00,0.30 //N.C.224
		FinSi
	Sino
		Si gProductoConMovimientos = 0 y aImpresion
			// Avanza de renglon
		  RenActual = RenActual + 1[C0]

			// N.D.2615 Inicio
			// En el caso de salida a Excel el almacén se imprimirá en el mismo renglón que el producto
			// Impresión del almacén
		  ws.Range('A' & RenActual & ':D' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
 			ws.Range('A' & RenActual & ':D' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0]
	  	ws.Range('A' & RenActual & ':B' & RenActual).Borders(xlIzquierda).LineStyle= xlLineaSimple[C0]
	 		ws.Range('D' & RenActual & ':D' & RenActual).Borders(xlDerecha).LineStyle  = xlLineaSimple[C0]

			// Codigo almacen
  		ws.Range('A' & RenActual).Value = @Chr(39) & fMascarilla(atAlmacen(cCodigoAlmacen); gMascarillaAlmacen)[C0]
			// Nombre almacen
	  	ws.Range('B' & RenActual).Value = atAlmacen(cNombreAlmacen)[C0]

			// Impresión del producto
		  ws.Range('C' & RenActual & ':H' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
 			ws.Range('C' & RenActual & ':H' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0]
	  	ws.Range('C' & RenActual & ':D' & RenActual).Borders(xlIzquierda).LineStyle= xlLineaSimple[C0]
	 		ws.Range('H' & RenActual & ':H' & RenActual).Borders(xlDerecha).LineStyle  = xlLineaSimple[C0]

			// Codigo producto
  		ws.Range('C' & RenActual).Value = @Chr(39) & fMascarilla(atProducto(cCodigoProducto); gMascarillaProducto)[C0]
			// Nombre producto
	  	ws.Range('D' & RenActual).Value = atProducto(cNombreProducto)[C0]
			// N.D.2615 Fin

			// Activa la bandera para indicar que ya se imprimio el producto
			gImpresoProducto = 1
		FinSi
	FinSi
	// Fin Tipo de Salida

FinFunc
// Fin método: fImprimeProducto


// *********************************************************************************************
// Proceso:			fImprimeAlmacen
// Descripción:	Esta función imprime los datos del almacén
//
// Parámetros 
//
// Salidas 
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Historia de modificaciones
//  Fecha      Nombre   IDLotus                     Descripcion
//  02/03/2004 LAP			2615				Mejora en la presentación	con salida a Excel.
// *********************************************************************************************
DefFunc fImprimeAlmacen(atAlmacen:Tabla; aImpresion)
Local lImprime, lCodigoEditado

	// Si ya está impreso salir
	Si gImpresoAlmacen
		Retorna
	FinSi

	// Salida a Excel o al Reporteador ?
	Si pExcel = 0
		Columnas 4;1.50,0.15,6.00
  	lImprime = ' '[C0..C3]
	  // Codigo
  	lCodigoEditado = fMascarilla(atAlmacen(cCodigoAlmacen); gMascarillaAlmacen)
		lImprime = 'Almacén:'[C0]
  	lImprime = @Col(lCodigoEditado;0)[C2]
	  Lista lImprime
		// Nombre
	  lImprime = 'Nombre:'[C0]
  	lImprime = atAlmacen(cNombreAlmacen)[C2]
	  Lista lImprime

		// Activa la bandera para indicar que ya se imprimio
		gImpresoAlmacen = 1

		Saltalin

		Si pTipoReporte = 1 y pMostrarConsignaciones = 1
			Columnas 19;0.70,1.50,0.15,1.70,0.15,0.75,0.15,1.80,0.15,3.00,0.15,1.80,0.15,1.80,0.15,1.80,0.15,4.00,0.30 //N.C.224
		Sino
			Columnas 19;0.70,1.50,0.15,0.00,0.15,0.75,0.15,1.80,0.15,3.00,0.15,1.80,0.15,1.80,0.15,1.80,0.15,4.00,0.30 //N.C.224
		FinSi
	Sino
	  // N.D.2615 Inicio
		// La impresión del almacén cuando sea salida a Excel se realizará en el mismo renglón que
		// el de la impresión del producto. Por tanto se pasa este código a fImprimeProducto
		//Si gAlmacenConMovimientos = 0 y aImpresion
		//	// Avanza de renglon
		//  RenActual = RenActual + 1[C0]
		//	// N.D.2615
		//  ws.Range('A' & RenActual & ':D' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
 		//	ws.Range('A' & RenActual & ':D' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0]
	  //	ws.Range('A' & RenActual & ':B' & RenActual).Borders(xlIzquierda).LineStyle= xlLineaSimple[C0]
	 	//	ws.Range('D' & RenActual & ':D' & RenActual).Borders(xlDerecha).LineStyle  = xlLineaSimple[C0]
		//
		//	// Codigo almacen
  	//	ws.Range('A' & RenActual).Value = @Chr(39) & fMascarilla(atAlmacen(cCodigoAlmacen); gMascarillaAlmacen)[C0]
		//	// Nombre almacen
	  //	ws.Range('B' & RenActual).Value = atAlmacen(cNombreAlmacen)[C0]
		//
		//	// Activa la bandera para indicar que ya se imprimio
		//	gImpresoAlmacen = 1
		//FinSi
	  // N.D.2615 Fin
	FinSi
	// Fin Tipo de Salida

FinFunc
// Fin método: fImprimeAlmacen


// *********************************************************************************************
// Proceso:			fImprimeTotalProducto
// Descripción:	Esta función imprime los totales del producto
//
// Parámetros 
//
// Salidas 
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Historia de modificaciones
//  Fecha      Nombre   IDLotus                     Descripcion
// *********************************************************************************************
DefFunc fImprimeTotalProducto ()
Local lImprime

	// Salida a Excel o al Reporteador ?
	Si pExcel = 0
		Texto C9;'_______________________________________________________'
		Texto C11;'_______________________________________________________'
		//Texto C13;'_______________________________________________________'
		Texto C15;'_______________________________________________________'
		Imprime

		lImprime = ' '[C0..C17]
  	lImprime = 'Total Producto'[C9]
		// Total Unidades
 		lImprime = gTotalProducto[C11]
		// Total Neto
		lImprime = gTotalProducto[C15]	

		Lista lImprime
		Saltalin 1
	Sino
		Si gImpresoProducto = 0
			Si gImpresoAlmacen = 0 
				fImprimeAlmacen(tAlmacen; 1)
			FinSi
			fImprimeProducto(tProducto; tAlmacen; 1)
		FinSi

		// Avanza de renglon
	  RenActual = RenActual + 1[C0]

	  ws.Range('C' & RenActual & ':I' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
 		ws.Range('C' & RenActual & ':I' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0]
	  ws.Range('C' & RenActual).Borders(xlIzquierda).LineStyle= xlLineaSimple[C0]
 		ws.Range('I' & RenActual).Borders(xlDerecha).LineStyle  = xlLineaSimple[C0]
	  ws.Range('J' & RenActual & ':O' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
 		ws.Range('J' & RenActual & ':O' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0]
	  ws.Range('J' & RenActual & ':O' & RenActual).Borders(xlIzquierda).LineStyle= xlLineaSimple[C0]
 		ws.Range('J' & RenActual & ':O' & RenActual).Borders(xlDerecha).LineStyle  = xlLineaSimple[C0]
	  ws.Range('H' & RenActual).Font.FontStyle = 'Negrita'[C0]
   	ws.Range('H' & RenActual ).Value = 'Total Producto'[C0]
		
		// Totales
		ws.Range('J' & RenActual).Value = gTotalProducto[C9]		// Unidades
		ws.Range('L' & RenActual).Value = gTotalProducto[C11]		// Neto
		ws.Range('M' & RenActual).Value = gTotalProducto[C12]		// Impuesto 1
		ws.Range('N' & RenActual).Value = gTotalProducto[C13]		// Impuesto 2
		ws.Range('O' & RenActual).Value = gTotalProducto[C14]		// Neto

		// Avanza de renglon
	  RenActual = RenActual + 1[C0]
	FinSi
	// Fin Tipo de Salida
FinFunc
// Fin método: fImprimeTotalProducto


// *********************************************************************************************
// Proceso:			fImprimeTotalAlmacen
// Descripción:	Esta función imprime los totales del almacén
//
// Parámetros 
//
// Salidas 
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Historia de modificaciones
//  Fecha      Nombre   IDLotus                     Descripcion
//  02/03/2004 LAP			2615				Mejora en la presentación	con salida a Excel.
// *********************************************************************************************
DefFunc fImprimeTotalAlmacen (atAlmacen:TABLA)
Local lImprime

	// Salida a Excel o al Reporteador ?
	Si pExcel = 0
		//Texto C1;'_______________________________________________________'
		//Texto C2;'_______________________________________________________'
		//Texto C3;'_______________________________________________________'
		//Texto C4;'_______________________________________________________'
		//Texto C5;'_______________________________________________________'
		//Texto C6;'_______________________________________________________'
		//Texto C7;'_______________________________________________________'
		//Texto C8;'_______________________________________________________'
		Texto C9;'_______________________________________________________'
		//Texto C10;'_______________________________________________________'
		Texto C11;'_______________________________________________________'
		//Texto C12;'_______________________________________________________'
		//Texto C13;'_______________________________________________________'
		//Texto C14;'_______________________________________________________'
		Texto C15;'_______________________________________________________'
		Imprime

		lImprime = ' '[C0..C17]
  	lImprime = 'Total Almacén'[C9]
		// Total Unidades
 		lImprime = gTotalAlmacen[C11]
		// Total Neto
		lImprime = gTotalAlmacen[C15]	

		Lista lImprime
		Saltalin 2
	Sino
		Si gImpresoAlmacen = 0
			fImprimeAlmacen(tAlmacen; 1)
		FinSi

		// Avanza de renglon
	  RenActual = RenActual + 1[C0]

		// N.D.2615
	  ws.Range('B' & RenActual & ':I' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
 		ws.Range('B' & RenActual & ':I' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0]
	  ws.Range('B' & RenActual).Borders(xlIzquierda).LineStyle= xlLineaSimple[C0]
 		ws.Range('I' & RenActual).Borders(xlDerecha).LineStyle  = xlLineaSimple[C0]
	  ws.Range('J' & RenActual & ':O' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
 		ws.Range('J' & RenActual & ':O' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0]
	  ws.Range('J' & RenActual & ':O' & RenActual).Borders(xlIzquierda).LineStyle= xlLineaSimple[C0]
 		ws.Range('J' & RenActual & ':O' & RenActual).Borders(xlDerecha).LineStyle  = xlLineaSimple[C0]
	  ws.Range('H' & RenActual).Font.FontStyle = 'Negrita'[C0]
   	ws.Range('H' & RenActual ).Value = 'Total Almacén ' & atAlmacen(cCodigoAlmacen)[C0]
		
		// Totales
		ws.Range('J' & RenActual).Value = gTotalAlmacen[C9]		// Unidades
		ws.Range('L' & RenActual).Value = gTotalAlmacen[C11]	// Neto
		ws.Range('M' & RenActual).Value = gTotalAlmacen[C12]	// Impuesto 1
		ws.Range('N' & RenActual).Value = gTotalAlmacen[C13]	// Impuesto 2
		ws.Range('O' & RenActual).Value = gTotalAlmacen[C14]	// Neto

		// Avanza de renglon
	  RenActual = RenActual + 1[C0]
	FinSi
	// Fin tipo de salida

FinFunc
// Fin método: fImprimeTotalAlmacen


// *********************************************************************************************
// Proceso:			fImprimeTotalReporte
// Descripción:	Esta función imprime los totales generales
//
// Parámetros 
//
// Salidas 
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Historia de modificaciones
//  Fecha      Nombre   IDLotus                     Descripcion
//  02/03/2004 LAP			2615				Mejora en la presentación	con salida a Excel.
// *********************************************************************************************
DefFunc fImprimeTotalReporte ()
Local lImprime

	// Salida a Excel o al Reporteador ?
	Si pExcel = 0
		//Texto C1;'_______________________________________________________'
		//Texto C2;'_______________________________________________________'
		//Texto C3;'_______________________________________________________'
		//Texto C4;'_______________________________________________________'
		//Texto C5;'_______________________________________________________'
		//Texto C6;'_______________________________________________________'
		//Texto C7;'_______________________________________________________'
		//Texto C8;'_______________________________________________________'
		Texto C9;'_______________________________________________________'
		//Texto C10;'_______________________________________________________'
		Texto C11;'_______________________________________________________'
		//Texto C12;'_______________________________________________________'
		//Texto C13;'_______________________________________________________'
		//Texto C14;'_______________________________________________________'
		Texto C15;'_______________________________________________________'
		Imprime

		lImprime = ' '[C0..C17]
	  lImprime = 'Total Reporte'[C9]
		// Total Unidades
	 	lImprime = gTotalReporte[C11]
		// Total Neto
		lImprime = gTotalReporte[C15]	

		Lista lImprime
		Saltalin 2
	Sino
		// Avanza de renglon
	  RenActual = RenActual + 2[C0]

		// N.D.2615
	  ws.Range('A' & RenActual & ':I' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
 		ws.Range('A' & RenActual & ':I' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0]
	  ws.Range('A' & RenActual).Borders(xlIzquierda).LineStyle= xlLineaSimple[C0]
 		ws.Range('I' & RenActual).Borders(xlDerecha).LineStyle  = xlLineaSimple[C0]
	  ws.Range('J' & RenActual & ':O' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
 		ws.Range('J' & RenActual & ':O' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0]
	  ws.Range('J' & RenActual & ':O' & RenActual).Borders(xlIzquierda).LineStyle= xlLineaSimple[C0]
 		ws.Range('J' & RenActual & ':O' & RenActual).Borders(xlDerecha).LineStyle  = xlLineaSimple[C0]
  	ws.Range('H' & RenActual).Font.Size = 12[C0]
	  ws.Range('H' & RenActual).Font.FontStyle = 'Negrita'[C0]
   	ws.Range('H' & RenActual ).Value = 'Total General'[C0]
		
		// Totales
		ws.Range('J' & RenActual).Value = gTotalReporte[C9]		// Unidades
		ws.Range('L' & RenActual).Value = gTotalReporte[C11]	// Neto
		ws.Range('M' & RenActual).Value = gTotalReporte[C12]	// Impuesto 1
		ws.Range('N' & RenActual).Value = gTotalReporte[C13]	// Impuesto 2
		ws.Range('O' & RenActual).Value = gTotalReporte[C14]	// Total

		// Avanza de renglon
	  RenActual = RenActual + 1[C0]
	FinSi
	// Fin tipo de salida

FinFunc
// Fin método: fImprimeTotalReporte


// *********************************************************************************************
// E N C A B E Z A D O
// *********************************************************************************************
// ==========================================================================================
// fImprimeClasesExcel
// Descripcion : 	Imprime los nombres de las clases justificados al centro
// Entrada :			aNumClases	: El número total de clases seleccionadas,contando todas las 
//																clasificaciones 	
//								aNumPorClase: Lista que tiene como elementos el numero de clases seleccionadas 
//																para cada clasificación
// Salidas: 
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Historia de modificaciones
//  Fecha      Nombre   IDLotus                     Descripcion
// ==========================================================================================
Deffunc fImprimeClasesExcel(aListaNombreClases; aNumPorClase)
Local	lLeyenda, lNumeroClase, lNumElmentos, lContador, lDesplazamiento

	lDesplazamiento = 0
  lNumeroClase = 0
  lLeyenda = ''

  // Se barren las seis listas de ID´s
  Mientras lNumeroClase < 6
    // solo se imprimen los que si tuvieron al menos un ID 
    Si @Escoge(aNumPorClase; lNumeroClase) != ''
      // Obtengo el número de elementos para la clase
      lNumElmentos = @Val(@Escoge(aNumPorClase; lNumeroClase))
      lContador = 0
      // Barre todos los elementos de esta clase
      Mientras lContador < lNumElmentos
        lLeyenda = lLeyenda &','& @Escoge(aListaNombreClases; lDesplazamiento+lContador)
        lContador = lContador +1
      FinMientras 

      lDesplazamiento = lDesplazamiento + lNumElmentos
    
      // Se imprime la clase y sus valores seleccionados
		  // Avanza de renglon
		  RenActual = RenActual + 1[C0]
		  ws.Range('A' & RenActual).Font.Size = 12[C0]
		  ws.Range('A' & RenActual).Font.FontStyle = 'Negrita'[C0]    
  		ws.Range('A' & RenActual & ':Q' & RenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0]
		  ws.Range('A' & RenActual ).Value = 'CLASIFICACIÓN No.' & @Str(lNumeroClase+1; 0) & ' : ' & @SubStr(lLeyenda; 1; @Len(lLeyenda)-1)
      lLeyenda = ''
    Finsi
    lNumeroClase = lNumeroClase + 1
  FinMientras
FinFunc

Encab

	Si pExcel = 0
		Texto '@TC{255,0,0}@S{8}AdminPAQ'
		Hoja '"@TC{0,0,0}@S{8}Hoja: '
		Imprime
    Texto '@TC{0,0,0}@S{8}Moneda: ' & gNombreMonedaReporte
	  Texto '"@TC{0,0,0}@S{8}Fecha: ' & fFormateaFecha(@Hoy();gIdioma)
  	Imprime
		Texto '^@TC{0,0,0}@S{22}' & tEmpresa->Nombre
		Imprime
	  Si pTipoReporte = 1
  		Texto '^@TC{0,0,0}@S{16}DIARIO DE COMPRAS POR ALMACEN'
  	Sino
  		Texto '^@TC{0,0,0}@S{16}DIARIO DE VENTAS POR ALMACEN'
  	Finsi  
		Imprime
		Texto '^@TC{0,0,0}@S{16}Del: ' & fFormateaFecha(pFechaInicial; gIdioma) & ' Al: ' & fFormateaFecha(pFechaFinal; gIdioma)
		Imprime
		// Estado del producto
		Si pEstadoProducto != 0
			Si pEstadoProducto = 1
				// Activos
	  		Texto '^@TC{0,0,0}@S{12}Productos Activos'
			Sino
				// Inactivos
	  		Texto '^@TC{0,0,0}@S{12}Productos Inactivos'
			FinSi
			Imprime
		FinSi
	  // Se Revisan las clasificaciones, para recuperarlas e imprimirlas en el encabezado
  	fRevisaClases(tValoresDeClasif)
	  Saltalin
		NEGRITAS TRUE
		Texto '@TC{0,0,0}@L{-1}'
	  Imprime
		Texto C1;'Fecha'
		Texto C3;'Doc. Modelo'
		Texto C5;'Serie'
		Texto C7;'Folio'
		Texto C9;'Concepto'
		Texto C11;'Unidades'
		Texto C13;'Costo unitario'
		Texto C15;'Neto'
	  Si pTipoReporte = 1
			Texto C17;'Proveedor'
		Sino
			Texto C17;'Cliente'
		FinSi
		Imprime
		Texto '@TC{0,0,0}@L{-1}'
		Imprime 1
		NEGRITAS FALSE
		Color @RGB(0;0;0)
		Altura 9
	Sino
		// Pone el nombre del sistema
  	ws.Range('A' & RenActual).Font.Color = @RGB(255;0;0)[C0]
	  ws.Range('A' & RenActual).Font.Size = 10[C0]
  	ws.Range('A' & RenActual).Value = 'AdminPAQ'[C0]

	  // Pone el nombre de la empresa
  	ws.Range('B' & RenActual).Font.Size = 14[C0]
	  ws.Range('B' & RenActual).Font.FontStyle = 'Negrita'[C0]
  	// Lo centra en las columnas
	  ws.Range('B' & RenActual & ':P' & RenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0]
	  ws.Range('B' & RenActual ).Value = tEmpresa->Nombre

	  // Avanza de renglon
  	RenActual = RenActual + 1[C0]

	  // Pone el titulo del reporte en EXCEL
  	ws.Range('A' & RenActual).Font.Size = 12[C0]
	  ws.Range('A' & RenActual).Font.FontStyle = 'Negrita'[C0]
  	Si pTipoReporte = 1
    	ws.Range('A' & RenActual ).Value = 'D I A R I O     D E     C O M P R A S     D E T A L L A D O     P O R     A L M A C E N'[C0]
	  SiNo
  	  ws.Range('A' & RenActual ).Value = 'D I A R I O     D E     V E N T A S     D E T A L L A D O     P O R     A L M A C E N'[C0]
	  FinSi
  	// Lo centra en las columnas
	  ws.Range('A' & RenActual & ':Q' & RenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0]

  	// Avanza de renglon
	  RenActual = RenActual + 1[C0]

	  // Pone el rango de fechas en EXCEL
  	ws.Range('A' & RenActual).Font.Size = 12[C0]
	  ws.Range('A' & RenActual).Font.FontStyle = 'Negrita'[C0]    
  	ws.Range('A' & RenActual ).Value = 'Del:  ' & fFormateaFecha(pFechaInicial;gIdioma) & '     Al:  ' & fFormateaFecha(pFechaFinal;gIdioma)[C0]
	  ws.Range('A' & RenActual & ':Q' & RenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0]

		// Estado del producto
		Si pEstadoProducto != 0
	  	// Avanza de renglon
		  RenActual = RenActual + 1[C0]

	  	ws.Range('A' & RenActual).Font.Size = 12[C0]
		  ws.Range('A' & RenActual).Font.FontStyle = 'Negrita'[C0]    
		  ws.Range('A' & RenActual & ':Q' & RenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0]
			Si pEstadoProducto = 1
				// Activos
		  	ws.Range('A' & RenActual ).Value = 'Productos Activos'[C0]
			Sino
				// Inactivos
		  	ws.Range('A' & RenActual ).Value = 'Productos Inactivos'[C0]
			FinSi
		FinSi

		// ===== Se Revisan las clasificaciones, para recuperarlas e imprimirlas en el encabezado
  	// ===== se arman los ID en una LIsta para poder recorrerlos en una iteración
	  gClasesRecibidas = fCuentaClases(&gNumClasesPorTipo; pIdClase1; pIdClase2; pIdClase3; pIdClase4; pIdClase5; pIdClase6)
  	// se cargan las clasificaciones validas y se obtiene el número de clases validas
	  gNumDeClases = fCargaClases(tValoresDeClasif; &gListNombreDeClases; &gListIdDeClases; gClasesRecibidas)
  	Si gNumDeClases > 0    // solo si hubo al menos una clase seleccionada
    	fImprimeClasesExcel(gListNombreDeClases; gNumClasesPorTipo ) 
	  Finsi

  	// Avanza de renglon
	  RenActual = RenActual + 1[C0]

		// Moneda del reporte
	  ws.Range('P' & RenActual).Font.Size = 12[C0]
  	ws.Range('P' & RenActual ).Value = 'Moneda: ' & gNombreMonedaReporte[C0]

  	// Avanza de renglon
	  RenActual = RenActual + 1[C0]

		// Titulos columnas
    //N.D.5724
    ws.Range('A' & RenActual & ':R' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
    ws.Range('A' & RenActual & ':R' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0]
    ws.Range('A' & RenActual & ':R' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0]
    ws.Range('A' & RenActual & ':R' & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0]
    ws.Range('A' & RenActual & ':R' & RenActual).Interior.ColorIndex = 55[C0]    
    ws.Range('A' & RenActual & ':R' & RenActual).Font.FontStyle = 'Negrita'[C0]    
    ws.Range('A' & RenActual & ':R' & RenActual).Font.Color = @RGB(255;255;255)[C0]
    ws.Range('A' & RenActual & ':R' & RenActual).HorizontalAlignment = xlCentro[C0]
    ws.Range('A' & RenActual & ':R' & RenActual).WrapText = 1[C0]
    ws.Range('A' & RenActual & ':L' & RenActual).Value = 'Codigo Almacén','Nombre (Almacén)','Codigo Producto','Nombre (Producto)','Fecha','Documento Modelo','Serie','Folio','Concepto','Unidades','Costo unitario','Neto'
    ws.Range('M' & RenActual & ':R' & RenActual).Value = tParametros(cNombreImpuesto1), tParametros(cNombreImpuesto2), 'Total','Codigo Proveedor', 'Nombre (Proveedor)', 'Error'

		RenFijo = RenActual+1
	  Excel.Rows(RenFijo & ':' & RenFijo).Select
  	Excel.ActiveWindow.FreezePanes = True
	  ws.Range('A' & RenActual).Select
	FinSi
FinEncab


// *********************************************************************************************
// Cuerpo del reporte
// *********************************************************************************************
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Historia de modificaciones
//  Fecha      Nombre   IDLotus     Descripcion
//  30/10/2002 LAP      1456        Modificación de las busquedas de los movimientos
//                                  a fin de considerar que las compras que vienen
//                                  de consignaciones no están afectadas en inventarios
//                                  - Cuerpo del reporte
//  02/03/2004 LAP			2615				Optimización de velocidad y mejora en la presentación
//																	con salida a Excel.
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

	// Inicializa valores globales para la biblioteca LibAdminPAQ.rpt
	fIniFechasHistoria(tEjercicio)

	// Configura los decimales del reporte y las mascarillas
	fConfiguraDecimalesyMascaras()

	// Verifica el rango de productos del reporte
	fVerificaParametros()

	// A partir de la fecha de inicio del reporte, obtiene el ejercicio y periodo correspondiente
	// esto es util para el cálculo del inventario inicial del reporte
	fEjercicioPeriodo(pFechaInicial; &gPeriodo; &gIdEjercicio; tEjercicio) 

	gTotalGeneral	= 0.0

	Mientras[tAlmacen.Busca[pAlmacenInicial & '..' & pAlmacenFinal]; tAlmacen->Encontro; tAlmacen.Busca Siguiente[1]]
		
		// Descarta el Almacén 0
		Si tAlmacen(cIdAlmacen) = 0
			Continua
		FinSi

		// Impresión de los datos del almacen
		gImpresoAlmacen = 0						// Bandera para indicar que ya se imprimio el almacén
		gTotalAlmacen		= 0.0					// Acumulados por almacén
		gAlmacenConMovimientos = 0		// Bandera para indicar que el almacén tiene movimientos
		fImprimeAlmacen(tAlmacen; 0)	// Imprime el almacén solo si tiene movimientos

		// Recorre todos los productos
		Mientras[tProducto.Busca[pProductoInicial & '..' & pProductoFinal]; tProducto->Encontro; tProducto.Busca Siguiente[1]]

			// No incluye el producto 0
			Si tProducto(cIdProducto) = 0
				Continua
			FinSi

		  // Verifica si el producto es candidato a imprimirse en función de su estado
		  // tProducto(cStatusProducto) [ 0 (Inactivo) / 1 (Activo) ]
			// pEstadoProducto						[ 0 Todos / 1 Activos / 2 Inactivos ]
		  Si pEstadoProducto y pEstadoProducto != @Abs(tProducto(cStatusProducto) - 2)
    		Continua
		  FinSi

		  // Verifica si el producto cumple con las clasificaciones especificadas 
		  Si gNumDeClases > 0
    		Si !fMiembroDeUnaClase(tProducto; gNumDeClases; gListIdDeClases; 2)
		      // Discrimina el producto por no pertenecer a alguna de las clasificaciones
    		  Continua
		    FinSi
		  FinSi

			// Inicialización de los totales del producto, de la bandera de impreso y de la de
			//	movimientos
			gImpresoProducto	= 0				// Bandera para indicar que ya se imprimio el almacén
			gTotalProducto 		= 0.0			// Acumulados por producto
			gProductoConMovimientos = 0	// Bandera para indicar que el producto tiene movimientos
			// N.D.2615
			Si pImprimirProductos = 0		
				// Si se desean imprimir todos los productos, imprime el producto
				fImprimeAlmacen(tAlmacen; 1)	
				fImprimeProducto(tProducto; tAlmacen; 1)
			FinSi

			lFecha = pFechaInicial

			// N.D.2615 Inicio
			// Localización del primer movimiento del producto para el almacén actual
      tMovimiento.Busca[tProducto(cIdProducto) & ':' & tAlmacen(cIdAlmacen)]
			// Omisión de los movimientos con fecha anterior a la fecha de inicio del reporte
      Mientras tMovimiento->Encontro y tMovimiento(cFecha) < pFechaInicial
			  tMovimiento.Busca siguiente[2]
			FinMientras

			// Procesamiento de los movimientos con fecha anterior a la fecha de fin del reporte
			Mientras tMovimiento->Encontro y tMovimiento(cFecha) <= pFechaFinal
        // Validación del Documento Modelo
        lAceptarDocumento = 0
				lIndice = 0
        Mientras lIndice < gNumIdDoctos
        	Si tMovimiento(cIdDocumentoDe) = @Escoge(gListIdDoctosDe; lIndice)
            lAceptarDocumento = 1
          FinSi
          lIndice = lIndice + 1
				FinMientras

        Si lAceptarDocumento = 1
          // Checar si la compra no viene de una consignacion  
          gConsignacion = 0
          Si pMostrarConsignaciones = 1 y tMovimiento(cIdMovtoOrigen)
            tMovtoDatos.Busca[@Str(tMovimiento(cIdMovtoOrigen);0)]
            Si tMovtoDatos(cIdDocumentoDe) = 18 
							// Consignacion de proveedor
              Si tMovtoDatos(cIdAlmacen) != tAlmacen(cIdAlmacen)
        			  tMovimiento.Busca siguiente[2]
                Continua
              FinSi
              gConsignacion = 1
            FinSi
          FinSi
          Si gConsignacion = 0					
            tMovtoDatos.Busca[@Str(tMovimiento(cIdMovimiento);0)]
          FinSi

          // Obtención del Documento al que pertenece el movimiento
          tDocumento.Busca[@Str(tMovtoDatos(cIdDocumento);0)]
          Si !tDocumento->Encontro
    			  tMovimiento.Busca siguiente[2]
            Continua
          FinSi
          
          //Inicio N.C.224
          Si tMovimiento(cAfectadoInventario)	= 2
           gTieneMovtosEnCaptura = 1
          Sino
            gTieneMovtosEnCaptura = 0
          FinSi
          //Fin N.C.224

          // Inicia N.D.2362 DRdA
          // Se salta los movtos de doctos cancelados (los omite)
          Si tDocumento(cCancelado) != 0
    			  tMovimiento.Busca siguiente[2]
            Continua
          FinSi
          // Fin N.D.2362 DRdA

          // Impresión del almacén
          fImprimeAlmacen(tAlmacen; 1)	
          // Impresión del producto
          fImprimeProducto(tProducto; tAlmacen; 1)
          // Impresión del documento
          gProductoConMovimientos = 1	// El producto tiene movimientos
          gAlmacenConMovimientos 	= 1	// El almacén tiene movimientos
          
          //N.D.3863 Verifica si el producto es normal o un paquete
          Si tProducto(CTIPOPRODUCTO) = 1
          	fImprimeDocumento(tDocumento; tMovtoDatos; tAlmacen; tProducto; 1)
          SiNo
          	fImprimeDocumento(tDocumento; tMovtoDatos; tAlmacen; tProducto; 0)
          	fImprimeMovtoComponentes(tDocumento; tMovtoDatos; tAlmacen; tProducto) 
          FinSi	
        FinSi

        // Siguiente movimiento
			  tMovimiento.Busca siguiente[2]
      FinMientras
			// Fin del recorrido de los productos
      // N.D.2615 Fin
			
  		// Impresión de los totales del producto
	 		Si pImprimirProductos = 0	// Imprimir todos los productos, con o sin movimientos				
  			fImprimeTotalProducto()
  		Sino											// Imprimir los productos solo si tienen movimientos
  			Si gProductoConMovimientos Y (gImpresoProducto o pExcel)
	 				fImprimeTotalProducto()
  			FinSi
	 		FinSi
    FinMientras 
  	// Fin Recorrido de Productos

		// Impresión de los totales por almacén
		Si pImprimirProductos = 0 // Todos los almacenes
			fImprimeTotalAlmacen(tAlmacen)
		Sino											// Solo almacenes con movimientos
			Si gAlmacenConMovimientos
				fImprimeTotalAlmacen(tAlmacen)
			FinSi
		FinSi
	FinMientras 
	// Fin Recorrido de Almacenes

	// Impresión de los totales del reporte
	fImprimetotalReporte()
	
	//Inicio N.C.224
	Si pExcel = 0
		Columnas 4;0.90,20,0.0
		Saltalin 2
		Lista '', ' (*) Este movimiento está actualmente en captura, por tal motivo solo está afectado en existencia y no en costo' [C1]
	Sino
		RenActual = RenActual + 4[C0]
		ws.Range('A' & RenActual).HorizontalAlignment = xlDerecha[C0]
		ws.Range('A' & RenActual).Value = '(*)'
		ws.Range('B' & RenActual).Value = 'Este movimiento está actualmente en captura, por tal motivo solo está afectado en existencia y no en costo'[C0]
	FinSi
	//Fin N.C.224
	