// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// Reporte:     Reporte de pedidos por producto
//              Reporte de cotizaciones por producto
//              Reporte de ordenes de compra por producto
//              Reporte de consignaciones por producto
//              Reporte de Remisiones por Producto
//              Reporte de Cotizaciones del Proveedor 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
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// 16/05/2007   JAAM    N.C.147     Esquema de adicion de unidades de compra y venta  
// 23/05/2007		ELVS		N.C.146			Se agrega documento modelo cotización del proveedor.	 	
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<


// *************************************************************************************************
// 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
                                     //3 = Unidad de Compra   4 = Unidad de Venta
    Parametro pIdUnidad         = 1  //base de datos de unidades (id)
    Parametro pIdMoneda         = 1  // 1 = ID moneda Peso mexicano
    Parametro pTipoReporte      = 1
                                     // 1     Reporte de pedidos por producto
                                     // 2     Reporte de cotizaciones por producto
                                     // 3     Reporte de Remisiones por Producto
                                     // 4     Reporte de ordenes de compra por producto
                                     // 5     Reporte de consignaciones por producto
                                     // 6     Reporte de dev.  de remision Sobre venta por producto
																		 // 7 		Reporte de cotizaciones del proveedor por producto	
    Parametro pIdClase1   = 0
    Parametro pIdClase2   = 0
    Parametro pIdClase3   = 0
    Parametro pIdClase4   = 0 
    Parametro pIdClase5   = 0   
    Parametro pIdClase6   = 0 //Clasificaciones


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

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

  UsaTabla tProductos = tEmpresa['mgw10005'] Alias 'Productos'              // Productos
  tProductos.Usaindice['iCodigoTipo']
  
  UsaTabla tMovimientos = tEmpresa['mgw10010'] Alias 'Movimientos'          // Movimientos
  tMovimientos.Usaindice['iProductoDoctoDeAfecFecha']

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

  UsaTabla tDocumentos = tEmpresa['mgw10008']                               // Documentos
  tDocumentos.Usaindice['cIdDocumento']
  
  UsaTabla tUnidadesPM = tEmpresa['mgw10026']                               //unidades peso y med
  tUnidadesPM.Usaindice['']
  
  UsaTabla tEquivaleUnidadesPM = tEmpresa['mgw10027']                       // EquivalenciasUnidades peso y med
  tEquivaleUnidadesPM.Usaindice['']
  
  UsaTabla tMonedas = tEmpresa['mgw10034']                                  // Monedas
  tMonedas.Usaindice[''] 
  
  UsaTabla tEjercicioPeriodo = tEmpresa['mgw10031']                         //ejercicio-mes
  tEjercicioPeriodo.Usaindice['']                     
  
  Usatabla tTiposCambio = tEmpresa['mgw10035']                              // TiposCambio 
  tTiposCambio.Usaindice['iMonedaFecha']

  // Para determinar si el producto del movimiento es un Paquete.
  UsaTabla tProductosBusqueda = tEmpresa['mgw10005'] Alias 'ProdBusqueda'
  tProductosBusqueda.Usaindice['']                                 
  UsaTabla tClasificaciones = tEmpresa['mgw10020']
  tClasificaciones.Usaindice['']
  UsaTabla tClientes = tEmpresa['mgw10002']
  tClientes.Usaindice['']

  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 
