// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// Reporte:     ANTIGUEDAD DE SALDOS PARA CLIENTES/PROVEDORES     AntigSaldos.rpt 
//
// Sistema:     ADMINPAQ  Versión v1.0 Windows
//
// Descripcion: Este reporte muestra los saldos vencidos de los clientes o los saldo que se tienen
//         con los diferentes proveedores, estos saldos se agrupan en periodos de 10,15 etc.días
//         según lo que se pidan.
//         Solo se mostrarán los Clientes/Proveedores que presenten un saldo vencido.
//         Se puede mostrar el reporte a nivel de documentos (Detallado) o sumarizado a nivel de 
//         Cliente/Proveedor.
// Consideraciones :
// Creación  :  Felix de la Cruz S.   05/Sept/2001
// Revisiones : 
// 29/04/2005   LAP    N.D.3240     Expresar los importes de los documentos en la moneda 
//                                  del reporte. Considerando que los documentos en moneda 
//                                  base tienen el tipo de cambio de la moneda del cliente 
//                                  a la moneda base. Utilizar fCambiarMonedaDoctoAReporte y
//                                  fCambiarMonedaImporteAReporte de LibAdminPAQ.rpt
// 13/08/2008   ELVS	 N.D.5234			ERROR PONE LOS DIAS DE PAGO EN LA SECCION DIAS DE REVISION
//																	Y PONE LOS DIAS DE REVISION EN LA SECCION DE DIAS DE PAGO
//																	AL EJECUTAR EL REPORTE DE CLIENTES ANTIGUEDAD DE SALDOS DETALLADO.	 
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// INCLUSION DE ARCHIVOS
      Incluye LibAdminPaq.rpt
      Incluye LibCliProv.rpt
// INICIO PARAMETROS
    Parametro pFechaCorte   = '20011129'
    Parametro pDelCliente   = ' '             // clave del primer cliente en el rango
		Parametro pAlCliente    = ' '             // clave del ultimo cliente en el rango
    Parametro pDias         = 15
    Parametro pCualesClientes =  0            // 0 =todos, 1= Activos, 2= InActivos
    Parametro pIdMoneda       =  2            // 1 = ID moneda Peso mexicano

    Parametro pQueTipo    = 0    // 0 = Clientes, 1 = Proveedores
    Parametro pDetallado  = 0    // Reporte detallado o concentrado
                                 // 0 = Concentrado 
                                 // 1 = Detallado
    
    Parametro pIdClase1   = 0    // por omisión deben recibir 0 =  ninguna
    Parametro pIdClase2   = 0    // se pueden seleccionar varias clases por clasificación.    
    Parametro pIdClase3   = 0    
    Parametro pIdClase4   = 0    // por los pueden recibir una lista con los Id´s de las clases
    Parametro pIdClase5   = 0
    Parametro pIdClase6   = 0    // seleccionadas.

// INICIO APERTURA TABLAS
// Nombres terminados en Lib, indican: la tabla fue abierta explicitamente para alguna Fx de libreria
  UsaEmpresa tEmpresa;'AdminpaqW'               

   // Parametros de la empresa
  UsaTabla tParametros = tEmpresa['mgw10000']         // Usa el indice primario

  // Documentos
  UsaTabla tDocumentos = tEmpresa['mgw10008'] Alias 'tDoctos1'
  tDocumentos.Usaindice['iCLienteProvAfectaNatVenc'] // cIdClienteProveedor+cAfectado+cNaturaleza
                                                     // cFechaVencimiento
  UsaTabla tDoctosLib2 = tEmpresa['mgw10008'] Alias 'tDoctos2'               
  tDoctosLib2.Usaindice['']                                // Usa el indice Primario cIDDocumento

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

  UsaTabla tMonedas = tEmpresa['mgw10034']          
  tMonedas.Usaindice['']                              // Usa el índice primario, por cIdMoneda

  UsaTabla tCargosAbonosLib = tEmpresa['mgw10009']   
  tCargosAbonosLib.UsaIndice['iDoctoCargoAbono']                  // IDDoctoCargo + IDDoctoAbono

  // TiposCambio 
  Usatabla tTiposCambio = tEmpresa['mgw10035']
  tTiposCambio.Usaindice['iMonedaFecha']                                  //  cIdMoneda + cFecha

  UsaTabla tValoresDeClasif = tEmpresa['mgw10020']
  tValoresDeClasif.UsaIndice['']

   // Periodos
  UsaTabla tPeriodos = tEmpresa['mgw10031']            // Usa el indice primario, cIDEjercicio
  tPeriodos.UsaIndice['']

  UsaTabla tConceptos = tEmpresa['mgw10006']
  tConceptos.UsaIndice['']

