// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//
// F@C_InformeSAT.rpt
//
//  Sistema: AdminPAQ v1.1
// 
// Elaboró:  Leonardo Aguilar Pizano
// Fecha:    27 de Diciembre de 2005
//
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Historia de modificaciones
//  Fecha      Nombre   IDLotus                     Descripcion
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// 
// 30/Mayo/2005		ND: 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)
// 05/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)
// 07/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 AdmilImpuestonPAQ 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/Junio/2006	N.D.4109 AdminPAQ VS AMECE - Hace falta validar que el informe mensual del SAT cumpla con
//			las especificaciones del Anexo 20.  Uno de los errores detectados es en el 
//			despliegue de la aprobación. (ELVS)
// 22/Junio/2006	N.D.4157 Al generar el reporte Informe mensual al SAT - Informativo, aparece 
//			desalineada la columna Estado con respecto al contenido de la misma columna.
// 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)
// 20/Julio/2006	N.D.4208 La información de Estado del reporte Informe mensual al SAT aparece en
//			1 sola linea en lugar de aparecer en lista como el resto de los reportes en AdminPAQ.
// 14/Noviembre/2008 N.D.5535 F@C - Informe Mensual al SAT CFDs - La columna 6 "Monto de la 
//   		Operación" muestra el Neto del documento y no el Monto total de la transacción que
//			ampara el comprobante, como lo señala el Anexo 20. (ELVS)
// 20/Noviembre/2008 N.D.5535 Informe Mensual al SAT CFDs - La columna 7 "Monto del 
//   		Impuesto" muestra la suma de todos los impuestos del documento y solo debe 
//			incluir el impuesto configurado como IVA. (ELVS)
// 26/Enero/2010  N.C.275 Cambio a la estructura del reporte mensual de CFD por nueva versión del Anexo de 21 de diciembre de 2009. (IYPZ)
// 25/Noviembre/2010 N.D.6519 Reportes - ERROR SE MUESTRA VACIA LA COLUMNA OPERACION E IMPUESTO 
//      PARA DOCUMENTOS CON IMPORTE 0, AL EMITIR EL REPORTE  INFORME MENSUAL AL SAT / CFDS EN
//      FORMATO INFORMATIVO; SIENDO QUE EL ARCHIVO TXT SI ENVIA CERO. (ALRH)
// 26/Noviembre/2010 N.D.6546 Genérico - aERROR EL EFETO DEL COMPROBANTE DEBE SER I E O T AL CARGAR
//      EL INFORME MENSUAL DE CFDS AL SAT. (ALRH)
// 26/Noviembre/2010 N.D.6530 Genérico - ERROR EL INFORME MENSUAL AL SAT/CFDS   SOLO ARROJA DOS DECIMALES,
//      AUN Y CUANDO EN LA CONFIGURACION GENERAL SE UTILIZAN 5. (ELVS)(ALRH)
// 03/12/2010 N.C.315 Documentos - SUGERENCIA AGREGAR EL DOCUMENTO CARTAS PORTES (COMPROBANTE)
//            EN LOS DOCUMENTOS DISPONIBLES DE ADMINPAQ. (ELVS)
// 20/01/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)
// 27/01/2011 N.D.6896  ERROR EL INFORME MENSUAL AL SAT DESPLIEGA MAS DE 2 DECIMAL 
//                      OCASIONANDO QUE EL VALIDADOR NO LO CARGUE CARRECTAMENTE. (ALRH)
// 11/02/2011 N.D.6949  Estan apareciendo documentos CFDi en el reporte. (ALRH)
// 18/02/2011 N.D.6997  ERROR LINEA 1 ESTRUCTURA DE ARCHIVO INCORRECTO AL ENTREGAR EL INFORME MENSUAL AL SAT. (ALRH)
// 22/02/2011 N.D.6999  ERROR NO CAMBIA EL ESTATUS A 0 CANCELADO EN EL INFORME MENSUAL AL SAT TRADICIONALES. (ALRH)
// 25/02/2011 N.D.7019  El estatus del documento es incorrecto, cuando se tiene un documento emitido y cancelado en el mismo periodo. (ALRH)(IYPZ)
// 17/03/2011 N.D.7075  ERROR EL REPORTE MENSUAL AL SAT MUESTRA DOS ESPACIOS EN BLANCO CUANDO HAY MAS DE 
//                      7 PEDIMENTOS AL EJECUTAR EL REPORTE MENSUAL AL SAT CON LOS REPORTES ACTUALIZADOS. (ALRH)
// 31/03/2011 N.D.7096  Reportes - ERROR SE INCLUYE EL NUMERO DE APROBACION AL GENERAR EL REPORTE DEL INFORME 
//                      MENSUAL AL SAT / TRADICIONALES, CUANDO NO DEBERIA INCLUIRSE DE ACUERDO AL LAYOUT DEL SAT. (FPP)
// 10/06/2011 N.D.7123  Si el primer movimiento del documento es un producto exento de IVA considera al documento como exento. (IYPZ)
// 08/12/2011 N.D.7706	Según el anexo 20, en documentos tradicionales ya no debe aparecer año de aprobación. (ALRH)
// 30/03/2011 N.C.502 	Se agregan los conceptos de abonos del cliente como CFDs. (IYPZ)
// 06/06/2012	N.D.8032	Se agrega validación para en el caso de los documentos de pago electrónico buscar algún producto exento en base al documento origen. (IYPZ)
// 18/09/2012 		 
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<



// ************************************************************************************************************************************************************
// 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 tDocumentos = tEmpresa['MGW10008'] Alias 'Docto1'    // Documentos
tDocumentos.Usaindice['cFecha']                    // cFecha

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

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

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

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

UsaTabla tClientes   = tEmpresa['MGW10002']       // Clientes

//N.C.275
UsaTabla tMovimiento = tEmpresa['MGW10010'] Alias 'Movto'       // Movimientos
tMovimiento.Usaindice['iDoctoNumeroMovto']       // cIdDocumento + cNumeroMovimiento
	
UsaTabla tProducto = tEmpresa['mgw10005']
tProducto.Usaindice['']																	// Indice primario: cIdProducto

UsaTabla tCapa = tEmpresa['MGW10025']             // Capas
tCapa.Usaindice['']                               // Indice primario: cIdCapa

