// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// Reporte:     Resumen de Operaciones de Venta Detallada por Agente   (ResAgen)
//
// Sistema:     ADMINPAQ  Versión v1.0 Windows
//
// Descripcion: 
//
// Consideraciones :
// Creación  :  Luis Palau Castañeda.  25/Agosto/2001
// Revisiones : 
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Historia de modificaciones
//  Fecha      Nombre   IDLotus                     Descripcion
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

// *************************************************************************************************
// INCLUSION DE ARCHIVOS
// *************************************************************************************************
   Incluye LibAdminPaq.rpt

// *************************************************************************************************
// INICIO PARAMETROS
// *************************************************************************************************
    Parametro pEjercicio        = 0
    Parametro pMes              = 0   //enero,feb,...oct, nov,dic
    Parametro pAgenteInicial    = '(Ninguno)'
    Parametro pAgenteFinal      = 'z'
    Parametro pProductoInicial  = '(Ninguno)' 
    Parametro pProductoFinal    = 'z'
    Parametro pUnidad           = 0	//0 = Unidad Base·	1 = Unidad No Equivalente·	2 = Seleccionar Unidad
    Parametro pIdUnidad         = 1 //base de datos de unidades (id)
    Parametro pIdMoneda         = 1 // 1 = ID moneda Peso mexicano    
    Parametro pFechaInicial     = ' '
    Parametro pFechaFinal       = ' '
 
// *************************************************************************************************
// INICIO APERTURA TABLAS
// *************************************************************************************************
  UsaEmpresa tEmpresa;'AdminpaqW'

   // Parametros de la empresa
  UsaTabla tParametros = tEmpresa['mgw10000']     

  // Productos
  UsaTabla tProductos = tEmpresa['mgw10005']
  tProductos.Usaindice['cIdProducto']

  //Agentes
  UsaTabla tAgentes = tEmpresa['mgw10001']
  tAgentes.Usaindice['iCodigoTipo']

  // Movimientos
  UsaTabla tMovimientos = tEmpresa['mgw10010']
  tMovimientos.Usaindice['iDoctoNumeroMovto']

  // tMovimientosOcultos
  UsaTabla tMovimientosOcultos = tEmpresa['mgw10010'] Alias 'tMovtosOcultos' 
  tMovimientosOcultos.Usaindice['iMovtoOwnerMovto']

  //documentosDe
  UsaTabla tDocumentosDe = tEmpresa['mgw10007']
  tDocumentosDe.Usaindice['']

  //documentos
  UsaTabla tDocumentos = tEmpresa['mgw10008']
  tDocumentos.Usaindice['iAgenteFechaSerieFolio']

  //conceptosdocumentos
  UsaTabla tconceptosDocumentos = tEmpresa['mgw10006']
  tconceptosDocumentos.Usaindice['']

  //unidades peso y med
  UsaTabla tUnidadesPM = tEmpresa['mgw10026']
  tUnidadesPM.Usaindice['']

  //EquivalenciasUnidades peso y med
  UsaTabla tEquivaleUnidadesPM = tEmpresa['mgw10027']
  tEquivaleUnidadesPM.Usaindice['']

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

  //ejercicio-mes
  UsaTabla tEjercicioPeriodo = tEmpresa['mgw10031']          
  tEjercicioPeriodo.Usaindice['']                     

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

// *************************************************************************************************
  tParametros.Busca Primero   
  // Esta función se debe ejecutar antes del cuerpo del reporte, para inicializar algunas valores
  // Globales para la biblioteca LibAdminPAQ.rpt
  tEjercicioPeriodo.Usaindice['cNumeroEjercicio']                     
  fIniFechasHistoria(tEjercicioPeriodo)
  tEjercicioPeriodo.Usaindice['']                     

// *************************************************************************************************
// DEFINICION DE COLUMNAS 
// *************************************************************************************************
  Columnas 20;1.95,0.15,1.80,0.15,1.5,0.15,3.9,0.15,0.75,0.15,2.4,0.15,1.95,0.15,2.4,0.15,2.4,0.15,0   
  UsaLetra 'Arial'
  Altura 9 
  [C0..C9].Decimales 0
  [C0..C9].Blanco ' '
  tMonedas.Busca[@str(pIdMoneda;0)]
  gDecimales = tMonedas(cDecimalesMoneda)
  [C10..C16].Coma
  [C10..C16].Decimales tParametros(cDecimalesUnidades) // Decimales para unidades
  [C10..C16].Blanco '0.00'
  [C11,C13,C15,C17..C19].Blanco ''

// *************************************************************************************************
// VARIABLES GLOBALES 
// *************************************************************************************************
  gDelaFecha = ''
  gAlaFecha  = ''
  vFechaFin = ''
  vFechaIni = ''
  gRenglon = '' 
  gTotalProd = ''
  gTotalAgente = ''
  gTotaltotal = ''
  gTotalPaquetes = ''
  gTotalAgentePaquetes = ''
  vTipoAcumulado = 0
  vImporteModelo  =  0
  vIdEjercicio = 0
  vDocumento = 0
  idRenglonIni = 5  //inicio de la hoja
  idRenglonFin = 5  //fin de la hoja (inicializacion)
  gNombreMoneda = tMonedas(cNombreMoneda)
 
  kMeses = 'Ene,Feb,Mar,Abr,May,Jun,Jul,Ago,Sep,Oct,Nov,Dic'[C0]
  //fecha de
  gDelaFecha = @str(pMes;0) 
  Mientras @len(gDelaFecha)<2
     gDelaFecha   = '0' & gDelaFecha 
  FinMientras
  gDelaFecha = @str(pEjercicio;0) &   gDelaFecha & '01'


