// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//
//	AnIVAFacCom.rpt
//	Nombre del reporte en el sistema: Análisis de IVA por Factura o Compra.
//
//  Sistema: AdminPAQ v1.1
// 
//	 Este reporte perteneciente al módulo de ventas y compras, depliega en Excel
//  un listado de documentos con el desglose de IVA para un rango de fechas dado.
//
//	Consideraciones especiales:
//  
//	Elaboró:    Daniel Robles de Alba
//	Fecha: 	   05 de marzo del 2002.
//
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Historia de modificaciones
//  Fecha      Nombre   IDLotus                     Descripcion
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// 21/06/2002   DRdA    N.D.0652    Se modificó:
//                                  - fImprimeDocumento.
// 14/11/2005   HVA    N.D.3469    Los importes en moneda extranjera no eran correctos.
// 19/01/2006   HVA    N.D.3469    Reabierto no mostrar los documentos si no coinciden 
//                                 con la moneda del cliente y del reporte.
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<


// *****************************************************************************
// 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 tDocumento = tEmpresa['MGW10008']        // Documentos
tDocumento.Usaindice['iDocumentoDeFechaSerieFol'] // cIdDocumentoDe+cFecha+cSerie+cFolio

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

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

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


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

Columnas 38;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
gTotalNeto = 0          // Total de las bases
gTotalImpuesto = 0      // Total de los IVAs
gTotal = 0              // Total de los totales 
gNumImpuesto = 1        // Cúal de los tres impuesto es usado

[C0..C7].Decimales 0

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 = 12 caracteres
ws.Columns(1).ColumnWidth = 12[C0]
// Serie = 5 caracteres
ws.Columns(2).ColumnWidth = 5[C0]
// Folio = 8 caracteres
ws.Columns(3).ColumnWidth = 8[C0]
// Cliente/Proveedor = 14 caracteres
ws.Columns(4).ColumnWidth = 14[C0]
// Base 15% = 15 caracteres
ws.Columns(5).ColumnWidth = 15[C0]
// Base 10% = 15 caracteres
ws.Columns(6).ColumnWidth = 15[C0]
// Base 0% = 15 caracteres
ws.Columns(7).ColumnWidth = 15[C0]
// Base Exento = 15 caracteres
ws.Columns(8).ColumnWidth = 15[C0]
// Base Otros = 15 caracteres
ws.Columns(9).ColumnWidth = 15[C0]
// Neto = 15 caracteres
ws.Columns(10).ColumnWidth = 15[C0]
// IVA 15% = 15 caracteres
ws.Columns(11).ColumnWidth = 15[C0]
// IVA 10% = 15 caracteres
ws.Columns(12).ColumnWidth = 15[C0]
// IVA Otros = 15 caracteres
ws.Columns(13).ColumnWidth = 15[C0]
// Total = 15 caracteres
ws.Columns(14).ColumnWidth = 15[C0]
// Proporcion 15% = 15 caracteres
ws.Columns(15).ColumnWidth = 15[C0]
// Proporcion 10% = 15 caracteres
ws.Columns(16).ColumnWidth = 15[C0]
// Proporcion 0% = 15 caracteres
ws.Columns(17).ColumnWidth = 15[C0]
// Proporcion Exento = 15 caracteres
ws.Columns(18).ColumnWidth = 15[C0]
// Proporcion Otros = 15 caracteres
ws.Columns(19).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(5).NumberFormat = lFormato[C0]
    ws.Columns(6).NumberFormat = lFormato[C0]
    ws.Columns(7).NumberFormat = lFormato[C0]
    ws.Columns(8).NumberFormat = lFormato[C0]
    ws.Columns(9).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]
    // De las columnas 15-19 se pasa el formato junto con el valor (ND-258 DRdA)
  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(5).NumberFormat = '#,##0.00_);(#,##0.00)'[C0]
    ws.Columns(6).NumberFormat = '#,##0.00_);(#,##0.00)'[C0]
    ws.Columns(7).NumberFormat = '#,##0.00_);(#,##0.00)'[C0]
    ws.Columns(8).NumberFormat = '#,##0.00_);(#,##0.00)'[C0]
    ws.Columns(9).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]
    // De las columnas 15-19 se pasa el formato junto con el valor (ND-258 DRdA)
  FinSi