//DEFINICION DE COLUMNAS 


  UsaLetra 'Arial'
  Altura 9
//  [C0..C2].Decimales 0
//  [C0..C2].Blanco ' '
//  [C4..C12].Coma
  tMonedas.Busca[@Str(pIdMoneda;0)]
  gDecimales = tMonedas(cDecimalesMoneda)
//  [C4..C12].Decimales gDecimales
//  [C4..C12].Blanco '0.00'

//VARIABLES GLOBALES 
  
  gHoy = fFormateaFecha(@Hoy();0)
  gNombreMoneda = tMonedas(cNombreMoneda)
  gLimite1 = pDias
  gLimite2 = 2*pDias
  gLimite3 = 3*pDias

  gAcum1Total = 0
  gAcum2Total = 0
  gAcum3Total = 0
  gAcum4Total = 0  

  gTotalSaldoVencido = 0


//FUNCIONES <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

// =================================================================================================
// Función área sensible al contexto
// =================================================================================================
DefFunc ContextoDetalleCliente(aNumeroColumna; aValor)
    EJECUTA tEmpresa->SysDirDatos & '\Reportes\AdminPAQ\AntigSaldos.RTW';pFechaCorte,aValor,aValor,pDias,0,pIdMoneda,pQueTipo,1,pIdClase1,pIdClase2,pIdClase3,pIdClase4,pIdClase5,pIdClase6;tEmpresa->Directorio
FinFunc

// ==========================================================================================
// fColumnas()
// ==========================================================================================
Deffunc fColumnas(aTipo)
  Si aTipo = 'C'              // Revisa si se quiere concentrado
               // C0      C2       C4        C6        C8        C10       C12     
    Columnas 19;2.1,0.15,5.4,0.15,1.95,0.15,1.95,0.15,1.95,0.15,1.95,0.15,1.95,0.1
    [C0..C2].Decimales 0
    [C0..C2].Blanco ' '
    [C4..C12].Coma
    [C4..C12].Decimales gDecimales
    [C4..C12].Blanco '0.00'
  
  Sino
               // C0      C2        C4        C6       C8        C10       C12      C14        C16       C18
    Columnas 19;1.65,0.15,1.65,0.15,0.75,0.15,1.2,0.15,1.95,0.15,1.95,0.15,1.95,0.15,1.95,0.15,1.95,0.15,3.0
    [C0..C8].Decimales 0
    [C0..C8].Blanco ' '
    [C10..C18].Coma
    [C10..C18].Decimales gDecimales
    [C10..C18].Blanco '0.00'

  Finsi
FinFunc

// ==========================================================================================
// fMascaraDias()
//    Esta función recibe un campo numérico, que en una representación binaria de siete digitos
//    indica ciertos días de la semana, según el digito que esté prendido, estos pueden ser
//    1111111 - Dom Sab Vie Jue Mie Mar Lun
// ==========================================================================================
Deffunc fMascaraDias(aValor)
  Local lDias,lGuion

  // solo nos interesan los 7 bits mas a la derecha
  
  lGuion = ''    
  lDias = ''
  Si aValor%2 = 1       // Un numero non = bit menos significativo encendido
    lDias = lGuion&'L'
    lGuion = '-'
  Finsi
  Si aValor%4 >= 2      // Valor Entre 1y4 = Segundo bit menos significativo encendido
    lDias = lDias & lGuion & 'M'
    lGuion = '-'
  Finsi
  Si aValor%8 >= 4      // Valor Entre 8y4 = Tercer bit menos significativo encendido
    lDias = lDias & lGuion & 'Mi'
    lGuion = '-'
  Finsi
  Si aValor%16 >= 8     // Valor Entre 16y8 = Cuarto bit menos significativo encendido
    lDias = lDias & lGuion & 'J'
    lGuion = '-'
  Finsi
  Si aValor%32 >= 16
    lDias = lDias & lGuion & 'V'
    lGuion = '-'
  Finsi  
  Si aValor%64 >= 32
    lDias = lDias & lGuion & 'S'
    lGuion = '-'
  Finsi  
  Si aValor%128>= 64
    lDias = lDias & lGuion & 'D'
    lGuion = '-'
  Finsi  

  Retorna lDias
