// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//
//	AnIVAPagado.rpt
//	Nombre del reporte en el sistema: Análisis de IVA por Documento de Pago.
//
//  Sistema: AdminPAQ v1.1
// 
//	 Este reporte perteneciente al módulo de ventas y compras, despliega en Excel
//  un listado de documentos pagados con el desglose de IVA para un rango de 
//  fechas dado.
//
//	Consideraciones especiales:
//  
//	Elaboró:    Daniel Robles de Alba
//	Fecha: 	   06 de marzo del 2002.
//
//  Historia de revisiones:
//	Autor:
//	Fecha:

// 14/11/2005   HVA    N.D.3469    Los importes en moneda extranjera no eran correctos.
// 23/08/2006   HVA    N.C.109    Reforma Fiscal se le agregaron 2 columnas de proveedor, 1 de concepto y 2 de retenciones
//
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<


// *****************************************************************************
// Funciones de librería

Incluye LibAdminPAQ.Rpt


// *****************************************************************************
//	Parámetros del reporte:

Parametro pFechaInicial = '20020101'    // Fecha inicial del rango
Parametro pFechaFinal = '20021231'      // Fecha final del rango
Parametro pIdMoneda = 1                 // Id de la moneda a expresar el reporte
Parametro pTipoReporte = 0              // Si es salida por factura o compra
                                        // 0 = Factura
                                        // 1 = Compra


// *****************************************************************************
//	Tablas a utilizar e Indices de búsqueda por omisión

UsaEmpresa tEmpresa;'ADMINPAQW'                   // Parámetros

UsaTabla tPagos = tEmpresa['MGW10008'] Alias 'tDoc1' // Documentos de pago
tPagos.Usaindice['cFecha']                           // cFecha

UsaTabla tDocumento = tEmpresa['MGW10008'] Alias 'tDoc2' // Documentos
tDocumento.Usaindice['']                                 // Indice primario: cIdDocumento

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

UsaTabla tAsociacion = tEmpresa['MGW10009']       // Asociación
tAsociacion.Usaindice['']                         // Indice primario: cIdDocumentoAbono+cIdDocumentoCargo

UsaTabla tProducto = tEmpresa['MGW10005']         // Productos
tProducto.Usaindice['']                           // Indice primario: cIdProducto

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

UsaTabla tTipoCambio = tEmpresa['MGW10035']       // Tipos de cambio entre monedas
tTipoCambio.Usaindice['iMonedaFecha']             // cIdMoneda+cFecha

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

Usatabla tTiposCambioLib = tEmpresa['mgw10035'] Alias 'tTipoC'
tTiposCambioLib.Usaindice['iMonedaFecha']                                  

UsaTabla tClienteProveedorTmp = tEmpresa['MGW10002']  Alias tCProv // Clientes/Proveedores
tClienteProveedorTmp.Usaindice['']                   // Indice primario: cIdClienteProveedor

//Clientes y Provedores. 
//Índice: cCodigoCliente + cTipoCliente.
UsaTabla tClientes = tEmpresa['mgw10002']
tClientes.Usaindice['iCodigoTipo']                            

// Conceptos de los documentos
UsaTabla tConceptos = tEmpresa['mgw10006']     
tConceptos.UsaIndice['cIdConceptoDocumento']



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

Columnas 40;1

Usaletra 'Arial'
Altura 9


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

gIdioma = 0             // Idioma del reporte
                        // 0 = Español
                        // 1 = Inglés
gDecimalesMoneda = 2    // Número de decimales en la moneda
gNeto = 0               // Bases del IVA (15,10,0,etc)
gImpuesto = 0           // IVAs (15,10,0,etc)
gProporcional = 0       // Proporciones de IVA sobre el neto del documento
gTotalConIVA = 0        // Importes con IVA
gTotalSinIVA = 0        // Importes sin IVA
gIVA = 0                // IVA al 15% y al 10%
gGranTotalConIVA = 0    // Acumulado de importes con IVA
gGranTotalSinIVA = 0    // Acumulado de importes sin IVA
gGranNeto = 0           // Acumulado del neto
gGranTotal = 0          // Acumulado del importe pagado
gGranIVA = 0            // Acumulado del IVA al 15% y al 10%
gGranRetencion = 0
gIdDocumento = 0        // Documento relacionado con el documento de pago
gnImporte = 0           // Importe pagado
gNumImpuesto = 1        // Cúal de los tres impuesto es usado



[C0..C5].Decimales 0
[C7..C11].Decimales 0
tMoneda.Busca[@Str(pIdMoneda;0)]
gDecimalesMoneda = tMoneda(cDecimalesMoneda)
[C6].Decimales gDecimalesMoneda
[C12..C38].Decimales gDecimalesMoneda

tParametros.Busca Primero
// Número de impuesto que tiene el IVA
gNumImpuesto = tParametros(cNumImpuestoIVA)
Si gNumImpuesto > 0 // ND-255
  gNumImpuesto = gNumImpuesto - 1 // (0 = Impuesto1, 1 = Impuesto2, 2 = Impuesto3)
FinSi

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

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

// Pone la longitud de cada columna
// Fecha pago = 12 caracteres
ws.Columns(1).ColumnWidth = 12[C0]
// Serie pago = 5 caracteres
ws.Columns(2).ColumnWidth = 5[C0]
// Folio pago = 8 caracteres
ws.Columns(3).ColumnWidth = 8[C0]


// Codigo Proveedor
ws.Columns(4).ColumnWidth = 18[C0]
// Proveedor
ws.Columns(5).ColumnWidth = 25[C0]
// Concepto
ws.Columns(6).ColumnWidth = 25[C0]