// *************************************************************************************************
// Si se trata de los reportes de remisiones se agrega una columa más, por lo que las columnas existentes
// se reducen de tamaño
  Si pTipoReporte = 3 o pTipoReporte = 5
   Columnas 16;2.7,0.15,4.78,0.15,0.75,0.15,2.10,0.15,2.10,0.15,2.10,0.15,2.10,0.15,2.10,0.15
  Sino 
   Columnas 20;2.7,0.15,5.25,0.15,0.75,0.15,2.25,0.15,2.25,0.15,2.25,0.15,2.25,0.15,0
  Finsi

  UsaLetra 'Arial'
  Altura 9 
  [C0..C5].Decimales 0
  [C0..C5].Blanco ' '
  tMonedas.Busca[@Str(pIdMoneda;0)]
  gDecimales = tMonedas(cDecimalesMoneda)

  Si pTipoReporte = 3 o pTipoReporte = 5
    [C6..C14].Coma
    [C6..C12].Decimales tParametros(cDecimalesUnidades) // Decimales para unidades
    [C14].Decimales gDecimales
    [C6..C14].Blanco // N.D.4250 No asignar este valor por omisión ya que deseamos que se muestre en base a la configuración de la columna '0.00'
    [C7,C9,C11,C13].Blanco ''
  Sino  
    [C6..C12].Coma
    [C6..C10].Decimales tParametros(cDecimalesUnidades) // Decimales para unidades
    [C12].Decimales gDecimales
    [C6..C12].Blanco // N.D.4250 No asignar este valor por omisión ya que deseamos que se muestre en base a la configuración de la columna '0.00'
    [C7,C9,C11,C13..C19].Blanco ''
  FinSi 

// *************************************************************************************************
// VARIABLES GLOBALES 
// *************************************************************************************************
  gUnidad = pUnidad
  gIdUnidad = pIdUnidad
  vFechaIni = ''
  gRenglon = '' 
  gTotalProd = ''
  gTotalGral = ''
  gTotalPaquetes = ''
  vDocumento = 0
  gNombreMoneda = tMonedas(cNombreMoneda)
 
  kMeses = 'Ene,Feb,Mar,Abr,May,Jun,Jul,Ago,Sep,Oct,Nov,Dic'[C0]


// *************************************************************************************************
// FUNCIONES <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// *************************************************************************************************
// =================================================================================================
// Función área sensible al contexto
// =================================================================================================
DefFunc ContextoDetalleProducto(aNumeroColumna; aValor)
Local lTipoReporte
    Si pTipoReporte = 1   // 1    Reporte de pedidos por producto
       lTipoReporte = 3   // 3.   Reporte de pedidos agrupado por productos
    FinSi
    Si pTipoReporte = 2   // 2    Reporte de cotizaciones por producto
       lTipoReporte = 6   // 6.   Reporte de Cotizaciones agrupado por producto
    FinSi
    Si pTipoReporte = 3   // 3    Reporte de remisiones por producto
       lTipoReporte = 9   // 9.   Reporte de Remisiones agrupado por producto
    FinSi
    Si pTipoReporte = 4   // 4    Reporte de ordenes de compra por producto
       lTipoReporte = 11  //11.   Reporte de ordenes de compra agrupadas por producto
    FinSi
    Si pTipoReporte = 5   // 5    Reporte de consignaciones por producto
       lTipoReporte =13   //13.   Reporte de consignaciones agrupadas por producto
    FinSi
    Si pTipoReporte = 6   // 6    Reporte de dev.  de remision Sobre venta por producto
       lTipoReporte = 0   //
    FinSi
		//N.C.146
    Si pTipoReporte = 7   // 7    Reporte de Cotizaciones del Proveedor por Producto
       lTipoReporte = 15  //15		Reporte de cotizaciones del proveedor agrupado por producto
    FinSi
    EJECUTA tEmpresa->SysDirDatos & '\Reportes\AdminPAQ\ImpPed.RTW';lTipoReporte,pFechaInicial,pFechaFinal,aValor,aValor,' ',' ',' ',' ',' ',0,0,1,0,0,0,pIdMoneda,pIdClase1,pIdClase2,pIdClase3,pIdClase4,pIdClase5,pIdClase6;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 gTotalGral
