// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// Reporte:       Reporte de Devoluciones sobre Venta por Producto   
//                Reporte de Devoluciones sobre Compra por Producto
//                Reporte de Devoluciones de Remision por Producto
//                Reporte de Devoluciones de Consignación por Producto
//
// 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  
// 17/07/2007   ELVS    N.D.4750    No se deben mostrar los servicios que vienen de una nota de venta.
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

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

// *************************************************************************************************
// INICIO PARAMETROS
// *************************************************************************************************
    Parametro pFechaInicial     = '20050401'  // Fecha inicial del rango
    Parametro pFechaFinal       = '20050430'  // Fecha final del rango
    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 pTipoReporte      = 1 // 1 = Reporte de Devoluciones sobre Venta por Producto   
                                    // 2 = Reporte de Devoluciones sobre Compra por Producto
                                    // 3 = Reporte de Devoluciones de Remision por Producto
                                    // 4 = Reporte de Devoluciones de Consignación por Producto

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

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

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

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

  // Movimientos dueños de movimientos ocultos
  UsaTabla tMovtoOwner = tEmpresa['MGW10010'] Alias 'MovtoOwner'  
  tMovtoOwner.Usaindice['']

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

  //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..C3,C5..C7,C9,C11..C13,C15..C19].Blanco ' '

// *************************************************************************************************
//VARIABLES GLOBALES 
// *************************************************************************************************
  gUnidad = pUnidad
  gIdUnidad = pIdUnidad
  gTotalGral = ''
  gTotalPaquetes = ''
  vDocumentoVen = 0
  vDocumentoDev = 0
  gNombreMoneda = tMonedas(cNombreMoneda)
 
  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 totales generales de las variables gTotalGral
// Entradas :  
// Salida :    
// *************************************************************************************************
DefFunc  fTotalGral()
local LTotalLinea

  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,C11]
  gTotalGral[2] = 'Total Productos'
  Imprime gTotalGral
  gTotalGral = ''

  // Impresión del Total de paquetes
  Si (@Col(gTotalPaquetes; 4) > 0) O (@Col(gTotalPaquetes; 10) > 0)
    gTotalPaquetes = ''[c0..c3,c11]
    gTotalPaquetes[2] = 'Total Cantidad de Paquetes'
    Imprime gTotalPaquetes
  FinSi
  gTotalPaquetes = ''
Finfunc

// *************************************************************************************************
// Descripcion: Imprime los totales del producto 
// Entradas :  
// Salida :    
// *************************************************************************************************
DefFunc fTotalProd(atProductos:TABLA)
  // Solo si la cantidad del producto es mayor a cero se imprime y se acumula
  Si (@Col(gTotalProd;4) > 0) O (@Col(gTotalProd;10) > 0)
    Imprime gTotalProd
    // Acumula a los Totales
    Si atProductos(cTipoProducto) = 2
      // En caso de paquetes acumular las unidades al total de paquetes
      gTotalPaquetes = gTotalPaquetes + gTotalProd[C4]
      gTotalPaquetes = gTotalPaquetes + gTotalProd[C10]
      // Acumular los restantes importes
      gTotalGral = gTotalGral + gTotalProd[C8,C12,C14]
    Sino
      gTotalGral = gTotalGral + gTotalProd[C4,C8,C10,C14]
    FinSi
  FinSi
  gTotalProd = ''
FinFunc

// *************************************************************************************************
// Descripcion: Esta función regresa el ID del documento del movimiento owner del 
//              movimiento oculto. La razón de ser de ésta función es que los movimientos
//              ocultos no heredan el campo cIdDocumento de su owner.
// Entradas : atMovtoOculto = Movimiento oculto (características, componentes o traspasos)
//            atMovtoOwner = Movimiento owner
// Salida :   Id del documento del movimeinto oculto
// *************************************************************************************************
DefFunc fIdDocumentoMovtoOwner(atMovtoOculto: Tabla; atMovtoOwner: Tabla)
  Si atMovtoOculto(cIdMovtoOwner)
    atMovtoOwner.Busca[@Str(atMovtoOculto(cIdMovtoOwner);0)] // Busca el movimiento owner
    Si atMovtoOwner->Encontro
      Retorna atMovtoOwner(cIdDocumento)
    FinSi
  FinSi
  Retorna 0
FinFunc