UsaTabla tMovimientoCapa = tEmpresa['MGW10028']   // Movimientos de capas (pedimentos)
tMovimientoCapa.Usaindice['']           				//Indice primario: cIdMovimiento+cIdCapa

UsaTabla tSerie = tEmpresa['MGW10032']            // Series
tSerie.Usaindice['']             			// Indice primario: cIdSerie

UsaTabla tMovimientoSerie = tEmpresa['MGW10036']  // Movimientos de series
tMovimientoSerie.Usaindice['']         // Indice primario: cIdMovimiento+cIdSerie

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

//N.D.6530
//Monedas
UsaTabla tMoneda = tEmpresa['mgw10034']          
tMoneda.Usaindice['']                        

// ************************************************************************************************************************************************************
// Parametros
// ************************************************************************************************************************************************************
// N.D.F@C Versión 2 Reordenamiento de los argumentos de entrada
Parametro pEjercicio  = 0
Parametro pMes        = 0   // Enero, Febrero, ..., Octubre, Noviembre, Diciembre
Parametro pFormato    = 0   // 0 - Pantalla
                            // 1 - Excel
                            // 2 - TXT
Parametro pNoEmitidos  = 0  // 0 - No4108
			                      // 1 - Sí
//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 pArchivo  = ''

// ************************************************************************************************************************************************************
// Definiciones y asumidos globales para el reporte
// ************************************************************************************************************************************************************
Columnas 1;1
Usaletra 'Arial'
Altura 9

//4108
constante kNoEmitidosNo	 	0
constante kNoEmitidosSi	 	1

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

constante kSeparador            '|'

kMeses = 'Enero,Febrero,Marzo,Abril,Mayo,Junio,Julio,Agosto,Septiembre,Octubre,Noviembre,Diciembre'[C0]


Si pEjercicio = 0 y pMes = 0
  lOpciones = ''
  tEjercicio.Busca Primero
  Mientras tEjercicio->Encontro   
    Si lOpciones != ''
      lOpciones = lOpciones & ','
    FinSi
    lOpciones = lOpciones & @SubStr(tEjercicio(cFecIniPeriodo1);0;4)
    tEjercicio.Saltareg[1]
  FinMientras  
  Acepta 'Ejercicio'; lSeleccion; lOpciones
  pEjercicio = @Val(lSeleccion)
  
  Acepta 'Mes:'; lSeleccion; kMeses
  Escoge lSeleccion
    Caso 'Enero'
      pMes = 1
    FinCaso
    Caso 'Febrero'
      pMes = 2
    FinCaso
    Caso 'Marzo'
      pMes = 3
    FinCaso
    Caso 'Abril'
      pMes = 4
    FinCaso
    Caso 'Mayo'
      pMes = 5
    FinCaso
    Caso 'Junio'
      pMes = 6
    FinCaso
    Caso 'Julio'
      pMes = 7
    FinCaso
    Caso 'Agosto'
      pMes = 8
    FinCaso
    Caso 'Septiembre'
      pMes = 9
    FinCaso
    Caso 'Octubre'
      pMes = 10
    FinCaso
    Caso 'Noviembre'
      pMes = 11
    FinCaso
    Caso 'Diciembre'
      pMes = 12
    FinCaso
  FinEscoge

  lOpciones = ''
  Acepta 'Salida'; lSeleccion; lOpciones
  Escoge lSeleccion
    Caso 'No'
      pNoEmitidos = kNoEmitidosNo
    FinCaso
    Caso 'Sí'
      pNoEmitidos = kNoEmitidosSi
  FinEscoge  

  lOpciones = ''
//N.D. 4097 Se manejan 4 tipo de documentos diferentes para el reporte
//  lOpciones = 'Tradicionales,CFDs,AutoImpresos,Todos'
//  Acepta 'Salida'; lSeleccion; lOpciones
//  Escoge lSeleccion
//    Caso 'Tradicionales'
//      pImprimeDoctos = kTradcionales
//    FinCaso
//    Caso 'CFDs'
//      pImprimeDoctos = kCFDs
//    FinCaso
//    Caso 'AutoImpresos'
//      pImprimeDoctos = kAutoimpresos
//    FinCaso
//    Caso 'Todos'
//      pImprimeDoctos = kTodos 
//    FinCaso
//  FinEscoge  

//  lOpciones = 'Pantalla,TXT,Excel'
//  Acepta 'Salida'; lSeleccion; lOpciones
//  Escoge PFormtao
//    Caso 'TXT'
//      pFormato = kTXT
//    FinCaso
//    Caso 'Pantalla'
//      pFormato = kPantalla
//    FinCaso
//    Caso 'Excel'
//      pFormato = kExcel
//    FinCaso
//  FinEscoge  

  //Si pFormato = kTXT
  //  Acepta 'Archivo: '; pArchivo
  //FinSi
FinSi
// ************************************************************************************************************************************************************
// Variables de ámbito global:
// ************************************************************************************************************************************************************
gIdioma = 0                       // Idioma del reporte
                                  // 0 = Español
                                  // 1 = Inglés

gFechaMes = @Str(pEjercicio;0)
Si pMes < 10
  gFechaMes = gFechaMes & '0'