// *************************************************************************************************
// FUNCIONES <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// *************************************************************************************************
// Función área sensible al contexto
// =================================================================================================
DefFunc ContextoDetalleDoctoProducto(aNumeroColumna; aValor)
    EJECUTA tEmpresa->SysDirDatos & '\Reportes\AdminPAQ\SegOpera.rtw';vFechaIni,vFechaFin,-1,pIdMoneda,pUnidad,pIdUnidad,0,1,@Escoge(aValor;0),@Escoge(aValor;1);tEmpresa->Directorio
FinFunc
// *************************************************************************************************
// Descripcion: Esta función recibe una fecha con formato ddmmaaaa y la convierte a formato	dd/mmm/aaaa
// Entradas :  Fecha : contiene la fecha AAAAMMDD
// Salida :    regresa una cadena con la fecha en formato DD/MMM/AAAA
// *************************************************************************************************
DefFunc fEditaFecha(aFecha)
Local lMes
Local lRegreso

  lMes = @INT(@SubStr(aFecha;4;2))
  lRegreso[0] = @SubStr(aFecha;6;2) & '/' & @Escoge(kMeses;lMes-1) & '/' & @SubStr(aFecha;0;4)
  Retorna lRegreso
FinFunc

// *************************************************************************************************
// Descripcion: imprime los totales generales de las variables gTotalProd
// Entradas :  
// Salida :    
// *************************************************************************************************
DefFunc  fTotalProd()
  Si PrimVez = 1
    Texto '@L{10,12,14,16}'
    imprime
    gTotalProd= ''[c0..c6]
    imprime gTotalProd
  Finsi
  gTotalProd = ''
Finfunc

// *************************************************************************************************
// Descripcion: imprime los totales  de las variable gRenglon y suma los totales 
// Entradas :  
// Salida :    
// *************************************************************************************************
DefFunc fRenglon(aTipoProducto; aIdDocumentoActual; aIdProducto)
  DEFREGION ContextoDetalleDoctoProducto
  [C4].REGIONINFO aIdDocumentoActual & ',' & aIdProducto
  imprime gRenglon
  gTotalProd  = gTotalProd + gRenglon
  Si aTipoProducto = 2
    gTotalAgentePaquetes = gTotalAgentePaquetes + gRenglon
  Sino
    gTotalAgente = gTotalAgente + gRenglon
  FinSi
  gRenglon = '' 
Finfunc

// *************************************************************************************************
// Descripcion: imprime los totales del Agente
// Entradas :  
// Salida :    
// *************************************************************************************************
DefFunc  fTotalAgente()
  Si PrimVez = 1
    Texto '@L{10,12,14,16}'
    imprime
    gTotaltotal = gTotaltotal + gTotalAgente
    gTotalPaquetes = gTotalPaquetes + gTotalAgentePaquetes
    gTotalAgente= ''[c0..c6]
    gTotalAgente[6] = 'Total Agente'
    imprime gTotalAgente

    // Impresion del Total de Paquetes. Solo aplica para ventas
    Si (@Col(gTotalAgentePaquetes;10) > 0) O (@Col(gTotalAgentePaquetes;12) > 0) O (@Col(gTotalAgentePaquetes;14) > 0) O (@Col(gTotalAgentePaquetes;16) > 0)
      gTotalAgentePaquetes = ''[c0..c6]
      gTotalAgentePaquetes[6] = 'Total Cantidad de Paquetes'
      Imprime gTotalAgentePaquetes        
    FinSi
  Finsi
  gTotalAgente = '' 
  gTotalAgentePaquetes = ''
Finfunc

// *************************************************************************************************
// Descripcion: imprime los totales generales del reporte
// Entradas :  
// Salida :    
// *************************************************************************************************
DefFunc  fTotaltotal()

  LTotalLinea = '==========================='[c0]
  Saltalin
  Texto c10; @col(LTotalLinea;0)
  Texto c12; @col(LTotalLinea;0)
  Texto c14; @col(LTotalLinea;0)
  Texto c16; @col(LTotalLinea;0)
  imprime
  gTotaltotal = ''[c0..c6]
  gTotalTotal[6] = 'Total Agentes'
  imprime gTotaltotal

  // Impresion del Total de Paquetes. Solo aplica para ventas
  Si (@Col(gTotalPaquetes;10) > 0) O (@Col(gTotalPaquetes;12) > 0) O (@Col(gTotalPaquetes;14) > 0) O (@Col(gTotalPaquetes;16) > 0)
    gTotalPaquetes = ''[c0..c6]
    gTotalPaquetes[6] = 'Total Cantidad de Paquetes'
    Imprime gTotalPaquetes        
  FinSi
Finfunc