// Importe pagado = 15 caracteres
ws.Columns(7).ColumnWidth = 14[C0]
// Serie factura = 5 caracteres
ws.Columns(8).ColumnWidth = 5[C0]
// Folio factura = 8 caracteres
ws.Columns(9).ColumnWidth = 8[C0]
// Total 15% = 15 caracteres
ws.Columns(10).ColumnWidth = 15[C0]
// Total 10% = 15 caracteres
ws.Columns(11).ColumnWidth = 15[C0]
// Total 0% = 15 caracteres
ws.Columns(12).ColumnWidth = 15[C0]
// Total Exento = 15 caracteres
ws.Columns(13).ColumnWidth = 15[C0]
// Total Otros = 15 caracteres
ws.Columns(14).ColumnWidth = 15[C0]
// Base 15% = 15 caracteres
ws.Columns(15).ColumnWidth = 15[C0]
// Base 10% = 15 caracteres
ws.Columns(16).ColumnWidth = 15[C0]
// Base 0% = 15 caracteres
ws.Columns(17).ColumnWidth = 15[C0]
// Base Exento = 15 caracteres
ws.Columns(18).ColumnWidth = 15[C0]
// Base Otros = 15 caracteres
ws.Columns(19).ColumnWidth = 15[C0]
// Neto = 15 caracteres
ws.Columns(20).ColumnWidth = 15[C0]
// IVA 15% = 15 caracteres
ws.Columns(21).ColumnWidth = 15[C0]
// IVA 10% = 15 caracteres
ws.Columns(22).ColumnWidth = 15[C0]
// IVA Otros = 15 caracteres
ws.Columns(23).ColumnWidth = 15[C0]

// Retencion 1
ws.Columns(24).ColumnWidth = 15[C0]
// Retencion 2
ws.Columns(25).ColumnWidth = 15[C0]



// *****************************************************************************
//  fConfiguraDecimales
//
//	Configura el número de decimales de las columnas de importes, basado 
//  en los parámetros de la empresa.
//
//  Parámetros 
//
//  Salidas 
// *****************************************************************************
DefFunc fConfiguraDecimales()
  LOCAL lDigDecimales, lDecs, lFormato

  lDigDecimales = '0000000000'

  // Busca el registro de la moneda del documento
  tMoneda.Busca[@Str(pIdMoneda;0)]
  Si tMoneda->Encontro // Si lo encontró
    lDecs = @SUBSTR(lDigDecimales;1;tMoneda(cDecimalesMoneda))
//    lFormato = '#,##0.' & lDecs & '_);[Rojo](#,##0.' & lDecs & ')'
    lFormato = '#,##0.' & lDecs & '_);(#,##0.' & lDecs & ')'
    ws.Columns(7).NumberFormat = lFormato[C0]
    ws.Columns(10).NumberFormat = lFormato[C0]
    ws.Columns(11).NumberFormat = lFormato[C0]
    ws.Columns(12).NumberFormat = lFormato[C0]
    ws.Columns(13).NumberFormat = lFormato[C0]
    ws.Columns(14).NumberFormat = lFormato[C0]
    ws.Columns(15).NumberFormat = lFormato[C0]
    ws.Columns(16).NumberFormat = lFormato[C0]
    ws.Columns(17).NumberFormat = lFormato[C0]
    ws.Columns(18).NumberFormat = lFormato[C0]
    ws.Columns(19).NumberFormat = lFormato[C0]
    ws.Columns(20).NumberFormat = lFormato[C0]

    ws.Columns(21).NumberFormat = lFormato[C0]
    ws.Columns(22).NumberFormat = lFormato[C0]
    ws.Columns(23).NumberFormat = lFormato[C0]
    ws.Columns(24).NumberFormat = lFormato[C0]
    ws.Columns(25).NumberFormat = lFormato[C0]
    ws.Columns(26).NumberFormat = lFormato[C0]
    ws.Columns(27).NumberFormat = lFormato[C0]
    ws.Columns(28).NumberFormat = lFormato[C0]
    ws.Columns(29).NumberFormat = lFormato[C0]


  Sino // Si no encontró el registro de la empresa
    [C8..C32].Decimales 2
//    ws.Columns(6).NumberFormat = '#,##0.00_);[Rojo](#,##0.00)'[C0]
    ws.Columns(7).NumberFormat = '#,##0.00_);(#,##0.00)'[C0]
    ws.Columns(10).NumberFormat = '#,##0.00_);(#,##0.00)'[C0]
    ws.Columns(11).NumberFormat = '#,##0.00_);(#,##0.00)'[C0]
    ws.Columns(12).NumberFormat = '#,##0.00_);(#,##0.00)'[C0]
    ws.Columns(13).NumberFormat = '#,##0.00_);(#,##0.00)'[C0]
    ws.Columns(14).NumberFormat = '#,##0.00_);(#,##0.00)'[C0]
    ws.Columns(15).NumberFormat = '#,##0.00_);(#,##0.00)'[C0]
    ws.Columns(16).NumberFormat = '#,##0.00_);(#,##0.00)'[C0]
    ws.Columns(17).NumberFormat = '#,##0.00_);(#,##0.00)'[C0]
    ws.Columns(18).NumberFormat = '#,##0.00_);(#,##0.00)'[C0]
    ws.Columns(19).NumberFormat = '#,##0.00_);(#,##0.00)'[C0]
    ws.Columns(20).NumberFormat = '#,##0.00_);(#,##0.00)'[C0]

    ws.Columns(21).NumberFormat = '#,##0.00_);(#,##0.00)'[C0]
    ws.Columns(22).NumberFormat = '#,##0.00_);(#,##0.00)'[C0]
    ws.Columns(23).NumberFormat = '#,##0.00_);(#,##0.00)'[C0]
    ws.Columns(24).NumberFormat = '#,##0.00_);(#,##0.00)'[C0]
    ws.Columns(25).NumberFormat = '#,##0.00_);(#,##0.00)'[C0]
    ws.Columns(26).NumberFormat = '#,##0.00_);(#,##0.00)'[C0]
    ws.Columns(27).NumberFormat = '#,##0.00_);(#,##0.00)'[C0]
    ws.Columns(28).NumberFormat = '#,##0.00_);(#,##0.00)'[C0]
    ws.Columns(29).NumberFormat = '#,##0.00_);(#,##0.00)'[C0]
  FinSi