FinFunc


// *****************************************************************************
//  fImprimeDocumento
//
//	 Esta función imprime los datos del documento y los calculados
//
//  Parámetros 
//
//  Salidas 
// *****************************************************************************
DefFunc fImprimeDocumento(atDocumento: Tabla; aNeto; aImpuesto; aProporcional)
  Local lFechaEditada, lCodigo, lMascarilla

  // Manda a Excel Documentos(cFecha), Documentos(cSerieDocumento), Documentos(cFolio), Clientes(cCodigoCliente)
  // Manda a Excel Neto(0), Neto(1), Neto(2), Neto(3), Neto(4), Documentos(cNeto), Impuesto(0), Impuesto(1), Impuesto(2)
  // Manda a Excel Documentos(cTotal), Proporcional(0), Proporcional(1), Proporcional(2), Proporcional(3), Proporcional(4)

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

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

  // Lee el cliente o proveedor, lo formatea y lo imprime
  tClienteProveedor.Busca[@Str(atDocumento(cIdClienteProveedor);0)]
  Si tClienteProveedor->Encontro
    lCodigo = tClienteProveedor(cCodigoCliente)
    lMascarilla = tParametros(cMascarillaClientes)
    // N.D.0652 Se agregó un apostrofe al inicio del código por si viene iniciado
    // por ceros no los quite excel, sino que lo tome como una cadena y no como 
    // un número. (DRdA)
    ws.Range('D' & RenActual).Value = @Chr(39) & fMascarilla(lCodigo;lMascarilla)[C0]
  FinSi

  // Base 15%
  ws.Range('E' & RenActual).Value = @Col(aNeto;0)[C0]

  // Base 10%
  ws.Range('F' & RenActual).Value = @Col(aNeto;1)[C0]

  // Base 0%
  ws.Range('G' & RenActual).Value = @Col(aNeto;2)[C0]

  // Base Exento
  ws.Range('H' & RenActual).Value = @Col(aNeto;3)[C0]

  // Base Otros
  ws.Range('I' & RenActual).Value = @Col(aNeto;4)[C0]

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

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

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

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

  // TOTAL
  ws.Range('N' & RenActual).Value = @Col(aNeto;8)[C0]

  // Se pasan los valores de las columnas O a la S con formato de porcentaje (ND-258 DRdA)

  // Proporcional 15%
  ws.Range('O' & RenActual).Value = @Col(aProporcional;0)*100 & '%'[C0]

  // Proporcional 10%
  ws.Range('P' & RenActual).Value = @Col(aProporcional;1)*100 & '%'[C0]

  // Proporcional 0%
  ws.Range('Q' & RenActual).Value = @Col(aProporcional;2)*100 & '%'[C0]

  // Proporcional Exento
  ws.Range('R' & RenActual).Value = @Col(aProporcional;3)*100 & '%'[C0]

  // Proporcional Otros
  ws.Range('S' & RenActual).Value = @Col(aProporcional;4)*100 & '%'[C0]
FinFunc