// *************************************************************************************************
// Descripcion: imprime los datos del Agente
// Entradas :  
// Salida :    
// *************************************************************************************************
Deffunc ImprimeAgente()
  Local vimprime

  Columnas 20;1.5,0.15,6.6,0.15,1.5,0.15,0.9,0.15,1.65,0.15,1.65,0.15,1.65,0.15,2.25,1.15,0
  Negritas True
  texto ' '
  imprime 
  vimprime = 'Agente:' [c0]
  vimprime = fMascarilla(tAgentes(cCodigoAgente);tParametros(cMascarillaAgente))[c2]
  imprime vimprime
  vimprime = 'Nombre:' [c0]
  vimprime = tAgentes(cNombreAgente) [c2]
  imprime vimprime
  Negritas False
  Columnas 20;1.95,0.15,1.80,0.15,1.5,0.15,3.9,0.15,0.75,0.15,2.4,0.15,1.95,0.15,2.4,0.15,2.4,0.15,0   
  aAnterior =''[c0]
Finfunc

// *************************************************************************************************
// Descripcion: imprime los datos del producto
// Entradas :  
// Salida :    
// *************************************************************************************************
Deffunc ImprimeP(aCodigo;aProducto;aidUnidadNoConvertible;aIdUnidadBase)

  Si @col(aCodigo;0) != @col(aAnterior;0)
    saltalin
    vimprime = ''[c4]
    Negritas True
    Columnas 20;1.5,0.15,6.6,0.15,0.75,0.15,0.9,0.15,1.65,0.15,1.65,0.15,1.65,0.15,0,0,0
    vimprime = 'Producto:' [c0]
    vimprime = fMascarilla( @col(aCodigo;0);tParametros(cMascarillaProducto))[c2]
    imprime vimprime
    vimprime = 'Nombre:' [c0]
    vimprime = @col(aProducto;0) [c2]

    //busca unidad base
    Si pUnidad = 1 y @col(aidUnidadNoConvertible;0) != 0
      tUnidadesPM.busca[@str(@col(acidUnidadNoConvertible;0);0)]
    Sino
      Si pUnidad = 2 
        tUnidadesPM.busca[@str(@col(pIdUnidad;0);0)]
      Sino
        tUnidadesPM.busca[@str(@col(aIdUnidadBase;0);0)]
      Finsi
    Finsi

    si tUnidadesPM->encontro
      vimprime  =tUnidadesPM(cDespliegue)[c4]
      Si @col(vimprime;4)='(N)'
        vimprime = ''[c4]
      Finsi
    Finsi

    imprime vimprime
    Negritas False

    Columnas 20;1.95,0.15,1.80,0.15,1.5,0.15,3.9,0.15,0.75,0.15,2.4,0.15,1.95,0.15,2.4,0.15,2.4,0.15,0   
  Finsi 
  aAnterior = @col(aCodigo;0)[c0]
Finfunc

// *************************************************************************************************
// Descripcion: imprime los datos del agente
// Entradas :  
// Salida :    
// *************************************************************************************************
Deffunc ImprimeA()
Local vimprime

   Si PrimVez = 0
     ImprimeAgente()
     PrimVez = 1
   Finsi
Finfunc

// *************************************************************************************************
// Descripcion: despues de buscar el id del peirodo se extrae las fechas correspondientres
//              a los mese 1,2,3,4..10,11,12 
// Entradas :   mes en formato numerico
// Salida :   fecha del mes
// *************************************************************************************************
DefFunc fFechaEjercicioPeriodo(aMes) 
Local lRegreso

  Escoge   aMes
    caso 1
      lRegreso = tEjercicioPeriodo(cFecIniPeriodo1)
    fincaso
    caso 2
      lRegreso = tEjercicioPeriodo(cFecIniPeriodo2)
    fincaso
    caso 3
      lRegreso = tEjercicioPeriodo(cFecIniPeriodo3)
    fincaso
    caso 4
      lRegreso = tEjercicioPeriodo(cFecIniPeriodo4)
    fincaso
    caso 5
      lRegreso = tEjercicioPeriodo(cFecIniPeriodo5)
    fincaso
    caso 6
      lRegreso = tEjercicioPeriodo(cFecIniPeriodo6)
    fincaso
    caso 7
      lRegreso = tEjercicioPeriodo(cFecIniPeriodo7)
    fincaso
    caso 8
      lRegreso = tEjercicioPeriodo(cFecIniPeriodo8)
    fincaso
    caso 9
      lRegreso = tEjercicioPeriodo(cFecIniPeriodo9)
    fincaso
    caso 10
      lRegreso = tEjercicioPeriodo(cFecIniPeriodo10)
    fincaso
    caso 11
      lRegreso = tEjercicioPeriodo(cFecIniPeriodo11)
    fincaso
    caso 12
      lRegreso = tEjercicioPeriodo(cFecIniPeriodo12)
    fincaso
  FinEscoge
  Retorna lRegreso
Finfunc

