// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// Reporte:       Reporte de Devoluciones sobre Venta por Agente  
//                Reporte de Devoluciones de Remision por Agente
//
// Sistema:     ADMINPAQ  Versión v1.0 Windows
//
// Descripcion: 
//
// Consideraciones :
// Creación  :  Luis Palau Castañeda.  15/Agosto/2001
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Historia de modificaciones
//  Fecha      Nombre   IDLotus                     Descripcion
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// 18/05/2007   JAAM    N.C.147     Esquema de adicion de unidades de compra y venta  
// 16/06/2008   IYPZ    N.D.4125    Los totales por agente y global se imprimen en las columnas: 4,8,10,14 
//                                  Se modifica:
//                                  - fRenglon      
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

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

// *************************************************************************************************
// INICIO PARAMETROS
// *************************************************************************************************
    Parametro pFechaIni         = '20050401'
    Parametro pFechaFin         = '20050430'
    Parametro pAgenteInicial    = ' ' 
    Parametro pAgenteFinal      = 'z'
    Parametro pProductoInicial  = ' ' 
    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 pTipoReporte      = 1 // 1 = Reporte de Devoluciones sobre Venta por Agente
                                    // 2 = Reporte de Devoluciones de Remision por Agente

// *************************************************************************************************
// INICIO APERTURA TABLAS
// *************************************************************************************************
  UsaEmpresa tEmpresa;'AdminpaqW'

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

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

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

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

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

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

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

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

// *************************************************************************************************
  tParametros.Busca Primero   

// *************************************************************************************************
// DEFINICION DE COLUMNAS 
// *************************************************************************************************
  Columnas 20;2.4,0.15,5.7,0.15,2.4,0.15,0.45,0.15,2.4,0.15,2.4,0.15,0.45,0.15,2.4,0.15,0
  UsaLetra 'Arial'
  Altura 9 
  [C0,C3].Decimales 0
  [C0,C3].Blanco ' '
  tMonedas.Busca[@str(pIdMoneda;0)]
  gDecimales = tMonedas(cDecimalesMoneda)
  [C4,C8,C10,C14].Coma
  [C4,C10].Decimales tParametros(cDecimalesUnidades) // Decimales para unidades
  [C8,C14].Decimales gDecimales
  [C4,C8,C10,C14].Blanco '0.00'
  [C0..C7,C9,C11..C13,C15..C19].Blanco ' '

// *************************************************************************************************
// VARIABLES GLOBALES 
// *************************************************************************************************
  gUnidad = pUnidad
  gIdUnidad = pIdUnidad
  gIdRenIni = 5  // Inicio de la hoja
  gIdRenFin = 5  // Fin de la hoja (inicializacion)
  gDelaFecha = pFechaIni
  gAlaFecha  = pFechaFin
  gRenglon = '' 
  gTotalAgente = ''
  gTotalGral = ''
  gTotalPaquetes = ''
  gTotalAgentePaquetes = ''
  gNombreMoneda = tMonedas(cNombreMoneda)
  gEncabezadoAgente = 0
  gImpTotalGral = 0
  gIdMonedaCte = 1
 
  kMeses = 'Ene,Feb,Mar,Abr,May,Jun,Jul,Ago,Sep,Oct,Nov,Dic'[C0]


// *************************************************************************************************
// FUNCIONES <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// *************************************************************************************************

// *************************************************************************************************
// 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 acumulados de un producto
// Entradas :  
// Salida :   
// 16/06/2008   IYPZ    N.D.4125    Los totales por agente y global se imprimen en las columnas: 4,8,10,14.  
// *************************************************************************************************
DefFunc fRenglon(aIdRenglon)
  // Código   Nom(Prod) Cantidad          Neto-Desc Cantidad          Neto-Desc
  // C0       C2        C4        C6        C8      C10       C12       C14       C16
  gRenglon[0] = @Col({aIdRenglon};1)
  gRenglon[2] = @Col({aIdRenglon};2)
  gRenglon[4] = @Col({aIdRenglon};3)
  gRenglon[6] = @Col({aIdRenglon};7)
  gRenglon[8] = @Col({aIdRenglon};4)
  gRenglon[10] = @Col({aIdRenglon};5)
  gRenglon[12] = @Col({aIdRenglon};7)
  gRenglon[14] = @Col({aIdRenglon};6)
  Imprime gRenglon

  Si @Col({aIdRenglon};8) = 2
    // En caso de paquetes acumular las unidades al total de paquetes
    gTotalPaquetes = gTotalPaquetes + gRenglon[C4]
    gTotalPaquetes = gTotalPaquetes + gRenglon[C10]
    // En caso de paquetes acumular las unidades al total de paquetes
    gTotalAgentePaquetes = gTotalAgentePaquetes + gRenglon[C4]
    gTotalAgentePaquetes = gTotalAgentePaquetes + gRenglon[C10]    
    // Acumular los restantes importes
    gTotalAgente = gTotalAgente + gRenglon[C6, C8, C12, C14]
    gTotalGral = gTotalGral + gRenglon[C6, C8, C12, C14]  
  Sino
    //N.D. 4125 - IYPZ
    gTotalAgente = gTotalAgente + gRenglon[C4, C8, C10, C14]
    gTotalGral = gTotalGral + gRenglon[C4, C8, C10, C14]  
  FinSi
  gRenglon = '' 