//**************************************************************************************************
DefFunc fTotalGeneral()
Local LTotalLinea

  LTotalLinea = '==========================='[c0]
  Texto c6; @col(LTotalLinea;0)
  Texto c8; @col(LTotalLinea;0)
  Texto c10; @col(LTotalLinea;0)
  Texto c12; @col(LTotalLinea;0)
  Si pTipoReporte = 3 o pTipoReporte = 5
    Texto c14; @col(LTotalLinea;0)
  FinSi 
  imprime
  
  gTotalGral = '' [c0..c4]
  gTotalGral[2] = 'Total General'
  gTotalGral = '' [c15..c19]
  imprime gTotalGral
  
  gTotalGral = ''
  // Impresión del Total de paquetes
  Si @Col(gTotalPaquetes; 6) > 0
    gTotalPaquetes = ''[c0..c3]
    gTotalPaquetes[2] = 'Total Cantidad de Paquetes'
    Imprime gTotalPaquetes
  FinSi
Finfunc

//**************************************************************************************************
// Descripcion: imprime los totales  de las variable gRenglon y suma los totales 
//**************************************************************************************************
DefFunc fAcumular(aTipoProducto)
  Si @col(gRenglon;6)!=0 o @col(gRenglon;8)!=0 o @col(gRenglon;10)!=0 o @col(gRenglon;12)!=0 o @col(gRenglon;14)!=0
    // Acumula a los Totales
    Si aTipoProducto = 2
      // En caso de paquetes acumular las unidades al total de paquetes
      gTotalPaquetes = gTotalPaquetes + gRenglon[C6,C8,C10]
      // Acumular los restantes importes
      gTotalGral = gTotalGral + gRenglon[C12,C14]
    Sino
      // Acumular las cantidades
      gTotalGral = gTotalGral + gRenglon
    FinSi
    gTotalProd  = @col(gRenglon;4)[c4]
    gTotalProd  = @col(gTotalProd;6) + @col(gRenglon;6)[c6]
    gTotalProd  = @col(gTotalProd;8) + @col(gRenglon;8)[c8]
    gTotalProd  = @col(gTotalProd;10) + @col(gRenglon;10)[c10]
    gTotalProd  = @col(gTotalProd;12) + @col(gRenglon;12)[c12]
    Si pTipoReporte = 3 o pTipoReporte = 5
      gTotalProd = @col(gTotalProd;14) + @col(gRenglon;14)[c14]
    FinSi
  Finsi 
  gRenglon = ''   
Finfunc

//**************************************************************************************************
// Descripcion: imprime los totales  de las variable gTotalProd 
//**************************************************************************************************
DefFunc fTotalProducto(atProductos:TABLA; atParametros:TABLA)

  gTotalProd = '' [c0..c3]
   
  DEFREGION ContextoDetalleProducto
  Si @col(gTotalProd;6)!=0
    [C6].REGIONINFO atProductos(cCodigoProducto)
  FinSi

  Si pTipoReporte = 3 o pTipoReporte = 5
    Si @col(gTotalProd;6)!=0 o @col(gTotalProd;8)!=0 o @col(gTotalProd;10)!=0 o @col(gTotalProd;12)!=0 o @col(gTotalProd;14)!=0
      gTotalProd = fMascarilla(atProductos(cCodigoProducto);atParametros(cMascarillaProducto))[c0]
      gTotalProd = atProductos(cNombreProducto)[c2]
      imprime gTotalProd
    Finsi  
  Sino
    Si @col(gTotalProd;6)!=0 o @col(gTotalProd;8)!=0 o @col(gTotalProd;10)!=0 o @col(gTotalProd;12)!=0 
      gTotalProd = fMascarilla(atProductos(cCodigoProducto);atParametros(cMascarillaProducto))[c0]
      gTotalProd = atProductos(cNombreProducto)[c2]
      imprime gTotalProd
    Finsi
  FinSi
  gTotalProd = ''
Finfunc

//**************************************************************************************************
// fIdDocumentoMovtoOwner
// 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( aIdProducto; atMovtoOculto: Tabla; atMovtoOwner: Tabla)
  Si atMovtoOculto(cIdMovtoOwner)
    atMovtoOwner.Busca[@Str(atMovtoOculto(cIdMovtoOwner);0)] // Busca el movimiento owner
    Si atMovtoOwner->Encontro
      aIdProducto = atMovtoOwner(cIdProducto)
      Retorna atMovtoOwner(cIdDocumento)
    FinSi
  FinSi
  aIdProducto = 0
  Retorna 0