FinSi
gFechaMes = gFechaMes & @Str(pMes;0) 

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

  //N.D. 4109 Modifica el tamaño de las columnas según el formato del SAT
  // Pone la longitud de cada columna
  ws.Columns(1).ColumnWidth = 13[C0] //20[C0]  // A    RFC
  ws.Columns(2).ColumnWidth = 10[C0]  // B    Serie
  ws.Columns(3).ColumnWidth = 10[C0]  // C    Folio
  ws.Columns(4).ColumnWidth = 14[C0]  // D    N.D. 4099 Se concatena el año al No Aprobación
  ws.Columns(5).ColumnWidth = 19[C0]  // E    N.D. 4090 Fecha / Hora (Expedicion o Cancelación)
  ws.Columns(6).ColumnWidth = 13[C0]  // F    Monto operacion
  ws.Columns(7).ColumnWidth = 13[C0]  // G    Monto del impuesto
  ws.Columns(8).ColumnWidth = 1[C0]  // H     //N.D. 4157 Estado del comprobante //N.D. 4109 ... formato SAT

  //N.D. 4109 Modifica el formato del campo según el SAT
  ws.Columns( 1).NumberFormat = '@'[C0]
  ws.Columns( 2).NumberFormat = '@'[C0]
  ws.Columns( 3).NumberFormat = '##########'[C0]
  ws.Columns( 4).NumberFormat = '@'[C0] //N.D. 4099 Se cambio el formato del dato para presentarse en excel
  ws.Columns( 5).NumberFormat = '@'[C0]
  ws.Columns( 6).NumberFormat = '##########.00' [C0] //N.D. 4109
  ws.Columns( 7).NumberFormat = '##########.00' [C0] //N.D. 4109
  ws.Columns( 8).NumberFormat = '@'[C0]
  
  constante kColInicio       'A'
  constante kColFin          'H'
  
  constante kRFC          'A'
  constante kSerie        'B'
  constante kFolio        'C'
  constante kAprobacion   'D' //N.D. 4099 No.Aprobación y Año
  constante kExpedicion   'E'
  constante kOperacion    'F'
  constante kImpuesto     'G'
  constante kEstado       'H'

FinSi
Si pFormato = kPantalla
  // Ancho de columnas = caracteres / 17 * 2.54
  //          C0         C2         C4         C6         C8         C10        C12        C14
  //          RFC        Serie      Folio      #AprobAño  Expedicion Monto      Impuestos  Estado 
  //          13         10         10         14         19         13         13         6

  //N.D. 4109  Columnas 16;3.00,0.15, 3.00,0.15, 3.00,0.15, 2.50,0.15, 3.50,0.15, 3.00,0.15, 2.00,0.15, 1.15,0.00
  Columnas 16;2.6,0.15,2.0,0.15,2.0,0.15,2.8,0.15,4.2,0.15,2.6,0.15,2.6,0.15,0.20,0.00
    [C0,C2,C4,C6,C8,C10,C12,C14].Blanco '' //N.D. Todas las columnas las hace de tipo texto 
//  [C0,C2,C6,C8].Blanco ''
//  N.D.4099  [C4,C6,C14].Decimales 0
//  [C4,C14].Decimales 0
//  [C4,C6,C10,C12].Coma
//  [C10,C12].Decimales kDecimales
Finsi
Si pFormato = kTXT
  Columnas 0;1
FinSi