Finfunc

// *************************************************************************************************
// Descripcion: imprime los datos del Agente
// Entradas :  
// Salida :    
// *************************************************************************************************
Deffunc ImprimeA()
Local lImprime, lIdRenglon

  Si gIdRenIni < gIdRenFin
    gEncabezadoAgente = 1
    gImpTotalGral = 1

    //          C0       C2
    Columnas 20;1.5,0.15,6.6,0.15,0
    Negritas True
    lImprime = 'Código:' [C0]
    Si tAgentes(cIdAgente) = 0
      lImprime = '-'[C2]
    SiNo
      lImprime = fMascarilla(tAgentes(cCodigoAgente);tParametros(cMascarillaAgente))[C2]
    FinSi
    Imprime lImprime

    lImprime = 'Agente:' [C0]
    Si tAgentes(cIdAgente) = 0
      lImprime = 'Sin Agente'[C2]
    SiNo
      lImprime = tAgentes(cNombreAgente) [C2]
    FinSi
    Imprime lImprime
    Negritas False
  
    //          Código   Nom(Prod)Cantidad         Neto-Desc Cantidad          Neto-Desc
    //          C0       C2       C4       C6        C8       C10      C12       C14      C16
    Columnas 20;2.4,0.15,5.7,0.15,2.4,0.15,0.45,0.15,2.4,0.15,2.4,0.15,0.45,0.15,2.4,0.15,0
    Mientras [lIdRenglon = gIdRenIni; lIdRenglon < gIdRenFin; lIdRenglon = lIdRenglon + 1]
      fRenglon(lIdRenglon)
    FinMientras
  FinSi
Finfunc

// *************************************************************************************************
// Descripcion: imprime los totales generales de las variables gTotalGral
// Entradas :  
// Salida :    
// *************************************************************************************************
DefFunc  fTotalGral()
Local LTotalLinea

  // Código   Nom(Prod)Cantidad         Neto-Desc Cantidad          Neto-Desc
  // C0       C2       C4       C6        C8       C10      C12       C14      C16

  // Si hubo datos
  Si gImpTotalGral = 1
    LTotalLinea = '==========================='[C0]
    Texto C4; @Col(LTotalLinea;0)
    Texto C8; @Col(LTotalLinea;0)
    Texto C10; @Col(LTotalLinea;0)
    Texto C14; @Col(LTotalLinea;0)
    Imprime
    gTotalGral = ''[C0..C3]
    gTotalGral[2] = 'Total General'
    Imprime gTotalGral
    gTotalGral = ''

    Si (@Col(gTotalPaquetes; 4) > 0) O (@Col(gTotalPaquetes; 10) > 0)
      gTotalPaquetes = ''[c0..c3]
      gTotalPaquetes[2] = 'Total Cantidad de Paquetes'
      Imprime gTotalPaquetes
    FinSi
    gTotalPaquetes = ''
  FinSi
Finfunc

// *************************************************************************************************
// Descripcion: imprime los totales del Agente de las variables gTotalAgente
// Entradas :  
// Salida :    
// *************************************************************************************************
DefFunc  fTotalAgente()
  // Código   Nom(Prod)Cantidad         Neto-Desc Cantidad          Neto-Desc
  // C0       C2       C4       C6        C8       C10      C12       C14      C16

  //si hubo encabezado del agente
  Si gEncabezadoAgente = 1
    Texto '@L{4,8,10,14}'
    Imprime
    gTotalAgente = ''[C0..C3]
    gTotalAgente[2] = 'Total Agente'
    Imprime gTotalAgente
    gTotalAgente  = ''
    gEncabezadoAgente = 0

    Si (@Col(gTotalAgentePaquetes; 4) > 0) O (@Col(gTotalAgentePaquetes; 10) > 0)
      gTotalAgentePaquetes = ''[c0..c3]
      gTotalAgentePaquetes[2] = 'Total Cantidad de Paquetes'
      Imprime gTotalAgentePaquetes
    FinSi
    gTotalAgentePaquetes = ''
    Saltalin
  FinSi
