// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// Reporte:     REPORTE DE RELACION DE COBRANZA POR CLIENTE    RelCobroPorAgente.rpt 
//
// Sistema:     ADMINPAQ  Versión v1.0 Windows
//
// Descripcion: Este reporte despliega todos los documentos pendientes de pago de cada cliente
//         El Saldo del documento se calcula en base a la fecha de corte.
//         Este reporte es exclusivo para Clientes.
// Consideraciones :
// Creación  :  Felix de la Cruz S.   11/Sept/2001
// Revisiones : Félix 14/Feb/2002;
//              Fernando 15/03/2002  Estaba usando indice erroneo 
//              Daniel Robles de Alba 11/Abr/2002 ND-323
//                                    17/Abr/2002 ND-343
//                                    07/Ago/2002 ND-449
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Historia de modificaciones
//  Fecha      Nombre   IDLotus                     Descripcion
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// 28/07/2003   CILA    N.D.2335    Se cambio el numero de decimales de 2 a 4
//                                  para la columna de tipo de cambio.
// 08/03/2005   HVA     N.D.2965    
// 20/04/2005   LAP     N.D.3219    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.
//                                  - Cuerpo del reporte
//                                  - fImprimirDocto
//                                  - fCambioMonedaDocto pasa a LibAdminPAQ.rpt como fCambiarMonedaDoctoAReporte
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// INCLUSION DE ARCHIVOS
    Incluye LibAdminPaq.rpt 
    Incluye LibCliProv.rpt

// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// INICIO PARAMETROS
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    Parametro pFechaCorte   = '20021231'
    Parametro pDelAgente    = ' '             // clave del primer cliente en el rango
    Parametro pAlAgente     = ' '             // clave del ultimo cliente en el rango
                                              // cualquier subconjunto, '1,2';'2,4,6' etc.
    Parametro pImprimirDoctos =  1            // 0 = Todos Doctos con saldo
                                              // 1 = Solo Doctos Vencidos a Fecha de Corte
    Parametro pIdMoneda       =  1            // 1 = ID moneda Peso mexicano
    
    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

  // Clientes y Provedores
  UsaTabla tClientes = tEmpresa['mgw10002']
  tClientes.Usaindice['']                  // Se toma el indice por omisión cIdClienteProveedor

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

  // Documentos
  UsaTabla tDocumentos = tEmpresa['mgw10008'] Alias 'tDoctos1'
  tDocumentos.Usaindice['iAgenteFechaSeriefolio']

  UsaTabla tDoctoslib = tEmpresa['mgw10008']  Alias 'tDoctos2'               
  tDoctosLib.UsaIndice['']      //IdClienteProveedor+cFecha+cSerie+cFolio

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

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

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

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

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

  UsaTabla tAgentes = tEmpresa['mgw10001']             // Usa el indice primario
  tAgentes.UsaIndice['iCodigoTipo']                    // cCodigoAgente + cTipoAgente

// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
//DEFINICION DE COLUMNAS 
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
             // C0      C2        C4        C6        C8      C10       C12      C14       C16       C18
  Columnas 19; 2.1,0.15,0.75,0.15,1.2,0.15,3.75,0.15,2.1,0.15,1.95,0.15,2.1,0.15,1.95,0.15,1.35,0.15,1.2 
  UsaLetra 'Arial'
  Altura 9
  [C0..C10,C16].Decimales 0
  
  [C0..C8].Blanco ' '
  [C10,C12].Coma
  [C10,C12].Corchete True
  tMonedas.Busca[@Str(pIdMoneda;0)]
  gDecimales = tMonedas(cDecimalesMoneda)
  // N.D.2335 Inicio -------------------------
  //[C12,C14,C18].Decimales gDecimales
  [C12,C14].Decimales gDecimales
  [C18].Decimales 4
  // N.D.2335 Fin ----------------------------
  [C10,C12].Blanco '0.00'

// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// VARIABLES GLOBALES 
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
  gHoy = fFormateaFecha(@Hoy();0)
  gNombreMoneda = tMonedas(cNombreMoneda)

  gTotalGralSaldo = 0.0
  gTotalGral  = 0.0

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

// =========================================================================================
// fImprimeDocumento (Procedimiento)
// 
// 17-ABR-2002 ND-343 No consideraba el tipo de agente de 'Venta'
// ==========================================================================================
Deffunc  fImprimeAgente(atAgente:TABLA)

  NEGRITAS True
  Texto 'Agente: ' & fMascarilla(atAgente(cCodigoAgente);tParametros(cMascarillaAgente))
  Imprime
  Texto 'Nombre:  ' & atAgente(cNombreAgente)
  Imprime
  // Si no es de Cobro  es de Venta/Cobro
  Si atAgente(cTipoAgente) = 1
    Texto 'Tipo :   Venta'
  SiNo
    Texto 'Tipo :   ' & (atAgente(cTipoAgente) = 3? 'Cobro' :'Venta/Cobro' )
  FinSi
  Imprime

  NEGRITAS False

