// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// Reporte:            Precios de Compra por Proveedor 
//                     Precios de Compra Por Producto   
//
//
//
//
// Sistema:     ADMINPAQ  Versión v1.0 Windows
//
// Descripcion: 
// 
//
//
// 
// Consideraciones :
// Creación  :  Luis Palau Castañeda.  12/septiembre/2001
// 
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Historia de modificaciones
//  Fecha      Nombre   IDLotus     Descripcion
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// 22/08/2002  LAP      N.D.1044    Los parametros del reporte se aplican para
//																	proveedores de la misma forma en como se
//																	aplican para productos.
//																	- Cuerpo del reporte
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// INCLUSION DE ARCHIVOS
    Incluye LibAdminPaq.rpt


// INICIO PARAMETROS
    Parametro pProInicial = '(Ninguno)'
    Parametro pProFinal = 'z'
    Parametro pEstadoPro = 0//0 = Todos     1 =  Activos     2 = Inactivos
    Parametro pIdClase1   = 0
    Parametro pIdClase2   = 0
    Parametro pIdClase3   = 0
    Parametro pIdClase4   = 0 
    Parametro pIdClase5   = 0   
    Parametro pIdClase6   = 0
    Parametro pTipoReporte = 1  //1  Precios de Compra por Proveedor 
                                //2  Precios de Compra Por Producto   


// INICIO APERTURA TABLAS

  UsaEmpresa tEmpresa;'AdminpaqW'

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

  //Clientes
  UsaTabla tClientes = tEmpresa['mgw10002']
  tClientes.Usaindice['iCodigoTipo']

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

  //Precios
  UsaTabla tPrecios = tEmpresa['mgw10014']
  tPrecios.Usaindice['cidProveedor']

  //Clasificaciones
  UsaTabla tClasificaciones = tEmpresa['mgw10020']
  tClasificaciones.Usaindice['']

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


  tParametros.Busca Primero   

//DEFINICION DE COLUMNAS 
  Columnas 20;2.7,0.15,5.55,0.15,1.5,0.15,0.9,0.15, 0,0 ,1.65,0.15,1.65,0.15,2.25,1.15,1.05,0.15,0

  UsaLetra 'Arial'
  Altura 9 
//  [C0..C7].Decimales 0
//  [C0..C7].Blanco ' '
  gDecimales = 2
//  [C8..C14].Coma
//  [C8..C14].Decimales gDecimales
//  [C8..C14].Blanco '0.00'
//  [c9,c11,c13,c15..c19].Blanco ' '

//VARIABLES GLOBALES 
  
  gDelaFecha = ''
  gAlaFecha  = ''
  gRenglon = '' 
  gMoneda = ''
  vTipoAcumulado = 0
  vImporteModelo  =  0
  vIdEjercicio = 0
  gNombreMoneda = tMonedas(cNombreMoneda)
 
  kMeses = 'Ene,Feb,Mar,Abr,May,Jun,Jul,Ago,Sep,Oct,Nov,Dic'[C0]


  gDelaFecha = @str(pMes;0) 
  Mientras @len(gDelaFecha)<2
     gDelaFecha   = '0' & gDelaFecha 
  FinMientras
  gDelaFecha = @str(pEjercicio;0) &   gDelaFecha & '02'

//FUNCIONES <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
//***********************************************************************************************
//	EditaFec
// 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
// Autor :     FBCS junio 2001
//***********************************************************************************************
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


//***********************************************************************************************
// ImprimeProd()    
// Descripcion: imprime los datos del producto
// Entradas :  
// Salida :    
// Autor :    Luis Palau    
// fecha :    agosto 2001
//***********************************************************************************************
Deffunc ImprimeProd()    
local vimprime
   Columnas 20;1.5,0.15,6.6,0.15,1.5,0.15,0
   Negritas True

   vimprime = 'Producto:' [c0]
   vimprime = fMascarilla(tProductos(cCodigoProducto);tParametros(cMascarillaProducto))[c2]
   imprime vimprime
   vimprime = 'Nombre:' [c0]
   vimprime = tProductos(cNombreProducto) [c2]
   imprime vimprime
   Negritas False

   Columnas 20;2.85,0.15,6.15,0.15,1.65,0.15,1.5,0.15,1.65,0.15,4.05,0.15,0