Finfunc

// *************************************************************************************************
// Descripcion : Agrega el producto si no existe y deposita o acumula los datos del movimiento
// Entradas :   el producto
// Salida :   id del renglon
// *************************************************************************************************
DefFunc fAcumulaProducto(aCodigoProd;aNombreProd;aTipoProducto;aUnidad;aCantidadVen;aNetoMenDescVen;aCantidadDev;aNetoMenDescDev)
Local lIdTemp

  lIdTemp = gIdRenIni
  Mientras  lIdTemp < gIdRenFin
    Si @Col(aCodigoProd;0) = @Col({lIdTemp};1)
      FinCiclo
    Finsi
    lIdTemp = lIdTemp + 1
  FinMientras

  // Si no se encontro el producto lo agrega a la lista
  Si lIdTemp = gIdRenFin
    {lIdTemp}[1] = aCodigoProd
    {lIdTemp}[2] = aNombreProd
    {lIdTemp}[3] = 0
    {lIdTemp}[4] = 0
    {lIdTemp}[5] = 0
    {lIdTemp}[6] = 0
    {lIdTemp}[7] = aUnidad
    // Guardar el tipo de producto
    {lIdTemp}[8] = aTipoProducto
    gIdRenFin = lIdTemp + 1
  Finsi

  // Agrega los datos
  {lIdTemp}[3] = @Col({lIdTemp};3) + @Col(aCantidadVen;0)
  {lIdTemp}[4] = @Col({lIdTemp};4) + @Col(aNetoMenDescVen;0)
  {lIdTemp}[5] = @Col({lIdTemp};5) + @Col(aCantidadDev;0)
  {lIdTemp}[6] = @Col({lIdTemp};6) + @Col(aNetoMenDescDev;0)
FinFunc