// ************************************************************************************************************************************************************
// F U N C I O N E S
// ************************************************************************************************************************************************************
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:    fImprimeFormatoExcel
// Objetivo:  Imprime el cuerpo del reporte en formato de excel
// ************************************************************************************************************************************************************
DefFunc fImprimeFormatoExcel (aRFC; aSerie; aFolio; aNoAprob; aExpedicion; aOperacion; aImpuesto; aLeyendaEstado; aCancelacion)
Local lEstado //N.D. 4157
          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(kRFC        & 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(kAprobacion & RenActual).Borders(xlBordeDerecha).LineStyle = xlLineaSimple[C0]
          ws.Range(kExpedicion & RenActual).Borders(xlBordeDerecha).LineStyle = xlLineaSimple[C0]
          ws.Range(kOperacion  & RenActual).Borders(xlBordeDerecha).LineStyle = xlLineaSimple[C0]
          ws.Range(kImpuesto   & RenActual).Borders(xlBordeDerecha).LineStyle = xlLineaSimple[C0]
          ws.Range(kEstado     & RenActual).Borders(xlBordeDerecha).LineStyle = xlLineaSimple[C0]       
          ws.Range(kRFC        & RenActual).Value = aRFC[C0]
          ws.Range(kSerie      & RenActual).Value = aSerie[C0]
          ws.Range(kFolio      & RenActual).Value = aFolio[C0]
          ws.Range(kAprobacion & RenActual).Value = aNoAprob[C0]
	  // N.D. 4090 Imprime la fecha y hora según sea el caso de expedición o cancelación
	  Si aLeyendaEstado='Vigente'
	     ws.Range(kExpedicion & RenActual).Value = aExpedicion[C0]
             lEstado='1' //N.D. 4157 Solo muestra un 1 o un 0 según sea el caso de acuerdo al SAT, Anexo 20
	  FinSi	
	  Si aLeyendaEstado='Cancelado'
	     ws.Range(kExpedicion & RenActual).Value = aExpedicion[C0] //N.D.4196 aCancelacion[C0]
	     lEstado='0'  //N.D. 4157 Solo muestra un 1 o un 0 según sea el caso de acuerdo al SAT, Anexo 20
	  FinSi
	  //4108
	  Si aLeyendaEstado='No Emitido'
	     ws.Range(kExpedicion & RenActual).Value = ''[C0]
	     lEstado='N'  //N.D. 4157 En este caso pone un "NE", en el Sat no se considera este estado.
	  FinSi	

          ws.Range(kOperacion  & RenActual).Value = aOperacion[C0]
          ws.Range(kImpuesto   & RenActual).Value = aImpuesto[C0]
	  //N.D. 4090 Se pone la leyenda del estado como vigente al primer documento
	  //N.D. 4109 Solo se pone 1 o 0 según el formato del SAT	
          ws.Range(kEstado     & RenActual).Value = lEstado[C0] //N.D. 4157 Solo muestra un 1 o un 0 según sea el caso de acuerdo al SAT, Anexo 20
          // Avanza de renglon
          RenActual = RenActual + 1[C0]

FinFunc



// ************************************************************************************************************************************************************
// Nombre:    fImprimeEnPantalla
// Objetivo:  Imprime el cuerpo del reporte en pantalla
// ************************************************************************************************************************************************************
DefFunc fImprimeEnPantalla (aRFC; aSerie; aFolio; aNoAprob; aExpedicion; aOperacion; aImpuesto; aLeyendaEstado; aCancelacion)
Local lEstado //N.D. 4157
 
          lRenglon = ''
          lRenglon[0] =  '"'&aRFC //N.D. 4109
          lRenglon[2] =  '"'&aSerie //N.D. 4109
          lRenglon[4] =  '"'&aFolio //N.D. 4109
          lRenglon[6] =  '"'&aNoAprob

	  Si aLeyendaEstado='Vigente'
	          lRenglon[8] =  '"'&aExpedicion		
		  lEstado='1' //N.D. 4157 Solo muestra un 1 o un 0 según sea el caso de acuerdo al SAT, Anexo 20
	  FinSi
	  Si aLeyendaEstado='Cancelado'
	          lRenglon[8] =  '"'&aExpedicion //N.D.4196 aCancelacion		
		  lEstado='0' //N.D. 4157 Solo muestra un 1 o un 0 según sea el caso de acuerdo al SAT, Anexo 20
	  FinSi
	  //4108
	  Si aLeyendaEstado='No Emitido'
	     lRenglon[8] =''
             lEstado='N' //N.D. 4157 En este caso pone un "NE", en el Sat no se considera este estado.
	  FinSi

          lRenglon[10] = aOperacion
          lRenglon[12] = aImpuesto
	  //N.D. 4109 Solo se pone 1 o 0 según el formato del SAT	
          lRenglon[14] = lEstado //N.D. 4157 En este caso pone un "NE", en el Sat no se considera este estado.

          Imprime lRenglon

FINFUNC

// ************************************************************************************************************************************************************
// Nombre:    fEliminaCaracteresRaros
// Objetivo:  Cambia las vocales con acento o diérisis a vocales sin puntuación, esto para procesar la aduana y pedimento en el informe mensual en txt.
// ************************************************************************************************************************************************************
Deffunc fEliminaCaracteresRaros (aCadena)
	Local lLargo, lContador, lLargoCaracteres, lContador2
	lCaracteresRaros = 'áéíóúäëïöüÁÉÍÓÚÄËÏÖÜ'
	lCaracteresTransformados = 'aeiouaeiouAEIOUAEIOU'
	Caracter1=''
	Caracter2=''
	CaracterTemporal=''
	CadenaFinal = ''
	
	lContador = lContador2 = 0
	lLargo = @Len(aCadena)
	lLargoCaracteres = 20
	Mientras [lContador = 1; lContador <= lLargo; lContador = lContador + 1]
		Mientras [lContador2 = 1; lContador2 <= lLargoCaracteres; lContador2 = lContador2 +1]
			Si (@Substr(aCadena;lContador;1) = @Substr(lCaracteresRaros;lContador2;1))
				CaracterTemporal = @Substr(lCaracteresTransformados;lContador2;1)	
				FinCiclo
			SiNo
				CaracterTemporal =  @Substr(aCadena;lContador;1)
			FinSi
		FinMientras
		CadenaFinal = CadenaFinal & CaracterTemporal
	FinMientras
	CadenaFinal = @Mayusculas(CadenaFinal)
	Retorna CadenaFinal
FinFunc

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///    Nombre:  fImprimeDocumento
///    Imprime un documento electrónico, incluye cancelados
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
DEFFUNC fImprimeDocumento(atFoliosDig:TABLA; atDocumentos:TABLA; EstadoOriginal)
	Local 	lInfoAduanal		
    lCancelacion = ''    
    lBanImprimeDocto=0
    lTipoComprob = ''
	lCadenaPedi = ''	

	//N.D. 4108 poner en el estado la leyenda "No emitido"
	//Solamente se consideran los CFDs Cancelados y/o Emitidos O los cancelados
	//Si (atFoliosDig(cEstado) = 2 O atFoliosDig(cEstado) =3)
	lSerie = @Mayusculas(@SubStr(atDocumentos(cSerieDocumento);0;10))[C0] //N.D. 4109 cambiar a mayúsculas
	// Expedicion: dd/mm/yyyy hh:mm:ss N.D. 4109 en el caso de documentos tradicionales se deja el formato de hora en 00:00:00
	lExpedicion = @Substr(atFoliosDig(cFechaEmi);6;2) & '/' & @Substr(atFoliosDig(cFechaEmi);4;2) & '/' & @Substr(atFoliosDig(cFechaEmi);0;4) & ' ' & atFoliosDig(cHoraEmi)
		
	//Inicio N.D.5535 
	Si tParametros(CNUMIMPUESTOIVA) = 1
		lImpuesto = fRedondeaImporte(atDocumentos(cImpuesto1); kDecimales)
	FinSi	
	
	Si tParametros(CNUMIMPUESTOIVA) = 2
		lImpuesto = fRedondeaImporte(atDocumentos(cImpuesto2); kDecimales)
	FinSi	
	
	Si tParametros(CNUMIMPUESTOIVA) = 3
		lImpuesto = fRedondeaImporte(atDocumentos(cImpuesto3); kDecimales)
	FinSi
			
    //N.D.7123 Si el impuesto es 0, averigua si el primer producto está exento de IVA para no mostrar el importe de IVA.
	Si lImpuesto = 0.00
		//N.D.8032 Si es un pago electronico busca el documento origen
		Si atFoliosDig(cIdDoctoDe) = 9 O atFoliosDig(cIdDoctoDe) = 10 O atFoliosDig(cIdDoctoDe) = 12
			tMovimiento.Busca[@Str(atDocumentos(cIdDocumentoOrigen);0)]
		Sino
			tMovimiento.Busca[@Str(atDocumentos(cIdDocumento);0)] 
		FinSi       	
		Si tMovimiento->Encontro  
			tProducto.Busca[@Str(tMovimiento(cIdProducto);0)] 
			Si tProducto->Encontro	         	
				Si tProducto(cEsExento) = 1
					lImpuesto = ''
				FinSi	      			
			FinSi	          
		FinSi 
	FinSi

	lOperacion = fRedondeaImporte(atDocumentos(cTotal); kDecimales)
	
	//N.D. 4084  (ELVS) F@C - Validación para que el reporte presente sus importes en pesos
	Si atDocumentos(cIdmoneda) != 1
		//N.D.5535 La columna operación debe llevar el monto total, no el neto menos descuentos
		lTipoCambio = atDocumentos(cTipocam01)								
		lOperacion = fRedondeaImporte(lOperacion * lTipoCambio; kDecimales)
		lImpuesto =fRedondeaImporte(lImpuesto * lTipoCambio; kDecimales)				
	Finsi
	//Fin N.D.5535

	Escoge EstadoOriginal
		Caso 1  // 'No emitido'
			lEstado=2
			lLeyendaEstado = 'No Emitido'
		FinCaso
		Caso 2 // 'Vigente'
			lEstado=1
			lLeyendaEstado = 'Vigente'
		FinCaso
		Caso 3 // 'Cancelado'
			lEstado=0
			lLeyendaEstado = 'Cancelado'
		FinCaso
	FinEscoge		

	Si atDocumentos(cRFC) != ''
		lRFC = @Mayusculas(@Substr(atDocumentos(cRFC);0;13))
	Sino
		tClientes.Busca[@Str(atDocumentos(cIdClienteProveedor);0)]
		Si tClientes->Encontro
			lRFC = @Mayusculas(@Substr(tCLientes(cRFC);0;13))
		FinSi
	FinSi 

	lCadenaTemp = ''
	lCadenaTemp = @SubStr(lRFC;3;1)
	Si lCadenaTemp = ' '
		lRFC1 = ' '
		lRFC2 = ' '
		lRFC1 = @SubStr(lRFC;0;3)
		lRFC2 = @SubStr(lRFC;4;@Len(lRFC)-1)
		lRFC = ''
		lRFC= lRFC1 & lRFC2
	FinSi

	//N.D.6546 Se agrega el documento modelo de honorarios del cliente
	//N.C.275 Factura y nota de cargo cte son ingresos, dev s/venta y nota de credito son egresos
	//N.C.502 Se agregan los conceptos de abonos del cliente como ingresos
	Si atFoliosDig(cIdDoctoDe) = 4 O atFoliosDig(cIdDoctoDe) = 13 O atFoliosDig(cIdDoctoDe) = 9 O atFoliosDig(cIdDoctoDe) = 10 O atFoliosDig(cIdDoctoDe) = 11 O atFoliosDig(cIdDoctoDe) = 12
		lTipoComprob = 'I' //Ingreso
		//N.C.315 Lee el concepto del documento para identificar si es carta porte
		tConceptoDocto.Busca[@Str(atDocumentos(CIDCONCE01);0)]
		Si tConceptoDocto->Encontro
			lCartaPorte = tConceptoDocto(cCartaPor)
		FinSi
		Si atFoliosDig(cIdDoctoDe) = 4 Y lCartaPorte
			lTipoComprob = 'T' //Traslado
		FinSi				
	FinSi
	Si atFoliosDig(cIdDoctoDe) = 5 O atFoliosDig(cIdDoctoDe) = 7
		lTipoComprob = 'E' //Egreso
	FinSi

	// Inicializacion de la bandera para indicar que se ha impreso al menos un documento
	gAlgunDocumentoImpreso = 1
	
	//N.D. 4097 Se manejan 4 tipo de documentos diferentes para el reporte
	Escoge pImprimeDoctos
	    Caso kTradicionales
      	    Si atFoliosDig(cEsTrad) = 1 Y (atFoliosDig(cNoAprob)!=0 O atFoliosDig(cNoAprob)!='') //Y pImprimeDoctos=0 //4152
				// N.C.351 (ALRH)					
				lAprobacion = @Str(atFoliosDig(cNoAprob);0) //N. D. 7096
				// Expedicion: dd/mm/yyyy N.D. 4109 en el caso de documentos tradicionales se deja el formato de hora en 00:00:00
				lExpedicion = @Substr(atFoliosDig(cFechaEmi);6;2) & '/' & @Substr(atFoliosDig(cFechaEmi);4;2) & '/' & @Substr(atFoliosDig(cFechaEmi);0;4) & ' ' & '00:00:00'
				lBanImprimeDocto=1
				// Cancelación: dd/mm/yyyy N.D. 4109 en el caso de documentos tradicionales se deja el formato de hora en 00:00:00
				Si lEstado=0
					lCancelacion=@Substr(atFoliosDig(cFechaCanc);6;2) & '/' & @Substr(atFoliosDig(cFechaCanc);4;2) & '/' & @Substr(atFoliosDig(cFechaCanc);0;4) & ' ' & '00:00:00'
				FinSi
			FinSi
		FinCaso
		Caso kCFDs
			Si atDocumentos(cEsCFD) = 1 //Y pImprimeDoctos=1
				lAprobacion=@Substr(atFoliosDig(cFecAprob);0;4)&atFoliosDig(cNoAprob) //N.D. 4097
				//N.D. 4108 CFDs No emitidos
				lBanImprimeDocto=1
				Si pNoEmitidos=kNoEmitidosNo Y lEstado=2
					lBanImprimeDocto=0
				FinSi
				// N.D.6949 (ALRH) Omitir si se trata de un CFDi o un CBB
				Si atFoliosDig(CESTRAD) = 3 O atFoliosDig(CESTRAD) = 2
					lBanImprimeDocto = 0
				FinSi
				Si lEstado=0
					lCancelacion=@Substr(atFoliosDig(cFechaCanc);6;2) & '/' & @Substr(atFoliosDig(cFechaCanc);4;2) & '/' & @Substr(atFoliosDig(cFechaCanc);0;4) & ' ' & atFoliosDig(cHoraCanc)
				FinSi
			FinSi 
		FinCaso
		// El Autoimpreso se comporta como un documento tradicional pero sin No. de Aprobación
		Caso kAutoimpresos 
			Si atFoliosDig(cEsTrad) = 1 Y (atFoliosDig(cNoAprob)=0 O atFoliosDig(cNoAprob)='') //Y pImprimeDoctos=2 //4152
				lBanImprimeDocto=1
				lAprobacion='' //N.D. 4108
				Si lEstado=0
					lCancelacion=@Substr(atFoliosDig(cFechaCanc);6;2) & '/' & @Substr(atFoliosDig(cFechaCanc);4;2) & '/' & @Substr(atFoliosDig(cFechaCanc);0;4) & ' ' & atFoliosDig(cHoraCanc)
				FinSi
			FinSi			
		FinCaso
		Caso kTodos
			Si pImprimeDoctos=3
				Si atDocumentos(cEsCFD)=1
					lAprobacion=@Substr(atFoliosDig(cFecAprob);0;4)&atFoliosDig(cNoAprob) //N.D. 4108
					lBanImprimeDocto=1
					//N.D. 4108 CFDs No emitidos
					Si pNoEmitidos=kNoEmitidosNo Y lEstado=2
						lBanImprimeDocto=0
					FinSi
					// N.D.6949 (ALRH) Omitir si se trata de un CFDi
					Si atFoliosDig(CESTRAD) = 3
						lBanImprimeDocto = 0
					FinSi
					Si lEstado=0
					   lCancelacion=@Substr(atFoliosDig(cFechaCanc);6;2) & '/' & @Substr(atFoliosDig(cFechaCanc);4;2) & '/' & @Substr(atFoliosDig(cFechaCanc);0;4) & ' ' & atFoliosDig(cHoraCanc)
					FinSi
				SiNo //Tradicionales
					Si atFoliosDig(cEsTrad) = 1 Y (atFoliosDig(cNoAprob)!=0 O atFoliosDig(cNoAprob)!='') //4152
						// N.C.351 (ALRH)
						// N.D.7706 ALRH
						lAprobacion = @Str(atFoliosDig(cNoAprob);0)
						// Expedicion: dd/mm/yyyy N.D. 4109 en el caso de documentos tradicionales se deja el formato de hora en 00:00:00
						lExpedicion = @Substr(atFoliosDig(cFechaEmi);6;2) & '/' & @Substr(atFoliosDig(cFechaEmi);4;2) & '/' & @Substr(atFoliosDig(cFechaEmi);0;4) & ' ' & '00:00:00'
						lBanImprimeDocto=1		
						Si lEstado=0
							// Expedicion: dd/mm/yyyy N.D. 4109 en el caso de documentos tradicionales se deja el formato de hora en 00:00:00
							lCancelacion=@Substr(atFoliosDig(cFechaCanc);6;2) & '/' & @Substr(atFoliosDig(cFechaCanc);4;2) & '/' & @Substr(atFoliosDig(cFechaCanc);0;4) & ' ' & '00:00:00'
						FinSi
					SiNo //AutoImpresos		
						lAprobacion='' //N.D. 4097
						lBanImprimeDocto=1		
						// N.D.6949 (ALRH) Omitir si se trata de un CBB
						Si atFoliosDig(CESTRAD) = 2
							lBanImprimeDocto = 0
						FinSi
						Si lEstado=0
							lCancelacion=@Substr(atFoliosDig(cFechaCanc);6;2) & '/' & @Substr(atFoliosDig(cFechaCanc);4;2) & '/' & @Substr(atFoliosDig(cFechaCanc);0;4) & ' ' & atFoliosDig(cHoraCanc)
						FinSi
					FinSi
				FinSi
			FinSi 
		FinCaso
	FinEscoge		
	Si lBanImprimeDocto=1
		//N.D. 4090 Se hicieron funciones para mandar a formato de excel y en pantalla
		Escoge pFormato
			Caso kExcel //manda llamar la función en formato de excel
				//Si @Substr(atFoliosDig(cFechaEmi);0;6)=gFechaMes 
				Si lEstado=1 O lEstado = 0
					fImprimeFormatoExcel(lRFC; lSerie; atDocumentos(cFolio); lAprobacion; lExpedicion; lOperacion; lImpuesto; lLeyendaEstado; lCancelacion) //N.D. 4108
				SiNo
					fImprimeFormatoExcel(lRFC; lSerie; atDocumentos(cFolio); lAprobacion; lExpedicion; lOperacion; lImpuesto; lLeyendaEstado; lCancelacion) //N.D. 4108, N.D.6086
				FinSi
				//FinSi
				//Si @Substr(atFoliosDig(cfechacanc);0;6)=gFechaMes Y lEstado=0
				//	fImprimeFormatoExcel(lRFC; lSerie; atDocumentos(cFolio); lAprobacion; lExpedicion; lOperacion; lImpuesto; lLeyendaEstado; lCancelacion)
				//FinSi
			FinCaso
			Caso kPantalla //manda llamar la función de imprimir en Pantalla
				//Si @Substr(atFoliosDig(cFechaEmi);0;6)=gFechaMes
				//fImprimeEnPantalla(lRFC; lSerie; atDocumentos(cFolio); lAprobacion; lExpedicion; lOperacion; lImpuesto; 'Vigente'; lCancelacion) //N.D. 4108
				Si lEstado=1  O lEstado = 0
					fImprimeEnPantalla(lRFC; lSerie; atDocumentos(cFolio); lAprobacion; lExpedicion; @Str(lOperacion;kDecimales); @Str(lImpuesto;kDecimales); lLeyendaEstado; lCancelacion) //N.D. 4108 //N.D.6519
				SiNo
					fImprimeEnPantalla(lRFC; lSerie; atDocumentos(cFolio); lAprobacion; lExpedicion; @Str(lOperacion;kDecimales); @Str(lImpuesto;kDecimales); lLeyendaEstado; lCancelacion) //N.D. 4108, N.D.6086, //N.D.6519
				FinSi
				//FinSi
				//Si @Substr(atFoliosDig(cfechacanc);0;6)=gFechaMes Y lEstado=0
				//	fImprimeEnPantalla(lRFC; lSerie; atDocumentos(cFolio); lAprobacion; lExpedicion; lOperacion; lImpuesto; lLeyendaEstado; lCancelacion)
				//FinSi
			FinCaso
			Caso kTXT
				Columnas 0;1
				//N.D6063 IYPZ Se imprimen en txt los documentos en estado de emitido o cancelado
				Si (lEstado = 1 O lEstado = 0)
					//Si @Substr(atFoliosDig(cFechaEmi);0;6)=gFechaMes
					//N.D.6226 Lee la informaición aduanal de la tabla de folios digitales.
					lInfoAduanal = atFoliosDig(cCadPedi)
					Si lInfoAduanal = ''
						lInfoAduanal = kSeparador & kSeparador
					SiNo
						//c.5890001: Aduana sin acento, diérisis ni minusculas.
						lInfoAduanal = fEliminaCaracteresRaros(lInfoAduanal)
					FinSi
					lRenglon = kSeparador & lRFC & kSeparador & lSerie & kSeparador & atDocumentos(cFolio) & kSeparador & lAprobacion & kSeparador & lExpedicion & kSeparador & @Str(lOperacion;kDecimales) & kSeparador & @Str(lImpuesto;kDecimales) & kSeparador & lEstado & kSeparador & lTipoComprob & kSeparador & lInfoAduanal & kSeparador
					//FPP:
					Si (@Len(lRenglon) > 990)
						lRenglon2 = @Substr(lRenglon;990;@Len(lRenglon)-990)
						//@Substr(x;y;z) --> Extrae z caracteres de la cadena x a partir de la posición y.
						lRenglon = @Substr(lRenglon;0;990)
					FinSi
					//lTamano = @Len(lRenglon) + 50//25
					// Ancho de columnas = caracteres / 17 * 2.54
					//lColumna = (lTamano / 17) * 2.54
					// N.D.6997 ALRH Cada caracter mide 0.2125 centímetros
					lColumna = @Len(lRenglon) * 0.2125
					// N.D.7075 ALRH Por cada 255 caracteres, eliminar el espacio en blanco agregado después de cada 255 caracteres
					lEspacios = @Int(@Len(lRenglon) / 255)
					lColumna = lColumna - (lEspacios * 0.2125)
					// Después de obtener el ancho de columna en base a la longitud de lRenglon, 
					// si se trata de una cadena cuyo tamaño sea múltiplo de 255,
					// se aumenta el ancho de la columna para que no se coma el último | 
					Si @Int(@Len(lRenglon) / 255) = (@Len(lRenglon) / 255)
						lColumna = lColumna + (0.2125 / 2)
					FinSi
					Columnas 2;lColumna,0
					Texto @Substr(lRenglon; 0; @Len(lRenglon))
					Imprime
					//FPP:
					Si (@Len(lRenglon2) > 0)
						Texto @Substr(lRenglon2; 0; @Len(lRenglon2))
						Imprime
						lRenglon2 = ''
					FinSi
					//FinSi
					//Si @Substr(atFoliosDig(cfechacanc);0;6)=gFechaMes Y lEstado=0
					//N.D.4196 Se modifica la fecha y hora de cancelación por la de la emisión del documento lCancelacion
					//lRenglon = kSeparador & lRFC & kSeparador & lSerie & kSeparador & atDocumentos(cFolio) & kSeparador & lAprobacion & kSeparador & lCancelacion & kSeparador & @Str(lOperacion;kDecimales) & kSeparador & @Str(lImpuesto;kDecimales) & kSeparador & 0 & kSeparador
					//    lRenglon = kSeparador & lRFC & kSeparador & lSerie & kSeparador & atDocumentos(cFolio) & kSeparador & lAprobacion & kSeparador & lExpedicion & kSeparador & @Str(lOperacion;kDecimales) & kSeparador & @Str(lImpuesto;kDecimales) & kSeparador & 0 & kSeparador
					//    lTamano = @Len(lRenglon) + 50//25
					// Ancho de columnas = caracteres / 17 * 2.54
					//    lColumna = (lTamano / 17) * 2.54
					//    Columnas 2;lColumna,0
					//    Texto @Substr(lRenglon; 0; @Len(lRenglon))  
					//    Imprime
					//FinSi // fin del lBanCancelado=1
				FinSi
			FinCaso
		FinEscoge
	FinSi //Fin del si se imprime
	//N.D. 4108 poner en el estado la leyenda "No emitido"
	//FinSi //Fin del (atFoliosDig(cEstado) = 2 O atFoliosDig(cEstado) =3)
FINFUNC

// ************************************************************************************************************************************************************
// Nombre:    fCalculaRenglon
// Objetivo:  Verifica que una cadena no sea mayor de 990 caracteres porque es el máximo que permite el reporteador.
// Entradas:  aRenglon --> Cadena para evaluar el largo.
//			  aRenglon2 --> Cadena donde se guarda el restante de la cadenota
// ************************************************************************************************************************************************************
DEFFUNC fCalculaRenglon (aRenglon; aRenglon2)
	Si (@Len(aRenglon) > 990)
		aRenglon2 = @Substr(aRenglon;990;@Len(aRenglon)-990)
		aRenglon = @Substr(aRenglon;0;990)
	FinSi
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 = 'I N F O R M E   M E N S U A L   A L   S A T'[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 = 'Mes: ' & @Escoge(kMeses; pMes-1)[C0]
      ws.Range(kColInicio & RenActual & ':' & kColFin & RenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0]
      // Avanza de renglon
      RenActual = RenActual + 1[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(kRFC        & 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(kAprobacion & RenActual).Borders(xlBordeDerecha).LineStyle = xlLineaSimple[C0]
      ws.Range(kExpedicion & RenActual).Borders(xlBordeDerecha).LineStyle = xlLineaSimple[C0]
      ws.Range(kOperacion  & RenActual).Borders(xlBordeDerecha).LineStyle = xlLineaSimple[C0]
      ws.Range(kImpuesto   & RenActual).Borders(xlBordeDerecha).LineStyle = xlLineaSimple[C0]
      ws.Range(kEstado     & RenActual).Borders(xlBordeDerecha).LineStyle = xlLineaSimple[C0]
      ws.Range(kRFC        & RenActual).Value = 'R.F.C.'[C0]
      ws.Range(kSerie      & RenActual).Value = 'Serie'[C0]
      ws.Range(kFolio      & RenActual).Value = 'Folio'[C0]
      ws.Range(kAprobacion & RenActual).Value = 'Aprobación'[C0]  //N.D.3838
      ws.Range(kExpedicion & RenActual).Value = 'Expedición'[C0]  //N.D.4196 //N.D.4090 N.D. 4109
      ws.Range(kOperacion  & RenActual).Value = 'Operación'[C0]
      ws.Range(kImpuesto   & RenActual).Value = 'Impuesto'[C0]
      ws.Range(kEstado     & RenActual).Value = 'E'[C0] //N.D. 4157 En este caso pone un "NE", en el Sat no se considera este estado. //N.D. 4109 Estado
      // Avanza de renglon
      RenActual = RenActual + 1[C0]
      Excel.Rows(RenActual & ':' & RenActual).Select
      Excel.ActiveWindow.FreezePanes = True
      ws.Range(kColInicio & RenActual).Select
    FinCaso
    Caso kPantalla
      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}' & 'INFORME MENSUAL AL SAT'
      Imprime
      Texto '^@TC{0,0,0}@S{16}'& 'Mes: ' & @Escoge(kMeses; pMes-1)
      Imprime 
      NEGRITAS TRUE
      Altura 9
      Texto '@TC{0,0,0}@L{-1}'
      Imprime 
      //N.D 4109 Formato 	
      Texto C0;'"R.F.C'
      Texto C2;'"Serie'
      Texto C4;'"Folio '
      Texto C6;'"Aprobación ' //N.D.3838
      Texto C8;'"Expedición'  //N.D.4196//N.D.4090
      Texto C10;'"Operación '
      Texto C12;'"Impuesto '
      Texto C14;'"E' //N.D. 4157 En este caso pone un "NE", en el Sat no se considera este estado. //N.D. 4109 Estado
      Imprime
      Texto '@TC{0,0,0}@L{-1}'
      Imprime 
      NEGRITAS FALSE  
    FinCaso
  FinEscoge
FinEncab


// ************************************************************************************************************************************************************
// Cuerpo del reporte
// ************************************************************************************************************************************************************
// Inicializacion de la bandera para indicar que no se ha impreso documento alguno
gAlgunDocumentoImpreso = 0

lExpedicion=''
//N.D.4090 Declaración de variables
lCancelacion=''
lSerie=''
//N.D.4099
lAprobacion=''

//N.D. 4090 Se hace un barrido de documentos de todo el ejercicio a fin de localizar documentos emitidos en 
//periodos diferentes pero cancelados en el periodo solicitado en el reporte.
//Para localizar el primer documento del ejercicio/mes
gFechaBusqueda = gFechaMes & '01' 

//Parametros
tParametros.Busca Primero

//N.D.6530
//N.D.277 - CONTPAQi F@C
lIdMoneda1 = '1' //Moneda Base
tMoneda.Busca[lIdMoneda1]
// N.D.6896 (ALRH)
//kDecimales = tMoneda(cDecimalesMoneda)
kDecimales = 2

// Se todos los documentos que estén dentro del rango de fechas
Mientras @VAL(@SUBSTR(gFechaBusqueda;4;2)) = @VAL(@SUBSTR(gFechaMes;4;2)) 

    tDocumentos.Busca[gFechaBusqueda]

    Mientras tDocumentos->Encontro
        tFoliosDig.Busca[@Str(tDocumentos(cIdDocumento);0)]    
        //N.D. 4090 Se valida que la fecha de emisión o cancelación estén dentro del periodo
        Si tFoliosDig->Encontro Y @Substr(tFoliosDig(cFechaEmi);0;6)=gFechaMes           
          // N.D.6999, N.D.7019 ALRH Rectificar el estado del Documento para el caso de tradicionales. 
					//Si es tradicional
					Si ( tDocumentos(cEsCFD) = 0 )
						//N.D.7548 Si esta cancelado y sí tiene fecha de cancelación, se imprime primero como vigente
						Si tDocumentos(cCancelado) = 1 Y tFoliosDig(cFechaCanc) != '        '
							lEstado = 2						
          	Sino
            	lEstado = tFoliosDig(cEstado)
          	FinSi
						fImprimeDocumento(tFoliosDig; tDocumentos; lEstado)
					FinSi
					//N.D.7019 IYPZ Si es CFD versión 2 y está cancelado, lo imprime como emitido ya que los cancelados se procesan aparte
					Si ( tDocumentos(cEsCFD) = 1 Y tFoliosDig(cEsTrad) = 0 )
 						fImprimeDocumento(tFoliosDig; tDocumentos; tFoliosDig(cEstado) = 3 ? 2: tFoliosDig(cEstado)) 
					FinSi
        FinSi
        tDocumentos.Busca Siguiente[1]
    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
            fImprimeDocumento(tFoliosCancelados; tDocto; 3)                                           
        FINSI 
        tFoliosCancelados.Busca Siguiente[1]
   FinMientras

  
    gFechaBusqueda = fFechaSiguiente(gFechaBusqueda)
FinMientras

//N.D.4208 Reacomodo de la información del Estado en el reporte
//N.D.4157 Pie de página
Escoge pFormato
	Caso kPantalla
		//Imprime un renglón en blanco
		lRenglon[0] = ''
		lRenglon[2] = ''
		lRenglon[4] = ''
		lRenglon[6] = ''
		lRenglon[8] = ''
		lRenglon[10] = ''
		lRenglon[12] = ''
		lRenglon[14] = ''
		Imprime lRenglon
		//Imprime un renglón en blanco
		Imprime lRenglon
		//Imprime la leyenda del estado
		lRenglon[0] = 'E = Estado'
		Imprime lRenglon
		lRenglon[0] = '1 = Vigente'
		Imprime lRenglon
		lRenglon[0] = '0 = Cancelado'
		Imprime lRenglon
		Si pNoEmitidos=kNoEmitidosSi
			lRenglon[0] = 'N = No Emitido'
			Imprime lRenglon
		FinSi
	FinCaso
	Caso kExcel
		//Imprime un renglón en blanco
		ws.Range('A'& RenActual).Value = ''
		ws.Range('B'& RenActual).Value = ''
		ws.Range('C'& RenActual).Value = ''
		ws.Range('D'& RenActual).Value = ''
	        // Avanza de renglon
        	RenActual = RenActual + 1[C0]

		//Imprime un renglón en blanco
	        // Avanza de renglon
        	RenActual = RenActual + 1[C0]

		ws.Range('A'& RenActual).Value = 'E = Estado'
	        // Avanza de renglon
        	RenActual = RenActual + 1[C0]

		ws.Range('A'& RenActual).Value = '1 = Vigente'
	        // Avanza de renglon
        	RenActual = RenActual + 1[C0]

		ws.Range('A'& RenActual).Value = '0 = Cancelado'
	        // Avanza de renglon
        	RenActual = RenActual + 1[C0]

		Si pNoEmitidos=kNoEmitidosSi
			ws.Range('A'& RenActual).Value = 'N = No Emitido'
		        // Avanza de renglon
        		RenActual = RenActual + 1[C0]
		FinSi
	FinCaso
FinEscoge
//N.D. 4157 Termina el pie de página para imprimir el Estado 



Si gAlgunDocumentoImpreso = 0 Y pFormato = kTXT
  Columnas 0;2
  Texto 'No existen documentos'
  Imprime
FinSi