// *****************************************************************************
//  fImprimeTotales
//
//	 Esta función imprime los datos del documento y los calculados
//
//  Parámetros 
//
//  Salidas 
// *****************************************************************************
DefFunc fImprimeTotales(aTotalNeto; aTotalImpuesto)
  // Avanza de renglon
  RenActual = RenActual + 1[C0]
  ws.Range('E' & RenActual & ':N' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
  ws.Range('E' & RenActual & ':N' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0]
  ws.Range('E' & RenActual & ':N' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0]
  ws.Range('E' & RenActual & ':N' & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0]
//  ws.Range('E' & RenActual & ':N' & RenActual).Borders(xlBordeInferior).LineStyle = xlLineaSimple[C0]
//  ws.Range('E' & RenActual & ':N' & RenActual).Borders(xlBordeSuperior).LineStyle = xlLineaSimple[C0]
//  ws.Range('E' & RenActual & ':N' & RenActual).Borders(xlBordeIzquierda).LineStyle = xlLineaSimple[C0]
//  ws.Range('E' & RenActual & ':N' & RenActual).Borders(xlBordeDerecha).LineStyle = xlLineaSimple[C0]
  ws.Range('E' & RenActual & ':N' & RenActual).Font.FontStyle = 'Negrita'[C0]    

  // Base 15%
  ws.Range('E' & RenActual).Value = @Col(aTotalNeto;0)[C0]

  // Base 10%
  ws.Range('F' & RenActual).Value = @Col(aTotalNeto;1)[C0]

  // Base 0%
  ws.Range('G' & RenActual).Value = @Col(aTotalNeto;2)[C0]

  // Base Exento
  ws.Range('H' & RenActual).Value = @Col(aTotalNeto;3)[C0]

  // Base Otros
  ws.Range('I' & RenActual).Value = @Col(aTotalNeto;4)[C0]

  // Neto
  ws.Range('J' & RenActual).Value = @Col(aTotalNeto;5)[C0]

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

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

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

  // TOTAL
  ws.Range('N' & RenActual).Value = @Col(aTotalNeto;6)[C0]
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; aTotal; atDocumento: Tabla; aNumImpuesto)
  Local lOffsetImporte, lOffsetPorcentaje, lEsExento, lNeto, lTotal, lImpuesto, lOtraTasa

  aNeto = 0[C0..C6]
  aImpuesto = 0[C0..C2]
  aRetencion = 0[C0..C1]
  aTotal = 0[C0..C4]
  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
    lTotal[0] = tMovimiento(cTotal) + tMovimiento(cRetenci01) + tMovimiento(cRetenci02)
    lOtraTasa = FALSE
		
    Escoge tMovimiento->CampoVal[lOffsetPorcentaje] 
      Caso 15 
        SI @VAL(@SUBSTR(atDocumento(cFecha);0;4)) <= 2009
            lImpuesto[0] = tMovimiento->CampoVal[lOffsetImporte]
            aNeto[0] = @Col(aNeto;0) + @Col(lNeto;0)
            aImpuesto[0] = @Col(aImpuesto;0) + @COL(lImpuesto;0)
            aTotal[0] = @Col(aTotal;0) + tMovimiento(cTotal)
        SINO
            lOtraTasa = TRUE
        FINSI
      FinCaso
      Caso 16 
        SI @VAL(@SUBSTR(atDocumento(cFecha);0;4)) > 2009
            lImpuesto[0] = tMovimiento->CampoVal[lOffsetImporte]
            aNeto[0] = @Col(aNeto;0) + @Col(lNeto;0)
            aImpuesto[0] = @Col(aImpuesto;0) + @Col(lImpuesto;0)
            aTotal[0] = @Col(aTotal;0) + tMovimiento(cTotal)
        SINO
            lOtraTasa = TRUE
        FINSI
      FinCaso      
      Caso 10
        SI @VAL(@SUBSTR(atDocumento(cFecha);0;4)) <= 2009
            lImpuesto[0] = tMovimiento->CampoVal[lOffsetImporte]
            aImpuesto[1] = @Col(aImpuesto;1) + @Col(lImpuesto;0)
            aNeto[1]  = @Col(aNeto;1) + @Col(lNeto;0)
            aTotal[1] = @Col(aTotal;1) + tMovimiento(cTotal)
        SINO
            lOtraTasa = TRUE
        FINSI
      FinCaso
      Caso 11
        SI @VAL(@SUBSTR(atDocumento(cFecha);0;4)) > 2009
            // AJUSTE 2010 CASO DOCUMENTO DE AJUSTE ESPECIAL
            lImpuesto[0] = tMovimiento->CampoVal[lOffsetImporte]
            aNeto[1] = @Col(aNeto;1) + @Col(lNeto;0)
            aImpuesto[1] = @Col(aImpuesto;1) + @Col(lImpuesto;0)
            aTotal[1] = @Col(aTotal;1) + tMovimiento(cTotal)
        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)
            aTotal[2] = @Col(aTotal;2) + tMovimiento(cTotal)  
          SiNo
            aNeto[3] = @Col(aNeto;3) + @Col(lNeto;0)
            aTotal[3] = @Col(aTotal;3) + tMovimiento(cTotal)  
          FinSi
        SiNo
          aImpuesto[2] = @Col(aImpuesto;2) + tMovimiento->CampoVal[lOffsetImporte]
          aNeto[4]  = @Col(aNeto;4) + @Col(lNeto;0)
          aTotal[4] = @Col(aTotal;4) + tMovimiento(cTotal)  
        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)
       aTotal[4] = @Col(aTotal;4) + tMovimiento(cTotal) 
    FINSI

  FinMientras
   SI atDocumento(cSistOrig) = 101
        aNeto[5] = atDocumento(cNeto) 
   SINO       
        aNeto[5] = atDocumento(cNeto) - atDocumento(cDescuentoMov)
   FINSI
  aNeto[6] = atDocumento(cTotal)