Finfunc


//***********************************************************************************************
//	ImprimeCP
// Descripcion: imprime los datos del Cliente  o Proveedor
// Entradas :  
// Salida :    
// Autor :    Luis Palau    
// fecha :    agosto 2001
//***********************************************************************************************
Deffunc ImprimeCP()
local vimprime
   Columnas 20;1.5,0.15,6.6,0.15,1.5,0.15,0
   Negritas True

   vimprime = 'Proveedor:' [c0]
   vimprime = fMascarilla(tClientes(cCodigoCliente);tParametros(cMascarillaClientes))[c2]
   imprime vimprime
   vimprime = 'Nombre:' [c0]
   vimprime = tClientes(cRazonSocial) [c2]
   imprime vimprime
   Negritas False

   Columnas 20;2.85,0.15,6.15,0.15,1.65,0.15,1.5,0.15,1.65,0.15,4.05,0.15,0
Finfunc


//***********************************************************************************************
//	fPrecios  
// Descripcion: hace un ciclo para imprimir los precios de los porductos
// Entradas :  
// Salida :    
// Autor :     LEPC Sept 2001
//***********************************************************************************************
DefFunc fPrecios(aIdProveedor)
  local vimprime
  tPrecios.busca[@str(@col(aIdProveedor;0);0)]

  Mientras tPrecios->encontro

    vimprime = ''
    Si tPrecios(cIdProveedor)!=@col(aIdProveedor;0)
      Finciclo
    Finsi

    tProductos.busca[@str(tPrecios(cIdProducto);0)]
    Si tProductos->encontro
       Si pEstadoPro = 1  //	0 = Todos     1 = Clientes Activos     2 = Clientes Inactivos
         Si tProductos(cStatusProducto)!= 1
           tPrecios.Saltareg[1]
           Continua
         Finsi
       Finsi
       Si pEstadoPro = 2  //	0 = Todos     1 = Clientes Activos     2 = Clientes Inactivos
         Si tProductos(cStatusProducto)!= 0
           tPrecios.Saltareg[1]
           Continua
         Finsi
       Finsi
    Finsi

    si PrimVez =1
       //se imprime su encabezado    
       ImprimeCP()    
       PrimVez =0
    Finsi

    vimprime = '"' &@str(tPrecios(cPrecioCompra);2)[c4]
    tUnidadesPM.busca[@str(tPrecios(cIdUnidad);0)]
    Si tUnidadesPM->encontro
      vimprime  =tUnidadesPM(cDespliegue)[c6]
      Si @col(vimprime;6)='(N)'
        vimprime = ''[c6]
      Finsi 
    FInsi
    tMonedas.busca[@str(tPrecios(cIdMoneda);0)]
    Si tMonedas->encontro
      vimprime = tMonedas(cNombreMoneda)[c8]
    FInsi
    vimprime = tPrecios(cCodigoProductoProveedor)[c10]

    tProductos.busca[@str(tPrecios(cIdProducto);0)]
    Si tProductos->encontro
      vimprime = fMascarilla(tProductos(cCodigoProducto);tParametros(cMascarillaProducto))[c0]
      vimprime = tProductos(cNombreProducto)[c2]
    FInsi

    imprime vimprime
    tPrecios.Saltareg[1]
  FinMientras

  si PrimVez =0
    //se imprime su encabezado    
    texto ' ' 
    imprime 
  Finsi
Finfunc