FinFunc

// ==========================================================================================
// fCambioMonedaDocto()
// Descripcion : Esta función convierte el importe expresado en la moneda del documento a un 
//        importe expresado en la moneda del reporte.
// ==========================================================================================
//! N.D.3240 DEFFUNC fCambioMonedaDocto(aTblDocto:TABLA; aSaldoDocto;aIdMoneda)
//! N.D.3240 	Local lSaldoMonedaRpt,lSaldoMonedaBase
//! N.D.3240   Local lTipoCambioRpt
//! N.D.3240 
//! N.D.3240 	// La moneda del Reporte es distinta a la moneda del Docto
//! N.D.3240   Si aTblDocto(cIdMoneda) != aIdMoneda
//! N.D.3240     lSaldoMonedaBase = aSaldoDocto * aTblDocto(cTipoCambio)
//! N.D.3240      // Si el reporte es requerido en una Moneda distinta a la Moneda Base
//! N.D.3240     Si aIdMoneda != 1
//! N.D.3240       // Convierte de la Moneda Base a la Moneda requerida en el Reporte
//! N.D.3240       lTipoCambioRpt      = fTipoCambio(aTblDocto(cFecha);aIdMoneda;tTiposCambio)
//! N.D.3240       lSaldoMonedaRpt = lSaldoMonedaBase / lTipoCambioRpt
//! N.D.3240     Sino
//! N.D.3240       lSaldoMonedaRpt  = lSaldoMonedaBase
//! N.D.3240     Finsi
//! N.D.3240   Sino
//! N.D.3240     lSaldoMonedaRpt = aSaldoDocto
//! N.D.3240   Finsi
//! N.D.3240   Retorna lSaldoMonedaRpt
//! N.D.3240 FinFunc

// ==========================================================================================
// fAcumulaSaldo()
// Descripcion : Esta función acumula el saldo enla columna que le corresponde de acuerdo a el 
//     número de días vencidos del saldo.
// ==========================================================================================
Deffunc fAcumulaSaldo(aDias;aSaldo)

  Si aDias <= gLimite1
    gAcum1Cliente = gAcum1Cliente + aSaldo
  Sino
    Si aDias <= gLimite2
      gAcum2Cliente = gAcum2Cliente + aSaldo
    Sino 
      Si aDias <= gLimite3
        gAcum3Cliente = gAcum3Cliente + aSaldo
      Sino
        gAcum4Cliente = gAcum4Cliente + aSaldo
      Finsi
    Finsi
  Finsi

FinFunc

// =========================================================================================
// fImprimeDocumento
// ==========================================================================================
Deffunc fImprimeDocumento(atCliente:TABLA;atDocto:TABLA;aSaldo;aDias)  
  Local  lRenglon

  // cuando se pide concentrado, aquí no se imprime nada.
  Si pDetallado = 0
    Retorna
  Finsi

  NEGRITAS True
  Si gDatosCliente = 0 
    Si pQueTipo = 0
      Texto 'Cliente: ' & fMascarilla(atCliente(cCodigoCliente);tParametros(cMascarillaClientes))
    Sino
      Texto 'Proveedor: ' & fMascarilla(atCliente(cCodigoCliente);tParametros(cMascarillaClientes))
    Finsi
    Imprime
    Texto 'Nombre:  ' & atCliente(cRazonSocial)
    Imprime
    Texto 'Días de Pago: '& fMascaraDias(atCliente(cDiaPago)) //N.D.5234
    Imprime
    Texto 'Días de Revisión: '& fMascaraDias(atCliente(cDiasRevision)) //N.D.5234
    Imprime
    gDatosCliente = 1
  Finsi
  NEGRITAS False

  fColumnas('D') // Se establecen las columnas para impresión detallada
  lRenglon = ''
  
  lRenglon[0] = fFormateaFecha(atDocto(cFechaVencimiento);0)
  lRenglon[2] = fFormateaFecha(atDocto(cFecha);0)
  lRenglon[4] = atDocto(cSerieDocumento)
  lRenglon[6] = atDocto(cFolio)
  lRenglon[8] = @Str(aDias;0)
  Si aDias <= gLimite1
    lRenglon[10] = aSaldo
  Sino
    Si aDias <= gLimite2
      lRenglon[12] = aSaldo
    Sino 
      Si aDias <= gLimite3
        lRenglon[14] = aSaldo
      Sino
        lRenglon[16] = aSaldo
      Finsi
    Finsi
  Finsi

  tConceptos.Busca[@Str(atDocto(cIDConceptoDocumento);0)]
  lRenglon[18] = tConceptos(cNombreConcepto)

  Imprime lRenglon
