// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//
//	Ajuste2010.rpt
//	Nombre del reporte en el sistema: Análisis de Documentos vs Ajustes reforma 2010
//
//  Sistema: AdminPAQ v1.1
// 
//	 Este reporte simula el ajuste que se realizará en documentos de clientes y proveedores
//   que tengan un saldo pendiente al 11 de enero del 2010, además reporta los ajustes que el
//   sistema hubiera generado debido a los pagos que se realicen posterior a esta fecha
//	Consideraciones especiales:
//  
//	Elaboró:    Gabriela Cuevas
//	Fecha: 	   25 de noviembre del 2009
//
//
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<


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

Incluye LibAdminPAQ.Rpt
Incluye LibCliProv.rpt

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

Parametro pFechaInicial    = '20090101'    // Fecha inicial del rango
Parametro pFechaCorte      = '20091127'
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 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

UsaEmpresa tTemporal;'';tEmpresa->SysDirDatos

//Cargos y Abonos. 
//Índice: IDDoctoCargo + IDDoctoAbono.
UsaTabla tCargosAbonosLib = tEmpresa['mgw10009']   
tCargosAbonosLib.UsaIndice['iDoctoCargoAbono']


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

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

//Documentos. 
//Índice: primario.
UsaTabla tDoctosLib2 = tEmpresa['mgw10008'] Alias 'tDoctos3'               
tDoctosLib2.Usaindice['']

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


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

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





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

Columnas 4;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
gProporcional = 0       // Proporciones de IVA sobre el neto del documento
gNumImpuesto = 1        // Cúal de los tres impuesto es usado


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


tMoneda.Busca[@Str(pIdMoneda;0)]
gDecimalesMoneda = tMoneda(cDecimalesMoneda)
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
constante xlDistribuir  -4117

// *************************************
// 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 = 20[C0]
// Saldo = 15 caracteres
ws.Columns(5).ColumnWidth = 14[C0]
// Ajuste = 15 caracteres
ws.Columns(6).ColumnWidth = 14[C0]
// Saldo ajustado = 15 caracteres
ws.Columns(7).ColumnWidth = 14[C0]
// Nota de crédito que se generará
ws.Columns(8).ColumnWidth = 14[C0]
// Concepto
ws.Columns(9).ColumnWidth = 20[C0]
// Serie ajuste = 5 caracteres
ws.Columns(10).ColumnWidth = 5[C0]
// Folio ajuste = 8 caracteres
ws.Columns(11).ColumnWidth = 8[C0]
// Importe ajuste = 15 caracteres
ws.Columns(12).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(12).NumberFormat = lFormato[C0]
  Sino // Si no encontró el registro de la empresa
    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(12).NumberFormat = '#,##0.00_);(#,##0.00)'[C0]
  FinSi
