// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//
// Impresion de Comprobantes Fiscales Digitales.rpt
//
//  Sistema: AdminPAQ v1.1
// 
// Elaboró:  Leonardo Aguilar Pizano
// Fecha:    30 de Diciembre de 2005
//
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Historia de modificaciones
//  Fecha      Nombre   IDLotus                     Descripcion
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// 30/Mayo/2006		N.D.4084 F@C - El Informe Mensual al SAT toma los importes del documento en
//			su moneda en vez de presentarlos en pesos. Habrá que revisar la situación con
//			el reporte Comprobantes Fiscales Digitales. (ELVS)
// 08/Junio/2006	N.D.4090 AdminPAQ VS AMECE - Si un documento se cancela en el mismo 
//			periodo en el que fue creado deben mostrarse el Documento Activo y el 
//			documento Cancelado  en el reporte Mensual, pero si el documento fue 
//			cancelado en un Periodo diferente debe reportarse solo el Cancelado. (ELVS)
// 08/Junio/2006	N.D.4097 AdminPAQ VS AMECE - Si una Empresa maneja CFD y documentos en 
//			papel (tradicionales) debe existir al menos un reporte que detalle los 
//			dos tipos de Documentos. (ELVS)
// 08/Junio/2006	N.D.4099 AdminPAQ VS AMECE - Si una Empresa maneja CFD y documentos en papel
//			(tradicionales) en el reporte que muestra ambos tipos de documentos Informe 
//			Mensual el SAT y comprobantes fiscales digitales) se debe incluir el número 
//			de aprobación y ejercicio de aprobación de los documentos tradicionales. (ELVS)
// 13/Junio/2006	N.D. 4108 AdminPAQ VS AMECE - El Informe Mensual en su modalidad de Informativo 
//			o Excel debe informar los documentos CFD´s que no han sido emitidos y poner en 
//			el estado la leyenda "Pendiente de emitir". La leyenda se cambio de "pendiente 
//			por emitir" por "no emitido" (ELVS)
// 14/Julio/2006	N.D.4196 F@C - Informe Mensual al SAT- AdminPAQ VS AMECE - Cuando un documento se 
//			cancela se debe poner la fecha de emisión y no la de cancelación, este estatus
//			solo es indicado en el reporte como un 0. (ELVS)
// 24/Feb/2009     ND5673 ERROR NO IMPRIME EL RFC DEL CLIENTE AL EJECUTAR EL REPORTE COMPROBANTES FISCALES
//      DIGITALES PARA NOTAS DE CREDITO Y FORMATO EXCEL. (IYPZ)
//
// 11/Mayo/2009  N.D. 5797 ERROR AL EJECUTAR EL REPORTE DE COMPROBANTES FISCALES DIGITALES INCLUYENDO DOS EJERCICIOS EN EL FILTRO EL SISTEMA SOLO ARROJA INFORMACION DEL EJERCICIO VIGENTE (2008) 
//               EL REPORTE POR CONCEPTO Y POR CLIENTE NO FUNCIONAN, YA QUE EN EL REPORTE DE CLIENTE SE ESTABA UTILIZANDO UN INDICE 
//               INCORRECTO, Y EN AMBAS OPCIONES AL UTILIZAR BUSQUEDAS PARCIALES NO SE VALIDO VOLVER A INICIALIZAR LA BUSQUEDA (MGCJ)                
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<


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

// ************************************************************************************************************************************************************
// Tablas a utilizar e Indices de búsqueda
// ************************************************************************************************************************************************************
UsaEmpresa tEmpresa;'ADMINPAQW'                   

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

UsaTabla tClientes   = tEmpresa['MGW10002']       // Clientes
UsaTabla tConceptos  = tEmpresa['MGW10006']       // Conceptos
UsaTabla tDocumentos = tEmpresa['MGW10008'] Alias 'Docto1'       // Documentos

UsaTabla tDocto = tEmpresa['MGW10008'] Alias 'Docto2'       // Documentos
tDocto.UsaIndice['']

UsaTabla tMovimientos = tEmpresa['MGW10010']      // Documentos
tMovimientos.Usaindice['iDoctoNumeroMovto']       // cIdDocumento + cNumeroMovto

UsaTabla tProductos = tEmpresa['MGW10005']        // Productos
tProductos.Usaindice['']                          // cIdProducto

UsaTabla tUnidades = tEmpresa['MGW10026']         // Unidades
tUnidades.UsaIndice['']

UsaTabla tFoliosDigitales = tEmpresa['MGW10045'] Alias 'Folios1' // Folios Digitales
tFoliosDigitales.Usaindice['cIdDocto']            // cIdDocto

UsaTabla tFoliosCancelados = tEmpresa['MGW10045'] Alias 'Folios2' // Folios Digitales
tFoliosCancelados.Usaindice['cFechacanc']            // cIdDocto

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

// ************************************************************************************************************************************************************
// Parametros
// ************************************************************************************************************************************************************
Parametro pFechaInicial = '20050101'      // Fecha inicial del rango
Parametro pFechaFinal   = '20051231'      // Fecha final del rango
Parametro pTodasSeries = 0                // 0 - No
                                          // 1 - Si
Parametro pSerie        = ' '             // Serie del documento
Parametro pFolioInicial = 1               // Folio inicial del rango
Parametro pFolioFinal   = 999999999       // Folio final del rango
Parametro pEntregado    = 0               // 0 - Todos
                                          // 1 - Entregados
                                          // 2 - No entregados
Parametro pDocumentoDe  = 4               // Documentos a imprimir
                                          // Facturas                  4
                                          // Devolución sobre venta    5
                                          // Nota de Crédito           7
                                          // Nota de Cargo al Cliente 13
Parametro pDetallado    = 0               // 0 - No
                                          // 1 - Si
Parametro pOrdenamiento = 0               // 0 = Fecha                                         
                                          // 1 = Cliente  - Fecha - Serie - Folio 
                                          // 2 = Concepto - Fecha - Serie - Folio
//N.D. 4097 Se manejan 4 tipo de documentos diferentes para el reporte
Parametro pImprimeDoctos= 0   		  // 0 - Tradicionales
			    		  // 1 - CFD's
			    		  // 2 - AutoImpresos
			    		  // 3 - Todos
			    		  // 2 - Ambos
Parametro pFormato      = 0               // 0 - Pantalla
                                          // 1 - Excel

pSerie = @Mayusculas(pSerie)
// ************************************************************************************************************************************************************
// Definiciones y asumidos globales para el reporte
// ************************************************************************************************************************************************************
Columnas 1;1
Usaletra 'Arial'
Altura 9

//N.D. 4097 Se manejan 4 tipo de documentos diferentes para el reporte
constante kTradicionales	0
constante kCFDs			1
constante kAutoimpresos		2
constante kTodos		3

constante kPantalla             0
constante kExcel                1

constante kDecimales            2
constante kSeparador            '|'
constante kTamanoSerie          10


// ************************************************************************************************************************************************************
// Variables de ámbito global:
// ************************************************************************************************************************************************************
tParametros.Busca Primero

gIdioma = 0                       // Idioma del reporte
                                  // 0 = Español
                                  // 1 = Inglés

// ************************************************************************************************************************************************************
// Inicializa R E P O R T E
// ************************************************************************************************************************************************************
Si pFormato = kExcel
  // Definicion de constantes de EXCEL
  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
  
  // Accesa 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

  constante kColInicio    'A'
  constante kColFin       'N'
  
  kAprobacion   = 'H'
  kEstado       = 'I'
  kExpedicion   = 'J'
  kNeto         = 'K'
  kDescuentos   = 'L'
  kImpuestos    = 'M'
  kTotal        = 'N'
  Escoge pOrdenamiento 
    Caso 0               // 0 = Fecha
        kFecha     = 'A'
        kSerie     = 'B'
        kFolio     = 'C'
        kCliente   = 'D'
        kRazSocial = 'E'
        kRFC       = 'F'
        kConcepto  = 'G'
    FinCaso
    Caso 1               // 1 = Cliente - Fecha - Serie - Folio
        kCliente   = 'A'
        kRazSocial = 'B'
        kRFC       = 'C'
        kFecha     = 'D'
        kSerie     = 'E'
        kFolio     = 'F'
        kConcepto  = 'G'
    FinCaso
    Caso 2               // 2 = Concepto - Fecha - Serie - Folio
        kConcepto  = 'A'
        kFecha     = 'B'
        kSerie     = 'C'
        kFolio     = 'D'
        kCliente   = 'E'
        kRazSocial = 'F'
        kRFC       = 'G'
    FinCaso
  FinEscoge 

  // Pone la longitud de cada columna
  ws.Columns( @Asc(kFecha)    - 64 ).ColumnWidth = 12[C0]  // Fecha
  ws.Columns( @Asc(kSerie)    - 64 ).ColumnWidth = 12[C0]  // Serie
  ws.Columns( @Asc(kFolio)    - 64 ).ColumnWidth = 15[C0]  // Folio
  ws.Columns( @Asc(kCliente)  - 64 ).ColumnWidth = 25[C0]  // Cliente
  ws.Columns( @Asc(kRazSocial)- 64 ).ColumnWidth = 40[C0]  // Razon Social
  ws.Columns( @Asc(kRFC)      - 64 ).ColumnWidth = 20[C0]  // RFC
  ws.Columns( @Asc(kConcepto) - 64 ).ColumnWidth = 25[C0]  // Concepto

  ws.Columns( @Asc(kAprobacion) - 64 ).ColumnWidth = 15[C0]  // N.D. 4099 Se concatena el año al No Aprobación, según sea el caso
  ws.Columns( @Asc(kExpedicion) - 64 ).ColumnWidth = 25[C0]  // N.D. 4090 Fecha / Hora Expedicion o Cancelación
  ws.Columns( @Asc(kEstado)     - 64 ).ColumnWidth = 10[C0]  // Estado del comprobante
  ws.Columns( @Asc(kNeto)       - 64 ).ColumnWidth = 15[C0]  // Neto
  ws.Columns( @Asc(kDescuentos) - 64 ).ColumnWidth = 15[C0]  // Descuentos
  ws.Columns( @Asc(kImpuestos)  - 64 ).ColumnWidth = 15[C0]  // Impuestos
  ws.Columns( @Asc(kTotal)      - 64 ).ColumnWidth = 15[C0]  // Total
  
  constante kColDetInicio    'F'
  constante kColDetFin       'N'
  constante kColDetCodigo    'F'
  constante kColDetNombre    'G'
  constante kColDetUnidades  'H'
  constante kColDetUnidad    'I'
  constante kColDetPrecio    'J'
  constante kColDetNeto      'K'
  constante kColDetDescuento 'L'
  constante kColDetImpuesto  'M'
  constante kColDetTotal     'N'
  
  Si tParametros(cDecimalesUnidades) = 0
    gFormatoCantidades = '#,##0'
  Sino  
    gFormatoCantidades = '#,##0.' & @SubStr('0000000000'; 1; tParametros(cDecimalesUnidades))
  FinSi