// *************************************************************************************************
// Descripcion: lista la hoja de trabajo
// Entradas :  rango de renglones
// Salida :   
// *************************************************************************************************
DefFunc Imprimehoja()//(idRenglonIni ;idRenglonFin )
Local idtemp

  idtemp = idRenglonIni
  Mientras  @col(idtemp;0) <@col(idRenglonFin;0)
    Si pUnidad = 3 O pUnidad = 4
      tEquivaleUnidadesPM.busca[@col({idtemp};13) & ':' & @col({idtemp};14)]
      Si tEquivaleUnidadesPM->encontro
        {idtemp}[5] = @col({idtemp};5) * tEquivaleUnidadesPM(cFactorConversion)
        {idtemp}[6] = @col({idtemp};6) * tEquivaleUnidadesPM(cFactorConversion)
        {idtemp}[7] = @col({idtemp};7) * tEquivaleUnidadesPM(cFactorConversion)
        {idtemp}[8] = @col({idtemp};8) * tEquivaleUnidadesPM(cFactorConversion)
      FinSi
    FinSi
    gRenglon [0]= @col({idtemp};11)//fecha
    gRenglon[0] = fEditaFecha(@col(gRenglon;0))
    gRenglon [2]= @col({idtemp};2)
    gRenglon [4]= @col({idtemp};3)
    gRenglon [6]= @col({idtemp};4)
    gRenglon [10]= @col({idtemp};5)
    gRenglon [12]= @col({idtemp};6)
    gRenglon [14]= @col({idtemp};7)
    gRenglon [16]= @col({idtemp};8)
    
    Si @col(gRenglon;10)=0 y @col(gRenglon;12)=0 y @col(gRenglon;14)=0 y @col(gRenglon;16)=0
      gRenglon= ''
    Sino 
      ImprimeP(@col({idtemp};10);@col({idtemp};12);@col({idtemp};13);@col({idtemp};14))
      fRenglon(@col({idtemp};15); @col({idtemp};16); @col({idtemp};17))
    Finsi
    {idtemp} = ''[c0..c17]
    idtemp [0] = @col(idtemp;0) +1
  Finmientras
  idRenglonFin = idRenglonIni
FinFunc

// *************************************************************************************************
// Descripcion:  busca en la hoja de calculo si el producto ya existe y si no lo inserta
// Entradas :   el producto
// Salida :   id del renglon
// *************************************************************************************************
DefFunc fAgregaProducto(cProducto)  
Local idtemp

  vRegreso = 0
  idtemp = idRenglonIni 
  Mientras  @col(idtemp;0)<@col(idRenglonFin;0)
    Si @col(cProducto;0) = @col({idtemp};1)
      vRegreso = idtemp
      FinCiclo
    finsi
    idtemp = @col(idtemp;0) +1[c0]
  Finmientras
  Si vRegreso = 0  
    {idtemp}[1] = @col(cProducto;0)
    vRegreso = idtemp
    idRenglonFin = vRegreso + 1
  Finsi
FinFunc

// *************************************************************************************************
//	Esta función ordena los elemantos de la hoja de trabajo basados en el código
// Utiliza el algoritmo de Buble Sort
// *************************************************************************************************
DefFunc OrdenaHoja(vInicio; vCuantos)
Local vTmp, vj, vi, vc1, vc2

  vi = 0[C0]
  Mientras vi < vCuantos - 1
    vj = 0[C0]
    Mientras vj < vCuantos - vi - 1
      vc1 = vInicio + vj
      vc2 = vInicio + vj + 1
      // verifica la columna a comparar
      Si @Col({vc1};1) > @Col({vc2};1)
        vTmp = {vc1}[C1..C17]
        {vc1} = {vc2}[C1..C17]
        {vc2} = vTmp[C1..C17]
      Finsi
      vj = vj + 1[C0]
    FinMientras
    vi = vi + 1[C0]
  FinMientras   
FinFunc

// *************************************************************************************************
// ENCABEZADO 
// *************************************************************************************************
  Encab
    Texto '@TC{255,0,0}@S{8}AdminPAQ' 
    Hoja '"@TC{0,0,0}@S{8}Página: '
    Imprime

    Texto '@TC{0,0,0}@S{8}Moneda: '& gNombreMoneda
    Texto '^@TC{0,0,0}@S{22}' & tEmpresa->Nombre
    Texto '"@TC{0,0,0}@S{8}Fecha: ' & fEditaFecha(@Hoy())
    Imprime

    Texto '^@TC{0,0,0}@S{16}' & 'Resumen de Operaciones de Venta Detallada por Agente'
    Texto '"@TC{0,0,0}@S{8}Hora: ' & @Hora()
    Imprime

    Si pEjercicio = 0 Y pMes = 0
      Texto '^@TC{0,0,0}@S{16}'& 'Del: ' & fEditaFecha(pFechaInicial) & ' al: ' & fEditaFecha(pFechaFinal)
    Sino
      Texto '^@TC{0,0,0}@S{16}'& 'Periodo: ' & @substr(fEditaFecha(gDelaFecha);3;20)
    FinSi
    Imprime 
    NEGRITAS TRUE
    Altura 10
    // Fecha       Serie Folio    Concepto                        Cotizado       Pedido      Remisiondo     Facturado         
    Columnas 20;1.95,0.15,1.80,0.15,1.5,0.15,3.9,0.15,0.75,0.15,2.4,0.15,1.95,0.15,2.4,0.15,2.4,0.15,0   
    Texto '@TC{0,0,0}@L{-1}'
    Imprime 

    Texto C0;'Fecha'
    Texto C2;'Serie'
    Texto c4;'Folio' 
    Texto c6;'Concepto' 
    Texto c10;'^Cotizado' 
    Texto c12;'^Pedido'
    Texto c14;'^Remisionado'
    Texto c16;'^Facturado'
    Imprime   

    Texto '@TC{0,0,0}@L{-1}'
    Imprime 
    NEGRITAS FALSE
    Altura 10
  FinEncab