FinFunc


// *****************************************************************************
//  fImprimeDocumento
//
//	 Esta función imprime los datos del documento y los calculados
//
//  Parámetros 
//
//  Salidas 
// *****************************************************************************
DefFunc fImprimeDocumento(atPagos: Tabla; atDocumento: Tabla; anImporte; aTotalConIVA; aTotalSinIVA; aNeto; aIVA; aRetencion)
  Local lFechaEditada

  // Manda a Excel  Pagos(cFecha), Pagos(cSerieDocumento), Pagos(cFolio), nImporte
  // Manda a Execl  Documentos(cSerieDocumento), Documentos(cFolio),  Documentos(cFecha)
  // Manda a Excel  TotalConIVA(0..3), TotalSinIVA(0..3), Neto, IVA(0...1)

  // Avanza de renglon
  RenActual = RenActual + 1[C0]
  ws.Range('A' & RenActual & ':Y' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
  ws.Range('A' & RenActual & ':Y' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0]
  ws.Range('A' & RenActual & ':Y' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0]
  ws.Range('A' & RenActual & ':Y' & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0]

//  ws.Range('A' & RenActual & ':T' & RenActual).Borders(xlBordeInferior).LineStyle = xlLineaSimple[C0]
//  ws.Range('A' & RenActual & ':T' & RenActual).Borders(xlBordeSuperior).LineStyle = xlLineaSimple[C0]
//  ws.Range('A' & RenActual & ':T' & RenActual).Borders(xlBordeIzquierda).LineStyle = xlLineaSimple[C0]
//  ws.Range('A' & RenActual & ':T' & RenActual).Borders(xlBordeDerecha).LineStyle = xlLineaSimple[C0]

  // Fecha del documento
  lFechaEditada = fFormateaFecha(atPagos(cFecha); gIdioma)
  ws.Range('A' & RenActual).Value = @Col(lFechaEditada;0)[C0]
  // Serie
  ws.Range('B' & RenActual).Value = atPagos(cSerieDocumento)[C0]
  // Folio
  ws.Range('C' & RenActual).Value = atPagos(cFolio)[C0]


  // Codigo Proveedor

  ws.Range('A' & RenActual).Value = @Col(lFechaEditada;0)[C0]
  // Serie
  ws.Range('B' & RenActual).Value = atPagos(cSerieDocumento)[C0]
  // Folio
  ws.Range('C' & RenActual).Value = atPagos(cFolio)[C0]


  ws.Range('D' & RenActual).Value = tClienteProveedorTmp(cCodigoCliente)[C0]
  ws.Range('E' & RenActual).Value = tClienteProveedorTmp(cRazonSo01)[C0]

  // buscar el concepto 

  tConceptos.Busca[@Str(atPagos(cIdConceptoDocumento);0)]
  Si tConceptos->Encontro
      ws.Range('F' & RenActual).Value = tConceptos(cNombreConcepto)[C0]    
  FinSi




  // Importe pagado
  ws.Range('G' & RenActual).Value = @Col(anImporte;0)[C0]

  // Serie
  ws.Range('H' & RenActual).Value = atDocumento(cSerieDocumento)[C0]
  // Folio
  ws.Range('I' & RenActual).Value = atDocumento(cFolio)[C0]

  // Total con IVA 15%
  ws.Range('J' & RenActual).Value = @Col(aTotalConIVA;0)[C0]
  // Total con IVA 10%
  ws.Range('K' & RenActual).Value = @Col(aTotalConIVA;1)[C0]
  // Total con IVA 0%
  ws.Range('L' & RenActual).Value = @Col(aTotalConIVA;2)[C0]
  // Total con IVA Exento
  ws.Range('M' & RenActual).Value = @Col(aTotalConIVA;3)[C0]
  // Total con IVA Otros
  ws.Range('N' & RenActual).Value = @Col(aTotalConIVA;4)[C0]

  // Total sin IVA 15%
  ws.Range('O' & RenActual).Value = @Col(aTotalSinIVA;0)[C0]
  // Total sin IVA 10%
  ws.Range('P' & RenActual).Value = @Col(aTotalSinIVA;1)[C0]
  // Total sin IVA 0%
  ws.Range('Q' & RenActual).Value = @Col(aTotalSinIVA;2)[C0]
  // Total sin IVA Exento
  ws.Range('R' & RenActual).Value = @Col(aTotalSinIVA;3)[C0]
  // Total sin IVA Otros
  ws.Range('S' & RenActual).Value = @Col(aTotalSinIVA;4)[C0]

  // Neto
  ws.Range('T' & RenActual).Value = @Col(aNeto;7)[C0]

  // IVA 15%
  ws.Range('U' & RenActual).Value = @Col(aIVA;0)[C0]
  // IVA 10%
  ws.Range('V' & RenActual).Value = @Col(aIVA;1)[C0]
  // IVA Otros
  ws.Range('W' & RenActual).Value = @Col(aIVA;2)[C0]

  // RETENCION 1
  ws.Range('X' & RenActual).Value = @COL(aRetencion;0)[C0]
  // RETENCION 2
  ws.Range('Y' & RenActual).Value = @COL(aRetencion;1)[C0]


FinFunc


// *****************************************************************************
//  fImprimeTotales
//
//	 Esta función imprime los totales de los documentos y los calculados
//
//  Parámetros 
//
//  Salidas 
// *****************************************************************************
DefFunc fImprimeTotales(gGranTotal; gGranTotalConIVA; gGranTotalSinIVA; gGranNeto; gGranIVA; gGranRetencion)
  // Avanza de renglon
  RenActual = RenActual + 1[C0]

  ws.Range('G' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
  ws.Range('G' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0]
  ws.Range('G' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0]
  ws.Range('G' & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0]
//  ws.Range('D' & RenActual).Borders(xlBordeInferior).LineStyle = xlLineaSimple[C0]
//  ws.Range('D' & RenActual).Borders(xlBordeSuperior).LineStyle = xlLineaSimple[C0]
//  ws.Range('D' & RenActual).Borders(xlBordeIzquierda).LineStyle = xlLineaSimple[C0]
//  ws.Range('D' & RenActual).Borders(xlBordeDerecha).LineStyle = xlLineaSimple[C0]
  ws.Range('G' & RenActual).Font.FontStyle = 'Negrita'[C0]

  ws.Range('J' & RenActual & ':Y' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
  ws.Range('J' & RenActual & ':Y' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0]
  ws.Range('J' & RenActual & ':Y' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0]
  ws.Range('J' & RenActual & ':Y' & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0]
//  ws.Range('G' & RenActual & ':T' & RenActual).Borders(xlBordeInferior).LineStyle = xlLineaSimple[C0]
//  ws.Range('G' & RenActual & ':T' & RenActual).Borders(xlBordeSuperior).LineStyle = xlLineaSimple[C0]
//  ws.Range('G' & RenActual & ':T' & RenActual).Borders(xlBordeIzquierda).LineStyle = xlLineaSimple[C0]
//  ws.Range('G' & RenActual & ':T' & RenActual).Borders(xlBordeDerecha).LineStyle = xlLineaSimple[C0]
  ws.Range('J' & RenActual & ':Y' & RenActual).Font.FontStyle = 'Negrita'[C0]

  // Total del importe pagado
  ws.Range('G' & RenActual).Value = @Col(gGranTotal;0)[C0]

  // Gran total con IVA 15%
  ws.Range('J' & RenActual).Value = @Col(gGranTotalConIVA;0)[C0]

  // Gran total con IVA 10%
  ws.Range('K' & RenActual).Value = @Col(gGranTotalConIVA;1)[C0]

  // Gran total con IVA 10%
  ws.Range('L' & RenActual).Value = @Col(gGranTotalConIVA;2)[C0]

  // Gran total con IVA Exento
  ws.Range('M' & RenActual).Value = @Col(gGranTotalConIVA;3)[C0]

  // Gran total con IVA Otros
  ws.Range('N' & RenActual).Value = @Col(gGranTotalConIVA;4)[C0]

  // Gran total sin IVA 15%
  ws.Range('O' & RenActual).Value = @Col(gGranTotalSinIVA;0)[C0]

  // Gran total sin IVA 10%
  ws.Range('P' & RenActual).Value = @Col(gGranTotalSinIVA;1)[C0]

  // Gran total sin IVA 10%
  ws.Range('Q' & RenActual).Value = @Col(gGranTotalSinIVA;2)[C0]

  // Gran total sin IVA Exento
  ws.Range('R' & RenActual).Value = @Col(gGranTotalSinIVA;3)[C0]

  // Gran total sin IVA Otros
  ws.Range('S' & RenActual).Value = @Col(gGranTotalSinIVA;4)[C0]

  // Total Neto
  ws.Range('T' & RenActual).Value = @Col(gGranNeto;0)[C0]

  // Total IVA 15%
  ws.Range('U' & RenActual).Value = @Col(gGranIVA;0)[C0]

  // Total IVA 10%
  ws.Range('V' & RenActual).Value = @Col(gGranIVA;1)[C0]

  // Total IVA Otros
  ws.Range('W' & RenActual).Value = @Col(gGranIVA;2)[C0]

  // Total Retencion1
  ws.Range('X' & RenActual).Value = @Col(gGranRetencion;0)[C0]

  // Total Retencion2
  ws.Range('Y' & RenActual).Value = @Col(gGranRetencion;1)[C1]



FinFunc


// *****************************************************************************
//  fCalculaTotales
//
//	 Esta función lee el IVA de los movtos y calcula los importe base de los IVAs
//
//  Parámetros 
//
//  Entradas: aIdDocumento - Identificador del documento padre de los movtos
//            aNumImpuesto - determina el campo impuesto de la tabla de movtos
//                        entre el 1 y 3l tres
//  Salidas: Los parámetros aNeto y aImpuesto deben ser enviados por referencia
// *****************************************************************************
DefFunc fCalculaTotales(aNeto; aImpuesto; aRetencion; atDocumento: Tabla; aNumImpuesto; atPagos: Tabla)
  Local lOffsetImporte, lOffsetPorcentaje, lEsExento, lNeto, lTotal, lImpuesto, lOtraTasa

  aNeto = 0[C0..C6]
  aImpuesto = 0[C0..C2]
  aRetencion = 0[C0..C1]
  lTotal = 0[C0]
  lImpuesto = 0[C0..C2]
      
  lOffsetImporte = 16 + (aNumImpuesto * 2)
  lOffsetPorcentaje = 17 + (aNumImpuesto * 2)
		
  Mientras [ tMovimiento.Busca[@Str(atDocumento(cIdDocumento);0)]; tMovimiento->Encontro; tMovimiento.Busca Siguiente[1] ]

    SI atDocumento(cSistOrig) = 101
        lNeto[0]  = tMovimiento(cNeto) 
    SINO
        lNeto[0]  = tMovimiento(cNeto) - tMovimiento(cDescuento1) - tMovimiento(cDescuento2) - tMovimiento(cDescuento3) - tMovimiento(cDescuento4) - tMovimiento(cDescuento5)
    FINSI
    aRetencion[0] = @COL(aRetencion;0) + tMovimiento(cRetenci01)
    aRetencion[1] = @COL(aRetencion;1) + tMovimiento(cRetenci02)
    lTotal[0] = tMovimiento(cTotal) + tMovimiento(cRetenci01) + tMovimiento(cRetenci02)
    lOtraTasa = FALSE
		
    Escoge tMovimiento->CampoVal[lOffsetPorcentaje] 
      Caso 15 
        SI @VAL(@SUBSTR(atDocumento(cFecha);0;4)) <= 2009
            // AJUSTE 2010 CASO PAGOS DEL 2009 PAGADOS EN LA FECHA DE AJUSTE O POSTERIOR
            SI atPagos(cFecha) >= tParametros(cfecaj2010) 
                lNeto[0] = @COL(lTotal;0) / 1.16
                lImpuesto[0] = @COL(lNeto;0) * 0.16
            SINO    
                lImpuesto[0] = tMovimiento->CampoVal[lOffsetImporte]
            FINSI
            aNeto[0] = @Col(aNeto;0) + @Col(lNeto;0)
            aImpuesto[0] = @Col(aImpuesto;0) + @COL(lImpuesto;0)
        SINO
            lOtraTasa = TRUE
        FINSI
      FinCaso
      Caso 16 
        SI @VAL(@SUBSTR(atDocumento(cFecha);0;4)) > 2009
            // AJUSTE 2010 CASO DOCUMENTO DE AJUSTE ESPECIAL
            SI atDocumento(cIdDocumentoOrigen) > 0 Y (atDocumento(cIdConce01) = gIdAjusteCliente O atDocumento(cIdConce01) = gIdAjusteProveedor)
                lNeto[0]     = tMovimiento->CampoVal[lOffsetImporte] / 1.16
                lImpuesto[0] = @COL(lNeto;0) * 0.16    
            SINO    
                lImpuesto[0] = tMovimiento->CampoVal[lOffsetImporte]
            FINSI
            aNeto[0] = @Col(aNeto;0) + @Col(lNeto;0)
            aImpuesto[0] = @Col(aImpuesto;0) + @Col(lImpuesto;0)
        SINO
            lOtraTasa = TRUE
        FINSI
      FinCaso      
      Caso 10
        SI @VAL(@SUBSTR(atDocumento(cFecha);0;4)) <= 2009
            // AJUSTE 2010 CASO PAGOS DEL 2009 PAGADOS EN LA FECHA DE AJUSTE O POSTERIOR
            SI atPagos(cFecha) >= tParametros(cfecaj2010)
               lNeto[0] = @COL(lTotal;0) / 1.11
               lImpuesto[0] = @COL(lNeto;0) * 0.11 
            SINO    
               lImpuesto[0] = tMovimiento->CampoVal[lOffsetImporte]
            FINSI
            aImpuesto[1] = @Col(aImpuesto;1) + @Col(lImpuesto;0)
            aNeto[1]  = @Col(aNeto;1) + @Col(lNeto;0)
        SINO
            lOtraTasa = TRUE
        FINSI
      FinCaso
      Caso 11
        SI @VAL(@SUBSTR(atDocumento(cFecha);0;4)) > 2009
            // AJUSTE 2010 CASO DOCUMENTO DE AJUSTE ESPECIAL
            SI atDocumento(cIdDocumentoOrigen) > 0 Y (atDocumento(cIdConce01) = gIdAjusteCliente O atDocumento(cIdConce01) = gIdAjusteProveedor)
                lNeto[0]     = tMovimiento->CampoVal[lOffsetImporte] / 1.11
                lImpuesto[0] = @COL(lNeto;0) * 0.11
            SINO    
                lImpuesto[0] = tMovimiento->CampoVal[lOffsetImporte]
            FINSI
            aNeto[1] = @Col(aNeto;1) + @Col(lNeto;0)
            aImpuesto[1] = @Col(aImpuesto;1) + @Col(lImpuesto;0)
        SINO
            lOtraTasa = TRUE
        FINSI
      FinCaso  
      Caso 0
        // Si el importe del impuesto es distinto de cero es por que se capturó
        // y debe ir a otras tasas
        Si tMovimiento->CampoVal[lOffsetImporte] = 0.0
          lEsExento = 0
          Si tMovimiento(cIdProducto) != 0
            tProducto.Busca[@Str(tMovimiento(cIdProducto);0)]
            Si !tProducto->Encontro
              Continua
            FinSi
            lEsExento = tProducto(cEsExento)
          FinSi
          Si lEsExento = 0
            aNeto[2] = @Col(aNeto;2) + @Col(lNeto;0)
          SiNo
            aNeto[3] = @Col(aNeto;3) + @Col(lNeto;0)
          FinSi
        SiNo
          aImpuesto[2] = @Col(aImpuesto;2) + tMovimiento->CampoVal[lOffsetImporte]
          aNeto[4]  = @Col(aNeto;4) + @Col(lNeto;0)
        FinSi
      FinCaso
      OtroCaso
        lOtraTasa = TRUE        
      FinCaso
    FinEscoge 

    SI lOtraTasa
       aImpuesto[2] = @Col(aImpuesto;2) + tMovimiento->CampoVal[lOffsetImporte]
       aNeto[4]  = @Col(aNeto;4) + @Col(lNeto;0)
    FINSI

  FinMientras
  aNeto[5] = atDocumento(cNeto) - atDocumento(cDescuentoMov)
  aNeto[6] = atDocumento(cTotal)
FinFunc


// *****************************************************************************
// Encabezado del reporte

Encab
    // Pone el nombre del sistema
    ws.Range('A' & RenActual).Font.Color = @RGB(255;0;0)[C0]
    ws.Range('A' & RenActual).Font.Size = 10[C0]
    ws.Range('A' & RenActual).Value = 'AdminPAQ'[C0]

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

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

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

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

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

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

    ws.Range('A' & RenActual).Font.FontStyle = 'Negrita'[C0]    
    ws.Range('A' & RenActual ).Value = 'Impuesto a considerar: ' & tParametros->CampoVal[65+gNumImpuesto][C0]

	 tMoneda.Busca[@Str(pIdMoneda;0)]
    Si tMoneda->Encontro
      ws.Range('Y' & RenActual).HorizontalAlignment = xlDerecha[C0]
      ws.Range('Y' & RenActual).Font.FontStyle = 'Negrita'[C0]    
      ws.Range('Y' & RenActual ).Value = 'Moneda: ' & tMoneda(cNombreMoneda)[C0]
    FinSi

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


    // Pone el titulo para el documento de Pago
    ws.Range('B' & RenActual & ':F' & RenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0]
    ws.Range('B' & RenActual & ':F' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
    ws.Range('B' & RenActual & ':F' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0]
    ws.Range('B' & RenActual & ':F' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0]
    ws.Range('B' & RenActual & ':F' & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0]
    ws.Range('B' & RenActual & ':F' & RenActual).Interior.ColorIndex = 3[C0]    
    ws.Range('B' & RenActual).Font.Color = @RGB(255;255;255)[C0]
    ws.Range('B' & RenActual).Font.FontStyle = 'Negrita'[C0]    
    ws.Range('B' & RenActual ).Value = 'PAGO'[C0]



    // Pone el titulo Factura o Compra
    ws.Range('H' & RenActual & ':I' & RenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0]
    ws.Range('H' & RenActual & ':I' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
    ws.Range('H' & RenActual & ':I' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0]
    ws.Range('H' & RenActual & ':I' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0]
    ws.Range('H' & RenActual & ':I' & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0]
    ws.Range('H' & RenActual & ':I' & RenActual).Interior.ColorIndex = 3[C0]    
    ws.Range('H' & RenActual).Font.Color = @RGB(255;255;255)[C0]
    ws.Range('H' & RenActual).Font.FontStyle = 'Negrita'[C0]    
    Si pTipoReporte = 0 // Por clientes?
      ws.Range('H' & RenActual ).Value = 'FACTURA'[C0]
    SiNo // por Proveedor
      ws.Range('H' & RenActual ).Value = 'COMPRA'[C0]
    FinSi

    // Pone el titulo Importes totales incluyendo IVA
    ws.Range('J' & RenActual & ':N' & RenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0]
    ws.Range('J' & RenActual & ':N' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
    ws.Range('J' & RenActual & ':N' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0]
    ws.Range('J' & RenActual & ':N' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0]
    ws.Range('J' & RenActual & ':N' & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0]
    ws.Range('J' & RenActual & ':N' & RenActual).Interior.ColorIndex = 3[C0]    
    ws.Range('J' & RenActual).Font.Color = @RGB(255;255;255)[C0]
    ws.Range('J' & RenActual).Font.FontStyle = 'Negrita'[C0]    
    ws.Range('J' & RenActual ).Value = 'IMPORTES TOTALES INCLUYENDO IVA'[C0]

    // Pone el titulo Importes totales sin IVA
    ws.Range('O' & RenActual & ':S' & RenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0]
    ws.Range('O' & RenActual & ':S' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
    ws.Range('O' & RenActual & ':S' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0]
    ws.Range('O' & RenActual & ':S' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0]
    ws.Range('O' & RenActual & ':S' & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0]
    ws.Range('O' & RenActual & ':S' & RenActual).Interior.ColorIndex = 3[C0]    
    ws.Range('O' & RenActual).Font.Color = @RGB(255;255;255)[C0]
    ws.Range('O' & RenActual).Font.FontStyle = 'Negrita'[C0]    
    ws.Range('O' & RenActual ).Value = 'IMPORTES TOTALES SIN IVA'[C0]

    // Pone el titulo Importe de IVA
    ws.Range('T' & RenActual & ':W' & RenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0]
    ws.Range('T' & RenActual & ':W' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
    ws.Range('T' & RenActual & ':W' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0]
    ws.Range('T' & RenActual & ':W' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0]
    ws.Range('T' & RenActual & ':W' & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0]
    ws.Range('T' & RenActual & ':W' & RenActual).Interior.ColorIndex = 3[C0]    
    ws.Range('T' & RenActual).Font.Color = @RGB(255;255;255)[C0]
    ws.Range('T' & RenActual).Font.FontStyle = 'Negrita'[C0]    
    ws.Range('T' & RenActual ).Value = 'IMPORTE DE IVA'[C0]

    // Pone el titulo Retenciones
    ws.Range('X' & RenActual & ':Y' & RenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0]
    ws.Range('X' & RenActual & ':Y' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
    ws.Range('X' & RenActual & ':Y' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0]
    ws.Range('X' & RenActual & ':Y' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0]
    ws.Range('X' & RenActual & ':Y' & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0]
    ws.Range('X' & RenActual & ':Y' & RenActual).Interior.ColorIndex = 3[C0]    
    ws.Range('X' & RenActual).Font.Color = @RGB(255;255;255)[C0]
    ws.Range('X' & RenActual).Font.FontStyle = 'Negrita'[C0]    
    ws.Range('X' & RenActual ).Value = 'RETENCIONES'[C0]



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

    // Pone el titulo de cada columna en EXCEL
    ws.Range('A' & RenActual & ':Y' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
    ws.Range('A' & RenActual & ':Y' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0]
    ws.Range('A' & RenActual & ':Y' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0]
    ws.Range('A' & RenActual & ':Y' & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0]
    ws.Range('A' & RenActual & ':Y' & RenActual).Interior.ColorIndex = 55[C0]    
    ws.Range('A' & RenActual & ':Y' & RenActual).Font.FontStyle = 'Negrita'[C0]    
    ws.Range('A' & RenActual & ':Y' & RenActual).Font.Color = @RGB(255;255;255)[C0]

    ws.Range('D' & RenActual).HorizontalAlignment = xlCentro[C0]
    ws.Range('G' & RenActual & ':Y' & RenActual).HorizontalAlignment = xlCentro[C0]


// leer los nombres de las retenciones de la tabla de parametros

    gNombreRetencion1 = tParametros(cNombrer01)
    gNombreRetencion2 = tParametros(cNombrer02)
    SI pTipoReporte = 0
        ws.Range('A' & RenActual & ':W' &  RenActual).Value = 'Fecha','Serie','Folio','Codigo Cliente','Cliente','Concepto','Importe Pagado','Serie','Folio',@Chr(39)&'16%',@Chr(39)&'11%',@Chr(39)&'0%','Exento','Otros Impuestos',@Chr(39)&'16%',@Chr(39)&'11%',@Chr(39)&'0%','Exento','Otros Impuestos','Neto','IVA 16%','IVA 11%','Otros Impuestos'
    SINO
        ws.Range('A' & RenActual & ':W' &  RenActual).Value = 'Fecha','Serie','Folio','Codigo Proveedor','Proveedor','Concepto','Importe Pagado','Serie','Folio',@Chr(39)&'16%',@Chr(39)&'11%',@Chr(39)&'0%','Exento','Otros Impuestos',@Chr(39)&'16%',@Chr(39)&'11%',@Chr(39)&'0%','Exento','Otros Impuestos','Neto','IVA 16%','IVA 11%','Otros Impuestos'
    FINSI
    ws.Range('X' & RenActual).value = gNombreRetencion1
    ws.Range('Y' & RenActual).value = gNombreRetencion2

    Excel.Rows('7:7').Select
    Excel.ActiveWindow.FreezePanes = True
    ws.Range('A' & RenActual).Select
FinEncab


// *****************************************************************************
// Cuerpo del reporte

// Configura los decimales del reporte
fConfiguraDecimales()

// Inicializa los conceptos de ajuste
tConceptos.UsaIndice['cCodigoC01']
tConceptos.BUSCA['AJUSTE_IVA_CTE_CARGO_2010']
gIdAjusteCliente = tConceptos(cIdConce01)
tConceptos.BUSCA['AJUSTE_IVA_PRV_CARGO_2010']
gIdAjusteProveedor = tConceptos(cIdConce01)
tConceptos.UsaIndice['PrimaryKey']

Si pTipoReporte = 0  // por Clientes?
  tAsociacion.Usaindice['']                         // Llave primaria: cIdDocumentoAbono+cIdDocumentoCargo
SiNo // proveedores
  tAsociacion.Usaindice['iDoctoCargoAbono']         // cIdDocumentoCargo+cIdDocumentoAbono
FinSi

// Obtiene los documentos en el rango de fechas especificado en el reporte
Mientras pFechaInicial <= pFechaFinal  
  // Si encontro algún documento en esa fecha, recupera todos los documentos en esa fecha
  Mientras [tPagos.Busca[pFechaInicial]; tPagos->Encontro; tPagos.Busca Siguiente[1] ]

    // Si el docto tiene fecha menor a 2002 no desglosar su IVA
    Si tPagos(cFecha) < '20020101'
      Continua
    FinSi

    // Omite los documentos cancelados, y que no han sido afectados
    Si tPagos(cCancelado) != 0
      Continua
    FinSi
    Si tPagos(cAfectado) = 0
      Continua
    FinSi

    // Si el reporte es de cliente únicamente se procesan los cheques, pagos y abonos
    Si pTipoReporte = 0 Y tPagos(cIdDocumentoDe) != 9 Y tPagos(cIdDocumentoDe) != 10 Y tPagos(cIdDocumentoDe) != 12
	   Continua
    FinSi
    // Si el reporte es de proveedores únicamente se procesan los cheques, pagos y abonos
    SI pTipoReporte = 1 Y tPagos(cIdDocumentoDe) != 23 Y tPagos(cIdDocumentoDe) != 24 Y tPagos(cIdDocumentoDe) != 26
      Continua
    FinSi

    // Si encontro documentos asociados a ese documento de pago
    Mientras [tAsociacion.Busca[@Str(tPagos(cIdDocumento);0)]; tAsociacion->Encontro; tAsociacion.Busca Siguiente[1] ]
      Si pTipoReporte = 0
        gIdDocumento = tAsociacion(cIdDocumentoCargo)
        gnImporte = tAsociacion(cImporteAbono)
      SiNo
        gIdDocumento = tAsociacion(cIdDocumentoAbono)
        gnImporte = tAsociacion(cImporteCargo)
      FinSi

      tDocumento.Busca[@Str(gIdDocumento;0)]
      Si !tDocumento->Encontro
        Continua
      Finsi

      // Si el docto tiene fecha menor a 2002 no desglosar su IVA
      Si tDocumento(cFecha) < '20020101'
        Continua
      FinSi

      tClienteProveedorTmp.Busca[@Str(tDocumento(cIdClienteProveedor);0)]
      Si tClienteProveedorTmp->Encontro
        lIdMonedaCliente = tClienteProveedorTmp(cIdMoneda)
      Sino
        lIdMonedaCliente = 1
      FinSi
  
      Si lIdMonedaCliente != pIdMoneda Y pIdMoneda != 1
        Continua
      FinSi


      // Nota únicamente se ocupará del Neto, sin embargo, se utiliza la misma función
      fCalculaTotales(&gNeto; &gImpuesto; &gRetencion; tDocumento; gNumImpuesto; tPagos)
      gProporcional = @Col(gnImporte;0) / tDocumento(cTotal)


      gNeto[0] = fCambiarMonedaDoctoAReporte(tPagos; tTiposCambioLib; @Col(gNeto;0); pIdMoneda; lIdMonedaCliente)
      gNeto[1] = fCambiarMonedaDoctoAReporte(tPagos; tTiposCambioLib; @Col(gNeto;1); pIdMoneda; lIdMonedaCliente)
      gNeto[2] = fCambiarMonedaDoctoAReporte(tPagos; tTiposCambioLib; @Col(gNeto;2); pIdMoneda; lIdMonedaCliente)
      gNeto[3] = fCambiarMonedaDoctoAReporte(tPagos; tTiposCambioLib; @Col(gNeto;3); pIdMoneda; lIdMonedaCliente)
      gNeto[4] = fCambiarMonedaDoctoAReporte(tPagos; tTiposCambioLib; @Col(gNeto;4); pIdMoneda; lIdMonedaCliente)
      gNeto[5] = fCambiarMonedaDoctoAReporte(tPagos; tTiposCambioLib; @Col(gNeto;5); pIdMoneda; lIdMonedaCliente)
      gNeto[6] = fCambiarMonedaDoctoAReporte(tPagos; tTiposCambioLib; @Col(gNeto;6); pIdMoneda; lIdMonedaCliente)
      gNeto[7] = fCambiarMonedaDoctoAReporte(tPagos; tTiposCambioLib; @Col(gNeto;7); pIdMoneda; lIdMonedaCliente)
      gNeto[8] = fCambiarMonedaDoctoAReporte(tPagos; tTiposCambioLib; @Col(gNeto;8); pIdMoneda; lIdMonedaCliente)
  
      gImpuesto[0] = fCambiarMonedaDoctoAReporte(tPagos; tTiposCambioLib; @Col(gImpuesto;0); pIdMoneda; lIdMonedaCliente)
      gImpuesto[1] = fCambiarMonedaDoctoAReporte(tPagos; tTiposCambioLib; @Col(gImpuesto;1); pIdMoneda; lIdMonedaCliente)
      gImpuesto[2] = fCambiarMonedaDoctoAReporte(tPagos; tTiposCambioLib; @Col(gImpuesto;2); pIdMoneda; lIdMonedaCliente)


      gRetencion[0] = fCambiarMonedaDoctoAReporte(tPagos; tTiposCambioLib; @Col(gRetencion;0); pIdMoneda; lIdMonedaCliente)
      gRetencion[1] = fCambiarMonedaDoctoAReporte(tPagos; tTiposCambioLib; @Col(gRetencion;1); pIdMoneda; lIdMonedaCliente)
    
      gnImporte = fCambiarMonedaDoctoAReporte(tPagos; tTiposCambioLib; gnImporte; pIdMoneda; lIdMonedaCliente)


      //Calcula las columnas de acuerdo a las proporciones obtenidas
      gTotalConIVA = (gNeto + gImpuesto) * @Col(gProporcional;0)[C0]
      gTotalConIVA = (gNeto + gImpuesto) * @Col(gProporcional;0)[C1]
      gTotalConIVA = gNeto * @Col(gProporcional;0)[C2]
      gTotalConIVA = gNeto * @Col(gProporcional;0)[C3]
      gTotalConIVA = (gNeto + @Col(gImpuesto;2)) * @Col(gProporcional;0)[C4]

      // Calcula impuestos en base a la proporción general
      gIVA = gImpuesto * @Col(gProporcional;0)[C0]
      gIVA = gImpuesto * @Col(gProporcional;0)[C1]
      // No se considerará el importe 3 ni el 4 ya que estos son tasa 0%
      gIVA = gImpuesto * @Col(gProporcional;0)[C2]


      gRet = gRetencion *  @Col(gProporcional;0)[C0]
      gRet = gRetencion *  @Col(gProporcional;0)[C1]
  
      // Calcula los totales sin impuestos
      gTotalSinIVA = gTotalConIVA - gIVA[C0]
      gTotalSinIVA = gTotalConIVA - gIVA[C1]
      gTotalSinIVA = gTotalConIVA[C2]
      gTotalSinIVA = gTotalConIVA[C3]
      gTotalSinIVA[4] = @Col(gTotalConIVA;4) - @Col(gIVA;2)

      gNeto[7] = @Col(gTotalSinIVA;0) + @Col(gTotalSinIVA;1) + @Col(gTotalSinIVA;2) + @Col(gTotalSinIVA;3) + @Col(gTotalSinIVA;4)

      gRetDocto1  = fCambiarMonedaDoctoAReporte(tPagos; tTiposCambioLib; tDocumento(cRetencion1); pIdMoneda; lIdMonedaCliente)
      gRetencion1 = gRetencion1 + gRetDocto1
      gRetDocto2  = fCambiarMonedaDoctoAReporte(tPagos; tTiposCambioLib; tDocumento(cRetencion2); pIdMoneda; lIdMonedaCliente) 
      gRetencion2 = gRetencion2 + gRetDocto2


      gGranTotal        = gGranTotal + gnImporte[C0]
      gGranTotalConIVA  = gGranTotalConIVA + gTotalConIVA[C0..C4]
      gGranTotalSinIVA  = gGranTotalSinIVA   + gTotalSinIVA[C0..C4]
      gGranNeto         = gGranNeto + @Col(gNeto;7)[C0]
      gGranIVA          = gGranIVA + gIVA[C0..C2]
      gGranRetencion    = gGranRetencion + gRet[C0..C1]


      // Imprime el documento
      fImprimeDocumento(tPagos; tDocumento; gnImporte; gTotalConIVA; gTotalSinIVA; gNeto; gIVA; gRet)
    FinMientras
  FinMientras

  // Busca en la siguiente fecha
  pFechaInicial = fFechaSiguiente(pFechaInicial)
FinMientras

// Manda a Excel GranTotal, GranTotalConIVA, GranTotalSinIVA, GranNeto, GranIVA
fImprimeTotales(gGranTotal; gGranTotalConIVA; gGranTotalSinIVA; gGranNeto; gGranIVA; gGranRetencion)