FinSi

// ************************************************************************************************************************************************************
// F U N C I O N E S
// ************************************************************************************************************************************************************

// ************************************************************************************************************************************************************
// Nombre:    fRedondeaImporte
// Objetivo:  Redondea el importe recibido según los decimales indicados
// ************************************************************************************************************************************************************
DefFunc fRedondeaImporte(aImporte; aDecimales)
Local lImporte, lImporteCadena, lIndice

  lImporte = aImporte
  lIndice = 1
  Mientras lIndice <= aDecimales 
    lImporte = lImporte * 10
    lIndice = lIndice + 1
  FinMientras
  lImporteCadena = @Str(lImporte;0)

  lImporte = @Val(lImporteCadena)
  lIndice = 1
  Mientras lIndice <= aDecimales 
    lImporte = lImporte / 10
    lIndice = lIndice + 1
  FinMientras

  Retorna lImporte
FinFunc

// ************************************************************************************************************************************************************
// Nombre:    fFormateaColumnas
// Objetivo:  
// ************************************************************************************************************************************************************
DefFunc fFormateaColumnas(aEncabezado)
  Si aEncabezado = 0
    // Ancho de columnas = caracteres / 17 * 2.54
    Escoge pOrdenamiento 
      Caso 0               // 0 = Fecha
        //           C0       C2        C4        C6        C8        C10        C12       C14       C16       C18        C20
        //           Fecha    Serie     Folio     Cliente   RazSocial AprobAño   Emision   Estado    Neto      Impuestos Total
        //           10       10        10        20        25        14         19        6         13        10        13
        Columnas 21;1.80,0.15,1.60,0.15,3.00,0.15,3.00,0.15,3.80,0.15,2.50,0.15, 3.50,0.15,1.25,0.15,3.00,0.15,2.50,0.15,3.00,0
        [C0,C2,C6,C8,C12,C14].Blanco ''
        [C4,C10].Decimales 0
        [C4,C10,C16,C18,C20].Coma
        [C16,C18,C20].Decimales kDecimales
      FinCaso
      Caso 1               // 1 = Cliente - Fecha - Serie - Folio
        //
        //          Cliente RazSocial RFC 
        //          C0        C2        C4        C6         C8        C10       C12       C14       C16       
        //          Fecha     Serie     Folio     AprobAño   Emision   Estado    Neto      Impuestos Total
        //          10        10        10        14         19        6         13        10        13
        Columnas 17;1.80,0.15,1.60,0.15,3.00,0.15,2.50,0.15, 3.50,0.15,1.25,0.15,3.00,0.15,2.50,0.15,3.00,0
        [C0,C2,C6,C8,C10].Blanco ''
        [C4,C6].Decimales 0
        [C4,C6,C12,C14,C16].Coma
        [C12,C14,C16].Decimales kDecimales
      FinCaso
      Caso 2               // 2 = Concepto - Fecha - Serie - Folio
        //          Concepto 
        //          C0        C2        C4        C6        C8        C10        C12       C14       C16       C18       C20
        //          Fecha     Serie     Folio     Cliente   RazSocial AprobAño Emision   Estado    Neto      Impuestos Total
        //          10        10        10        20        30        14         19        6         13        10        13
        Columnas 21;1.80,0.15,1.60,0.15,3.00,0.15,3.00,0.15,3.80,0.15,2.50,0.15, 3.50,0.15,1.25,0.15,3.00,0.15,2.50,0.15,3.00,0
        [C0,C2,C6,C8,C10,C12,C14].Blanco ''
        [C4,C10].Decimales 0
        [C4,C10,C16,C18,C20].Coma
        [C16,C18,C20].Decimales kDecimales
      FinCaso
    FinEscoge 
  Sino
    //               C1        C3        C5        C7        C9        C11       C13       C15       C17
    //               Producto  Nombre    Unidades  Abrev     Precio    Neto      Descuento Impuesto  Total
    //               20        30        8         3         10        13        10        10        13    
    Escoge pOrdenamiento 
      Caso 0
        Columnas 18;10.10,3.00,0.15,4.50,0.15,1.40,0.15,0.50,0.20,1.50,0.15,2.00,0.15,1.60,0.15,1.60,0.15,2.65,0
      FinCaso 
      Caso 1
        Columnas 18;2.70,3.00,0.15,4.50,0.15,1.40,0.15,0.50,0.20,1.50,0.15,2.00,0.15,1.70,0.15,1.70,0.15,2.75,0
      FinCaso
      Caso 2
        Columnas 18;10.10,3.00,0.15,4.50,0.15,1.40,0.15,0.50,0.20,1.50,0.15,2.00,0.15,1.60,0.15,1.60,0.15,2.65,0
      FinCaso
    FinEscoge
    [C1,C3,C7].Blanco ''
    [C5,C9,C11,C13,C15,C17].Coma
    [C5].Decimales tParametros(cDecimalesUnidades)
    [C9,C11,C13,C15,C17].Decimales kDecimales
  FinSi
FinFunc