FinFunc

//**************************************************************************************************
// fRecorreMovimientos
// 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; atMovimientos:TABLA; atMovimientosDestino:TABLA; atMovtoOwner:TABLA; atProductos:TABLA; atDocumentos:TABLA; atUnidadesPM:TABLA; atEquivaleUnidadesPM:TABLA; atParametros:TABLA)
Local lIdProducto
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) & ':' & vDocumento & ':' & 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 vDocumento = @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) & ':' & vDocumento & ':' & aAfecInven & ':' & gFechaBusqueda]
          FinSi
        FinSi
      FinSi
    FinSi        
  FinSi
  
  Mientras atMovimientos->Encontro Y (atMovimientos(cFecha) <= pFechaFinal)
    vCantidad = 0
    vSurtidas = 0
    vDevueltas = 0
    vNeto = 0
    vDescuentos = 0
    vTotal = 0

    // Busca el documento del movimiento
    Si atMovimientos(cIdDocumento) 
      atDocumentos.Busca[@Str(atMovimientos(cIdDocumento);0)]
    Sino 
      lIdDocumento = fIdDocumentoMovtoOwner(&lIdProducto; atMovimientos; atMovtoOwner)
      atDocumentos.Busca[@Str(lIdDocumento;0)]
    Finsi

    //Se cambia a la moneda especificada
    lIdMonedaCte = 1
    tClientes.Busca[@Str(atDocumentos(cIdClienteProveedor);0)]
    Si tClientes->Encontro
      lIdMonedaCte = tClientes(cIdMoneda)
    FinSi

    // No imprimir los documentos cancelados
    Si atDocumentos(cCancelado) = 1
      atMovimientos.BUSCA SIGUIENTE[3]
      Continua
    FinSi
    
    //ped. cot
    Si (atMovimientos(cIdDocumentoDe) = 1 o atMovimientos(cIdDocumentoDe) = 2) y (atMovimientos(cTipoTraspaso)=4)
      atMovimientos.BUSCA SIGUIENTE[3]
      Continua
    Finsi  
    //remisiones
    Si (atMovimientos(cIdDocumentoDe) = 3 ) y (atMovimientos(cTipoTraspaso)!=2)
      atMovimientos.BUSCA SIGUIENTE[3]
      Continua
    Finsi    
    //ord. compra ,consig
    Si (atMovimientos(cIdDocumentoDe) = 17 o atMovimientos(cIdDocumentoDe) = 18) y (atMovimientos(cTipoTraspaso)=4)
      atMovimientos.BUSCA SIGUIENTE[3]
      Continua
    Finsi
    
    //SI el Producto tiene Unidad de Medida NO Equivalente  "Y" pUnidad = 1
    Si  pUnidad = 1 y atProductos(cidUnidadNoConvertible) != 0
      vCantidad = atMovimientos(cUnidadesNC)
      vPendientes= atMovimientos(cUnidadesNCPendientes)
    Sino 
      vCantidad =  atMovimientos(cUnidades)
      vPendientes = atMovimientos(cUnidadesPendientes)
    Finsi
    // Si es el reporte de Remisiones o de Consignaciones buscar los movimientos 
    // destino para determinar si son facturas, compras o devoluciones
    Si pTipoReporte = 3 o pTipoReporte = 5
      Mientras [atMovimientosDestino.busca[@Str(atMovimientos(cIdMovimiento);0)];atMovimientosDestino->encontro;atMovimientosDestino.Busca Siguiente[1]]
        Si atMovimientosDestino(cIdDocumentoDe) = 4  // Factura
          vSurtidas = vSurtidas + atMovimientosDestino(cUnidadesOrigen)
        Finsi
        Si atMovimientosDestino(cIdDocumentoDe) = 6  // Dev. Remisión
          vDevueltas = vDevueltas + atMovimientosDestino(cUnidadesOrigen)
        Finsi
        Si atMovimientosDestino(cIdDocumentoDe) = 19  // Compra
          vSurtidas = vSurtidas + atMovimientosDestino(cUnidadesOrigen)
        Finsi
        Si atMovimientosDestino(cIdDocumentoDe) = 21  // Dev. Consignación
          vDevueltas = vDevueltas + atMovimientosDestino(cUnidadesOrigen)
        Finsi
      FinMientras
    Sino
       vSurtidas = vCantidad - vPendientes
    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
        vCantidad = vCantidad * atEquivaleUnidadesPM(cFactorConversion)
        vPendientes = vPendientes * atEquivaleUnidadesPM(cFactorConversion)
        vSurtidas = vSurtidas * atEquivaleUnidadesPM(cFactorConversion)
        Si pTipoReporte = 3 o pTipoReporte = 5
          vDevueltas = vDevueltas * atEquivaleUnidadesPM(cFactorConversion)
        Finsi
        lsihubocambio =1
      Finsi
    Finsi
    
    vTotal = atMovimientos(cNeto) - atMovimientos(cDescuento1) - atMovimientos(cDescuento2) - atMovimientos(cDescuento3) - atMovimientos(cDescuento4) - atMovimientos(cDescuento5)
    
    Si pTipoReporte = 3 o pTipoReporte = 5
      gRenglon = @col(vCantidad;0)[c6]
      gRenglon = @col(vSurtidas;0)[c8] 
      gRenglon = @col(vDevueltas;0)[c10]
      gRenglon = @col(vPendientes;0)[c12]
      vTotal = fCambiarMonedaDoctoAReporte(atDocumentos; tTiposCambio; vTotal; pIdMoneda; lIdMonedaCte)[C0]  
      gRenglon = @col(vTotal;0)[c14]
    Sino
      gRenglon = @col(vCantidad;0)[c6]
      gRenglon = @col(vSurtidas;0)[c8] 
      gRenglon = @col(vPendientes;0)[c10]
      vTotal = fCambiarMonedaDoctoAReporte(atDocumentos; tTiposCambio; vTotal; pIdMoneda; lIdMonedaCte)[C0]
      gRenglon = @col(vTotal;0)[c12]
    Finsi
    
    //busca unidad base
    //SI el Producto tiene Unidad de Medida NO Equivalente  "Y" pUnidad = 1
    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
      gRenglon = atUnidadesPM(cDespliegue)[c4]
      Si @col(gRenglon;4)='(N)'
        gRenglon = ''[c4]
      Finsi
    Finsi
    
    // Acumular los importes enviando el tipo de producto para identificar si es un paquete
    fAcumular(atProductos(cTipoProducto))  
    
    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 Pedidos por Producto'
  Sino
    Si pTipoReporte = 2
      Texto '^@TC{0,0,0}@S{16}' & 'Reporte de Cotizaciones por Producto'
    Sino
      Si pTipoReporte = 3
        Texto '^@TC{0,0,0}@S{16}' & 'Reporte de Remisiones por Producto'
      Sino
        Si pTipoReporte = 4
          Texto '^@TC{0,0,0}@S{16}' & 'Reporte de Ordenes de Compra por Producto'
        Sino
          Si pTipoReporte = 5
            Texto '^@TC{0,0,0}@S{16}' & 'Reporte de Consignaciones por Producto'
          sino
	          Si pTipoReporte = 6
							Texto '^@TC{0,0,0}@S{16}' & 'Reporte de Dev. de Remision Sobre Venta por Producto'  	          
						//N.C.146
    	      sino
							Texto '^@TC{0,0,0}@S{16}' & 'Reporte de Cotizaciones del Proveedor por Producto'      	      
						finsi
          finsi  
        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
  Si pTipoReporte = 3 o pTipoReporte = 5
    // Código         Nombre(Producto)                            Cantidad     Facturado     Devueltos     Pendientes    Total                      
    Columnas 16;2.7,0.15,4.78,0.15,0.75,0.15,2.10,0.15,2.10,0.15,2.10,0.15,2.10,0.15,2.10,0.15
  Sino
    // Código         Nombre(Producto)                            Cantidad       Surtidos       Pendientes      Total                      
    Columnas 20;2.7,0.15,5.25,0.15,0.75,0.15,2.25,0.15,2.25,0.15,2.25,0.15,2.25,0.15,0
  Finsi  
  Texto '@TC{0,0,0}@L{-1}'
  Imprime 

  Texto C0;'Código'
  Texto C2;'Nombre (Producto)'
  Texto c4;'' 
  Texto c6;'^Cantidad' 