// *************************************************************************************************
// Descripcion : Recorre los movimientos afectados o sin afectar de un producto sumándolos a los totales
// Entrada : aAfecInven - Estado de los movimientos
//             0 - Sin afectar
//             1 - Afectado en existenciasy costos
//             2 - Afectado sólo en existencias
//           atMovimientos        - Tabla de movimientos
//           atMovimientosDestino - Tabla de movimientos destino del pedido, remisión...
//           tMovtoOwner          - Movimientos dueños de los movtos ocultos
//           atProductos          - Tabla de productos
//           atDocumentos         - Tabla de documentos
//           atUnidadesPM         - Tabla de unidades
//           atEquivaleUnidadesPM - Tabla de equivalencias de unidades 
//           atParametros         - Tabla de parámetros
// *************************************************************************************************
DefFunc fRecorreMovimientos(aAfecInven; aDocumento; atMovimientos:TABLA; atMovtoOwner:TABLA; atProductos:TABLA; atDocumentos:TABLA; atUnidadesPM:TABLA; atEquivaleUnidadesPM:TABLA; atParametros:TABLA)
Local lIdDocumento, lsihubocambio, lCantidad, lNeto, lDescuentos, lNetoMenDesc
Local lIdMonedaCte

  // N.D.4048 Búsqueda de un movimiento del producto a la fecha inicial del reporte
  gFechaBusqueda = pFechaInicial
  // NOTA: Es obligatorio volver a fijar el índice a fin de que las búsquedas parciales funcionen correctamente
  atMovimientos.Usaindice['iProductoDoctoDeAfecFecha']
  atMovimientos.busca[atProductos(cIdProducto) & ':' & aDocumento & ':' & aAfecInven & ':' & gFechaBusqueda]
  Si !atMovimientos->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 atProductos(cIdProducto) = @Val(@SUBSTR(atMovimientos->Llave;0;11))
      Si aDocumento = @Val(@SUBSTR(atMovimientos->Llave;11;11))
        Si aAfecInven = @Val(@SUBSTR(atMovimientos->Llave;22;6))
          Si @SUBSTR(atMovimientos->Llave;28;8) >= pFechaInicial Y @SUBSTR(atMovimientos->Llave;28;8) <= pFechaFinal
            // Realizar nuevamente la búsqueda a fin de posicionarnos en el registro y activar la propiedad Encontro
            gFechaBusqueda = @SUBSTR(atMovimientos->Llave;28;8)
            atMovimientos.busca[atProductos(cIdProducto) & ':' & aDocumento & ':' & aAfecInven & ':' & gFechaBusqueda]
          FinSi
        FinSi
      FinSi
    FinSi        
  FinSi
  
  Mientras atMovimientos->Encontro Y (atMovimientos(cFecha) <= pFechaFinal)        
    Si pTipoReporte = 3 // Devoluciones de remision
      Si aDocumento = vDocumentoVen // Remisión
        Si atMovimientos(cAfectaExistencia) != 2
          atMovimientos.BUSCA SIGUIENTE[3]
          Continua
        FinSi
      SiNo // Devolución de Remisión
        Si atMovimientos(cAfectaExistencia) != 1
          atMovimientos.BUSCA SIGUIENTE[3]
          Continua
        FinSi
      FinSi
    FinSi

    // Busca el documento del movimiento, se debe diferenciar entre movimientos reales y ocultos
    lIdDocumento = atMovimientos(cIdDocumento)
    Si lIdDocumento = 0  // es un movimiento oculto
      lIdDocumento = fIdDocumentoMovtoOwner(atMovimientos; atMovtoOwner) 
    FinSi
    atDocumentos.Busca[@Str(lIdDocumento;0)]

    // No tomar los movimientos de documentos cancelados
    Si atDocumentos(cCancelado) = 1
      atMovimientos.BUSCA SIGUIENTE[3]
      Continua
    FinSi

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

    fVerificaUnidad(tProductos)
    
    // Si el Producto tiene Unidad de Medida NO Equivalente  "Y" pUnidad = 1
    Si pUnidad = 1 y atProductos(cIdUnidadNoConvertible) != 0
      lCantidad = atMovimientos(cUnidadesNC)
    Sino 
      lCantidad =  atMovimientos(cUnidades)
    Finsi

    lsihubocambio = 0
    //Convertir Importes en la Moneda del Reporte
    Si pUnidad = 2 Y atProductos(cIdUnidadBase) != 0
      // El Producto tiene Unidad de Medida y Peso
      // Unificar vCantidad de acuerdo a la unidad deseada en el reporte.
      atEquivaleUnidadesPM.Busca[@Str(atProductos(cIdUnidadBase);0) & ':' & @Str(pIdUnidad;0)]
      Si atEquivaleUnidadesPM->Encontro
        lCantidad = lCantidad * atEquivaleUnidadesPM(cFactorConversion)
        lsihubocambio =1
      Finsi
    Finsi

    // Busca nombre de la unidad de medida o peso
    Si  pUnidad = 1 y atProductos(cidUnidadNoConvertible) != 0
      atUnidadesPM.busca[@str(atProductos(cidUnidadNoConvertible);0)]
    Sino
      Si pUnidad = 2 
        Si lsihubocambio =1
          atUnidadesPM.busca[@str(@col(pIdUnidad;0);0)]
        Sino
          atUnidadesPM.busca[@str(atProductos(cIdUnidadBase);0)]
        Finsi
      Sino
        atUnidadesPM.busca[@str(atProductos(cIdUnidadBase);0)]
      Finsi
    Finsi
    Si atUnidadesPM->encontro
      Si aDocumento = vDocumentoVen
        gTotalProd = atUnidadesPM(cDespliegue)[C6]
        Si @col(gTotalProd;6)='(N)'
          gTotalProd = ''[C6]
        Finsi
      SiNo
        gTotalProd = atUnidadesPM(cDespliegue)[C12]
        Si @col(gTotalProd;12)='(N)'
          gTotalProd = ''[C12]
        Finsi
      FinSi
    Finsi

    lNeto = atMovimientos(cNeto)
    lNeto = fCambiarMonedaDoctoAReporte(atDocumentos; tTiposCambio; lNeto; pIdMoneda; lIdMonedaCte)
    lDescuentos = atMovimientos(cDescuento1) + atMovimientos(cDescuento2) + atMovimientos(cDescuento3) + atMovimientos(cDescuento4) + atMovimientos(cDescuento5)
    lDescuentos = fCambiarMonedaDoctoAReporte(atDocumentos; tTiposCambio; lDescuentos; pIdMoneda; lIdMonedaCte)
    lNetoMenDesc = lNeto - lDescuentos
    Si aDocumento = vDocumentoVen
      gTotalProd = gTotalProd + @Col(lCantidad;0)[C4]
      gTotalProd = gTotalProd + @Col(lNetoMenDesc;0)[C8]
    SiNo
      gTotalProd = gTotalProd + @Col(lCantidad;0)[C10]
      gTotalProd = gTotalProd + @Col(lNetoMenDesc;0)[C14]
    FinSi
    atMovimientos.BUSCA SIGUIENTE[3]
  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

    Si pTipoReporte = 1
      Texto '^@TC{0,0,0}@S{16}' & 'Reporte de Devoluciones sobre Venta por Producto'
    Sino
      Si pTipoReporte = 2
        Texto '^@TC{0,0,0}@S{16}' & 'Reporte de Devoluciones sobre Compra por Producto'
      Sino
        Si pTipoReporte = 3
          Texto '^@TC{0,0,0}@S{16}' & 'Reporte de Devoluciones de Remision por Producto'
        Sino
          Si pTipoReporte = 4
            Texto '^@TC{0,0,0}@S{16}' & 'Reporte de Devoluciones de Consignación por Producto'
          Finsi 
        Finsi 
      Finsi
    Finsi
    Texto '"@TC{0,0,0}@S{8}Hora: ' & @Hora()
    Imprime

    Texto '^@TC{0,0,0}@S{16}'& 'Del: ' & fEditaFecha(pFechaInicial) & ' al: ' & fEditaFecha(pFechaFinal)
    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
      Si pTipoReporte = 2 
        Texto C2;'     C O M P R A D O'
      Sino
        Si pTipoReporte = 3
          Texto C2;'R E M I S I O N A D O'
        Sino
          Texto C2;'   C O N S I G N A D O'
        Finsi
      Finsi
    Finsi
    Texto C4;'D E V U E L T O' 
    Imprime   

    //Código         Nombre(Producto,Servicio,Paquete)        Cantidad           Total          Cantidad            Total         
    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 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// *************************************************************************************************
  vDoctoNotas = 35     // FBSC POS, variables con los ID de los nuevos tipos de documentos para
  vDoctoDevNotas = 36  // POS

  Si pTipoReporte = 1
    vDocumentoVen = 4
    vDocumentoDev = 5
  Sino
    Si pTipoReporte = 2
      vDocumentoVen = 19
      vDocumentoDev = 20
    Sino
      Si pTipoReporte = 3
        vDocumentoVen = 3
        vDocumentoDev = 6
      Sino 
        vDocumentoVen = 18
        vDocumentoDev = 21
      Finsi
    Finsi
  Finsi

  gTotalGral = ''

  Si @str(pProductoInicial;0) = ' '
    tProductos.Busca Primero
  Sino
    tProductos.Busca [@str(pProductoInicial;0) & ':']
  FinSi

  Mientras tProductos->Encontro
    Si @Str(pProductoFinal;0) != ' '
      Si tProductos(cCodigoProducto)> @str(pProductoFinal;0)
        Finciclo
      Finsi 
    Finsi
    Si pTipoReporte = 2 o pTipoReporte = 4
      Si tProductos(cTipoProducto) = 2
        //si es compra y es paquete, se brinca el registro
        tProductos.Saltareg[1]                     
        continua
      Finsi
    Finsi

    //N.D.4750 Si es uno de los servicios para facturar notas de venta no incluirlo
    Si tProductos(cIdProducto) = tParametros(cIdProdu01)
      tProductos.Saltareg[1]
      Continua
    FinSi
    Si tProductos(cIdProducto) = tParametros(cIdProdu02)
      tProductos.Saltareg[1]
      Continua
    FinSi
    Si tProductos(cIdProducto) = tParametros(cIdProdu03)
      tProductos.Saltareg[1]
      Continua
    FinSi
    Si tProductos(cIdProducto) = tParametros(cIdProdu04)
      tProductos.Saltareg[1]
      Continua
    FinSi
    Si tProductos(cIdProducto) = tParametros(cIdProdu05)
      tProductos.Saltareg[1]
      Continua
    FinSi

    gTotalProd = ''
    gTotalProd = fMascarilla(tProductos(cCodigoProducto);tParametros(cMascarillaProducto))[C0]
    gTotalProd = tProductos(cNombreProducto)[C2]
    gTotalProd = 0[C4]
    gTotalProd = ''[C6]
    gTotalProd = 0[C8]
    gTotalProd = 0[C10]
    gTotalProd = ''[C12]
    gTotalProd = 0[C14]

    // Recorrer los movimientos sin afectar en existencias y costas, afectado y afectado sólo en existencias
    // Se hace en tres llamados distintos porque el índice no permite hacer un sólo recorrido, además por
    // cada uno se hace un doble llamado para sacar lo vendido y después lo devuelto
    Si pTipoReporte = 1 // FBCS POS los valores se actualizan por que en cada iteración 
      vDocumentoVen = 4 // Busca primero facturas y luego notas de venta.
      vDocumentoDev = 5
    Finsi

    fRecorreMovimientos(0; vDocumentoVen; tMovimientos; tMovtoOwner; tProductos; tDocumentos; tUnidadesPM; tEquivaleUnidadesPM; tParametros)
    fRecorreMovimientos(0; vDocumentoDev; tMovimientos; tMovtoOwner; tProductos; tDocumentos; tUnidadesPM; tEquivaleUnidadesPM; tParametros)     
    fRecorreMovimientos(1; vDocumentoVen; tMovimientos; tMovtoOwner; tProductos; tDocumentos; tUnidadesPM; tEquivaleUnidadesPM; tParametros)
    fRecorreMovimientos(1; vDocumentoDev; tMovimientos; tMovtoOwner; tProductos; tDocumentos; tUnidadesPM; tEquivaleUnidadesPM; tParametros)     
    fRecorreMovimientos(2; vDocumentoVen; tMovimientos; tMovtoOwner; tProductos; tDocumentos; tUnidadesPM; tEquivaleUnidadesPM; tParametros)
    fRecorreMovimientos(2; vDocumentoDev; tMovimientos; tMovtoOwner; tProductos; tDocumentos; tUnidadesPM; tEquivaleUnidadesPM; tParametros)
       
    Si pTipoReporte = 1 // Si el reporte es de ventas, recorre los documentos de notas y devolución de notas.
      vDocumentoVen = vDoctoNotas        // FBCS POS
      vDocumentoDev = vDoctoDevNotas
      fRecorreMovimientos(0; vDocumentoVen; tMovimientos; tMovtoOwner; tProductos; tDocumentos; tUnidadesPM; tEquivaleUnidadesPM; tParametros)
      fRecorreMovimientos(0; vDocumentoDev; tMovimientos; tMovtoOwner; tProductos; tDocumentos; tUnidadesPM; tEquivaleUnidadesPM; tParametros)
      fRecorreMovimientos(1; vDocumentoVen; tMovimientos; tMovtoOwner; tProductos; tDocumentos; tUnidadesPM; tEquivaleUnidadesPM; tParametros)
      fRecorreMovimientos(1; vDocumentoDev; tMovimientos; tMovtoOwner; tProductos; tDocumentos; tUnidadesPM; tEquivaleUnidadesPM; tParametros)
      fRecorreMovimientos(2; vDocumentoVen; tMovimientos; tMovtoOwner; tProductos; tDocumentos; tUnidadesPM; tEquivaleUnidadesPM; tParametros)
      fRecorreMovimientos(2; vDocumentoDev; tMovimientos; tMovtoOwner; tProductos; tDocumentos; tUnidadesPM; tEquivaleUnidadesPM; tParametros)
    Finsi
  
    fTotalProd(tProductos)
    tProductos.Saltareg[1]
  FinMientras

  //Imprime Totales Generales
  fTotalGral()

// FIN REPORTE  