// ************************************************************************************************************************************************************
// Nombre:    fImprimeMovimiento
// Objetivo:  Imprime los movimientos del documento indicado
// ************************************************************************************************************************************************************
DefFunc fImprimeMovimiento(atMovimientos:TABLA; atProductos:TABLA; atUnidades:TABLA; aTipoCambio)
//N.D. 4084 Variables para la validación de la moneda del documento
Local lDescuentos, lNeto, lTipoCambio, lImpuestos, lTotal
  
  Escoge pFormato
    Caso kExcel
          ws.Range(kColDetInicio & RenActual & ':' & kColDetFin & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
          ws.Range(kColDetInicio & RenActual & ':' & kColDetFin & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0]
          ws.Range(kColDetInicio & RenActual & ':' & kColDetFin & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0]
          ws.Range(kColDetInicio & RenActual & ':' & kColDetFin & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0]
          ws.Range(kColDetCodigo    & RenActual).Borders(xlBordeDerecha).LineStyle = xlLineaSimple[C0]
          ws.Range(kColDetNombre    & RenActual).Borders(xlBordeDerecha).LineStyle = xlLineaSimple[C0]
          ws.Range(kColDetUnidades  & RenActual).Borders(xlBordeDerecha).LineStyle = xlLineaSimple[C0]
          ws.Range(kColDetUnidad    & RenActual).Borders(xlBordeDerecha).LineStyle = xlLineaSimple[C0]
          ws.Range(kColDetPrecio    & RenActual).Borders(xlBordeDerecha).LineStyle = xlLineaSimple[C0]
          ws.Range(kColDetNeto      & RenActual).Borders(xlBordeDerecha).LineStyle = xlLineaSimple[C0]
          ws.Range(kColDetDescuento & RenActual).Borders(xlBordeDerecha).LineStyle = xlLineaSimple[C0]
          ws.Range(kColDetImpuesto  & RenActual).Borders(xlBordeDerecha).LineStyle = xlLineaSimple[C0]
          ws.Range(kColDetTotal     & RenActual).Borders(xlBordeDerecha).LineStyle = xlLineaSimple[C0]
          
          ws.Range(kColDetCodigo    & RenActual).NumberFormat = '@'[C0]
          ws.Range(kColDetNombre    & RenActual).NumberFormat = '@'[C0]
          ws.Range(kColDetUnidades  & RenActual).NumberFormat = gFormatoCantidades[C0]
          ws.Range(kColDetUnidad    & RenActual).NumberFormat = '@'[C0]
          ws.Range(kColDetPrecio    & RenActual).NumberFormat = '#,##0.00_);-#,##0.00'[C0]
          ws.Range(kColDetNeto      & RenActual).NumberFormat = '#,##0.00_);-#,##0.00'[C0]
          ws.Range(kColDetDescuento & RenActual).NumberFormat = '#,##0.00_);-#,##0.00'[C0]
          ws.Range(kColDetImpuesto  & RenActual).NumberFormat = '#,##0.00_);-#,##0.00'[C0]
          ws.Range(kColDetTotal     & RenActual).NumberFormat = '#,##0.00_);-#,##0.00'[C0]

          ws.Range(kColDetCodigo    & RenActual).Value = fMascarilla(atProductos(cCodigoProducto);tParametros(cMascarillaProducto))[C0]
          ws.Range(kColDetNombre    & RenActual).Value = atProductos(cNombreProducto)[C0]
          ws.Range(kColDetUnidades  & RenActual).Value = fRedondeaImporte(atMovimientos(cUnidades);tParametros(cDecimalesUnidades))[C0]
          Si atUnidades(cIdUnidad) != 0
            ws.Range(kColDetUnidad    & RenActual).Value = atUnidades(cAbreviatura)[C0]
          FinSi

          //N.D. 4084  (ELVS) F@C - Validación para que el reporte presente sus importes en pesos
	  Si aTipoCambio = 1
	  	ws.Range(kColDetPrecio    & RenActual).Value = fRedondeaImporte(atMovimientos(cPrecio); kDecimales)[C0]
        	ws.Range(kColDetNeto      & RenActual).Value = fRedondeaImporte(atMovimientos(cNeto); kDecimales)[C0]
	        ws.Range(kColDetDescuento & RenActual).Value = fRedondeaImporte(atMovimientos(cDescuento1)+atMovimientos(cDescuento2)+atMovimientos(cDescuento3)+atMovimientos(cDescuento4)+atMovimientos(cDescuento5); kDecimales)[C0]
	        ws.Range(kColDetImpuesto  & RenActual).Value = fRedondeaImporte(atMovimientos(cImpuesto1)+atMovimientos(cImpuesto2)+atMovimientos(cImpuesto3); kDecimales)[C0]
	        ws.Range(kColDetTotal     & RenActual).Value = fRedondeaImporte(atMovimientos(cTotal); kDecimales)[C0]
	  SiNo

		lDescuentos = atMovimientos(cDescuento1)+atMovimientos(cDescuento2)+atMovimientos(cDescuento3)+atMovimientos(cDescuento4)+atMovimientos(cDescuento5)
		lNeto = atMovimientos(cNeto) - lDescuentos
		lTipoCambio = aTipoCambio
		lImpuestos = atMovimientos(cImpuesto1)+atMovimientos(cImpuesto2)+atMovimientos(cImpuesto3)
		lTotal = (lNeto * lTipoCambio) + (LImpuestos * lTipoCambio)

	  	ws.Range(kColDetPrecio    & RenActual).Value = fRedondeaImporte(atMovimientos(cPrecio) * lTipoCambio; kDecimales)[C0]
        	ws.Range(kColDetNeto      & RenActual).Value = fRedondeaImporte(lNeto * lTipoCambio; kDecimales)[C0]
	        ws.Range(kColDetDescuento & RenActual).Value = fRedondeaImporte(lDescuentos * lTipoCambio; kDecimales)[C0]
	        ws.Range(kColDetImpuesto  & RenActual).Value = fRedondeaImporte(lImpuestos * lTipoCambio; kDecimales)[C0]
	        ws.Range(kColDetTotal     & RenActual).Value = fRedondeaImporte(lTotal; kDecimales)[C0]
	  Finsi

          // Avanza de renglon
          RenActual = RenActual + 1[C0]
    FinCaso
    Caso kPantalla
      lRenglon = ''
      //               C1        C3        C5        C7        C9        C11       C13       C15       C17
      //               Producto  Nombre    Unidades  Abrev     Precio    Neto      Descuento Impuesto  Total
      lRenglon[ 1] = fMascarilla(atProductos(cCodigoProducto);tParametros(cMascarillaProducto))
      lRenglon[ 3] = atProductos(cNombreProducto)
      lRenglon[ 5] = fRedondeaImporte(atMovimientos(cUnidades);tParametros(cDecimalesUnidades))
      Si atUnidades(cIdUnidad) != 0
        lRenglon[ 7] = atUnidades(cAbreviatura)
      FinSi

      //N.D. 4084  (ELVS) F@C - Validación para que el reporte presente sus importes en pesos
      Si aTipoCambio = 1
	      lRenglon[ 9] = fRedondeaImporte(atMovimientos(cPrecio); kDecimales)
	      lRenglon[11] = fRedondeaImporte(atMovimientos(cNeto); kDecimales)
	      lRenglon[13] = fRedondeaImporte(atMovimientos(cDescuento1)+atMovimientos(cDescuento2)+atMovimientos(cDescuento3)+atMovimientos(cDescuento4)+atMovimientos(cDescuento5); kDecimales)
	      lRenglon[15] = fRedondeaImporte(atMovimientos(cImpuesto1)+atMovimientos(cImpuesto2)+atMovimientos(cImpuesto3); kDecimales)
	      lRenglon[17] = fRedondeaImporte(atMovimientos(cTotal); kDecimales)
      SiNo
	      lDescuentos = atMovimientos(cDescuento1)+atMovimientos(cDescuento2)+atMovimientos(cDescuento3)+atMovimientos(cDescuento4)+atMovimientos(cDescuento5)
	      lNeto = atMovimientos(cNeto) - lDescuentos
              lTipoCambio = aTipoCambio
	      lImpuestos = atMovimientos(cImpuesto1)+atMovimientos(cImpuesto2)+atMovimientos(cImpuesto3)
	      lTotal = (lNeto * lTipoCambio) + (LImpuestos * lTipoCambio)
	      
              lRenglon[ 9] = fRedondeaImporte(atMovimientos(cPrecio) * lTipoCambio; kDecimales)
              lRenglon[11] = fRedondeaImporte(lNeto * lTipoCambio; kDecimales)
              lRenglon[13] = fRedondeaImporte(LDescuentos * lTipoCambio; kDecimales)
              lRenglon[15] = fRedondeaImporte(LImpuestos * lTipoCambio; kDecimales)
              lRenglon[17] = fRedondeaImporte(LTotal; kDecimales)

	Finsi

      Imprime lRenglon
    Fincaso
  FinEscoge
FinFunc

// ************************************************************************************************************************************************************
// Nombre:    fImprimeDocumento
// Objetivo:  Imprime el encabezado del documento
// ************************************************************************************************************************************************************
// N.D. Se agrego el parámetro aEstado a la función
// 01/02/2011   N.C.351   Unificar el reporte mensual para que pueda generarse con documentos tradicionales y CFDs. 
//                        Además incluir en los documentos tradicionales el número y año de aprobación. 
//                        (Actualmente solo se permite el número). (ALRH)
// 01/02/2011   N.D.6937  ERROR ASIGNA MAL EL NETO CUANDO SE MANEJAN DESCUENTOS EN DOCUMENTOS EN DOLARES 
//                        AL EJECUTAR EL REPORTE COMPROBANTES FISCAL DIGITAL EN EXCEL. (ALRH)
// 08/12/2011	N.D.7706  Según el anexo 20, en documentos tradicionales ya no debe aparecer año de aprobación. (ALRH)
// ************************************************************************************************************************************************************
DefFunc fImprimeDocumento (atDocumentos:TABLA; atClientes:TABLA; atConceptos:TABLA; atFoliosDigitales:TABLA; aEstado)
Local lExpedicion
Local lEstado
Local lSerie
Local lRenglon
Local lAprobacion //N.D. 4099

//N.D. 4084 Variables para la validación de la moneda del documento
Local lDescuentos, lTipoCambio, lImpuestos, lTotal

  // Filtrar Serie
  Si pTodasSeries = 0
    Si pSerie != atDocumentos(cSerieDocumento)
      Retorna
    FinSi
  FinSi
  // Filtrar Folios
  Si atDocumentos(cFolio) < pFolioInicial O atDocumentos(cFolio) > pFolioFinal
    Retorna
  FinSi
  // Filtrar Entregado
  Si pEntregado = 1 Y atFoliosDigitales(cEntregado) = 0
    Retorna
  FinSi
  Si pEntregado = 2 Y atFoliosDigitales(cEntregado) = 1
    Retorna
  FinSi
 
  //N.D. 4090 Según sea el caso se imprime la fecha y hora de emisión o cancelación del docuemnto 
  // Expedicion o Cancelación: dd/mm/yyyy hh:mm:ss
 Si aEstado=1 //Vigente
	lExpedicion = @Substr(atFoliosDigitales(cFechaEmi);6;2) & '/' & @Substr(atFoliosDigitales(cFechaEmi);4;2) & '/' & @Substr(atFoliosDigitales(cFechaEmi);0;4) & ' ' & atFoliosDigitales(cHoraEmi)
        lEstado='Vigente'
	//N.D. 4108 Si el estado del docuemento está en no emitido 
	Si atFoliosDigitales(cEstado) = 1
		lExpedicion = @Substr(atFoliosDigitales(cFechaEmi);6;2) & '/' & @Substr(atFoliosDigitales(cFechaEmi);4;2) & '/' & @Substr(atFoliosDigitales(cFechaEmi);0;4) & ' ' & atFoliosDigitales(cHoraEmi)
        	lEstado='No Emitido'		
	FinSi
  Finsi
  Si aEstado=0 //Cancelado
       	//N.D.4090 Cancelación: dd/mm/yyyy hh:mm:ss 
	//N.D.4196 lExpedicion = @Substr(atFoliosDigitales(cFechaCanc);6;2) & '/' & @Substr(atFoliosDigitales(cFechaCanc);4;2) & '/' & @Substr(atFoliosDigitales(cFechaCanc);0;4) & ' ' & atFoliosDigitales(cHoraCanc)
        lExpedicion = @Substr(atFoliosDigitales(cFechaEmi);6;2) & '/' & @Substr(atFoliosDigitales(cFechaEmi);4;2) & '/' & @Substr(atFoliosDigitales(cFechaEmi);0;4) & ' ' & atFoliosDigitales(cHoraEmi)
        lEstado='Cancelado'
  Finsi

    //N.D. 4099 Se contatena el año de aprobación según sea el caso
    // N.C.351 (ALRH)
    Si atFoliosDigitales(cEsTrad) = 1 Y atFoliosDigitales(cNoAprob)!=''
    	// N.D.7706 ALRH
        lAprobacion = @Str(atFoliosDigitales(cNoAprob);0)
    FinSi
    Si atDocumentos(cEsCFD) = 1
        lAprobacion=@Substr(atFoliosDigitales(cFecAprob);0;4)&atFoliosDigitales(cNoAprob)
    FinSi 
	//N.D.1188
	Si atFoliosDigitales(cEsTrad) = 2 
		lAprobacion=@Substr(atFoliosDigitales(cFecAprob);0;4)&atFoliosDigitales(cNoAprob)
	FinSi
    // El Autoimpreso se comporta como un documento tradicional pero sin No. de Aprobación
    Si atFoliosDigitales(cEsTrad) = 1 Y atFoliosDigitales(cNoAprob)=''
	lAprobacion=''
    FinSi			

  Escoge pFormato
    Caso kExcel
          ws.Range(kColInicio & RenActual & ':' & kColFin & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
          ws.Range(kColInicio & RenActual & ':' & kColFin & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0]
          ws.Range(kColInicio & RenActual & ':' & kColFin & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0]
          ws.Range(kColInicio & RenActual & ':' & kColFin & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0]
          ws.Range(kFecha     & RenActual).Borders(xlBordeDerecha).LineStyle = xlLineaSimple[C0]
          ws.Range(kSerie     & RenActual).Borders(xlBordeDerecha).LineStyle = xlLineaSimple[C0]
          ws.Range(kFolio     & RenActual).Borders(xlBordeDerecha).LineStyle = xlLineaSimple[C0]
          ws.Range(kCliente   & RenActual).Borders(xlBordeDerecha).LineStyle = xlLineaSimple[C0]
          ws.Range(kRazSocial & RenActual).Borders(xlBordeDerecha).LineStyle = xlLineaSimple[C0]
          ws.Range(kRFC       & RenActual).Borders(xlBordeDerecha).LineStyle = xlLineaSimple[C0]
          ws.Range(kConcepto  & RenActual).Borders(xlBordeDerecha).LineStyle = xlLineaSimple[C0]
          ws.Range(kAprobacion & RenActual).Borders(xlBordeDerecha).LineStyle = xlLineaSimple[C0]
          ws.Range(kExpedicion & RenActual).Borders(xlBordeDerecha).LineStyle = xlLineaSimple[C0]
          ws.Range(kEstado     & RenActual).Borders(xlBordeDerecha).LineStyle = xlLineaSimple[C0]
          ws.Range(kNeto       & RenActual).Borders(xlBordeDerecha).LineStyle = xlLineaSimple[C0]
          ws.Range(kDescuentos & RenActual).Borders(xlBordeDerecha).LineStyle = xlLineaSimple[C0]
          ws.Range(kImpuestos  & RenActual).Borders(xlBordeDerecha).LineStyle = xlLineaSimple[C0]
          ws.Range(kTotal      & RenActual).Borders(xlBordeDerecha).LineStyle = xlLineaSimple[C0]
          
          ws.Range(kFecha     & RenActual).NumberFormat = '@'[C0]
          ws.Range(kSerie     & RenActual).NumberFormat = '@'[C0]
          ws.Range(kFolio     & RenActual).NumberFormat = '#,##0'[C0]
          ws.Range(kCliente   & RenActual).NumberFormat = '@'[C0]
          ws.Range(kRazSocial & RenActual).NumberFormat = '@'[C0]
          ws.Range(kRFC       & RenActual).NumberFormat = '@'[C0]
          ws.Range(kConcepto  & RenActual).NumberFormat = '@'[C0]
          ws.Range(kAprobacion & RenActual).NumberFormat = '@'[C0] //N.D. 4099 Se cambio el formato del dato para presentarse en excel
          ws.Range(kExpedicion & RenActual).NumberFormat = '@'[C0]
          ws.Range(kEstado     & RenActual).NumberFormat = '@'[C0]
          ws.Range(kNeto       & RenActual).NumberFormat = '#,##0.00_);-#,##0.00'[C0]
          ws.Range(kDescuentos & RenActual).NumberFormat = '#,##0.00_);-#,##0.00'[C0]
          ws.Range(kImpuestos  & RenActual).NumberFormat = '#,##0.00_);-#,##0.00'[C0]
          ws.Range(kTotal      & RenActual).NumberFormat = '#,##0.00_);-#,##0.00'[C0]

          ws.Range(kFecha     & RenActual).Value = fFormateaFecha(aEstado = 1 ? atDocumentos(cFecha): atFoliosDigitales(cFechaCanc);gIdioma)[C0]
          ws.Range(kSerie     & RenActual).Value = @Mayusculas(atDocumentos(cSerieDocumento))[C0]
          ws.Range(kFolio     & RenActual).Value = atDocumentos(cFolio)[C0]
          ws.Range(kCliente   & RenActual).Value = fMascarilla(atClientes(cCodigoCliente);tParametros(cMascarillaClientes))[C0]
          ws.Range(kRazSocial & RenActual).Value = atDocumentos(cRazonSocial)[C0]
   //ND5673 Si el RFC del documento es vacio, se utiliza el RFC del cliente
          ws.Range(kRFC       & RenActual).Value = fMascarilla( (atDocumentos(cRFC) != ''?atDocumentos(cRFC):atClientes(cRFC) );tParametros(cMascarillaRFC))[C0]
          ws.Range(kConcepto  & RenActual).Value = atConceptos(cNombreConcepto)[C0]
	  //N.D. 4099 Se concatena el año de aprobación según sea el caso
          ws.Range(kAprobacion & RenActual).Value = lAprobacion //atFoliosDigitales(cNoAprob)[C0]
          ws.Range(kExpedicion & RenActual).Value = lExpedicion[C0]
          ws.Range(kEstado     & RenActual).Value = lEstado[C0]

          //N.D. 4084  (ELVS) F@C - Validación para que el reporte presente sus importes en pesos
	  Si atDocumentos(cIdmoneda) = 1
                ws.Range(kNeto       & RenActual).Value = fRedondeaImporte(atDocumentos(cNeto); kDecimales)[C0]
                ws.Range(kDescuentos & RenActual).Value = fRedondeaImporte(atDocumentos(cDescuen01) + atDocumentos(cDescuen02) + atDocumentos(cDescuen03); kDecimales)[C0]
                ws.Range(kImpuestos  & RenActual).Value = fRedondeaImporte(atDocumentos(cImpuesto1) + atDocumentos(cImpuesto2) + atDocumentos(cImpuesto3); kDecimales)[C0]
                ws.Range(kTotal      & RenActual).Value = fRedondeaImporte(atDocumentos(cTotal); kDecimales)[C0]
	  SiNo
		lDescuentos = (atDocumentos(cDescuen01) + atDocumentos(cDescuen02) + atDocumentos(cDescuen03))
		// N.D.6937 (ALRH)
		lNeto = atDocumentos(cNeto) 
		lTipoCambio = atDocumentos(cTipocam01)
		lImpuestos = (atDocumentos(cImpuesto1) + atDocumentos(cImpuesto2) + atDocumentos(cImpuesto3))
		lTotal = ((lNeto - lDescuentos) * lTipoCambio) + (LImpuestos * lTipoCambio)

	        ws.Range(kNeto       & RenActual).Value = fRedondeaImporte(lNeto * lTipoCambio; kDecimales)[C0]
	        ws.Range(kDescuentos & RenActual).Value = fRedondeaImporte(lDescuentos * lTipoCambio; kDecimales)[C0]
        	ws.Range(kImpuestos  & RenActual).Value = fRedondeaImporte(lImpuestos * lTipoCambio; kDecimales)[C0]
	        ws.Range(kTotal      & RenActual).Value = fRedondeaImporte(lTotal; kDecimales)[C0]
	  Finsi

          Excel.Rows(RenActual & ':' & RenActual).Select
          // Avanza de renglon
          RenActual = RenActual + 1[C0]
    FinCaso
    Caso kPantalla
      fFormateaColumnas(0)
      lRenglon = ''
      Escoge pOrdenamiento 
          Caso 0               // 0 = Fecha
            //           C0       C2        C4        C6        C8        C10        C12       C14       C16       C18        C20
            //           Fecha    Serie     Folio     Cliente   RazSocial AprobAño   Emision   Estado    Neto      Impuestos Total
            lRenglon[ 0] = fFormateaFecha(aEstado = 1 ? atDocumentos(cFecha): atFoliosDigitales(cFechaCanc);gIdioma)
            lRenglon[ 2] = @Mayusculas(atDocumentos(cSerieDocumento))
            lRenglon[ 4] = atDocumentos(cFolio)
            lRenglon[ 6] = fMascarilla(atClientes(cCodigoCliente);tParametros(cMascarillaClientes))
            lRenglon[ 8] = atDocumentos(cRazonSocial)
            lRenglon[10] = '"'&lAprobacion//atFoliosDigitales(cNoAprob) //N.D. 4099 Se concatena el año según sea el caso
            lRenglon[12] = lExpedicion
            lRenglon[14] = lEstado

	    //N.D. 4084  (ELVS) F@C - Validación para que el reporte presente sus importes en pesos
	    Si atDocumentos(cIdmoneda) = 1
                lRenglon[16] = fRedondeaImporte(atDocumentos(cNeto) - (atDocumentos(cDescuen01) + atDocumentos(cDescuen02) + atDocumentos(cDescuen03)); kDecimales)
                lRenglon[18] = fRedondeaImporte(atDocumentos(cImpuesto1) + atDocumentos(cImpuesto2) + atDocumentos(cImpuesto3); kDecimales)
                lRenglon[20] = fRedondeaImporte(atDocumentos(cTotal); kDecimales)
            SiNo
		lDescuentos = atDocumentos(cDescuen01) + atDocumentos(cDescuen02) + atDocumentos(cDescuen03)
		// N.D.6937 (ALRH)
		lNeto = atDocumentos(cNeto) - (atDocumentos(cDescuen01) + atDocumentos(cDescuen02) + atDocumentos(cDescuen03)) //N.D. 8576
		lTipoCambio = atDocumentos(cTipocam01)
		lImpuestos = (atDocumentos(cImpuesto1) + atDocumentos(cImpuesto2) + atDocumentos(cImpuesto3))
		lTotal = ((lNeto) * lTipoCambio) + (LImpuestos * lTipoCambio)

		lRenglon[16] = fRedondeaImporte(lNeto * lTipoCambio; kDecimales)
        	lRenglon[18] = fRedondeaImporte(lImpuestos * lTipoCambio; kDecimales)
	        lRenglon[20] = fRedondeaImporte(lTotal; kDecimales)
	    Finsi

          FinCaso
          Caso 1               // 1 = Cliente - Fecha - Serie - Folio
            //          C0        C2        C4        C6         C8        C10       C12       C14       C16       
            //          Fecha     Serie     Folio     AprobAño Emision   Estado    Neto      Impuestos Total
            lRenglon[ 0] = fFormateaFecha(aEstado = 1 ? atDocumentos(cFecha): atFoliosDigitales(cFechaCanc);gIdioma)
            lRenglon[ 2] = @Mayusculas(atDocumentos(cSerieDocumento))
            lRenglon[ 4] = atDocumentos(cFolio)
            lRenglon[ 6] = '"'&lAprobacion//atFoliosDigitales(cNoAprob) // N.D. 4099 Se concatena el año al No Aprobación, según sea el caso
            lRenglon[ 8] = lExpedicion
            lRenglon[10] = lEstado

            //N.D. 4084  (ELVS) F@C - Validación para que el reporte presente sus importes en pesos
	    Si atDocumentos(cIdmoneda) = 1
	        lRenglon[12] = fRedondeaImporte(atDocumentos(cNeto) - (atDocumentos(cDescuen01) + atDocumentos(cDescuen02) + atDocumentos(cDescuen03)); kDecimales)
        	lRenglon[14] = fRedondeaImporte(atDocumentos(cImpuesto1) + atDocumentos(cImpuesto2) + atDocumentos(cImpuesto3); kDecimales)
	        lRenglon[16] = fRedondeaImporte(atDocumentos(cTotal); kDecimales)
            SiNo
		lDescuentos = atDocumentos(cDescuen01) + atDocumentos(cDescuen02) + atDocumentos(cDescuen03)
		// N.D.6937 (ALRH)
	    	lNeto = atDocumentos(cNeto)
		lTipoCambio = atDocumentos(cTipocam01)
		lImpuestos = (atDocumentos(cImpuesto1) + atDocumentos(cImpuesto2) + atDocumentos(cImpuesto3))
		lTotal = ((lNeto - lDescuentos) * lTipoCambio) + (LImpuestos * lTipoCambio)

	        lRenglon[12] = fRedondeaImporte(lNeto * lTipoCambio; kDecimales)
                lRenglon[14] = fRedondeaImporte(LImpuestos * lTipoCambio; kDecimales)
                lRenglon[16] = fRedondeaImporte(lTotal; kDecimales)
	    Finsi

          FinCaso
          Caso 2               // 2 = Concepto - Fecha - Serie - Folio
            //          C0        C2        C4        C6        C8        C10        C12       C14       C16       C18       C20
            //          Fecha     Serie     Folio     Cliente   RazSocial AprobAño Emision   Estado    Neto      Impuestos Total
            lRenglon[ 0] = fFormateaFecha(aEstado = 1 ? atDocumentos(cFecha): atFoliosDigitales(cFechaCanc);gIdioma)
            lRenglon[ 2] = @Mayusculas(atDocumentos(cSerieDocumento))
            lRenglon[ 4] = atDocumentos(cFolio)
            lRenglon[ 6] = fMascarilla(atClientes(cCodigoCliente);tParametros(cMascarillaClientes))
            lRenglon[ 8] = atDocumentos(cRazonSocial)
            lRenglon[10] = '"'&lAprobacion//atFoliosDigitales(cNoAprob) //N.D. 4099 Se concatena el año al No Aprobación, según sea el caso
            lRenglon[12] = lExpedicion
            lRenglon[14] = lEstado

            //N.D. 4084  (ELVS) F@C - Validación para que el reporte presente sus importes en pesos
	    Si atDocumentos(cIdmoneda) = 1
	        lRenglon[16] = fRedondeaImporte(atDocumentos(cNeto) - (atDocumentos(cDescuen01) + atDocumentos(cDescuen02) + atDocumentos(cDescuen03)); kDecimales)
                lRenglon[18] = fRedondeaImporte(atDocumentos(cImpuesto1) + atDocumentos(cImpuesto2) + atDocumentos(cImpuesto3); kDecimales)
	        lRenglon[20] = fRedondeaImporte(atDocumentos(cTotal); kDecimales)
            SiNo
		lDescuentos = atDocumentos(cDescuen01) + atDocumentos(cDescuen02) + atDocumentos(cDescuen03)
		// N.D.6937 (ALRH)
		lNeto = atDocumentos(cNeto)
		lTipoCambio = atDocumentos(cTipocam01)
		lImpuestos = (atDocumentos(cImpuesto1) + atDocumentos(cImpuesto2) + atDocumentos(cImpuesto3))
		lTotal = ((lNeto - lDescuentos) * lTipoCambio) + (LImpuestos * lTipoCambio)

		lRenglon[16] = fRedondeaImporte(lNeto * lTipoCambio; kDecimales)
        	lRenglon[18] = fRedondeaImporte(lImpuestos * lTipoCambio; kDecimales)
	        lRenglon[20] = fRedondeaImporte(lTotal; kDecimales)
	    Finsi
          FinCaso
      FinEscoge 
      Imprime lRenglon
    Fincaso
  FinEscoge
  
  Si pDetallado = 1
    fFormateaColumnas(1)
    // Recupera los movimientos del documento
    Mientras[tMovimientos.Busca[@Str(atDocumentos(cIdDocumento);0)]; tMovimientos->Encontro; tMovimientos.Busca Siguiente[1]]
      // Lee el producto del movimiento
      tProductos.Busca[@Str(tMovimientos(cIdProducto);0)]
      Si !tProductos->Encontro
        Continua
      FinSi
      tUnidades.Busca[@Str(tProductos(cIdUnidadBase);0)]
      // Imprime el movimiento
      //N.D. 4084 manda el tipo de cambio como parámetro si no usa la moneda base
      fImprimeMovimiento(tMovimientos; tProductos; tUnidades; atDocumentos(cTipoCam01))
    FinMientras
  FinSi
FinFunc

/////////////////////////////////////////////////////////////////////////////////////////////
Deffunc fVerificaDocumento(atDocumentos:TABLA; atFoliosDigitales:TABLA)
   
   //Solamente se consideran los CFDs Cancelados y/o Emitidos O los cancelados
	//N.D. 4108	Si (tFoliosDigitales(cEstado) = 2 O tFoliosDigitales(cEstado) =3)
	lEstado=1
	Si atFoliosDigitales(cEstado) = 3
     	lEstado  = 0
	   lLeyendaEstado = 'Cancelado'
	FinSi
	lBanImprimeDocto=0
	//N.D. 4097 Se manejan 4 tipo de documentos diferentes para el reporte
	Escoge pImprimeDoctos
	Caso kTradicionales
       Si atFoliosDigitales(cEsTrad) = 1 Y pImprimeDoctos=0 Y atFoliosDigitales(cNoAprob)!=''
	      lBanImprimeDocto=1
	   FinSi
	FinCaso
	Caso kCFDs
      Si atDocumentos(cEsCFD) = 1 Y pImprimeDoctos=1
  	     lBanImprimeDocto=1
      FinSi 
	FinCaso
	// El Autoimpreso se comporta como un documento tradicional pero sin No. de Aprobación
	Caso kAutoimpresos 
	   Si atFoliosDigitales(cEsTrad) = 1 Y pImprimeDoctos=2 Y atFoliosDigitales(cNoAprob)=''
		  lBanImprimeDocto=1
	   FinSi			
	FinCaso
	Caso kTodos
      Si pImprimeDoctos=3
		 lBanImprimeDocto=1			
      FinSi 
	FinCaso
   FinEscoge //Fin del N.D.4097

FinFunc
// ************************************************************************************************************************************************************
// Nombre:    fRecorrePorFecha
// Objetivo:  Recorre los documentos según su fecha
// ************************************************************************************************************************************************************
DefFunc fRecorrePorFecha()
  // Activacion de los indices
  tDocumentos.UsaIndice['iDocumen01']
  tClientes.UsaIndice['']
  tConceptos.UsaIndice['']

  gFechaBusqueda = pFechaInicial
  // Se todos los documentos que estén dentro del rango de fechas
  Mientras gFechaBusqueda <= pFechaFinal 
      tDocumentos.Busca[@STR(pDocumentoDe;0) & ':' & gFechaBusqueda]
      Mientras tDocumentos->Encontro
      	// Localiza su Folio Digital
      	tFoliosDigitales.Busca[@Str(tDocumentos(cIdDocumento);0)]    
      	Si tFoliosDigitales->Encontro
            //4090 Verifica que esté dentro del rango de la fecha del reporte solicitada	
         	Si ((tFoliosDigitales(cFechaEmi)>=pFechaInicial Y tFoliosDigitales(cFechaEmi)<=pFechaFinal)) //O (tFoliosDigitales(cfechacanc)>=pFechaInicial Y tFoliosDigitales(cfechacanc)<=pFechaFinal))
                fVerificaDocumento(tDocumentos; tFoliosDigitales)
                // Localiza Concepto y Cliente
                tClientes.Busca[@Str(tDocumentos(cIdClienteProveedor);0)]
                tConceptos.Busca[@Str(tDocumentos(cIdConceptoDocumento);0)]      
	            //4090 Imprime los documentos con fecha de emisión y cancelación dentro del periodo solicitado en la fecha
	            Si lBanImprimeDocto=1
		            Si (tFoliosDigitales(cFechaEmi)>=pFechaInicial Y tFoliosDigitales(cFechaEmi)<=pFechaFinal)// O (tFoliosDigitales(cfechacanc)>=pFechaInicial Y tFoliosDigitales(cfechacanc)<=pFechaInicial)
			            fImprimeDocumento(tDocumentos; tClientes; tConceptos; tFoliosDigitales;1)
		            FinSi
		            //Si (tFoliosDigitales(cfechacanc)>=pFechaInicial Y tFoliosDigitales(cfechacanc)<=pFechaFinal) Y LEstado=0
		   	        //    fImprimeDocumento(tDocumentos; tClientes; tConceptos; tFoliosDigitales;0)
		            //FinSi		
   	          FinSi
	            //N.D. 4108	FinSi //N.D. 4090 Solo considera emitidos y cancelados
            FinSi //Si está dentro del rango de las fechas de emisión o cancelación
         FinSi //Fin de lo encontró
         tDocumentos.Busca Siguiente[2]
  	  FinMientras
      
      // Busca aquellos folios digitales que estén en el rango de fechas (canceladas) pero no hayan sido impresos todavía
      // si el documento al que pertenece el folio digital fue ya impreso por pertenecer al rango de fechas, entonces no lo imprime, sino
      // si lo imprime
      tFoliosCancelados.Busca[gFechaBusqueda]
      Mientras tFoliosCancelados->Encontro
          tDocto.Busca[@STR(tFoliosCancelados(cIdDocto);0)]  
          SI tDocto->ENCONTRO
             SI tDocto(cIdDocum02) != pDocumentoDe
                tFoliosCancelados.Busca Siguiente[1]
                Continua
             FINSI
             tClientes.Busca[@Str(tDocto(cIdClienteProveedor);0)]
             tConceptos.Busca[@Str(tDocto(cIdConceptoDocumento);0)]     
            // Unicamente se imprimirán documentos que se cancelen en el periodo pero su documento no haya sido impreso
            //SI  tDocto(cFecha) < pFechaInicial
            fVerificaDocumento(tDocto; tFoliosCancelados)
            SI lBanImprimeDocto = 1
                fImprimeDocumento(tDocto; tClientes; tConceptos; tFoliosCancelados;0)
            FINSI
	        //FINSI  
          FINSI 
          tFoliosCancelados.Busca Siguiente[1]
      FinMientras
   
      gFechaBusqueda = fFechaSiguiente(gFechaBusqueda) 
        
  FinMientras 
  
FinFunc

// ************************************************************************************************************************************************************
// Nombre:    fRecorrePorClienteFecha
// Objetivo:  Recorre los documentos por fecha y agrupandolos por cliente
// ************************************************************************************************************************************************************
DefFunc fRecorrePorClienteFecha()
Local lImpresoCliente
Local lClienteAnterior//N.D.4090
Local lClientePosterior//N.D.4090

// Activacion de los indices
tDocumentos.UsaIndice['ICLIENTE01']
// Se cambia para que el orden sea por código del cliente y no por id, de esta forma estarán ordenados
tClientes.UsaIndice['ICODIGOT01']

tClientes.BUSCA PRIMERO
pDelCliente = tClientes(cCodigoC01)
tClientes.BUSCA ULTIMO
pAlCliente = tClientes(cCodigoC01)


tDocumentos.UsaIndice['ICLIENTE01']

MIENTRAS [ tClientes.Busca[pDelCliente & '..'  & pAlCliente ]; tClientes->Encontro; tClientes.Busca Siguiente[1] ]            

    SI tClientes(cIdClienteProveedor) = 0
       Continua
    FINSI
        
    gFechaBusqueda = pFechaInicial
    // Se todos los documentos que estén dentro del rango de fechas
    Mientras gFechaBusqueda <= pFechaFinal

      tDocumentos.Busca[@STR(tClientes(cidclien01);0) & ':' & gFechaBusqueda]
      Mientras tDocumentos->Encontro

        SI pDocumentoDe != tDocumentos(ciddocum02) 
            tDocumentos.Busca Siguiente[2]
            CONTINUA
        FINSI

      	// Localiza su Folio Digital
      	tFoliosDigitales.Busca[@Str(tDocumentos(cIdDocumento);0)]    
      	Si tFoliosDigitales->Encontro
            //4090 Verifica que esté dentro del rango de la fecha del reporte solicitada	
         	Si ((tFoliosDigitales(cFechaEmi)>=pFechaInicial Y tFoliosDigitales(cFechaEmi)<=pFechaFinal)) //O (tFoliosDigitales(cfechacanc)>=pFechaInicial Y tFoliosDigitales(cfechacanc)<=pFechaFinal))
                fVerificaDocumento(tDocumentos; tFoliosDigitales)
                // Localiza Concepto y Cliente
                tConceptos.Busca[@Str(tDocumentos(cIdConceptoDocumento);0)]      
	            //4090 Imprime los documentos con fecha de emisión y cancelación dentro del periodo solicitado en la fecha
	            Si lBanImprimeDocto=1
                    // N.D.4090 Imprime el cliente
                    lClienteAnterior=tClientes(cidClien01)
                    Si lClienteAnterior!=lClientePosterior //Hace la validación para imprimir el cliente
		                Si pFormato = kPantalla // Y tDocumentos->Encontro
		                    lRenglon[2]='Código : '
		                    lRenglon[4]=fMascarilla(tClientes(cCodigoCliente);tParametros(cMascarillaClientes))
                            Imprime lRenglon
		                    lRenglon[2]='Razón Social'
		                    lRenglon[4]=tClientes(cRazonSocial)
		                    Imprime lRenglon
		                    lRenglon[2]='R.F.C. : '
		                    lRenglon[4]=fMascarilla(tClientes(cRFC);tParametros(cMascarillaRFC))
	                        Imprime lRenglon
                            lImpresoCliente = 1
		                FinSi 
		                lClientePosterior=tClientes(cidClien01)
                    FinSi
		            Si (tFoliosDigitales(cFechaEmi)>=pFechaInicial Y tFoliosDigitales(cFechaEmi)<=pFechaFinal)// O (tFoliosDigitales(cfechacanc)>=pFechaInicial Y tFoliosDigitales(cfechacanc)<=pFechaInicial)
			            fImprimeDocumento(tDocumentos; tClientes; tConceptos; tFoliosDigitales;1)
		            FinSi
		            //Si (tFoliosDigitales(cfechacanc)>=pFechaInicial Y tFoliosDigitales(cfechacanc)<=pFechaFinal) Y LEstado=0
		   	        //    fImprimeDocumento(tDocumentos; tClientes; tConceptos; tFoliosDigitales;0)
		            //FinSi		
   	            FinSi
	            //N.D. 4108	FinSi //N.D. 4090 Solo considera emitidos y cancelados
            FinSi //Si está dentro del rango de las fechas de emisión o cancelación
         FinSi //Fin de lo encontró
         tDocumentos.Busca Siguiente[2]
  	  FinMientras
      
      // Busca aquellos folios digitales que estén en el rango de fechas (canceladas) pero no hayan sido impresos todavía
      // si el documento al que pertenece el folio digital fue ya impreso por pertenecer al rango de fechas, entonces no lo imprime, sino
      // si lo imprime
      tFoliosCancelados.Busca[gFechaBusqueda]
      Mientras tFoliosCancelados->Encontro
          tDocto.Busca[@STR(tFoliosCancelados(cIdDocto);0)]  
          SI tDocto->ENCONTRO
             SI tDocto(cIdDocum02) != pDocumentoDe
                tFoliosCancelados.Busca Siguiente[1]
                Continua
             FINSI
             SI tDocto(cIdClienteProveedor) != tClientes(cIdClienteProveedor)
                  tFoliosCancelados.Busca Siguiente[1]
                Continua
             FINSI
            
             tConceptos.Busca[@Str(tDocto(cIdConceptoDocumento);0)]     
            // Unicamente se imprimirán documentos que se cancelen en el periodo pero su documento no haya sido impreso
            //SI  tDocto(cFecha) < pFechaInicial
            fVerificaDocumento(tDocto; tFoliosCancelados)
            SI lBanImprimeDocto = 1
               lClienteAnterior=tClientes(cidClien01)
               Si lClienteAnterior!=lClientePosterior //Hace la validación para imprimir el cliente
		          Si pFormato = kPantalla // Y tDocumentos->Encontro
		             lRenglon[2]='Código : '
		             lRenglon[4]=fMascarilla(tClientes(cCodigoCliente);tParametros(cMascarillaClientes))
                     Imprime lRenglon
		             lRenglon[2]='Razón Social'
		             lRenglon[4]=tClientes(cRazonSocial)
		             Imprime lRenglon
		             lRenglon[2]='R.F.C. : '
		             lRenglon[4]=fMascarilla(tClientes(cRFC);tParametros(cMascarillaRFC))
	                 Imprime lRenglon
                     lImpresoCliente = 1
		          FinSi 
		          lClientePosterior=tClientes(cidClien01)
               FinSi 
               fImprimeDocumento(tDocto; tClientes; tConceptos; tFoliosCancelados;0)
            FINSI
	        //FINSI  
          FINSI 
          tFoliosCancelados.Busca Siguiente[1]
      FinMientras
   
      gFechaBusqueda = fFechaSiguiente(gFechaBusqueda) 
        
  FinMientras 
FinMientras

FinFunc

// ************************************************************************************************************************************************************
// Nombre:    fRecorrePorConceptoFecha
// Objetivo:  Recorre los documentos por fecha y agrupandolos por concepto
// ************************************************************************************************************************************************************
DefFunc fRecorrePorConceptoFecha()
Local lImpresoConcepto
Local lImpresoCliente
Local lConceptoAnterior//N.D.4090
Local lConceptoPosterior//N.D.4090

// Activacion de los indices

tConceptos.UsaIndice['PRIMARYKEY']
tDocumentos.UsaIndice['ICONCEPT01']

tConceptos.Busca Primero
Mientras tConceptos->Encontro

  SI tConceptos(cesCFD) != 1
     tConceptos.Saltareg[1]
     Continua
  FINSI      
  

  gFechaBusqueda = pFechaInicial
  // Se todos los documentos que estén dentro del rango de fechas
  Mientras gFechaBusqueda <= pFechaFinal 
      tDocumentos.Busca[@STR(tConceptos(cidconce01);0) & ':' & gFechaBusqueda]
      Mientras tDocumentos->Encontro
      	// Localiza su Folio Digital
      	tFoliosDigitales.Busca[@Str(tDocumentos(cIdDocumento);0)]    
      	Si tFoliosDigitales->Encontro
            //4090 Verifica que esté dentro del rango de la fecha del reporte solicitada	
         	Si ((tFoliosDigitales(cFechaEmi)>=pFechaInicial Y tFoliosDigitales(cFechaEmi)<=pFechaFinal)) //O (tFoliosDigitales(cfechacanc)>=pFechaInicial Y tFoliosDigitales(cfechacanc)<=pFechaFinal))
                fVerificaDocumento(tDocumentos; tFoliosDigitales)
                // Localiza Concepto y Cliente
                tClientes.Busca[@Str(tDocumentos(cIdClienteProveedor);0)]
                //4090 Imprime los documentos con fecha de emisión y cancelación dentro del periodo solicitado en la fecha
	            Si lBanImprimeDocto=1
                    lConceptoAnterior=tConceptos(cidconce01)
                    Si lConceptoAnterior!=lConceptoPosterior //Hace la validación para imprimir el cliente
		                Si pFormato = kPantalla // Y tDocumentos->Encontro
		                    lRenglon[2]='Concepto : '
		                    lRenglon[4]=tConceptos(cNombreConcepto)
		                    imprime lRenglon
	                        lImpresoConcepto = 1
		                FinSi 
		                lConceptoPosterior=tConceptos(cidconce01)
                    FinSi

		            Si (tFoliosDigitales(cFechaEmi)>=pFechaInicial Y tFoliosDigitales(cFechaEmi)<=pFechaFinal)// O (tFoliosDigitales(cfechacanc)>=pFechaInicial Y tFoliosDigitales(cfechacanc)<=pFechaInicial)
			            fImprimeDocumento(tDocumentos; tClientes; tConceptos; tFoliosDigitales;1)
		            FinSi
		            //Si (tFoliosDigitales(cfechacanc)>=pFechaInicial Y tFoliosDigitales(cfechacanc)<=pFechaFinal) Y LEstado=0
		   	        //    fImprimeDocumento(tDocumentos; tClientes; tConceptos; tFoliosDigitales;0)
		            //FinSi		
   	            FinSi
	            //N.D. 4108	FinSi //N.D. 4090 Solo considera emitidos y cancelados
            FinSi //Si está dentro del rango de las fechas de emisión o cancelación
         FinSi //Fin de lo encontró
         tDocumentos.Busca Siguiente[2]
  	  FinMientras
      
      // Busca aquellos folios digitales que estén en el rango de fechas (canceladas) pero no hayan sido impresos todavía
      // si el documento al que pertenece el folio digital fue ya impreso por pertenecer al rango de fechas, entonces no lo imprime, sino
      // si lo imprime
      tFoliosCancelados.Busca[gFechaBusqueda]
      Mientras tFoliosCancelados->Encontro
          tDocto.Busca[@STR(tFoliosCancelados(cIdDocto);0)]  
          SI tDocto->ENCONTRO
             SI tDocto(cIdConceptoDocumento) != tConceptos(cIdConceptoDocumento)
                tFoliosCancelados.Busca Siguiente[1]
                Continua
             FINSI
             tClientes.Busca[@Str(tDocto(cIdClienteProveedor);0)]
            //SI  tDocto(cFecha) < pFechaInicial
            fVerificaDocumento(tDocto; tFoliosCancelados)
            SI lBanImprimeDocto = 1
                lConceptoAnterior=tConceptos(cidconce01)
                Si lConceptoAnterior!=lConceptoPosterior //Hace la validación para imprimir el cliente
		            Si pFormato = kPantalla // Y tDocumentos->Encontro
		                lRenglon[2]='Concepto : '
		                lRenglon[4]=tConceptos(cNombreConcepto)
		                imprime lRenglon
	                    lImpresoConcepto = 1
		            FinSi 
		            lConceptoPosterior=tConceptos(cidconce01)
                FinSi

                fImprimeDocumento(tDocto; tClientes; tConceptos; tFoliosCancelados;0)
            FINSI
	        //FINSI  
          FINSI 
          tFoliosCancelados.Busca Siguiente[1]
      FinMientras
   
      gFechaBusqueda = fFechaSiguiente(gFechaBusqueda) 
        
  FinMientras   

  tConceptos.Saltareg[1]
FinMientras

FinFunc

// ************************************************************************************************************************************************************
// Encabezado del reporte
// ************************************************************************************************************************************************************
Encab
  Escoge pFormato
    Caso kExcel
      // Pone el nombre del sistema
      ws.Range(kColInicio & RenActual).Font.Color = @RGB(255;0;0)[C0]
      ws.Range(kColInicio & RenActual).Font.Size = 10[C0]
      ws.Range(kColInicio & RenActual).Value = 'AdminPAQ'[C0]
      // Avanza de renglon
      RenActual = RenActual + 1[C0]
      // Pone el nombre de la empresa
      ws.Range(kColInicio & RenActual).Font.Size = 14[C0]
      ws.Range(kColInicio & RenActual).Font.FontStyle = 'Negrita'[C0]
      ws.Range(kColInicio & RenActual & ':' & kColFin & RenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0]
      ws.Range(kColInicio & RenActual).Value = tEmpresa->Nombre
      // Avanza de renglon
      RenActual = RenActual + 2[C0]
      // Pone el titulo del reporte en EXCEL
      ws.Range(kColInicio & RenActual).Font.Size = 12[C0]
      ws.Range(kColInicio & RenActual).Font.FontStyle = 'Negrita'[C0]
      ws.Range(kColInicio & RenActual).Value = 'C O M P R O B A N T E S   F I S C A L E S   D I G I T A L E S'[C0]
      ws.Range(kColInicio & RenActual & ':' & kColFin & RenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0]
      // Avanza de renglon
      RenActual = RenActual + 1[C0]
      ws.Range(kColInicio & RenActual).Font.Size = 12[C0]
      ws.Range(kColInicio & RenActual).Font.FontStyle = 'Negrita'[C0]    
      ws.Range(kColInicio & RenActual).Value = 'Del: ' & fFormateaFecha(pFechaInicial;gIdioma) & ' Al: ' & fFormateaFecha(pFechaFinal;gIdioma)[C0]
      ws.Range(kColInicio & RenActual & ':' & kColFin & RenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0]
      // Avanza de renglon
      RenActual = RenActual + 2[C0]   
      // Pone el titulo de cada columna en EXCEL
      ws.Range(kColInicio & RenActual & ':' & kColFin & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
      ws.Range(kColInicio & RenActual & ':' & kColFin & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0]
      ws.Range(kColInicio & RenActual & ':' & kColFin & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0]
      ws.Range(kColInicio & RenActual & ':' & kColFin & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0]
      ws.Range(kColInicio & RenActual & ':' & kColFin & RenActual).Interior.ColorIndex = 55[C0]    
      ws.Range(kColInicio & RenActual & ':' & kColFin & RenActual).Font.FontStyle = 'Negrita'[C0]    
      ws.Range(kColInicio & RenActual & ':' & kColFin & RenActual).Font.Color = @RGB(255;255;255)[C0]

      ws.Range(kFecha      & RenActual).Borders(xlBordeDerecha).LineStyle = xlLineaSimple[C0]
      ws.Range(kSerie      & RenActual).Borders(xlBordeDerecha).LineStyle = xlLineaSimple[C0]
      ws.Range(kFolio      & RenActual).Borders(xlBordeDerecha).LineStyle = xlLineaSimple[C0]
      ws.Range(kCliente    & RenActual).Borders(xlBordeDerecha).LineStyle = xlLineaSimple[C0]
      ws.Range(kRazSocial  & RenActual).Borders(xlBordeDerecha).LineStyle = xlLineaSimple[C0]
      ws.Range(kRFC        & RenActual).Borders(xlBordeDerecha).LineStyle = xlLineaSimple[C0]
      ws.Range(kConcepto   & RenActual).Borders(xlBordeDerecha).LineStyle = xlLineaSimple[C0]
      ws.Range(kAprobacion & RenActual).Borders(xlBordeDerecha).LineStyle = xlLineaSimple[C0]
      ws.Range(kExpedicion & RenActual).Borders(xlBordeDerecha).LineStyle = xlLineaSimple[C0]
      ws.Range(kEstado     & RenActual).Borders(xlBordeDerecha).LineStyle = xlLineaSimple[C0]
      ws.Range(kNeto       & RenActual).Borders(xlBordeDerecha).LineStyle = xlLineaSimple[C0]
      ws.Range(kDescuentos & RenActual).Borders(xlBordeDerecha).LineStyle = xlLineaSimple[C0]
      ws.Range(kImpuestos  & RenActual).Borders(xlBordeDerecha).LineStyle = xlLineaSimple[C0]
      ws.Range(kTotal      & RenActual).Borders(xlBordeDerecha).LineStyle = xlLineaSimple[C0]

      ws.Range(kFecha      & RenActual).Value = 'Fecha'[C0]
      ws.Range(kSerie      & RenActual).Value = 'Serie'[C0]
      ws.Range(kFolio      & RenActual).Value = 'Folio'[C0]
      ws.Range(kCliente    & RenActual).Value = 'Cliente'[C0]
      ws.Range(kRazSocial  & RenActual).Value = 'Razón Social'[C0]
      ws.Range(kRFC        & RenActual).Value = 'R.F.C.'[C0]
      ws.Range(kConcepto   & RenActual).Value = 'Concepto'[C0]
      ws.Range(kAprobacion & RenActual).Value = 'Aprobación'[C0]
      ws.Range(kExpedicion & RenActual).Value = 'Expedición'[C0] //N.D.4196 N.D.4090 
      ws.Range(kEstado     & RenActual).Value = 'Estado'[C0]
      ws.Range(kNeto       & RenActual).Value = 'Neto'[C0]
      ws.Range(kDescuentos & RenActual).Value = 'Descuentos'[C0]
      ws.Range(kImpuestos  & RenActual).Value = 'Impuestos'[C0]
      ws.Range(kTotal      & RenActual).Value = 'Total'[C0]
      // Avanza de renglon
      RenActual = RenActual + 1[C0]
      Si pDetallado = 1
        ws.Range(kColDetInicio & RenActual & ':' & kColDetFin & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
        ws.Range(kColDetInicio & RenActual & ':' & kColDetFin & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0]
        ws.Range(kColDetInicio & RenActual & ':' & kColDetFin & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0]
        ws.Range(kColDetInicio & RenActual & ':' & kColDetFin & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0]
        ws.Range(kColDetInicio & RenActual & ':' & kColDetFin & RenActual).Interior.ColorIndex = 55[C0]    
        ws.Range(kColDetInicio & RenActual & ':' & kColDetFin & RenActual).Font.FontStyle = 'Negrita'[C0]    
        ws.Range(kColDetInicio & RenActual & ':' & kColDetFin & RenActual).Font.Color = @RGB(255;255;255)[C0]
        ws.Range(kColDetCodigo    & RenActual).Borders(xlBordeDerecha).LineStyle = xlLineaSimple[C0]
        ws.Range(kColDetNombre    & RenActual).Borders(xlBordeDerecha).LineStyle = xlLineaSimple[C0]
        ws.Range(kColDetUnidades  & RenActual).Borders(xlBordeDerecha).LineStyle = xlLineaSimple[C0]
        ws.Range(kColDetUnidad    & RenActual).Borders(xlBordeDerecha).LineStyle = xlLineaSimple[C0]
        ws.Range(kColDetPrecio    & RenActual).Borders(xlBordeDerecha).LineStyle = xlLineaSimple[C0]
        ws.Range(kColDetNeto      & RenActual).Borders(xlBordeDerecha).LineStyle = xlLineaSimple[C0]
        ws.Range(kColDetDescuento & RenActual).Borders(xlBordeDerecha).LineStyle = xlLineaSimple[C0]
        ws.Range(kColDetImpuesto  & RenActual).Borders(xlBordeDerecha).LineStyle = xlLineaSimple[C0]
        ws.Range(kColDetTotal     & RenActual).Borders(xlBordeDerecha).LineStyle = xlLineaSimple[C0]
        ws.Range(kColDetCodigo    & RenActual).Value = 'Código Producto'[C0]
        ws.Range(kColDetNombre    & RenActual).Value = 'Nombre'[C0]
        ws.Range(kColDetUnidades  & RenActual).Value = 'Unidades'[C0]
        ws.Range(kColDetUnidad    & RenActual).Value = 'Abreviatura'[C0]
        ws.Range(kColDetPrecio    & RenActual).Value = 'Precio'[C0]
        ws.Range(kColDetNeto      & RenActual).Value = 'Neto'[C0]
        ws.Range(kColDetDescuento & RenActual).Value = 'Descuento'[C0]
        ws.Range(kColDetImpuesto  & RenActual).Value = 'Impuesto'[C0]
        ws.Range(kColDetTotal     & RenActual).Value = 'Total'[C0]
        // Avanza de renglon
        RenActual = RenActual + 1[C0]
      FinSi
      Excel.Rows(RenActual & ':' & RenActual).Select
      Excel.ActiveWindow.FreezePanes = True
      ws.Range(kColInicio & RenActual).Select
    FinCaso
    Caso kPantalla
      fFormateaColumnas(0)
      Texto '@TC{255,0,0}@S{8}AdminPAQ' 
      Imprime 
      Texto '^@TC{0,0,0}@S{22}' & tEmpresa->Nombre
      Imprime
      Texto '^@TC{0,0,0}@S{16}' & 'COMPROBANTES FISCALES DIGITALES'
      Imprime
      Texto '^@TC{0,0,0}@S{16}' & 'Del: ' & fFormateaFecha(pFechaInicial;gIdioma) & ' Al: ' & fFormateaFecha(pFechaFinal;gIdioma)
      Imprime 
      NEGRITAS TRUE
      Altura 9
      Texto '@TC{0,0,0}@L{-1}'
      Imprime 
      Escoge pOrdenamiento 
        Caso 0               // 0 = Fecha
          //           C0       C2        C4        C6        C8        C10        C12       C14       C16       C18        C20
          //           Fecha    Serie     Folio     Cliente   RazSocial AprobAño   Emision   Estado    Neto      Impuestos Total
          Texto C0; 'Fecha'
          Texto C2; 'Serie'
          Texto C4; '"Folio  '
          Texto C6; 'Código Cliente'
          Texto C8; 'Razón Social'
          Texto C10;'"Aprobación  '
          Texto C12;'Expedición' //N.D.4196 Cancelación' //N.D. 4090
          Texto C14;'Estado'
          Texto C16;'"Neto  '
          Texto C18;'"Impuestos  '
          Texto C20;'"Total  '
        FinCaso
        Caso 1               // 1 = Cliente - Fecha - Serie - Folio
          //          C0        C2        C4        C6         C8        C10       C12       C14       C16       
          //          Fecha     Serie     Folio     AprobAño   Emision   Estado    Neto      Impuestos Total
          Texto C0; 'Fecha'
          Texto C2; 'Serie'
          Texto C4; '"Folio  '
          Texto C6;'"Aprobación  '
          Texto C8;'Expedición' //N.D.4196 Cancelación'
          Texto C10;'Estado'
          Texto C12;'"Neto  '
          Texto C14;'"Impuestos  '
          Texto C16;'"Total  '
        FinCaso
        Caso 2               // 2 = Concepto - Fecha - Serie - Folio
          //          C0        C2        C4        C6        C8        C10        C12       C14       C16       C18       C20
          //          Fecha     Serie     Folio     Cliente   RazSocial AprobAño   Emision   Estado    Neto      Impuestos Total
          Texto C0; 'Fecha'
          Texto C2; 'Serie'
          Texto C4; '"Folio  '
          Texto C6; 'Código Cliente'
          Texto C8; 'Razón Social'
          Texto C10;'"Aprobación '
          Texto C12;'Expedición' //N.D.4196 Cancelación' //N.D. 4090
          Texto C14;'Estado'
          Texto C16;'"Neto  '
          Texto C18;'"Impuestos  '
          Texto C20;'"Total  '
        FinCaso
      FinEscoge
      Imprime
      Texto '@TC{0,0,0}@L{-1}'
      Imprime 
      Si pDetallado = 1
        fFormateaColumnas(1)
        //               C1        C3        C5        C7        C9        C11       C13       C15       C17
        //               Producto  Nombre    Unidades  Abrev     Precio    Neto      Descuento Impuesto  Total
        Texto C1; 'Producto'
        Texto C3; 'Nombre'
        Texto C5; 'Unidades'
        Texto C7; ''
        Texto C9; 'Precio'
        Texto C11;'^Neto'
        Texto C13;'^Descuento'
        Texto C15;'^Impuesto'
        Texto C17;'^Total'
        Imprime
        Texto '@TC{0,0,0}@L{-1}'
        Imprime       
      Finsi
      NEGRITAS FALSE  
    FinCaso
  FinEscoge
FinEncab


// ************************************************************************************************************************************************************
// Cuerpo del reporte
// ************************************************************************************************************************************************************
Escoge pOrdenamiento 
  Caso 0               // 0 = Fecha
      fRecorrePorFecha( )
  FinCaso
  Caso 1               // 1 = Cliente - Fecha - Serie - Folio
      fRecorrePorClienteFecha( )
  FinCaso
  Caso 2               // 2 = Concepto - Fecha - Serie - Folio
      fRecorrePorConceptoFecha( )
  FinCaso
FinEscoge 

Si pFormato = kExcel
  Excel.Rows(RenActual & ':' & RenActual).Select
FinSi