//N.C.146
  Si pTipoReporte = 4 o pTipoReporte = 5
    Texto c8;'^Recibidos'
  Sino  
    Si pTipoReporte = 3
      Texto c8;'^Facturado'
    Sino
      Texto c8;'^Surtidos'
    Finsi
  Finsi   
  Si pTipoReporte = 3 o pTipoReporte = 5
    Texto c10;'^Devuelto'
    Texto c12;'^Pendientes'
    Texto c14;'^Total'
  Sino
    Texto c10;'^Pendientes'
    Texto c12;'^Total'
  FinSi  
  Imprime   

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

  NEGRITAS FALSE
  Altura 10
  // Se Revisan las clasificaciones, para recuperarlas e imprimirlas en el encabezado
  fRevisaClases(tClasificaciones ) 
FinEncab


//**************************************************************************************************
// PRINCIPAL
//**************************************************************************************************
//vDocumento =  2(pedidos), 1(cotizaciones), 3(remisiones), 17(ordenes de compra), 18(consignaciones), 38(cotizaciones del proveedor)
Si pTipoReporte = 1
  vDocumento = 2
Sino
  Si pTipoReporte = 2
    vDocumento = 1
  Sino
    Si pTipoReporte = 3
      vDocumento = 3
    Sino
      Si pTipoReporte = 4
        vDocumento = 17
			Sino
				//N.C.146
      	Si pTipoReporte = 7
        	vDocumento = 38
				Sino
        	vDocumento = 18
				FinSi
      Finsi 
    Finsi 
  Finsi