FinFunc

// ==========================================================================================
// fImprimeTotales()
// ==========================================================================================
Deffunc fImprimeTotales(atCliente:TABLA;aTotal)  
  
  local lRenglon
  
  // Si no se pidió Detallado
  Si pDetallado = 0
    fColumnas('C')
    lRenglon = ''
    lRenglon[0] = fMascarilla(atCliente(cCodigoCliente);tParametros(cMascarillaClientes))
    lRenglon[2] = atCliente(cRazonSocial)

    lRenglon[4] = aTotal
    lRenglon[6] = gAcum1Cliente
    lRenglon[8] = gAcum2Cliente
    lRenglon[10] = gAcum3Cliente
    lRenglon[12] = gAcum4Cliente
    Si aTotal != 0
      DEFREGION ContextoDetalleCliente
      [C4].REGIONINFO atCliente(cCodigoCliente)
    FinSi
    Imprime lRenglon
  Sino 
    // si se pidió detallado
    fColumnas('D')
    lRenglon = ''
    [C10,C12,C14,C16].Subrayacol '-' 
    imprime
    lRenglon[10] = gAcum1Cliente
    lRenglon[12] = gAcum2Cliente
    lRenglon[14] = gAcum3Cliente
    lRenglon[16] = gAcum4Cliente
    Imprime lRenglon
  Finsi

  gAcum1Total = gAcum1Total + gAcum1Cliente
  gAcum2Total = gAcum2Total + gAcum2Cliente
  gAcum3Total = gAcum3Total + gAcum3Cliente
  gAcum4Total = gAcum4Total + gAcum4Cliente  

  gTotalSaldoVencido = gTotalSaldoVencido + aTotal
FinFunc

// ==========================================================================================
// fImprimeGranTotal()
// ==========================================================================================
Deffunc fImprimeGranTotal()
  Local lRenglon,lSubRaya

  lRenglon = ''
  lSubRaya = ''
  Saltalin 1
  Si pDetallado = 0 
    lSubRaya = '==============='[C4,C6,C8,C10,C12]
    Imprime lSubRaya 
    lRenglon[4] = gTotalSaldoVencido
    lRenglon[6] = gAcum1Total
    lRenglon[8] = gAcum2Total
    lRenglon[10] = gAcum3Total
    lRenglon[12] = gAcum4Total
  Sino
    lSubRaya = '==============='[C10,C12,C14,C16]
    imprime lSubRaya
    lRenglon[10] = gAcum1Total
    lRenglon[12] = gAcum2Total
    lRenglon[14] = gAcum3Total
    lRenglon[16] = gAcum4Total
  Finsi
  Imprime lRenglon