// *************************************************************************************************
// PRINCIPAL <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// *************************************************************************************************
  gRenglon = '' 
  gTotalProd = ''
  gTotalAgente = ''

  //buscamos el id del ejericio-mes
  tEjercicioPeriodo.busca primero
  Mientras tEjercicioPeriodo->encontro
    Si gDelaFecha >= tEjercicioPeriodo(cFecIniPeriodo1) y gDelaFecha <= tEjercicioPeriodo(cFechaFinal)
      vIdEjercicio = tEjercicioPeriodo(cIdEjercicio)
      //lefecha inicio y fecha fin
      vFechaIni = fFechaEjercicioPeriodo(pMes) 
      Si Pmes = 12
        vFechaFin = tEjercicioPeriodo(cFechafinal)
      Sino
        vFechaFin = fFechaEjercicioPeriodo(pMes+1) 
        vFechaFin = fFechaAnterior(vFechaFin)
      Finsi
    Finsi
    tEjercicioPeriodo.Saltareg[1]
  FinMientras

  Si pEjercicio = 0 Y pMes = 0
    vFechaIni = pFechaInicial
    vFechaFin = pFechaFinal
  FinSi

  Si @str(pAgenteInicial;0) = ' '
    tAgentes.busca Primero
  Sino
    tAgentes.busca[@str(pAgenteInicial;0) & ':']
  Finsi

  Mientras tAgentes->Encontro
    Si @str(pAgenteFinal;0)!= ' '
      Si tAgentes(cCodigoAgente)> @str(pAgenteFinal;0)
        Finciclo
      Finsi 
    Finsi

    PrimVez = 0

    // N.D.4048 Búsqueda de un movimiento del producto a la fecha inicial del reporte
    gFechaBusqueda = vFechaIni
    // NOTA: Es obligatorio volver a fijar el índice a fin de que las búsquedas parciales funcionen correctamente
    tDocumentos.Usaindice['iAgenteFechaSerieFolio']
    tDocumentos.Busca[tAgentes(cIdAgente) & ':' & gFechaBusqueda]
    Si !tDocumentos->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 tAgentes(cIdAgente) = @Val(@SUBSTR(tDocumentos->Llave;0;11))
        Si @SUBSTR(tDocumentos->Llave;11;8) >= vFechaIni Y @SUBSTR(tDocumentos->Llave;11;8) <= vFechaFin
          // Realizar nuevamente la búsqueda a fin de posicionarnos en el registro y activar la propiedad Encontro
          gFechaBusqueda = @SUBSTR(tDocumentos->Llave;11;8)
          tDocumentos.Busca[tAgentes(cIdAgente) & ':' & gFechaBusqueda]
        FinSi
      FinSi        
    FinSi

    Mientras tDocumentos->Encontro Y (tDocumentos(cFecha) <= vFechaFin)
        Si tDocumentos(cAfectado) != 1// NO AFECTADO
          tDocumentos.BUSCA SIGUIENTE[1]
          Continua
        FinSi

        Si tDocumentos(cCancelado) != 0// CANCELADOS
          tDocumentos.BUSCA SIGUIENTE[1]
          Continua
        FinSi

        tMovimientos.busca[@str(tDocumentos(cIdDocumento);0)]
        Mientras tMovimientos->encontro
          Si tMovimientos(cIdDocumento) != tDocumentos(cIdDocumento)
            Finciclo
          FinSi

          tProductos.busca[@str(tMovimientos(cIdProducto);0)]
          Si tProductos->encontro y (tProductos(cCodigoProducto) >= @str(pProductoInicial;0)o @str(pProductoInicial;0)=' ') y (tProductos(cCodigoProducto) <= @str(pProductoFinal;0)o @str(pProductoFinal;0)=' ')
            // Si es uno de los servicios para facturar notas de venta no incluirlo
            Si tProductos(cIdProducto) = tParametros(cIdProdu01)
              tMovimientos.saltareg[1]
              Continua
            FinSi
            Si tProductos(cIdProducto) = tParametros(cIdProdu02)
              tMovimientos.saltareg[1]
              Continua
            FinSi
            Si tProductos(cIdProducto) = tParametros(cIdProdu03)
              tMovimientos.saltareg[1]
              Continua
            FinSi
            Si tProductos(cIdProducto) = tParametros(cIdProdu04)
              tMovimientos.saltareg[1]
              Continua
            FinSi
            Si tProductos(cIdProducto) = tParametros(cIdProdu05)
              tMovimientos.saltareg[1]
              Continua
            FinSi

            //imprime el producto
            Si  pUnidad = 1 y tProductos(cidUnidadNoConvertible) != 0
              Si tMovimientos(cUnidadesNC)!=0 y (tMovimientos(cIdDocumentoDe) <5 O tMovimientos(cIdDocumentoDe) = 35 ) // FBCS POS
                ImprimeA()
              Finsi
            Sino
              Si tMovimientos(cUnidades)!=0 Y (tMovimientos(cIdDocumentoDe) <5 O tMovimientos(cIdDocumentoDe) = 35 ) //FBCS POS
                ImprimeA()
              Finsi
            Finsi

            fAgregaProducto(tProductos(cCodigoProducto) &'..'& tMovimientos(cFecha) &'..'& tDocumentos(cFolio))
            // regresa el renglon del susodicho producto
            // Movimiento (Fecha, Serie, Folio, Concepto)
            idRenglon = vRegreso

            //SI el Producto tiene Unidad de Medida y Peso NO Equivalente "Y" pUnidad = 1
            Si  pUnidad = 1 y tProductos(cidUnidadNoConvertible) != 0
              Si tMovimientos(cIdDocumentoDe) = 1  
                vCotizaciones = tMovimientos(cUnidadesNC)
              Finsi
              Si tMovimientos(cIdDocumentoDe) = 2
                vPedidos = tMovimientos(cUnidadesNC)
              Finsi
              Si tMovimientos(cIdDocumentoDe) = 3
                vRemisiones = tMovimientos(cUnidadesNC)
              Finsi
              Si (tMovimientos(cIdDocumentoDe) = 4 O tMovimientos(cIdDocumentoDe) = 35)// FBCS POS
                vFacturas = tMovimientos(cUnidadesNC)
              Finsi
              Si tMovimientos(cIdDocumentoDe) = 17
                vOrdenesCompra = tMovimientos(cUnidadesNC)
              Finsi
              Si tMovimientos(cIdDocumentoDe) = 18
                vConsignaciones = tMovimientos(cUnidadesNC)
              Finsi
            Sino
              Si tMovimientos(cIdDocumentoDe) = 1  
                vCotizaciones = tMovimientos(cUnidades)
              Finsi
              Si tMovimientos(cIdDocumentoDe) = 2
                vPedidos = tMovimientos(cUnidades)
              Finsi
              Si tMovimientos(cIdDocumentoDe) = 3
                vRemisiones = tMovimientos(cUnidades)
              Finsi
              Si (tMovimientos(cIdDocumentoDe) = 4 O tMovimientos(cIdDocumentoDe) = 35) // FBCS POS
                vFacturas = tMovimientos(cUnidades)
              Finsi
              Si tMovimientos(cIdDocumentoDe) = 17
                vOrdenesCompra = tMovimientos(cUnidades)
              Finsi
              Si tMovimientos(cIdDocumentoDe) = 18
                vConsignaciones = tMovimientos(cUnidades)
              Finsi
            Finsi

            //Convertir Importes en la Moneda del Reporte
            Si pUnidad = 2  Y tProductos(cidUnidadBase) != 0
              // el Producto tiene Unidad de Medida y Peso
              // Unificar vCantidad de acuerdo a la unidad deseada en el reporte.
              tEquivaleUnidadesPM.busca[@str(tProductos(cIdUnidadBase);0) &':'& @str(pIdUnidad;0)]
              Si tEquivaleUnidadesPM->encontro
                Si tMovimientos(cIdDocumentoDe) = 1
                  vPedidos = vPedidos *  tEquivaleUnidadesPM(cFactorConversion)
                Finsi
                Si tMovimientos(cIdDocumentoDe) = 2
                  vRemisiones = vRemisiones * tEquivaleUnidadesPM(cFactorConversion)
                Finsi
                Si tMovimientos(cIdDocumentoDe) = 3
                  vCotizaciones = vCotizaciones * tEquivaleUnidadesPM(cFactorConversion)
                Finsi
                Si (tMovimientos(cIdDocumentoDe) = 4 O tMovimientos(cIdDocumentoDe) = 35) // FBCS POS
                  vfacturas = vfacturas * tEquivaleUnidadesPM(cFactorConversion)
                Finsi
                Si tMovimientos(cIdDocumentoDe) = 17
                  vOrdenesCompra = vOrdenesCompra* tEquivaleUnidadesPM(cFactorConversion) 
                Finsi
                Si tMovimientos(cIdDocumentoDe) = 18
                  vConsignaciones = vConsignaciones * tEquivaleUnidadesPM(cFactorConversion) 
                Finsi
              Finsi
            Finsi  

            {idRenglon}[2] = tDocumentos(cSerieDocumento)
            {idRenglon}[3] = tDocumentos(cFolio)

            tDocumentosDe.busca[@str(tdocumentos(cIdDocumentoDe);0)]
            Si tDocumentosDe->encontro
              {idRenglon}[4] = tDocumentosDe(cDescripcion)
            Finsi

            {idRenglon}[5] = @col({idRenglon};5) +  @col(vCotizaciones ;0)
            {idRenglon}[6] = @col({idRenglon};6) +  @col(vPedidos ;0)
            {idRenglon}[7] = @col({idRenglon};7) +  @col(vRemisiones ;0)
            {idRenglon}[8] = @col({idRenglon};8) +  @col(vfacturas ;0)
            // duplicar información para agilizar el reporte.
            {idRenglon}[10]= tProductos(cCodigoProducto)
            {idRenglon}[11]= tMovimientos(cFecha)
            {idRenglon}[12]= tproductos(cNombreProducto)
            {idRenglon}[13]= tProductos(cidUnidadNoConvertible)
            {idRenglon}[14]= tProductos(cIdUnidadBase)      
            Si pUnidad = 3 Y tProductos(cIdUnidadCompra) != 0
              {idRenglon}[13]= tProductos(cIdUnidadBase)
              {idRenglon}[14]= tProductos(cIdUnidadCompra)
            FinSi
            Si pUnidad = 4 Y tProductos(cIdUnidadVenta) != 0
              {idRenglon}[13]= tProductos(cIdUnidadBase)
              {idRenglon}[14]= tProductos(cIdUnidadVenta)
            FinSi
            // Guardar el tipo de producto
            {idRenglon}[15]= tProductos(cTipoProducto)
            {idRenglon}[16]= tDocumentos(cIdDocumento)
            {idRenglon}[17]= tProductos(cIdProducto)
            vCotizaciones = 0
            vPedidos = 0
            vRemisiones = 0
            vfacturas = 0
          Finsi  // Si el producto del movimiento pertenece al rango

          // vamos por los movtos hijos del movto origen
          tMovimientosOcultos.busca[@str(tMovimientos(cidMovimiento);0)]
          Mientras tMovimientosOcultos->encontro
            Si tMovimientosOcultos(cIdMovtoOwner)!=tMovimientos(cidMovimiento)
              Finciclo
            Finsi 

            // fact
            Si (tMovimientosOcultos(cIdDocumentoDe) = 4 O tMovimientosOcultos(cIdDocumentoDe) = 35) y (tMovimientosOcultos(cTipoTraspaso)=4)
              tMovimientosOcultos.Saltareg[1]  
              Continua
            Finsi
            // ped. cot
            Si (tMovimientosOcultos(cIdDocumentoDe) = 1 o tMovimientosOcultos(cIdDocumentoDe) = 2) y (tMovimientosOcultos(cTipoTraspaso)=4)
              tMovimientosOcultos.Saltareg[1]  
              Continua
            Finsi
            // remisiones
            Si (tMovimientosOcultos(cIdDocumentoDe) = 3 ) y (tMovimientosOcultos(cTipoTraspaso)!=2)
              tMovimientosOcultos.Saltareg[1]  
              Continua
            Finsi

            tProductos.busca[@str(tMovimientosOcultos(cIdProducto);0)]
            Si tProductos->encontro y (tProductos(cCodigoProducto) >= @str(pProductoInicial;0)o @str(pProductoInicial;0)=' ') y (tProductos(cCodigoProducto) <= @str(pProductoFinal;0)o @str(pProductoFinal;0)=' ')
              // Si es uno de los servicios para facturar notas de venta no incluirlo
              Si tProductos(cIdProducto) = tParametros(cIdProdu01)
                tMovimientosOcultos.saltareg[1]
                Continua
              FinSi
              Si tProductos(cIdProducto) = tParametros(cIdProdu02)
                tMovimientosOcultos.saltareg[1]
                Continua
              FinSi
              Si tProductos(cIdProducto) = tParametros(cIdProdu03)
                tMovimientosOcultos.saltareg[1]
                Continua
              FinSi
              Si tProductos(cIdProducto) = tParametros(cIdProdu04)
                tMovimientosOcultos.saltareg[1]
                Continua
              FinSi
              Si tProductos(cIdProducto) = tParametros(cIdProdu05)
                tMovimientosOcultos.saltareg[1]
                Continua
              FinSi

              // imprime el producto
              Si  pUnidad = 1 y tProductos(cidUnidadNoConvertible) != 0
                Si tMovimientosOcultos(cUnidadesNC)!=0 y (tMovimientosOcultos(cIdDocumentoDe) <5 O tMovimientosOcultos(cIdDocumentoDe) = 35)// FBCS POS
                  ImprimeA()
                Finsi
              Sino
                Si tMovimientosOcultos(cUnidades)!=0 y (tMovimientosOcultos(cIdDocumentoDe) < 5 O tMovimientosOcultos(cIdDocumentoDe) = 35)// FBCS POS
                  ImprimeA()
                Finsi
              Finsi

              fAgregaProducto(tProductos(cCodigoProducto) &'..'& tMovimientosOcultos(cFecha) &'..'& tDocumentos(cFolio))
              // regresa el renglon del susodicho producto
              // Movimiento (Fecha, Serie, Folio, Concepto)
              idRenglon = vRegreso

              //SI el Producto tiene Unidad de Medida y Peso NO Equivalente "Y" pUnidad = 1
              Si pUnidad = 1 y tProductos(cidUnidadNoConvertible) != 0
                Si tMovimientosOcultos(cIdDocumentoDe) = 1  
                  vCotizaciones = tMovimientosOcultos(cUnidadesNC)
                Finsi
                Si tMovimientosOcultos(cIdDocumentoDe) = 2
                  vPedidos = tMovimientosOcultos(cUnidadesNC)
                Finsi
                Si tMovimientosOcultos(cIdDocumentoDe) = 3
                  vRemisiones = tMovimientosOcultos(cUnidadesNC)
                Finsi
                Si tMovimientosOcultos(cIdDocumentoDe) = 4 O tMovimientosOcultos(cIdDocumentoDe) =35//FBCS POS
                  vFacturas = tMovimientosOcultos(cUnidadesNC)
                Finsi
                Si tMovimientosOcultos(cIdDocumentoDe) = 17
                  vOrdenesCompra = tMovimientosOcultos(cUnidadesNC)
                Finsi
                Si tMovimientosOcultos(cIdDocumentoDe) = 18
                  vConsignaciones = tMovimientosOcultos(cUnidadesNC)
                Finsi
              Sino
                Si tMovimientosOcultos(cIdDocumentoDe) = 1  
                  vCotizaciones = tMovimientosOcultos(cUnidades)
                Finsi
                Si tMovimientosOcultos(cIdDocumentoDe) = 2
                  vPedidos = tMovimientosOcultos(cUnidades)
                Finsi
                Si tMovimientosOcultos(cIdDocumentoDe) = 3
                  vRemisiones = tMovimientosOcultos(cUnidades)
                Finsi
                Si (tMovimientosOcultos(cIdDocumentoDe) = 4 O tMovimientosOcultos(cIdDocumentoDe) = 35)// FBCS POS
                  vFacturas = tMovimientosOcultos(cUnidades)
                Finsi
                Si tMovimientosOcultos(cIdDocumentoDe) = 17
                  vOrdenesCompra = tMovimientosOcultos(cUnidades)
                Finsi
                Si tMovimientosOcultos(cIdDocumentoDe) = 18
                  vConsignaciones = tMovimientosOcultos(cUnidades)
                Finsi
              Finsi

              //Convertir Importes en la Moneda del Reporte
              Si pUnidad = 2  Y tProductos(cidUnidadBase) != 0
                // el Producto tiene Unidad de Medida y Peso
                // Unificar vCantidad de acuerdo a la unidad deseada en el reporte.
                // EquivalenciaUnidadMedidayPeso.BUSCA[Productos(cIdUnidadBase)+cIdUnidad]	
                tEquivaleUnidadesPM.busca[@str(tProductos(cIdUnidadBase);0) &':'& @str(pIdUnidad;0)]
                Si tEquivaleUnidadesPM->encontro
                  Si tMovimientosOcultos(cIdDocumentoDe) = 1
                    vPedidos = vPedidos *  tEquivaleUnidadesPM(cFactorConversion)
                  Finsi
                  Si tMovimientosOcultos(cIdDocumentoDe) = 2
                    vRemisiones = vRemisiones * tEquivaleUnidadesPM(cFactorConversion)
                  Finsi
                  Si tMovimientosOcultos(cIdDocumentoDe) = 3
                    vCotizaciones = vCotizaciones * tEquivaleUnidadesPM(cFactorConversion)
                  Finsi
                  Si (tMovimientosOcultos(cIdDocumentoDe) = 4 O tMovimientosOcultos(cIdDocumentoDe) = 35) // FBCS POS
                    vfacturas = vfacturas * tEquivaleUnidadesPM(cFactorConversion)
                  Finsi
                  Si tMovimientosOcultos(cIdDocumentoDe) = 17
                    vOrdenesCompra = vOrdenesCompra* tEquivaleUnidadesPM(cFactorConversion) 
                  Finsi
                  Si tMovimientosOcultos(cIdDocumentoDe) = 18
                    vConsignaciones = vConsignaciones * tEquivaleUnidadesPM(cFactorConversion) 
                  Finsi
                Finsi
              Finsi

              {idRenglon}[2] = tDocumentos(cSerieDocumento)
              {idRenglon}[3] = tDocumentos(cFolio)

              tDocumentosDe.busca[@str(tdocumentos(cIdDocumentoDe);0)]
              Si tDocumentosDe->encontro
                {idRenglon}[4] = tDocumentosDe(cDescripcion)
              Finsi

              {idRenglon}[5] = @col({idRenglon};5) +  @col(vCotizaciones ;0)
              {idRenglon}[6] = @col({idRenglon};6) +  @col(vPedidos ;0)
              {idRenglon}[7] = @col({idRenglon};7) +  @col(vRemisiones ;0)
              {idRenglon}[8] = @col({idRenglon};8) +  @col(vfacturas ;0)
              //duplicar información para agilizar el reporte.
              {idRenglon}[10]= tProductos(cCodigoProducto)
              {idRenglon}[11]= tMovimientosOcultos(cFecha)
              {idRenglon}[12]= tproductos(cNombreProducto)
              {idRenglon}[13]= tProductos(cidUnidadNoConvertible)
              {idRenglon}[14]= tProductos(cIdUnidadBase)      
              Si pUnidad = 3 Y tProductos(cIdUnidadCompra) != 0
                {idRenglon}[13]= tProductos(cIdUnidadBase)
                {idRenglon}[14]= tProductos(cIdUnidadCompra)
              FinSi
              Si pUnidad = 4 Y tProductos(cIdUnidadVenta) != 0
                {idRenglon}[13]= tProductos(cIdUnidadBase)
                {idRenglon}[14]= tProductos(cIdUnidadVenta)
              FinSi
              {idRenglon}[15]= tProductos(cTipoProducto)
              {idRenglon}[16]= tDocumentos(cIdDocumento)
              {idRenglon}[17]= tProductos(cIdProducto)
              vCotizaciones = 0
              vPedidos = 0
              vRemisiones = 0
              vfacturas = 0
            Finsi  // Si el producto del movimiento oculto pertenece al rango

            tMovimientosOcultos.saltareg[1]
          FinMientras  // Mientras hay movimeintos ocultos

          tMovimientos.saltareg[1]
        Finmientras  // Mientras hay movimientos del documento

      tDocumentos.BUSCA SIGUIENTE[1]
    Finmientras  // Mientras hay fechas

    //Ordena la Hoja de trabajo de acuerdo ala fecha del Producto (movto)
    Ordenahoja(idRenglonIni ;idRenglonFin - idRenglonIni )
    //Imprime Datos de la Hoja de trabajo y limpia la hoja
    Imprimehoja()//(idRenglonIni ;idRenglonFin )

    fTotalAgente()
    tAgentes.saltareg[1]
  Finmientras  // Mientras hay agentes en el rango

  fTotaltotal()