Finsi

gRenglon = '' 
gTotalGral = ''
gTotalProd = ''

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 gNumDeClases > 0
    Si !fMiembroDeUnaClase(tProductos;gNumDeClases;gListIdDeClases;2)
      // salta el producto actual, por no pertenecer a alguna de las clasificaciones
      tProductos.Saltareg[1]
      Continua
    Finsi
  Finsi

  Si pTipoReporte = 4 o pTipoReporte = 5
    Si tProductos(cTipoProducto) = 2
      //si es compra y es serv  se brinca el registro
      tProductos.Saltareg[1]                     
      continua
    Finsi
  Finsi
 
  // Verifica parámetro pUnidad
  fVerificaUnidad(tProductos)
 
  fRecorreMovimientos(0; tMovimientos; tMovimientosDestino; tMovtoOwner; tProductos; tDocumentos; tUnidadesPM; tEquivaleUnidadesPM; tParametros)
  fRecorreMovimientos(1; tMovimientos; tMovimientosDestino; tMovtoOwner; tProductos; tDocumentos; tUnidadesPM; tEquivaleUnidadesPM; tParametros)
  fRecorreMovimientos(2; tMovimientos; tMovimientosDestino; tMovtoOwner; tProductos; tDocumentos; tUnidadesPM; tEquivaleUnidadesPM; tParametros)

  fTotalProducto(tProductos;tParametros)
  tProductos.Saltareg[1]
FinMientras  // Mientras hay productos

fTotalGeneral()

// FIN REPORTE  