FinFunc

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

  // Se salta el Cliente NINGUNO
  Si atCliente(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  pQueTipo = 0 Y (atCliente(cTipoCliente) > 2) 
    lRegresa = 1
  Finsi

  // Si se requieren los Proveedores y no se trata de un Proveedor
  Si  pQueTipo = 1 Y (atCliente(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 (pCualesClientes != 0) Y (atCliente(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(atCliente;gNumDeClases;gListIdDeClases;pQueTipo)
     // Sa salta el cliente actual, por no pertenecer a alguna de las clasificaciones
      lRegresa = 1
    Finsi
  Finsi
  Retorna lRegresa

FinFunc


// ==========================================================================================
// fEncabColumnas()
// ==========================================================================================
Deffunc fEncabColumnas()
   NEGRITAS TRUE
    Altura 9
    Texto '@TC{0,0,0}@L{-1}'
    Imprime 

    Si pDetallado = 0  // No se pidio detallado
      fColumnas('C')
      Texto C4; 'Importe'
      Texto C6; '^'&'1-'& @Str(gLimite1;0)
      Texto C8; '^'&@Str((gLimite1)+1;0)&'-'&@Str(gLimite2;0)
      Texto C10;'^'&@Str(gLimite2+1;0)&'-'&@Str(gLimite3;0)
      Texto C12;'^'&@Str(gLimite3+1;0)
      Imprime
      Texto C0;'Código'
      Texto C2;pQueTipo = 0? 'Nombre (Cliente)':'Nombre (Proveedor)'
      Texto C4; 'Total Vencido'
      Texto C6; '^Días'
      Texto C8; '^Días'
      Texto C10;'^Días'
      Texto C12;'^Días o más'
    Sino            // Si se pidió detallado
      fColumnas('D')
      Texto C8; 'Días' 
      Texto C10; '^'&'1-'& @Str(gLimite1;0)
      Texto C12; '^'&@Str((gLimite1)+1;0)&'-'&@Str(gLimite2;0)
      Texto C14; '^'&@Str(gLimite2+1;0)&'-'&@Str(gLimite3;0)
      Texto C16; '^'&@Str(gLimite3+1;0)
      Imprime
      Texto C0; 'Vencimiento'
      Texto C2; 'Fecha'
      Texto C4; 'Serie'
      Texto C6; 'Folio'
      Texto C8; 'Vencidos'
      Texto C10;'^Días'
      Texto C12;'^Días'
      Texto C14;'^Días'
      Texto C16;'^Días o más'
      Texto C18;'Concepto'
    Finsi

    Imprime 1

    Texto '@TC{0,0,0}@L{-1}'
    Imprime 
    NEGRITAS FALSE
FinFunc


//ENCABEZADO 
  Encab
    
    Si pDetallado = 0
      fColumnas('C')
    Sino
      fColumnas('D')
    Finsi
    Texto '@TC{0,0,0}@S{8}AdminPAQ' 
 	  Hoja '"@TC{0,0,0}@S{8}Hoja: ' 
    Imprime 
    Texto '@TC{0,0,0}@S{8}Moneda: ' & gNombreMoneda
    Texto '"@TC{0,0,0}@S{8}Fecha: ' & gHoy
    Imprime
    Texto '^@TC{0,0,0}@S{22}' & tEmpresa->Nombre
    Imprime
    Si pDetallado = 0
      Texto '^@TC{0,0,0}@S{16}' & 'Antiguedad de Saldos'
    Sino
      Texto '^@TC{0,0,0}@S{16}' & 'Antiguedad de Saldos Detallado'
    Finsi
    Imprime

    gFechaCorte = fFormateaFecha(pFechaCorte;0)
    Texto '^@TC{0,0,0}@S{16}'& 'Fecha de Corte : ' & gFechaCorte
    Imprime 

    // ===== Se Revisan las clasificaciones, para recuperarlas e imprimirlas en el encabezado
    fRevisaClases(tValoresDeClasif)  
    // ===== Fin de la revision de clasificaciones

    fEncabColumnas()
  FinEncab

//PRINCIPAL <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

  Si pDelCliente = ' '
    tClientes.Busca Primero
    pDelCliente = tClientes(cCodigoCliente)
  Finsi
  
  Si pAlCliente = ' '
    tClientes.Busca Ultimo
    pAlCliente =  tClientes(cCodigoCliente)  
  Finsi

  // Esta función se debe ejecutar antes del cuerpo del reporte, para inicializar algunas valores
  // Globales para la biblioteca LibAdminPAQ.rpt
  fIniFechasHistoria(tPeriodos)

  gSaldoDocumento = 0.0
  gTotalVencido = 0.0
  tParametros.Busca Primero   
 
  Mientras [tClientes.Busca[pDelCliente & '..'  & pAlCliente ]; tClientes->Encontro ; tClientes.Busca Siguiente[1]]
    
    Si fDiscriminaCliente(tClientes) = 1
      Continua
    Finsi

    // Se buscan todos los documentos asociados a el cliente, afectados 
    Si pQueTipo = 0          // Para clientes busca cargos
      gLlaveBusqueda = tClientes(cIdClienteProveedor)&':'&'1:'&'0'
    Sino                     // Para Proveedores busca abonos
      gLlaveBusqueda = tClientes(cIdClienteProveedor)&':'&'1:'&'1'
    Finsi

    // Inicializa totales por Cliente
    gTotalVencido = 0.0      // guarda el acumulado de saldos vencidos del cliente
    gAcum1Cliente = 0.0      // Acumulado del rango 1, 2,3, 4
    gAcum2Cliente = 0.0 
    gAcum3Cliente = 0.0     
    gAcum4Cliente = 0.0     
    gDatosCliente = 0        // Indica si se imprimió o no, los datos del empleado.
    Mientras [tDocumentos.Busca[gLlaveBusqueda];tDocumentos->Encontro;tDocumentos.Busca Siguiente[3]]

      // CASO Clientes/Proveedores : se descartan los cargos que no son de clientes 
      // y los abonos que no son de proveedores
      Si pQueTipo = 0 y tDocumentos(cUsaCliente) = 0 // cargo pero no es docto de cliente
        Continua
      Finsi
      Si pQueTipo = 1 y tDocumentos(cUsaProveedor) = 0 // abono pero no es docto de proveedor
        Continua
      Finsi

      Si tDocumentos(cFechaVencimiento) < pFechaCorte
        gSaldoDocumento = fSaldoDocumento('';pFechaCorte;tCargosAbonosLib;tDocumentos;tDoctosLib2)
        // N.D.3238/4362 Redondear los importes antes de mostrarlos
        Si tMonedas(cIdMoneda) != tDocumentos(cIdMoneda)
          tMonedas.Busca[@Str(tDocumentos(cIdMoneda);0)]
        FinSi
        gSaldoDocumento = fRedondeaImporteLib(gSaldoDocumento; tMonedas(cDecimalesMoneda))
        // Si tiene un saldo vencido, este documento
        Si gSaldoDocumento > 0.001
          // se obtiene el saldo en la moneda del reporte
          //! N.D.3240 gSaldoDocumento = fCambioMonedaDocto(tDocumentos; gSaldoDocumento;pIdMoneda)
          gSaldoDocumento = fCambiarMonedaDoctoAReporte(tDocumentos; tTiposCambio; gSaldoDocumento; pIdMoneda; tClientes(cIdMoneda))
          // N.D.3238/4362 Redondear los importes antes de mostrarlos
          gSaldoDocumento = fRedondeaImporteLib(gSaldoDocumento; gDecimales)
          // se acumula al total vencido del cliente/Proveedor
          gTotalVencido = gTotalVencido + gSaldoDocumento 
          // se obtienen los días vencidos del documento
          gDiasVencidos = fConvJul(pFechaCorte)-fConvJul(tDocumentos(cFechaVencimiento))
          // se acumulan a la columna apropiada
          fAcumulaSaldo(gDiasVencidos;gSaldoDocumento)
          // Imprime el documento, la función valida si es detallado o concentrado
          fImprimeDocumento(tClientes;tDocumentos;gSaldoDocumento;gDiasVencidos)  
          // Imprimir datos del cliente (Solo la primera vez) y del documento
        Finsi
      Sino
        // Se llego al fin ya no es necesario seguir buscando
        FinCiclo
      FinSi
        
    FinMientras
    // final de la busqueda, se imprime el resumen, solo en caso de haber un saldo vencido
    Si gTotalVencido > 0.001
      // Imprime los totales, la función valida si es detallado o concentrado
      fImprimeTotales(tClientes;gTotalVencido)
    Finsi
  FinMientras                            // Fin del mientras tClientes.busca
  
  fImprimeGranTotal()

//  FIN DEL REPORTE