//***********************************************************************************************
//	fPrecios2
// Descripcion: hace un ciclo para imprimir los precios de los productos de los proveedores
// Entradas :  
// Salida :    
// Autor :     LEPC Sept 2001
//***********************************************************************************************
Deffunc fPrecios2(aIdProducto)
  local vimprime
  tPrecios.busca[@str(@col(aIdProducto;0);0)&':']
  Mientras tPrecios->encontro
    vimprime = ''
    Si tPrecios(cIdProducto)!=@col(aIdProducto;0)
      Finciclo
    Finsi

    si PrimVez =1
       //se imprime su encabezado    
       ImprimeProd()    
       PrimVez =0
    Finsi

    vimprime = '"' &@str(tPrecios(cPrecioCompra);2)[c4]
    tUnidadesPM.busca[@str(tPrecios(cIdUnidad);0)]
    Si tUnidadesPM->encontro
      vimprime  =tUnidadesPM(cDespliegue)[c6]
      Si @col(vimprime;6)='(N)'
        vimprime = ''[c6]
      Finsi 
    FInsi
    tMonedas.busca[@str(tPrecios(cIdMoneda);0)]
    Si tMonedas->encontro
      vimprime = tMonedas(cNombreMoneda)[c8]
    FInsi
    vimprime = tPrecios(cCodigoProductoProveedor)[c10]

    tClientes.busca[@str(tPrecios(cIdProveedor);0)]
    Si tClientes->encontro
      vimprime = fMascarilla(tClientes(cCodigoCliente);tParametros(cMascarillaClientes))[c0]
      vimprime = tClientes(cRazonSocial)[c2]
    FInsi
    imprime vimprime
    tPrecios.Saltareg[1]
  FinMientras

  si PrimVez =0
    //se imprime su encabezado    
    texto ' ' 
    imprime 
  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{22}' & tEmpresa->Nombre
    Texto '"@TC{0,0,0}@S{8}Fecha: ' & fEditaFecha(@Hoy())
    Imprime
    Si pTipoReporte = 1
      Texto '^@TC{0,0,0}@S{16}' & ' Precios de Compra por Proveedor'
    Sino
      Si pTipoReporte = 2
        Texto '^@TC{0,0,0}@S{16}' & ' Precios de Compra por Producto'
      Sino
        Si pTipoReporte = 3
          Texto '^@TC{0,0,0}@S{16}' & ' '
        Finsi
      Finsi
    Finsi
    Texto '"@TC{0,0,0}@S{8}Hora: ' & @Hora()
    Imprime
    // ===== Se Revisan las clasificaciones, para recuperarlas e imprimirlas en el encabezado
    fRevisaClases(tClasificaciones)
    // ===== Fin de la revision de clasificaciones
    NEGRITAS TRUE
    Altura 10
    Texto '@TC{0,0,0}@L{-1}'
  	Imprime 
    //Código(Producto)  Nombre(Producto)                        Precio    Unidad   Moneda    Código Producto(Proveedor)
    Columnas 20;2.85,0.15,6.15,0.15,1.65,0.15,1.5,0.15,1.65,0.15,4.05,0.15,0
    Texto ''
    Si pTipoReporte = 1 //por proveedor
      Texto C0;'Código(Producto)'
      Texto C2;'Nombre(Producto)'                        
    Sino
      Texto C0;'Código(Proveedor)'
      Texto C2;'Nombre(Proveedor)'
    Finsi
    Texto c4;'Precio' 
    Texto c6;'Unidad' 
    Texto c8;'Moneda'
    Texto c10;'Código Producto(Proveedor)'
    Imprime   
    Texto '@TC{0,0,0}@L{-1}'
	  Imprime   
    NEGRITAS FALSE
    Altura 10
	FinEncab

