// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//
//	AnIVAPProveedor.rpt
//	Nombre del reporte en el sistema: Análisis de IVA por Documento de Pago para proveedores por Reforma Agosto 2006
//
//  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ó:    Hector Valencia
//	Fecha: 	   22 de agosto del 2006.
//
// 07/03/2019   IYPZ   S.C.4041   Se agrega el IVA 8%. 
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<


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

Incluye LibAdminPAQ.Rpt


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

Parametro pFechaInicial = '20060801'    // Fecha inicial del rango
Parametro pFechaFinal = '20060831'      // Fecha final del rango
Parametro pDelClienteP     = ' '      // Espacio en blanco, clave del primer cliente en el rango
Parametro pAlClienteP      = ' '      // Espacio en blanco, clave del ultimo cliente en el rango
Parametro pIdMoneda = 1                 // Id de la moneda a expresar el reporte
Parametro pIdListaCptos = '25, '    // Para Clientes, Lista de conceptos de cargo
Parametro pTipoReporte = 1              // Si es salida por factura o compra
                                        // 0 = Factura
                                        // 1 = Compra
Parametro pMostrarTasa8  = 0            // Si se muestra el IVA AL 8%
                                        // 0 = No
                                        // 1 = Sí   


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

UsaEmpresa tEmpresa;'ADMINPAQW'                   // Parámetros

UsaEmpresa tTemporal;'';tEmpresa->SysDirDatos

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

UsaTabla tPagos = tEmpresa['mgw10008'] Alias 'tDoc1'  
tPagos.Usaindice['iClienteProvCptoFecha']      //IdClienteProveedor+cIdCpto+cFecha+cSerie+cFolio


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['PrimaryKey']





// *****************************************************************************
// 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)
gRetencion = 0
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         // Acumulado globla de las retencionesde las compras 

gIdDocumento = 0        // Documento relacionado con el documento de pago
gnImporte = 0           // Importe pagado
gNumImpuesto = 1        // Cúal de los tres impuesto es usado



gGranTotalConIVACorte = 0    // Acumulado por proveedor de importes con IVA
gGranTotalSinIVACorte = 0    // Acumulado por proveedor de importes sin IVA
gGranNetoCorte = 0           // Acumulado por proveedor del neto
gGranTotalCorte = 0          // Acumulado por proveedor del importe pagado
gGranIVACorte = 0            // Acumulado por proveedor del IVA al 15% y al 10%
gGranRetencionCorte = 0         // Acumulado por proveedor de las retenciones de las compras 

//vPath = tEmpresa->SysDirDatos & '\\' & 'datadirtag.ini'
//vVersionAdminpaq = @ArchIni(vPath; 'ADMW'; 'ProductVersion')





[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)

// checar que la version sea superior a la 310



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]