FinFunc
/////////////////////////////////////////////////////////////////////////////////
//
//
Deffunc fImprimeTotal(aTitulo; aAcumulado)
  
  ws.Range('A' & RenActual & ':L' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
  ws.Range('A' & RenActual & ':L' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0]
  ws.Range('A' & RenActual & ':L' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0]
  ws.Range('A' & RenActual & ':L' & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0]
  ws.Range('A' & RenActual & ':L' & RenActual).Font.FontStyle = 'Negrita'[C0]
  ws.Range('C' & RenActual).Value = aTitulo[C0]  
  ws.Range('E' & RenActual).Value = @Col(aAcumulado;0)[C0]
  ws.Range('F' & RenActual).Value = @Col(aAcumulado;1)[C0]
  ws.Range('G' & RenActual).Value = @Col(aAcumulado;0)+@Col(aAcumulado;1)[C0]        
  ws.Range('H' & RenActual).Value = @Col(aAcumulado;3)[C0]           
  ws.Range('L' & RenActual).Value = @Col(aAcumulado;2)[C0]  
  RenActual = RenActual + 1[C0]    
FinFunc

// *****************************************************************************
//  fImprimeDocumento
//
//	 Esta función imprime los datos del documento y los calculados
//
//  Parámetros 
//
//  Salidas 
// *****************************************************************************
DefFunc fImprimeDocumento(atDocumento:Tabla; aSaldoDocto; aAjuste; aNotaCredito; aIdMonedaCliente)
  Local lFechaEditada, lBandera, lIVA

  SI @COL(aAjuste;0) 
    lIVA = 0
  SINO 
    lIVA = 1
  FINSI

  // Avanza de renglon

  ws.Range('A' & RenActual & ':L' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
  ws.Range('A' & RenActual & ':L' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0]
  ws.Range('A' & RenActual & ':L' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0]
  ws.Range('A' & RenActual & ':L' & RenActual).Borders(xlDerecha).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]



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

  // Importe pagado
  aSaldoDocto[0] = fCambiarMonedaDoctoAReporte(atDocumento; tTiposCambioLib; @Col(aSaldoDocto;0); pIdMoneda; aIdMonedaCliente)  
  aAjuste[lIVA] = fCambiarMonedaDoctoAReporte(atDocumento; tTiposCambioLib; @Col(aAjuste;lIVA); pIdMoneda; aIdMonedaCliente)    
  aNotaCredito[lIVA] = fCambiarMonedaDoctoAReporte(atDocumento; tTiposCambioLib; @Col(aNotaCredito;lIVA); pIdMoneda; aIdMonedaCliente)    
  ws.Range('E' & RenActual).Value = @Col(aSaldoDocto;0)[C0]
  ws.Range('F' & RenActual).Value = @Col(aAjuste;lIVA)[C0]
  ws.Range('G' & RenActual).Value = @Col(aSaldoDocto;0)+@Col(aAjuste;lIVA)[C0]  
  ws.Range('H' & RenActual).Value = @Col(aNotaCredito;lIVA)[C0]


  gCliente[0] = @COL(gCliente;0) + @Col(aSaldoDocto;0)
  gCliente[1] = @COL(gCliente;1) + @Col(aAjuste;lIVA)
  gCliente[3] = @COL(gCliente;3) + @Col(aNotaCredito;lIVA)  
  gTotal[0] = @COL(gTotal;0) + @Col(aSaldoDocto;0)
  gTotal[1] = @COL(gTotal;1) + @Col(aAjuste;lIVA)  
  gTotal[3] = @COL(gTotal;3) + @Col(aNotaCredito;lIVA)  

  lBandera = 0    
  tAjuste.BUSCA[@STR(atDocumento(CIDDOCUM01);0)]  
  MIENTRAS tAjuste->ENCONTRO
    SI tAjuste(cIdConce01) = gIdAjusteCliente O tAjuste(cIdConce01) = gIdAjusteProveedor O ( tAjuste(cIdMonedca) != 0 Y tAjuste(cIdDocum03) != 0)
        lBandera = 1
        ws.Range('I' & RenActual & ':L' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
        ws.Range('I' & RenActual & ':L' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0]
        ws.Range('I' & RenActual & ':L' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0]
        ws.Range('I' & RenActual & ':L' & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0]      
        // cONCEPTO
        tConceptos.Busca[@Str(tAjuste(cIdConceptoDocumento);0)]
        Si tConceptos->Encontro
            ws.Range('I' & RenActual).Value = tConceptos(cNombreConcepto)[C0]    
        FinSi
        // Serie
        ws.Range('J' & RenActual).Value = tAjuste(cSerieDocumento)[C0]
        // Folio
        ws.Range('K' & RenActual).Value = tAjuste(cFolio)[C0]

        // Folio
        ws.Range('L' & RenActual).Value = fCambiarMonedaDoctoAReporte(tAjuste; tTiposCambioLib; tAjuste(cTotal); pIdMoneda; aIdMonedaCliente)[C0]
        gCliente[2] = @COL(gCliente;2) + ws.Range('L' & RenActual).Value
        gTotal[2] = @COL(gTotal;2) + ws.Range('L' & RenActual).Value
        
        RenActual = RenActual + 1[C0]
    FINSI
    tAjuste.BUSCA SIGUIENTE[1]
 FINMIENTRAS
 SI lBandera = 1
    RenActual = RenActual - 1[C0]
 FINSI     
FinFunc

// *****************************************************************************
//  fCalculaAjuste
//
//	 Calcula el ajuste de iva que le corresponde a la factura
//
//  Parámetros 
//
//  Entradas: aIdDocumento - Identificador del documento padre de los movtos
//            gAjuste      - Ajuste de iva que debe hacerse  
//  Salidas: El parámetro AImpuesto debe ser pasado por referencia
// *****************************************************************************
Deffunc fCalculaAjuste(atDocumento:Tabla; aImpuesto)    

  Local lOffsetImporte, lOffsetPorcentaje

  aImpuesto = 0[C0..C1]
       
  lOffsetImporte = 16 + (gNumImpuesto * 2)
  lOffsetPorcentaje = 17 + (gNumImpuesto * 2)
		
  Mientras [ tMovimiento.Busca[@Str(atDocumento(cIdDocumento);0)]; tMovimiento->Encontro; tMovimiento.Busca Siguiente[1] ]


    Escoge tMovimiento->CampoVal[lOffsetPorcentaje] 
      Caso 15 
        aImpuesto[0] = @Col(aImpuesto;0) + tMovimiento->CampoVal[lOffsetImporte]
      FinCaso
      Caso 10
        aImpuesto[1] = @Col(aImpuesto;1) + tMovimiento->CampoVal[lOffsetImporte]
      FinCaso
    FinEscoge 

  FinMientras
  aImpuesto[0] = (@COL(aImpuesto;0) * 0.01) /0.15
  aImpuesto[1] = (@COL(aImpuesto;1) * 0.01) /0.10

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 & ':L' & 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]
    ws.Range('A' & RenActual ).Value = 'Análisis de Ajustes por Reforma 2010'[C0]
    
    // Lo centra en las columnas A a la T
    ws.Range('A' & RenActual & ':L' & 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 = 'Verificar documentos a partir del: ' & fFormateaFecha(pFechaInicial;gIdioma)[C0]
    // Lo centra en las columnas A a la T
    ws.Range('A' & RenActual & ':L' & 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 = 'Fecha de Corte: ' & fFormateaFecha(pFechaCorte;gIdioma)[C0]
    // Lo centra en las columnas A a la T
    ws.Range('A' & RenActual & ':L' & RenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0]

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

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

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

    ws.Range('A' & RenActual).Font.Size = 10[C0]
    ws.Range('A' & RenActual ).Value = 'A. Ajuste incrementando IVA:  Ajuste que se generará para trasladar el IVA adicional que se cause, en la operaciones del 2009 pagadas en el 2010'[C0]

    RenActual = RenActual + 1[C0]

    ws.Range('A' & RenActual).Font.Size = 10[C0]
    ws.Range('A' & RenActual ).Value = 'B.   Ajuste absorbiendo IVA:    Ajuste que se generará para identificar el importe de IVA que se deberá absorber por la diferencia de tasas'[C0]

    RenActual = RenActual + 1[C0]

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

    
    ws.Range('F' & RenActual & ':G' & RenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0]
    ws.Range('F' & RenActual & ':G' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
    ws.Range('F' & RenActual & ':G' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0]
    ws.Range('F' & RenActual & ':G' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0]
    ws.Range('F' & RenActual & ':G' & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0]
    ws.Range('F' & RenActual & ':G' & RenActual).Interior.ColorIndex = 3[C0]    
    ws.Range('F' & RenActual).Font.Color = @RGB(255;255;255)[C0]
    ws.Range('F' & RenActual).Font.FontStyle = 'Negrita'[C0]    
    ws.Range('F' & RenActual ).Value = 'A. Ajuste incrementando IVA'[C0]



    ws.Range('H' & RenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0]
    ws.Range('H' & RenActual).VerticalAlignment = xlDistribuir[C0]
    ws.Range('H' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
    ws.Range('H' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0]
    ws.Range('H' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0]
    ws.Range('H' & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0]
    ws.Range('H' & RenActual).Interior.ColorIndex = 3[C0]    
    ws.Range('H' & RenActual).Font.Color = @RGB(255;255;255)[C0]
    ws.Range('H' & RenActual).Font.FontStyle = 'Negrita'[C0]    
    ws.Range('H' & RenActual ).Value = 'B. Ajuste absorbiendo IVA'[C0]


    // Pone el titulo Factura o Compra
    ws.Range('I' & RenActual & ':L' & RenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0]
    ws.Range('I' & RenActual & ':L' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
    ws.Range('I' & RenActual & ':L' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0]
    ws.Range('I' & RenActual & ':L' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0]
    ws.Range('I' & RenActual & ':L' & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0]
    ws.Range('I' & RenActual & ':L' & 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 = 'DOCUMENTO DE AJUSTE'[C0]

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

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

    ws.Range('A' & RenActual & ':L' & RenActual).HorizontalAlignment = xlCentro[C0]
    ws.Range('A' & RenActual ).Value = 'Fecha'[C0]
    ws.Range('B' & RenActual ).Value = 'Serie'[C0]
    ws.Range('C' & RenActual ).Value = 'Folio'[C0]
    ws.Range('D' & RenActual ).Value = 'Concepto'[C0]
    ws.Range('E' & RenActual ).Value = 'Saldo'[C0]
    ws.Range('F' & RenActual ).Value = 'Ajuste'[C0]
    ws.Range('G' & RenActual ).Value = 'Saldo Nuevo'[C0]
    ws.Range('H' & RenActual ).Value = 'Nota de Crédito'[C0]
    ws.Range('I' & RenActual ).Value = 'Concepto'[C0]
    ws.Range('J' & RenActual ).Value = 'Serie'[C0]
    ws.Range('K' & RenActual ).Value = 'Folio'[C0]
    ws.Range('L' & RenActual ).Value = 'Importe'[C0]

    RenActual = RenActual + 1[C0]
    // leer los nombres de las retenciones de la tabla de parametros

    Excel.Rows('8:8').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

  Retorna lRegresa

FinFunc

// =============================================================================
// fDiscriminaDocto()
// Salidas:  1 = indica que el Docto no aplica, debe descartarse
//           0 = indica que el Docto no debe descartarse.
//  Historia de revisiones:
//
//  Fecha         ID-LOTUS         Descripción
//------------------------------------------------------------------------------
//  07/05/2002    N.D.389          De acuerdo al parámetro pConDoctosNoAfectados
//                                 se verifica que en caso de quererse incluir
//                                 Documentos no afectados en el reporte, dichos
//                                 Documentos no estén cancelados. (EGV) 
// =============================================================================
DefFunc fDiscriminaDocto(atDocumento:TABLA; aIdMonedaCliente)
  Local lRegresa

  lRegresa = 0

  // si no es cargo o abono  
  Si atDocumento(cNaturaleza) = 2 
    lRegresa =1
  Finsi

  Si atDocumento(cCancelado) = 1
    lRegresa = 1
  FinSi

  Si atDocumento(cAfectado) != 1
     lRegresa =1
  Finsi

  // CASO Clientes/Proveedores : se descartan los cargos que no son de clientes y los abonos
  // que no son de proveedores, solo imprime los doctos de acuerdo a el tipo de reporte pedido
  Si pTipoReporte = 0 y atDocumento(cNaturaleza) != 0 // cargo pero no es docto de cliente
    lRegresa =1
  Finsi
  Si pTipoReporte = 1 y atDocumento(cNaturaleza) != 1 // abono pero no es docto de proveedor
    lRegresa =1
  Finsi

  // S.C.264 Discriminar los ajustes con documento origen
  Si (atDocumento(cIdConceptoDocumento) = gIdAjusteCliente O atDocumento(cIdConceptoDocumento) = gIdAjusteProveedor) Y atDocumento(cIdDocumentoOrigen) > 0
    lRegresa = 1
  FinSi

  
  Si aIdMonedaCliente != pIdMoneda Y pIdMoneda != 1
     lRegresa = 1
  FinSi      

  Retorna lRegresa

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 = pFechaInicial

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

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


tParametros.Busca Primero   
gFechaCorte = pFechaCorte //tParametros(cFecAj2010)
gTotal = 0


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

    gCliente = 0
    lImprime = 0
    Si fDiscriminaCliente(tClientes) = 1
        Continua
    Finsi
    
    lIdMonedaCliente = tClientes(cIdMoneda)    
    gFechaBusqueda   = pFechaInicial
    tDocumento.Usaindice['ICLIENTE01']
    tDocumento.Busca[@STR(tClientes(cIdClien01);0) & ':' & gFechaBusqueda]
    Si !tDocumento->ENCONTRO
        // Busquedas parciales: Cursor en el registro más cercano que cumple con la llave
        // NOTA: La propiedad Llave de la tabla nos regresa la llave más cercana que cumple con el criterio de la búsqueda
        //       La llave está en formato cadena y no tiene ningún separador entre los campos, por lo que es necesario revisar
        //      en FoxPro la definición del índice para descomponer los elementos de la Llave
        // Revisar si la llave actual corresponde al Producto / Almacén y al Rango de Fechas.
          Si tClientes(cIdClien01) = @Val(@SUBSTR(tDocumento->Llave;0;11))
              // Realizar nuevamente la búsqueda a fin de posicionarnos en el registro y activar la propiedad Encontro                
              gFechaBusqueda = @SUBSTR(tDocumento->Llave;11;8)
              tDocumento.Busca[@str(tClientes(cIdClien01);0) & ':' & gFechaBusqueda]
          FinSi
                
     FinSi

      

    MIENTRAS tDocumento->ENCONTRO  //Y @VAL(@SUBSTR(tDocumento(cFecha);0;4)) < 2010

        gAjuste = 0[c0..c1]
        gNotaCredito = 0[c0..c1]
        gSaldoDocto[0] = 0        

    
       Si fDiscriminaDocto(tDocumento; lIdMonedaCliente) = 1
          // Búsqueda del siguiente registro que cumpla con el cliente
          tDocumento.BUSCA SIGUIENTE[1]
          Continua
       Finsi


        // Calcula el Saldo del Documento es igual tanto para cargos, como para abonos
        gSaldoDocto[0] = fSaldoDocumento(''; gFechaCorte; tCargosAbonosLib; tDocumento; tDoctosLib2)
        
        // Se verifica para no imprimir documentos saldados.  
        Si (@COL(gSaldoDocto;0) < 0.001)
        // Búsqueda del siguiente registro que cumpla con el cliente
          tDocumento.BUSCA SIGUIENTE[1]
          Continua
        Finsi

        // Calcula el iva ajustado del documento
        fCalculaAjuste(tDocumento; &gAjuste)    
        // Calcula la proporción
        gProporcional[0] = gSaldoDocto / tDocumento(cTotal)
        gAjuste[0] = @COL(gAjuste;0) * @COL(gProporcional;0)
        gAjuste[1] = @COL(gAjuste;1) * @COL(gProporcional;0)
       
        gNotaCredito[0] = @COL(gAjuste;0) / 1.16
        gNotaCredito[1] = @COL(gAjuste;1) / 1.11

        // Imprime el documento
        Si lImprime = 0   
              RenActual = RenActual + 1  
              ws.Range('A' & RenActual).Font.FontStyle = 'Negrita'[C0]    
              ws.range('A' & RenActual).value = pTipoReporte = 0 ? 'Cliente': '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
  
              lImprime = 1
        FinSi
  
        fImprimeDocumento(tDocumento; gSaldoDocto; gAjuste; gNotaCredito; lIdMonedaCliente)
        RenActual = RenActual + 1[C0]
        tDocumento.BUSCA SIGUIENTE[1]    
    FINMIENTRAS

    tDocumento.Usaindice['']
    SI lImprime = 1
        fImprimeTotal(pTipoReporte = 0?'Total Cliente':'Total Proveedor'; gCliente)
    FINSI
FINMIENTRAS
fImprimeTotal('Total General';gTotal)

FINSI

      