//PRINCIPAL <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
	gRenglon = '' 
	// R E P O R T E   P O R   P R O V E E D O R <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
	Si pTipoReporte = 1 
		tClientes.Usaindice['iCodigoTipo']
		tProductos.Usaindice['']
		//tClientes.Busca [@str(pProInicial;0) & ':']
		tClientes.Busca Primero

		// N.D.1044 Inicio
		// Ubica el proveedor del filtro inicial
    si pProInicial = ' '
      tClientes.Busca primero
    sino
      tClientes.Busca [@str(pProInicial;0) & ':']
    finsi
		// N.D.1044 Fin

    Mientras tClientes->Encontro
			// N.D.1044 Inicio
			// Determina si ya llego al proveedor del filtro final
      SI pProFinal != ' '
        SI tClientes(cCodigoCliente) > @str(pProFinal;0)
          FINCICLO
        FINSI
      FINSI
			// N.D.1044 Fin

			//Si tClientes(cCodigoCliente)> @str(pProFinal;0)
      //  Finciclo
      //Finsi 
      Si tClientes(cIdClienteProveedor)= 0
        tClientes.Saltareg[1]
        Continua
      Finsi

			// N.D.1044 Inicio
			// Respetar el filtro de estado del proveedor
      //Si tClientes(cTipoCliente)= 1
      //  tClientes.Saltareg[1]
      //  Continua
      //Finsi
      Si pEstadoPro = 1  //	0 = Todos     1 = Clientes Activos     2 = Clientes Inactivos
        Si tClientes(cEstatus) != 1
          tClientes.Saltareg[1]
          Continua
        Finsi
      Finsi
      Si pEstadoPro = 2  //	0 = Todos     1 = Clientes Activos     2 = Clientes Inactivos
        Si tClientes(cEstatus) != 0
          tClientes.Saltareg[1]
          Continua
        Finsi
      Finsi
			// N.D.1044 Fin

      // Se Revisan las CLASIFICACIONES, solo en el caso de haber seleccionado al menos una 
      Si gNumDeClases > 0
				// N.D.1044 Utilizar el tipo de clasificación de proveedores
        lQueTipo = 1 // Proveedores
        Si !fMiembroDeUnaClase(tClientes; gNumDeClases; gListIdDeClases; lQueTipo)
          // Sa salta el cliente actual, por no pertenecer a alguna de las clasificaciones
          tClientes.Saltareg[1]
          Continua
        Finsi
      Finsi
      //se lista la tabla 14
      PrimVez =1
      fPrecios(tClientes(cIdClienteProveedor))
      tClientes.Saltareg[1]
    FinMientras 
	// R E P O R T E   P O R   P R O D U C T O <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
	Sino
    tPrecios.Usaindice['']
    tClientes.Usaindice['']
    tProductos.Usaindice['iCodigoTipo']

    si pProInicial = ' '
      tProductos.Busca primero
    sino
      tProductos.Busca [@str(pProInicial;0) & ':']
    finsi

    Mientras tProductos->Encontro

      si pProFinal != ' '
        Si tProductos(cCodigoProducto)> @str(pProFinal;0)
          Finciclo
        Finsi 
      finsi
      Si tProductos(cIdProducto)= 0
        tProductos.Saltareg[1]
        Continua
      Finsi
      Si pEstadoPro = 1  //	0 = Todos     1 = Clientes Activos     2 = Clientes Inactivos
        Si tProductos(cStatusProducto)!= 1
          tProductos.Saltareg[1]
          Continua
        Finsi
      Finsi
      Si pEstadoPro = 2  //	0 = Todos     1 = Clientes Activos     2 = Clientes Inactivos
        Si tProductos(cStatusProducto)!= 0
          tProductos.Saltareg[1]
          Continua
        Finsi
      Finsi
      // Se Revisan las CLASIFICACIONES, solo en el caso de haber seleccionado al menos una 
      Si gNumDeClases > 0
        lQueTipo = 2
        Si !fMiembroDeUnaClase( tProductos  ;gNumDeClases;gListIdDeClases;lQueTipo)
           // Sa salta el cliente actual, por no pertenecer a alguna de las clasificaciones
           tProductos.Saltareg[1]
          Continua
        Finsi
      Finsi
      //se lista la tabla 14
      PrimVez =1
      fPrecios2(tProductos(cIdProducto))
      tProductos.Saltareg[1]
    FinMientras 
	Finsi
 