// Concepto = 20 caracteres
ws.Columns(4).ColumnWidth = 22[C0]
// Importe pagado = 15 caracteres
ws.Columns(5).ColumnWidth = 14[C0]
// Serie factura = 5 caracteres
ws.Columns(6).ColumnWidth = 5[C0]
// Folio factura = 8 caracteres
ws.Columns(7).ColumnWidth = 8[C0]
// Concepto = 20 caracteres
ws.Columns(8).ColumnWidth = 22[C0]
// Total 15% = 15 caracteres
ws.Columns(9).ColumnWidth = 15[C0]
// Total 10% = 15 caracteres
ws.Columns(10).ColumnWidth = 15[C0]
// Total 8% = 15 caracteres
ws.Columns(11).ColumnWidth = (pMostrarTasa8=0? 0: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 8% = 15 caracteres
ws.Columns(17).ColumnWidth = (pMostrarTasa8=0? 0:15 )[C0]
// Base 0% = 15 caracteres
ws.Columns(18).ColumnWidth = 15[C0]
// Base Exento = 15 caracteres
ws.Columns(19).ColumnWidth = 15[C0]
// Base Otros = 15 caracteres
ws.Columns(20).ColumnWidth = 15[C0]
// Neto = 15 caracteres
ws.Columns(21).ColumnWidth = 15[C0]
// IVA 15% = 15 caracteres
ws.Columns(22).ColumnWidth = 15[C0]
// IVA 10% = 15 caracteres
ws.Columns(23).ColumnWidth = 15[C0]
// IVA 8% = 15 caracteres
ws.Columns(24).ColumnWidth = (pMostrarTasa8=0? 0:15 )[C0]
// IVA Otros = 15 caracteres
ws.Columns(25).ColumnWidth = 15[C0]
// Retencion ISR = 15 caracteres
ws.Columns(26).ColumnWidth = 15[C0]
// Retencion IVA = 15 caracteres
ws.Columns(27).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(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]
    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]
  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(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]
    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]
  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 & ':AA' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
  ws.Range('A' & RenActual & ':AA' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0]
  ws.Range('A' & RenActual & ':AA' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0]
  ws.Range('A' & RenActual & ':AA' & RenActual).Borders(xlDerecha).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]



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

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

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

  
  tConceptos.Busca[@Str(atDocumento(cIdConce01);0)]
  Si tConceptos->Encontro
      ws.Range('H' & RenActual).Value = tConceptos(cNombreConcepto)[C0]    
  FinSi
    
  
  // Total con IVA 15%
  ws.Range('I' & RenActual).Value = @Col(aTotalConIVA;0)[C0]
  // Total con IVA 10%
  ws.Range('J' & RenActual).Value = @Col(aTotalConIVA;1)[C0]
  // Total con IVA 8%
  ws.Range('K' & RenActual).Value = @Col(aTotalConIVA;2)[C0]  
  // Total con IVA 0%
  ws.Range('L' & RenActual).Value = @Col(aTotalConIVA;3)[C0]
  // Total con IVA Exento
  ws.Range('M' & RenActual).Value = @Col(aTotalConIVA;4)[C0]
  // Total con IVA Otros
  ws.Range('N' & RenActual).Value = @Col(aTotalConIVA;5)[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 8%
  ws.Range('Q' & RenActual).Value = @Col(aTotalSinIVA;2)[C0]  
  // Total sin IVA 0%
  ws.Range('R' & RenActual).Value = @Col(aTotalSinIVA;3)[C0]
  // Total sin IVA Exento
  ws.Range('S' & RenActual).Value = @Col(aTotalSinIVA;4)[C0]
  // Total sin IVA Otros
  ws.Range('T' & RenActual).Value = @Col(aTotalSinIVA;5)[C0]

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

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

  // Retencion ISR
  ws.Range('Z' & RenActual).Value = @col(aRetencion;0)[C0]

  // Retencion IVA
  ws.Range('AA' & 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; aTitulo; gGranRetencion)
  // Avanza de renglon
  RenActual = RenActual + 1[C0]


  ws.Range('C' & RenActual & ':D' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
  ws.Range('C' & RenActual & ':D' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0]
  ws.Range('C' & RenActual & ':D' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0]
  ws.Range('C' & RenActual & ':D' & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0]
  ws.Range('C' & RenActual & ':D' & RenActual).Font.FontStyle = 'Negrita'[C0]



  ws.Range('E' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
  ws.Range('E' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0]
  ws.Range('E' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0]
  ws.Range('E' & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0]
  ws.Range('E' & RenActual).Font.FontStyle = 'Negrita'[C0]

  ws.Range('I' & RenActual & ':AA' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
  ws.Range('I' & RenActual & ':AA' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0]
  ws.Range('I' & RenActual & ':AA' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0]
  ws.Range('I' & RenActual & ':AA' & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0]
  ws.Range('I' & RenActual & ':AA' & RenActual).Font.FontStyle = 'Negrita'[C0]



  // Titulo
  ws.Range('C' & RenActual).Value = aTitulo


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

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

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

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

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

  // Gran total con IVA Otros
  ws.Range('N' & RenActual).Value = @Col(gGranTotalConIVA;5)[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 8%
  ws.Range('Q' & RenActual).Value = @Col(gGranTotalSinIVA;2)[C0]  

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

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

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

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

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

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

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


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

  // Total Retencion 2
  ws.Range('AA' & RenActual).Value = @Col(gGranRetencion;1)[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; aRetencion; atDocumento: Tabla; aNumImpuesto; atPagos: Tabla)
  Local lOffsetImporte, lOffsetPorcentaje, lEsExento, lNeto, lTotal, lImpuesto, lOtraTasa

  aNeto = 0[C0..C7]
  aImpuesto = 0[C0..C3]
  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] ]

    lNeto[0]  = tMovimiento(cNeto) - tMovimiento(cDescuento1) - tMovimiento(cDescuento2) - tMovimiento(cDescuento3) - tMovimiento(cDescuento4) - tMovimiento(cDescuento5)
    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 8
        SI @VAL(@SUBSTR(atDocumento(cFecha);0;4)) > 2018
            lImpuesto[0] = tMovimiento->CampoVal[lOffsetImporte]
            aNeto[2] = @Col(aNeto;2) + @Col(lNeto;0)
            aImpuesto[2] = @Col(aImpuesto;2) + @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[3] = @Col(aNeto;3) + @Col(lNeto;0)
          SiNo
            aNeto[4] = @Col(aNeto;4) + @Col(lNeto;0)
          FinSi
        SiNo
          aImpuesto[3] = @Col(aImpuesto;3) + tMovimiento->CampoVal[lOffsetImporte]
          aNeto[5]  = @Col(aNeto;5) + @Col(lNeto;0)
        FinSi
      FinCaso
      OtroCaso
        lOtraTasa = TRUE        
      FinCaso
    FinEscoge 

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

  FinMientras
  aNeto[6] = atDocumento(cNeto) - atDocumento(cDescuentoMov)
  aNeto[7] = 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 Á 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  P O R  C L I E N T E'[C0]
    SiNo
      ws.Range('A' & RenActual ).Value = 'A N Á 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  P O R  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 & ':T' & 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('AA' & RenActual).HorizontalAlignment = xlDerecha[C0]
      ws.Range('AA' & RenActual).Font.FontStyle = 'Negrita'[C0]    
      ws.Range('AA' & RenActual ).Value = 'Moneda: ' & tMoneda(cNombreMoneda)[C0]
    FinSi

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


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

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

    // Pone el titulo Importes totales sin IVA
    ws.Range('O' & RenActual & ':T' & RenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0]
    ws.Range('O' & RenActual & ':T' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
    ws.Range('O' & RenActual & ':T' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0]
    ws.Range('O' & RenActual & ':T' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0]
    ws.Range('O' & RenActual & ':T' & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0]
    ws.Range('O' & RenActual & ':T' & 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('V' & RenActual & ':Y' & RenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0]
    ws.Range('V' & RenActual & ':Y' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
    ws.Range('V' & RenActual & ':Y' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0]
    ws.Range('V' & RenActual & ':Y' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0]
    ws.Range('V' & RenActual & ':Y' & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0]
    ws.Range('V' & RenActual & ':Y' & RenActual).Interior.ColorIndex = 3[C0]    
    ws.Range('V' & RenActual).Font.Color = @RGB(255;255;255)[C0]
    ws.Range('V' & RenActual).Font.FontStyle = 'Negrita'[C0]    
    ws.Range('V' & RenActual ).Value = 'IMPORTE DE IVA'[C0]


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



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

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

    ws.Range('D' & RenActual).HorizontalAlignment = xlCentro[C0]
    ws.Range('G' & RenActual & ':AA' & RenActual).HorizontalAlignment = xlCentro[C0]
    ws.Range('A' & RenActual & ':AA' & RenActual).Value = 'Fecha','Serie','Folio','Concepto','Importe Pagado','Serie','Folio','Concepto',@Chr(39)&'16%',@Chr(39)&'11%',@Chr(39)&'8%',@Chr(39)&'0%','Exento','Otros Impuestos',@Chr(39)&'16%',@Chr(39)&'11%',@Chr(39)&'8%',@Chr(39)&'0%','Exento','Otros Impuestos','Neto','IVA 16%','IVA 11%','IVA 8%','Otros Impuestos'

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

    gNombreRetencion1 = tParametros(cNombrer01)
    gNombreRetencion2 = tParametros(cNombrer02)
    ws.Range('Z' & RenActual).value = gNombreRetencion1
    ws.Range('AA' & RenActual).value = gNombreRetencion2


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

// ==========================================================================================
// fDiscriminaCliente()
// Salidas:  1 = indica que el cliente no aplica, debe descartarse
//           0 = indica que el cliente no debe descartarse.
// ==========================================================================================
DefFunc fDiscriminaCliente(aCliente:TABLA)
  Local lRegresa
    
  lRegresa = 0

  // Se salta el Cliente NINGUNO
  Si aCliente(cIdClienteProveedor) = 0
    lRegresa = 1
  Finsi
  // Si se requieren los clientes y no se trata de un cliente:(1=cliente,2=cliente/provedor,3= proveedor)
  Si  pTipoReporte = 0 Y (aCliente(cTipoCliente) > 2) 
    lRegresa = 1
  Finsi
  // Si se requieren los Proveedores y no se trata de un Proveedor
  Si  pTipoReporte = 1 Y (aCliente(cTipoCliente) < 2) 
    lRegresa = 1
  Finsi
  // Si Estado solicitado no es Todos y No Coincide el tipo de cliente con el parametro 
  // pCualesClientes = 2(inactivos) aplicando %2 = 0, 0 = inactivos en la tabla de clientes
//  Si (aCliente(cEstatus) != pCualesClientes%2)
//    lRegresa = 1
//  Finsi
  // Se Revisan las CLASIFICACIONES, solo en el caso de haber seleccionado al menos una 
  Si gNumDeClases > 0
    Si !fMiembroDeUnaClase(aCliente;gNumDeClases;gListIdDeClases;pQueTipo)
     // Sa salta el cliente actual, por no pertenecer a alguna de las clasificaciones
      lRegresa = 1
    Finsi
  Finsi


  Retorna lRegresa

FinFunc


// ===========================================================================================
// fBuscaAlgunReg
// Descripcion : Busca algun registro que coincida con el campo aIDBuscado, y alguna de las 
//               fechas que sea menor o igual que aFechaFin.
// Salida : modifica el argumento aFechaIni, para regresar la fecha en que se encontro el 1er.
//          registro que coincide
//          Posicion : tiene la posición dentro de la lista, que corresponde al concepto 
// ===========================================================================================
Deffunc BuscaAlgunReg(aFechaIni;aFechaFin;aIdBuscado;aTblDeBusqueda:TABLA;aListaCptos)
Local lpos, lFechaIni

  lFechaIni = aFechaIni
  lpos = 0

  Mientras @Escoge(aListaCptos;lpos) != ''

    aTblDeBusqueda.BUSCA[aIdBuscado &':'& @Escoge(aListaCptos;lpos)]
    Si aTblDeBusqueda->Encontro

      // ya encontro el concepto ahora busca la fecha
      aFechaIni = lFechaIni

      // Busca la llave completa, de otra forma nunca entraria al ciclo
      aTblDeBusqueda.BUSCA[aIdBuscado &':'& @Escoge(aListaCptos;lpos)&':' &aFechaIni]

      // si lo encontro en la primer fecha, ya no entra
      Mientras aFechaIni <= aFechaFin Y !aTblDeBusqueda->ENCONTRO 
        aTblDeBusqueda.BUSCA[aIdBuscado &':'& @Escoge(aListaCptos;lpos)&':' &aFechaIni]
        Si !aTblDeBusqueda->Encontro 
          aFechaIni = fFechaSiguiente(aFechaIni)
        Finsi
      FinMientras

      // Si lo encontro se sale del ciclo para dejar a lPos en la pos. del primer Cpto encontrado
      Si aTblDeBusqueda->Encontro 
        Finciclo
      Sino
        lpos = lpos + 1   
      Finsi

    Sino
      lpos = lpos + 1 
    Finsi

  FinMientras 

  Retorna  lpos
Finfunc



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


Si pDelClienteP = ' '
  tClientes.Busca Primero
  pDelClienteP = tClientes(cCodigoCliente)
Finsi
  
Si pAlClienteP = ' '
  tClientes.Busca Ultimo
  pAlClienteP =  tClientes(cCodigoCliente)  
Finsi

gFechaBusqueda = pDeLaFecha  

lVersion = @INT(tParametros(cVersion01))
lVersionDDT = @INT(vVersionAdminpaq)

//Si lVersion < 310 O lVersionDDT < 310
//  ws.Range('A8').Value = 'Reporte solo para version 310 o superior'
//Sino

Mientras[tClientes.Busca[pDelClienteP & '..'  & pAlClienteP ];tClientes->Encontro ; tClientes.Busca Siguiente[1]]

  Si fDiscriminaCliente(tClientes) = 1
    Continua
  Finsi
  gPosicion = 0
//  gPosicion = BuscaAlgunReg(&gFechaBusqueda;pAlaFecha;tClientes(cIdClienteProveedor);&tPagos;pIdListaCptos)

    gGranTotalCorte = 0
    gGranTotalConIVACorte = 0
    gGranTotalSinIVACorte  = 0
    gGranNetoCorte = 0
    gGranIVACorte = 0

    gGranRetencionCorte =0




  Mientras @Escoge(pIdListaCptos ; gPosicion) != ''
    // Se obtine el nombre del concepto en proceso y se inicializa el contador de doctos por Cpto


    

    gAlMenosUnDocto = 0
    // Totales por concepto
    gTotalCargosCpto = 0.0
    gTotalAbonosCpto = 0.0
    // Se buscan movtos asociados a el concepto en todo el rango de fechas

      // Ahora si barre todos los movimientos a partir del primero que ya habia encontrado
      // la Llave base se refiere al IdCliente y el IdConcepto, solo cambiaria la fecha
      gLlaveBase = @Str(tClientes(cIdClienteProveedor);0)&':'&@Escoge(pIdListaCptos ; gPosicion)


      pFueraRango = 0

      Mientras [tPagos.BUSCA[ gLlaveBase]; (tPagos->ENCONTRO Y pFueraRango=0); tPagos.BUSCA SIGUIENTE[2]]
        // Si el docto tiene fecha menor a 2002 no desglosar su IVA
        Si tPagos(cFecha) < '20020101' 
          Continua
        FinSi

        Si tPagos(cFecha) < pFechaInicial
          Continua
        FinSi


        Si tPagos(cFecha) > pFechaFinal
          pFueraRango = 1 
          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)
            gImpuesto[3] = fCambiarMonedaDoctoAReporte(tPagos; tTiposCambioLib; @Col(gImpuesto;3); 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 + gImpuesto) * @Col(gProporcional;0)[C2]
            gTotalConIVA = gNeto * @Col(gProporcional;0)[C3]
            gTotalConIVA = gNeto * @Col(gProporcional;0)[C4]
            gTotalConIVA = (gNeto + @Col(gImpuesto;3)) * @Col(gProporcional;0)[C5]
            
            Si pMostrarTasa8 = 0 
              gnImporte[0] = @COL(gnImporte; 0) - @COL(gTotalConIVA; 2) 
            FinSi  
      
            // Calcula impuestos en base a la proporción general
            gIVA = gImpuesto * @Col(gProporcional;0)[C0]
            gIVA = gImpuesto * @Col(gProporcional;0)[C1]
            gIVA = gImpuesto * @Col(gProporcional;0)[C2]
            // No se considerará el importe 3 ni el 4 ya que estos son tasa 0%
            gIVA = gImpuesto * @Col(gProporcional;0)[C3]

            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 - gIVA[C2]
            gTotalSinIVA = gTotalConIVA[C3]
            gTotalSinIVA = gTotalConIVA[C4]
            gTotalSinIVA[5] = @Col(gTotalConIVA;5) - @Col(gIVA;3)
      
            gNeto[7] = @Col(gTotalSinIVA;0) + @Col(gTotalSinIVA;1) + @Col(gTotalSinIVA;2) + @Col(gTotalSinIVA;3) + @Col(gTotalSinIVA;4) + @Col(gTotalSinIVA;5)
      
            //Si no muestra IVA 8%, se resta el importe al neto y total. 
            Si pMostrarTasa8 = 0 
              gNeto[7] = @COL(gNeto; 7) - @COL(gTotalSinIVA; 2) 
            FinSi    
              
            gGranTotal = gGranTotal + gnImporte[C0]
            gGranTotalConIVA = gGranTotalConIVA + gTotalConIVA[C0..C5]
            gGranTotalSinIVA  = gGranTotalSinIVA   + gTotalSinIVA[C0..C5]
            gGranNeto = gGranNeto + @Col(gNeto;7)[C0]
            gGranIVA = gGranIVA + gIVA[C0..C3]
            gGranRetencion = gGranRetencion + gRet[C0..C1]


            gGranTotalCorte = gGranTotalCorte + gnImporte[C0]
            gGranTotalConIVACorte = gGranTotalConIVACorte + gTotalConIVA[C0..C5]
            gGranTotalSinIVACorte  = gGranTotalSinIVACorte   + gTotalSinIVA[C0..C5]
            gGranNetoCorte = gGranNetoCorte + @Col(gNeto;7)[C0]
            gGranIVACorte = gGranIVACorte + gIVA[C0..C3]

            gGranRetencionCorte = gGranRetencionCorte + gRet[C0..C1]

            Si lImprimeProveedor = 0   
              RenActual = RenActual + 2 
              ws.Range('A' & RenActual).Font.FontStyle = 'Negrita'[C0]    
              ws.range('A' & RenActual).value = 'Proveedor'
              ws.Range('D' & RenActual).Font.FontStyle = 'Negrita'[C0]    
              ws.range('D' & RenActual).value = tClientes(cCodigoCliente)
              RenActual = RenActual + 1
              ws.range('A' & RenActual).value = 'Razon Social'
              ws.Range('A' & RenActual).Font.FontStyle = 'Negrita'[C0]    
              ws.range('D' & RenActual).value = tClientes(cRazonSo01)
              ws.Range('D' & RenActual).Font.FontStyle = 'Negrita'[C0]    
              RenActual = RenActual + 1
  
              lImprimeProveedor = 1
            FinSi
            // Imprime el documento
            fImprimeDocumento(tPagos; tDocumento; gnImporte; gTotalConIVA; gTotalSinIVA; gNeto; gIVA; gRet)
          FinMientras
      FinMientras
      // Fin del mientras Documentos.busca
    gPosicion = gPosicion + 1
  FinMientras
  lImprimeProveedor = 0

  // total por proveedor
  SI @COL(gGranTotalCorte;0) > 0  
      fImprimeTotales(gGranTotalCorte; gGranTotalConIVACorte; gGranTotalSinIVACorte; gGranNetoCorte; gGranIVACorte; 'Total Proveedor'; gGranRetencionCorte)    
  FINSI  


FinMientras

// Manda a Excel GranTotal, GranTotalConIVA, GranTotalSinIVA, GranNeto, GranIVA
RenActual = RenActual + 1
fImprimeTotales(gGranTotal; gGranTotalConIVA; gGranTotalSinIVA; gGranNeto; gGranIVA; 'Total General'; gGranRetencion)


//FinSi