// *************************************************************************************************
// Descripcion : Agrega el producto si no existe y deposita o acumula los datos  del movimiento
// Entrada :aTblDocto : Documento del que se tomarán la fecha y el tipo de cambio
//          aTblMovto : Movimiento del que se tomarán los datos
//          aTipoDato : 0 - Vendido
//                      1 - Devuelto
// Salida  :Importe del documento reflejado en la moneda que recibe 
// *************************************************************************************************
Deffunc fProcesaMovto(aTblDocto:TABLA; aTblMovto:TABLA; aTipoDato)
Local lCantidad, lUnidad, lNeto, lDescuentos, lNetoMenDesc
Local lRegresa, lIdUnidad

  lRegresa = 0
  Si aTblMovto(cIdProducto) = 0
    lRegresa = 1
  SiNo
    tProductos.Busca[@Str(aTblMovto(cIdProducto);0)]
  FinSi

  Si lRegresa = 0 Y tProductos->Encontro Y (tProductos(cCodigoProducto) >= pProductoInicial O pProductoInicial = ' ') Y (tProductos(cCodigoProducto) <= pProductoFinal O pProductoFinal = ' ')
    lIdUnidad = tProductos(cIdUnidadBase)

    fVerificaUnidad(tProductos)

    // SI el Producto tiene Unidad de Medida NO Equivalente  "Y" pUnidad = 1
    Si  pUnidad = 1 Y tProductos(cIdUnidadNoConvertible) != 0 Y tMovimientos(cUnidadesNC) > 0
      lCantidad = tMovimientos(cUnidadesNC)
      lIdUnidad = tProductos(cIdUnidadNoConvertible)
    Sino 
      lCantidad =  tMovimientos(cUnidades)
    FinSi

    // Convertir cantidad de unidades a la unidad solicitada
    Si pUnidad = 2  Y tProductos(cIdUnidadBase) != 0
      // El Producto tiene Unidad de Medida y Peso, por lo que hay que
      //	unificar vCantidad de acuerdo a la unidad deseada en el reporte.
      tEquivaleUnidadesPM.Busca[@Str(tProductos(cIdUnidadBase);0) &':'& @Str(pIdUnidad;0)]
      Si tEquivaleUnidadesPM->Encontro
        lCantidad = lCantidad * tEquivaleUnidadesPM(cFactorConversion)
        lIdUnidad = pIdUnidad
      Finsi
    Finsi

    // Se busca el nombre de la unidad del producto
    lUnidad = ''
    Si lIdUnidad != 0
      tUnidadesPM.Busca[@Str(lIdUnidad;0)]
      Si tUnidadesPM->Encontro
        lUnidad = tUnidadesPM(cDespliegue)
      FinSi
    FinSi

    lNeto = fCambiarMonedaDoctoAReporte(aTblDocto; tTiposCambio; aTblMovto(cNeto); pIdMoneda; gIdMonedaCte)
    lDescuentos = aTblMovto(cDescuento1) + aTblMovto(cDescuento2) + aTblMovto(cDescuento3) + aTblMovto(cDescuento4) + aTblMovto(cDescuento5)
    lDescuentos = fCambiarMonedaDoctoAReporte(aTblDocto; tTiposCambio; lDescuentos; pIdMoneda; gIdMonedaCte)
    lNetoMenDesc = lNeto - lDescuentos

    // Enviar el tipo de producto a acumular
    // Acumula los saldos en memoria
    Si aTipoDato = 0 // Vendido
      fAcumulaProducto(fMascarilla(tProductos(cCodigoProducto);tParametros(cMascarillaProducto));tProductos(cNombreProducto);tProductos(cTipoProducto);lUnidad;lCantidad;lNetoMenDesc;0;0)
    SiNo // Devuelto
      fAcumulaProducto(fMascarilla(tProductos(cCodigoProducto);tParametros(cMascarillaProducto));tProductos(cNombreProducto);tProductos(cTipoProducto);lUnidad;0;0;lCantidad;lNetoMenDesc)
    FinSi
  FinSi
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

    Si pTipoReporte = 1
      Texto '^@TC{0,0,0}@S{16}' & 'Reporte de Devoluciones sobre Venta por Agente'
    Sino
      Texto '^@TC{0,0,0}@S{16}' & 'Reporte de Devoluciones de Remision por Agente'
    Finsi
    Texto '"@TC{0,0,0}@S{8}Hora: ' & @Hora()
    Imprime

    Texto '^@TC{0,0,0}@S{16}'& 'Del ' & fEditaFecha(gDelaFecha) & ' al ' & fEditaFecha(gAlaFecha)
    Imprime 
    NEGRITAS TRUE
    Altura 10

    Texto '@TC{0,0,0}@L{-1}'
	  Imprime 
    //                                                               V E N D I D O                    D E V U E L T O                                                               
    Columnas 20;9.6,0.15,6.15,0.15,3,0.15
    Si pTipoReporte = 1  
      Texto C2;'     V E N D I D O'
    Sino
      Texto C2;'R E M I S I O N A D O'
    Finsi
    Texto c4;'D E V U E L T O' 
    Imprime   
    //          Código   Nom(Prod)Cantidad         Neto-Desc Cantidad          Neto-Desc
    //          C0       C2       C4       C6        C8       C10      C12       C14      C16
    Columnas 20;2.4,0.15,5.7,0.15,2.4,0.15,0.45,0.15,2.4,0.15,2.4,0.15,0.45,0.15,2.4,0.15,0
    Texto C0;'Código'
    Texto C2;'Nombre(Producto,Servicio,Paquete)'
    Texto C4;'^Cantidad' 
    Texto C8;'^Neto-Desc.'
    Texto C10;'^Cantidad' 
    Texto C14;'^Neto-Desc.'
    Imprime   

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