FinFunc

// ==========================================================================================
// fImprimirDocto()
// Descripcion : 
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Historia de modificaciones
// Fecha       Nombre   IDLotus     Descripcion
// 20/04/2005  LAP      N.D.3219    Ahora esta función recibe el total y el saldo del documento
//                                  expresados en la moneda del reporte.
// ==========================================================================================
Deffunc fImprimirDocto(atDocto:TABLA; aTotal; aSaldo)
Local lRenglon, lNaturaleza, lTipoCambio

  lRenglon = ''

  Si atDocto(cFechaVencimiento) < pFechaCorte
    lRenglon[ 0] = '*'& fFormateaFecha(atDocto(cFecha);0)
    lRenglon[16] = (fConvJul(pFechaCorte)-fConvJul(atDocto(cFechaVencimiento)))
  Sino
    lRenglon[ 0] = ' '& fFormateaFecha(atDocto(cFecha);0)
  Finsi
  lRenglon[ 2] = atDocto(cSerieDocumento)
  lRenglon[ 4] = atDocto(cFolio)
  
  tConceptos.Busca[@Str(atDocto(cIdConceptoDocumento);0)]
  Si tConceptos->Encontro
    lRenglon[ 6] = tConceptos(cNombreConcepto)
  Finsi

  lRenglon[ 8] = fMascarilla(tClientes(cCodigoCliente);tParametros(cMascarillaClientes))
  lRenglon[10] = fFormateaFecha(atDocto(cFechaVencimiento);0)

  lRenglon[12] = aTotal
  lRenglon[14] = aSaldo 
  lRenglon[18] = atDocto(cTipoCambio)

  Imprime lRenglon

  // Acumula el total por cliente
  gTotalSaldoAgente = gTotalSaldoAgente + aSaldo
  gTotalAgente = gTotalAgente + aTotal
FinFunc

// ==========================================================================================
// fImprimeTotal() 
//    Imprime el total por cliente o el total general, depende del parametro aCual
// ==========================================================================================
Deffunc fImprimeTotal(aTotal;aTotalSaldo;aCual)
  Local lRenglon, lSubRaya

  lRenglon = ''

  Si aCual = 'C'  // es un total del cliente
    [C12,C14].SubrayaCol '-'
    Imprime 
    // Entonces acumula los totales generales
    gTotalGralSaldo = gTotalGralSaldo + aTotalSaldo
    gTotalGral = gTotalGral + aTotal
  Sino            // Es un total general, subraya las columnas 
    lSubraya = '==============='[C12,C14]
    Saltalin 1
    Imprime lSubRaya
  Finsi

  lRenglon[12] = aTotal
  lRenglon[14] = aTotalSaldo
  Imprime lRenglon

FinFunc

// ==========================================================================================
// fEncabColumnas
// ==========================================================================================
Deffunc fEncabColumnas()

  NEGRITAS True
  Altura 9
  Texto '@TC{0,0,0}@L{-1}'
  Imprime 
  Texto C0; 'Fecha'
  TExto C2; 'Serie'
  TExto C4; 'Folio'
  Texto C6; 'Concepto'
  Texto C8; 'Cliente'
  Texto C10;'Vencimiento'
  Texto C12;'^Total'
  Texto C14;'^Saldo'
  Texto C16;'^Días'
  Texto C18;'^Tipo'
  Imprime 
  Texto C16;'^Vencidos'
  Texto C18;'^Cambio'
  Imprime 

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

FinFunc

// ==========================================================================================
// fDiscriminaCliente()
// Salidas:  1 = indica que el cliente no aplica, debe descartarse
//           0 = indica que el cliente no debe descartarse.
//
// ND-323 Se quitó el filtro que solo dejaba pasar agentes de cobro por que
// en una factura suele haber solo agentes de ventas o de vta/cobro y por
// tanto la mayor parte de la veces no sacaba información (DRdA)
// ==========================================================================================
DefFunc fDiscriminaAgente(atAgente:TABLA)
  Local lRegresa
    
  lRegresa = 0

  // Se salta el Cliente NINGUNO
  Si atAgente(cIdAgente) = 0
    lRegresa = 1
  Finsi

  // Si no es agente cobranza = 3, cobranza/venta = 2 ; venta = 1 lo excluye
//!  Si atAgente(cTipoAgente) = 1
//!    lRegresa = 1
//!  Finsi

  // Se Revisan las CLASIFICACIONES, solo en el caso de haber seleccionado al menos una 
  Si gNumDeClases > 0
    Si !fMiembroDeUnaClase(atAgente;gNumDeClases;gListIdDeClases;3)
     // Sa salta el cliente actual, por no pertenecer a alguna de las clasificaciones
      lRegresa = 1
    Finsi
  Finsi
  Retorna lRegresa

FinFunc

// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// ENCABEZADO 
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
 Encab   
    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
    Texto '^@TC{0,0,0}@S{16}' & 'Relación de Cobranza por Agente'
    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 pDelAgente = ' '
  tAgentes.Busca Primero
  pDelAgente = tAgentes(cCodigoAgente)
Finsi
  
Si pAlAgente = ' '
  tAgentes.Busca Ultimo
  pAlAgente =  tAgentes(cCodigoAgente)  
Finsi

tParametros.Busca Primero   

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

fEjercicioPeriodo(pFechaCorte;&gPeriodo;&gIdEjercicio;tPeriodos)  
// Esta función se debe ejecutar antes del cuerpo del reporte, para inicializar algunas valores
// Globales para la biblioteca LibAdminPAQ.rpt
 
Mientras[tAgentes.Busca[pDelAgente&'..'&pAlAgente]; tAgentes->Encontro; tAgentes.Busca Siguiente[1]]           
  Si fDiscriminaAgente(tAgentes) = 1
    Continua
  Finsi

  gTotalSaldoAgente = 0.0 // acumula el saldo de los doctos que se imprimen para el Agente
  gTotalAgente = 0.0
  gImprimirAgente = 0 // Por omisión no se imprime el cliente hasta encontrar un docto con saldo
  gDatosAgente = 0    // Controla la impresión de los datos del cliente, solo una vez por cliente

  Mientras[tDocumentos.BUSCA[@Str(tAgentes(cIdAgente);0)]; tDocumentos->ENCONTRO; tDocumentos.BUSCA SIGUIENTE[1]]  
    // Inicia N.D.0449
    // Si hay documentos mayores a la fecha de corte termina el ciclo por que no deben entrar. Esto
    // obedece a que se está usando un índice que incluye fechas. (DRdA)
    Si tDocumentos(cFecha) > pFechaCorte
      FinCiclo
    FinSi
    // Fin N.D.0449

    // Si el docuemento no esta afectado, o no es de clientes o no es cargo; se lo salta
    Si (tDocumentos(cAfectado)!= 1) O (tDocumentos(cUsaCliente)!= 1)O (tDocumentos(cNaturaleza)!=0)
      Continua
    Finsi

    // Excluye los documentos de utilidad o perdida cambiaria
    Si ( tDocumentos(cIdDocumentoDe)>=28 Y tDocumentos(cIdDocumentoDe)<=31 )
      Continua
    Finsi

    // Calcula el Saldo del Documento es igual tanto para cargos, como para abonos
    gSaldoDocumento = fSaldoDocumento('';pFechaCorte;tCargosAbonosLib;tDocumentos;tDoctosLib)

    // Si al menos un docto tiene saldo, entonces se imprime el cliente
    Si (gSaldoDocumento > 0.001) 
      gImprimirAgente = 1
    Finsi

    // Si no tiene saldo, siempre se excluye
    Si (gImprimirAgente = 0 )
      Continua                        
    FinSi

    // Si llegó hasta aquí, el cliente tiene al menos un docto con saldo a la fecha de corte
    // Si el saldo no esta vencido y se elijió solo doctos vencidos, lo excluye
    Si  (tDocumentos(cFechaVencimiento) >= pFechaCorte) Y (pImprimirDoctos = 1)
      // Al quitarse la linea siguiente se mantiene el valor de la bandera hasta el final ya sea 0 o 1
      //!gImprimirAgente = 0  // Siempre no se va a imprimir el cliente.
      Continua
    Finsi

    // Si no se han impreso los datos, se imprimen y se levanta la bandera para no imprimirlos nuevamente
    Si gDatosAgente = 0
      fImprimeAgente(tAgentes)
      gDatosAgente = 1   // Solo se imprime una vez el encabezado del cliente
    FinSi

    // Solo se imprimen los documento que tienen un saldo realmente, a la fecha de corte
    Si gSaldoDocumento > 0.001
      // N.D.3219 Inicio
      // Busqueda del cliente 
      tClientes.Busca[@Str(tDocumentos(cIdClienteProveedor);0)]
      // Expresar el total y el saldo en la moneda del reporte
      gSaldoDocumento = fCambiarMonedaDoctoAReporte(tDocumentos; tTiposCambioLib; gSaldoDocumento; pIdMoneda; tClientes(cIdMoneda))
      gTotalDocumento = fCambiarMonedaDoctoAReporte(tDocumentos; tTiposCambioLib; tDocumentos(cTotal); pIdMoneda; tClientes(cIdMoneda))
      // Enviar el total y el saldo a la función que imprime el documento
      fImprimirDocto(tDocumentos; gTotalDocumento; gSaldoDocumento)
      // N.D.3219 Fin
    Finsi

  FinMientras

  Si (gImprimirAgente = 1)
    fImprimetotal(gTotalAgente;gTotalSaldoAgente;'C')
  Finsi

FinMientras   

fImprimeTotal(gTotalGral;gTotalGralSaldo;'G')

Saltalin 1
Texto '      *  Documentos Vencidos con respecto a la Fecha de Corte'
Imprime

//  FIN DEL REPORTE