FinFunc

// *****************************************************************************
//  fCalculaProporcion
//
//	 Esta función calcula la parte proporcional de cada IVA sobre el neto del
//  documento
//
//  Parámetros 
//
//  Entradas:
//  Salidas: El parámetro aProporcional deberá ser enviado por referencia
// *****************************************************************************
DefFunc fCalculaProporcion(aTotal; aTotalDocumento; aProporcional)
  aProporcional[0] = @Col(aTotal;0) / aTotalDocumento
  aProporcional[1] = @Col(aTotal;1) / aTotalDocumento
  aProporcional[2] = @Col(aTotal;2) / aTotalDocumento
  aProporcional[3] = @Col(aTotal;3) / aTotalDocumento
  aProporcional[4] = @Col(aTotal;4) / aTotalDocumento
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 R
    ws.Range('B' & RenActual & ':R' & 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     F A C T U R A'[C0]
    SiNo
      ws.Range('A' & RenActual ).Value = 'A N A L I S I S     D E     I V A     P O R     C O M P R A'[C0]
    FinSi
    // Lo centra en las columnas A a la S
    ws.Range('A' & RenActual & ':S' & 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 S
    ws.Range('A' & RenActual & ':S' & 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('S' & RenActual).HorizontalAlignment = xlDerecha[C0]
      ws.Range('S' & RenActual).Font.FontStyle = 'Negrita'[C0]    
      ws.Range('S' & RenActual ).Value = 'Moneda: ' & tMoneda(cNombreMoneda)[C0]
    FinSi

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

    // Pone el titulo Análisis del importe neto
    ws.Range('E' & RenActual & ':I' & RenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0]
    ws.Range('E' & RenActual & ':I' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
    ws.Range('E' & RenActual & ':I' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0]
    ws.Range('E' & RenActual & ':I' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0]
    ws.Range('E' & RenActual & ':I' & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0]
    ws.Range('E' & RenActual & ':I' & RenActual).Interior.ColorIndex = 3[C0]
    ws.Range('E' & RenActual).Font.Color = @RGB(255;255;255)[C0]
    ws.Range('E' & RenActual).Font.FontStyle = 'Negrita'[C0]    
    ws.Range('E' & RenActual ).Value = 'ANALISIS DEL IMPORTE NETO'[C0]

    // Pone el titulo Análisis del impuesto
    ws.Range('K' & RenActual & ':M' & RenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0]
    ws.Range('K' & RenActual & ':M' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
    ws.Range('K' & RenActual & ':M' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0]
    ws.Range('K' & RenActual & ':M' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0]
    ws.Range('K' & RenActual & ':M' & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0]
    ws.Range('K' & RenActual & ':M' & RenActual).Interior.ColorIndex = 3[C0]
    ws.Range('K' & RenActual).Font.Color = @RGB(255;255;255)[C0]
    ws.Range('K' & RenActual).Font.FontStyle = 'Negrita'[C0]    
    ws.Range('K' & RenActual ).Value = 'ANALISIS DEL IMPUESTO'[C0]

    // Pone el titulo Parte proporcional del neto
    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 = 'PARTE PROPORCIONAL DEL NETO'[C0]

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

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

    ws.Range('E' & RenActual & ':S' & RenActual).HorizontalAlignment = xlCentro[C0]
    ws.Range('A' & RenActual & ':S' & RenActual).Value = 'Fecha','Serie','Folio',(pTipoReporte=0?'Cliente':'Proveedor'),@Chr(39)&'16%',@Chr(39)&'11%',@Chr(39)&'0%','Exento','Otros Impuestos','Neto','IVA 16%','IVA 11%','IVA Otros','TOTAL',@Chr(39)&'16%',@Chr(39)&'11%',@Chr(39)&'0%','Exento','Otros Impuestos'

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


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

// Configura los decimales del reporte
fConfiguraDecimales()

Si pTipoReporte = 0  // Facturas?
  vIdDocumentoDe = 4
SiNo
  vIdDocumentoDe = 19  // Compras
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 [tDocumento.Busca[vIdDocumentoDe & ':' & pFechaInicial]; tDocumento->Encontro; tDocumento.Busca Siguiente[2] ]

    // Omite los documentos cancelados, y que no han sido afectados
    Si tDocumento(cCancelado) != 0
      Continua
    FinSi
    Si tDocumento(cAfectado) = 0
      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



    fCalculaTotales(&gNeto; &gImpuesto; &gTotal; tDocumento; gNumImpuesto)
    fCalculaProporcion(gTotal; tDocumento(cTotal); &gProporcional)
    SI tDocumento(cSistOrig) = 101
        gNeto[7] = tDocumento(cNeto) 
    SINO
        gNeto[7] = tDocumento(cNeto) - tDocumento(cDescuentoMov)
    FINSI
    gNeto[8] = tDocumento(cTotal)



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

    gImpuesto[0] = fCambiarMonedaDoctoAReporte(tDocumento; tTiposCambioLib; @Col(gImpuesto;0); pIdMoneda; lIdMonedaCliente)
    gImpuesto[1] = fCambiarMonedaDoctoAReporte(tDocumento; tTiposCambioLib; @Col(gImpuesto;1); pIdMoneda; lIdMonedaCliente)
    gImpuesto[2] = fCambiarMonedaDoctoAReporte(tDocumento; tTiposCambioLib; @Col(gImpuesto;2); pIdMoneda; lIdMonedaCliente)

    gTotal[0] = fCambiarMonedaDoctoAReporte(tDocumento; tTiposCambioLib; @Col(gTotal;0); pIdMoneda; lIdMonedaCliente)
    gTotal[1] = fCambiarMonedaDoctoAReporte(tDocumento; tTiposCambioLib; @Col(gTotal;1); pIdMoneda; lIdMonedaCliente)
    gTotal[2] = fCambiarMonedaDoctoAReporte(tDocumento; tTiposCambioLib; @Col(gTotal;2); pIdMoneda; lIdMonedaCliente)
    gTotal[3] = fCambiarMonedaDoctoAReporte(tDocumento; tTiposCambioLib; @Col(gTotal;3); pIdMoneda; lIdMonedaCliente)
    gTotal[4] = fCambiarMonedaDoctoAReporte(tDocumento; tTiposCambioLib; @Col(gTotal;4); pIdMoneda; lIdMonedaCliente)

    gTotalNeto = gTotalNeto + gNeto[C0..C6]
    gTotalImpuesto = gTotalImpuesto + gImpuesto[C0..C2]

    // Imprime el documento
    fImprimeDocumento(tDocumento;gNeto;gImpuesto;gProporcional)
  FinMientras
  // Busca en la siguiente fecha
  pFechaInicial = fFechaSiguiente(pFechaInicial)
FinMientras

// Manda a Excel TotalNeto y TotalImpuesto
fImprimeTotales(gTotalNeto; gTotalImpuesto)