// *************************************************************************************************
//PRINCIPAL <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// *************************************************************************************************
  gRenglon = '' 
  gTotalGral = ''

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

  // Ciclo principal de Agentes
  Mientras tAgentes->Encontro
    Si pAgenteInicial != ' '
      Si tAgentes(cCodigoAgente) < pAgenteInicial
        tAgentes.Saltareg[1]
        Continua  
      Finsi 
    Finsi
    Si pAgenteFinal != ' '
      Si tAgentes(cCodigoAgente) > pAgenteFinal
        Finciclo
      Finsi 
    Finsi

    gIdRenFin = 5  // Reinicia la hoja con el Agente

    // N.D.4048 Búsqueda de un movimiento del producto a la fecha inicial del reporte
    gFechaBusqueda = pFechaIni
    // 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
      Si tAgentes(cIdAgente) = @Val(@SUBSTR(tDocumentos->Llave;0;11))
        Si @SUBSTR(tDocumentos->Llave;11;8) >= pFechaIni Y @SUBSTR(tDocumentos->Llave;11;8) <= pFechaFin
          // 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) <= pFechaFin)
      Si tDocumentos(cAfectado) != 1
        tDocumentos.BUSCA SIGUIENTE[1]
        Continua
      FinSi

      Si pTipoReporte = 1 // Devoluciones de venta
        Si tDocumentos(cIdDocumentoDe) != 4 Y tDocumentos(cIdDocumentoDe) != 5 Y tDocumentos(cIdDocumentoDe) != 35 Y tDocumentos(cIdDocumentoDe) != 36  
          tDocumentos.BUSCA SIGUIENTE[1]
          Continua
        FinSi         
      SiNo 
        Si !(tDocumentos(cIdDocumentoDe) = 3 O tDocumentos(cIdDocumentoDe) = 6) 
          tDocumentos.BUSCA SIGUIENTE[1]
          Continua
        FinSi         
      Finsi

      gIdMonedaCte = 1
      tClientes.Busca[@Str(tDocumentos(cIdClienteProveedor);0)]
      Si tClientes->Encontro
        gIdMonedaCte = tClientes(cIdMoneda)
      FinSi

      // Ciclo de los movimientos visibles del documento
      tMovimientos.Busca[@str(tDocumentos(cIdDocumento);0)]
      Mientras tMovimientos->Encontro
        Si tMovimientos(cIdDocumento) != tDocumentos(cIdDocumento)
          Finciclo
        FinSi
        Si pTipoReporte = 2 // Devoluciones de remision
          Si tDocumentos(cIdDocumentoDe) = 3 // Remisión
            // Se salta el que no sea de salida
            Si tMovimientos(cAfectaExistencia) != 2
              tMovimientos.Saltareg[1]
              Continua
            FinSi
          SiNo // Devolución de Remisión
            // Se salta el que no sea de entrada
            Si tMovimientos(cAfectaExistencia) != 1
              tMovimientos.Saltareg[1]
              Continua
            FinSi
          FinSi
        FinSi
        // Acumula datos del movto a su producto asignado FBCS POS
        Si (tDocumentos(cIdDocumentoDe) <= 4 O tDocumentos(cIdDocumentoDe) = 35) // A lo vendido ó remisionado, o nota de venta
          fProcesaMovto(tDocumentos;tMovimientos;0)
        SiNo // A lo devuelto
          fProcesaMovto(tDocumentos;tMovimientos;1)
        FinSi
        // Recorre los movtos hijos del movto origen
        tMovimientosOcultos.Busca[@Str(tMovimientos(cIdMovimiento);0)]
        Mientras tMovimientosOcultos->Encontro
          Si tMovimientosOcultos(cIdMovtoOwner) != tMovimientos(cIdMovimiento)
            Finciclo
          Finsi      
          //ped. cot
          Si (tMovimientosOcultos(cIdDocumentoDe) = 1 O tMovimientosOcultos(cIdDocumentoDe) = 2) Y (tMovimientosOcultos(cTipoTraspaso)=4)
            tMovimientosOcultos.Saltareg[1]  
            Continua                 
          Finsi                                   
          //remisiones
          Si pTipoReporte = 1
            Si (tMovimientosOcultos(cIdDocumentoDe) = 3 ) Y (tMovimientosOcultos(cTipoTraspaso)!=2)
              tMovimientosOcultos.Saltareg[1]
              Continua
            FinSi
          FinSi            
          //ord. compra ,consig
          Si (tMovimientosOcultos(cIdDocumentoDe) = 17 O tMovimientosOcultos(cIdDocumentoDe) = 18) Y (tMovimientosOcultos(cTipoTraspaso)=4)
             tMovimientosOcultos.Saltareg[1]  
            Continua                 
          FinSi
          Si pTipoReporte = 2 // Devoluciones de remision
            Si tDocumentos(cIdDocumentoDe) = 3 // Remisión
              // Se salta el que no sea de salida
              Si tMovimientosOcultos(cAfectaExistencia) != 2
                tMovimientosOcultos.Saltareg[1]
                Continua
              FinSi
            SiNo // Devolución de Remisión
              // Se salta el que no sea de entrada
              Si tMovimientosOcultos(cAfectaExistencia) != 1
                tMovimientosOcultos.Saltareg[1]
                Continua
              FinSi
            FinSi
          FinSi
          // Acumula datos del movto a su producto asignado
          Si (tDocumentos(cIdDocumentoDe) <= 4 O tDocumentos(cIdDocumentoDe) = 35)// A lo vendido ó remisionado
            fProcesaMovto(tDocumentos;tMovimientosOcultos;0)
          SiNo // A lo devuelto
            fProcesaMovto(tDocumentos;tMovimientosOcultos;1)
          FinSi
          tMovimientosOcultos.saltareg[1]           
        FinMientras
        tMovimientos.Saltareg[1]
      FinMientras

      tDocumentos.BUSCA SIGUIENTE[1]
    FinMientras

    ImprimeA()

    //Imprime Totales del Agente
    fTotalAgente()
    tAgentes.Saltareg[1]
  FinMientras 

  //Imprime Totales Generales
  fTotalGral()
