// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// Reporte:            Catálogos de Productos, Servicios y Paquetes. Ordenado por Código
//                     Catálogos de Productos, Servicios y Paquetes. Ordenado por Nombre 
//
//
//
//
// Sistema:     ADMINPAQ  Versión v1.0 Windows
//
// Descripcion: 
// 
//
//
// 
// Consideraciones :
// Creación  :  Luis Palau Castañeda.  12/septiembre/2001
// Revisiones : 
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// INCLUSION DE ARCHIVOS
      Incluye LibAdminPaq.rpt


// INICIO PARAMETROS
    Parametro pProductoInicial = '(Ninguno)'
      Parametro pProductoFinal = 'z'
    Parametro pEstadoProducto = 0//0 = Todos     1 =  Activos     2 = Inactivos
    Parametro pTipoProducto   = 2//0=Todos  1=Productos 3=Servicios 2=Paquetes
    Parametro pInformacion = '1,4' //
    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']                    


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

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

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

  //caracteristicas
  UsaTabla tCaracteristicas = tEmpresa['mgw10021']
  tCaracteristicas.Usaindice['']

  //EquivalenciasUnidades peso y med
  UsaTabla tEquivaleUnidadesPM = tEmpresa['mgw10027']
  tEquivaleUnidadesPM.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
//***********************************************************************************************
// fMascara()
//    Esta función recibe un campo numérico, que en una representación binaria de siete digitos
//    indica ciertos días de la semana, según el digito que esté prendido, estos pueden ser
//    11111 - serie pedimento lotes  caract umedida
//***********************************************************************************************
Deffunc fMascara(aValor)
  Local lDias,lGuion

  // solo nos interesan los 7 bits mas a la derecha
  
  lGuion = ''    
  lDias = ''
  Si aValor%2 = 1       // Un numero non = bit menos significativo encendido
    lDias = lGuion&'U'
    lGuion = ','
  Finsi
  Si aValor%4 >= 2      // Valor Entre 1y4 = Segundo bit menos significativo encendido
    lDias = lDias & lGuion & 'C'
    lGuion = ','
  Finsi
  Si aValor%8 >= 4      // Valor Entre 8y4 = Tercer bit menos significativo encendido
    lDias = lDias & lGuion & 'S'
    lGuion = ','
  Finsi
  Si aValor%16 >= 8     // Valor Entre 16y8 = Cuarto bit menos significativo encendido
    lDias = lDias & lGuion & 'P'
    lGuion = ','
  Finsi
  Si aValor%32 >= 16
    lDias = lDias & lGuion & 'L'
    lGuion = ','
  Finsi  

  Retorna lDias
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}' & ' Catálogos de Productos, Servicios y Paquetes. Ordenado por Código'
    Sino
      Si pTipoReporte = 2
        Texto '^@TC{0,0,0}@S{16}' & ' Catálogos de Productos, Servicios y Paquetes. Ordenado por Nombre'
      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         Nombre(Producto)                           Comisión Venta    Comisión Cobro Series Pedimentos Lotes
    Columnas 20;2.25,0.15,6.75,0.15,2.85,0.15,2.4,0.15,1.2,0.15,1.8,0.15,0.9,0.15,0
    Texto ''
    Texto C0;'Código'
    Si pTipoProducto = 1//0=Todos  1=Productos 2=Servicios 3=Paquetes
      Texto C2;'Nombre(Producto)'                        
    Sino
      Si pTipoProducto = 2
        Texto C2;'Nombre(Paquete)'                        
      Sino
        Si pTipoProducto = 3
          Texto C2;'Nombre(Servicio)'                         
        Sino
          Texto C2;'Nombre(Prod,Serv,Paq)'                         
        Finsi
      Finsi
    Finsi
    Texto c4;'Comisión Venta' 
    Texto c6;'Comisión Cobro' 
    Texto c8;'Series'
    Texto c10;'Pedimentos'
    Texto c12;'Lotes'
    Imprime   

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


    Si @pos(@col(pInformacion;0);'1') != -1
      //               Unidad Base            Unidad NO Equiv.    Característica 1  Característica 2  Característica 3  
      Columnas 20;2.4,0.15,3.3,0.15,3.15,0.15,2.85,0.15,2.4,0.15,3.15,1.05,0.15,0
      Texto ''
      Texto C0;''
      Texto C2;'Unidad Base'                        
      Texto c4;'Unidad NO Equiv.' 
      Texto c6;'Característica 1' 
      Texto c8;'Característica 2'
      Texto c10;'Característica 3'
      Imprime   

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

    Finsi     
    Si @pos(@col(pInformacion;0);'3') != -1
      //               Impuesto 1    Impuesto 2     Impuesto 3    Retención 1       Retención 2   
      Columnas 20;2.4,0.15,3.3,0.15,3.15,0.15,2.85,0.15,2.4,0.15,3.15,1.05,0.15,0
      Texto ''
      Texto C0;''
      Texto C2;'Impuesto 1'                        
      Texto c4;'Impuesto 2' 
      Texto c6;'Impuesto 3' 
      Texto c8;'Retención 1'
      Texto c10;'Retención 2'
      Imprime   

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



    Finsi     
    Si @pos(@col(pInformacion;0);'2') != -1
      //               Porcentaje de Margen de Utilidad           Método de costeo
      Columnas 20;2.4,0.15,6.6,0.15,7.65,0.15
      Texto ''
      Texto C0;''
      Texto C2;'Porcentaje de Margen de Utilidad'                        
      Texto c4;'Método de Costeo' 
      Imprime   

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


    Finsi     
    Si @pos(@col(pInformacion;0);'4') != -1
      //               desdcripcion detallada
      Columnas 20;2.4,0.15,14.1,0.15
      Texto ''
      Texto C0;''
      Texto C2;'Descripción Detallada'
      Imprime   

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

    Finsi     


  
    NEGRITAS FALSE
    Altura 10
  FinEncab

//PRINCIPAL <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  gRenglon = '' 
 
  si pProductoInicial = ' '
    tProductos.Busca primero
  sino
    tProductos.Busca [@str(pProductoInicial;0) & ':']
  finsi


  Si pTipoReporte = 2
    tProductos.Usaindice['iNombreTipo']
    tProductos.Busca primero
  Finsi




 Mientras tProductos->Encontro
   si pProductoFinal != ' '
     Si tProductos(cCodigoProducto)> @str(pProductoFinal;0)
       tProductos.Saltareg[1]
       Continua
     Finsi 
   finsi
   si pProductoInicial != ' '
     Si tProductos(cCodigoProducto)< @str(pProductoInicial;0)
       tProductos.Saltareg[1]
       Continua
     Finsi 
   finsi
   Si tProductos(cIdProducto)= 0
     tProductos.Saltareg[1]
     Continua
   Finsi

   Si pTipoProducto !=0
     Si tProductos(cTipoProducto) != @col(pTipoProducto;0)
       tProductos.Saltareg[1]
       Continua
     Finsi
   Finsi


   Si pEstadoProducto = 1  //	0 = Todos     1 = Productos Activos     2 = Productos Inactivos
     Si tProductos(cStatusProducto)!= 1
       tProductos.Saltareg[1]
       Continua
     Finsi
   Finsi
   Si pEstadoProducto = 2  //	0 = Todos     1 = Productos Activos     2 = Productos 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


   //Código         Nombre(Producto)                           Comisión Venta    Comisión Cobro Series Pedimentos Lotes
   Columnas 20;2.25,0.15,6.75,0.15,2.85,0.15,2.4,0.15,1.2,0.15,1.8,0.15,0.9,0.15,0
   gRenglon = fMascarilla(tProductos(cCodigoProducto);tParametros(cMascarillaProducto))[c0]
   gRenglon = tProductos(cNombreProducto)[c2]
   gRenglon = '"'& @str(tProductos(cComVentaExcepProducto);2)&' %'[c4]
   gRenglon = '"'& @str(tProductos(cComCobroExcepProducto);2)&' %'[c6]
   Si @pos(fMascara(tProductos(cControlExistencia));'S')!=-1
     gRenglon = 'Sí'[c8]
   Sino
     gRenglon = 'No'[c8]
   Finsi
   Si @pos(fMascara(tProductos(cControlExistencia));'P')!=-1
     gRenglon = 'Sí'[c10]
   Sino
     gRenglon = 'No'[c10]
   Finsi
   Si @pos(fMascara(tProductos(cControlExistencia));'L')!=-1
     gRenglon = 'Sí'[c12]
   Sino
     gRenglon = 'No'[c12]
   Finsi

   imprime gRenglon
   gRenglon = '' 

   Si @pos(@col(pInformacion;0);'1') != -1     
     //               Unidad Base            Unidad NO Equiv.    Característica 1  Característica 2  Característica 3  
     Columnas 20;2.4,0.15,3.3,0.15,3.15,0.15,2.85,0.15,2.4,0.15,3.15,1.05,0.15,0
     tUnidadesPM.busca[@str(tProductos(cidUnidadBase);0)]
     Si tUnidadesPM->encontro
         gRenglon =  tUnidadesPM(cNombreUnidad)&' '& tUnidadesPM(cDespliegue)[c2]
     Finsi
     tUnidadesPM.busca[@str(tProductos(cIdUnidadNoConvertible);0)]
     Si tUnidadesPM->encontro
         gRenglon =  tUnidadesPM(cNombreUnidad)&' '& tUnidadesPM(cDespliegue)[c4]
     Finsi

     tCaracteristicas.busca[@str(tProductos(cIdPadreCaracteristica1);0)]
     Si tCaracteristicas->encontro
         gRenglon =  tCaracteristicas(cNombreCaracteristica)[c6]
     Finsi
     tCaracteristicas.busca[@str(tProductos(cIdPadreCaracteristica2);0)]
     Si tCaracteristicas->encontro
         gRenglon =  tCaracteristicas(cNombreCaracteristica)[c8]
     Finsi
     tCaracteristicas.busca[@str(tProductos(cIdPadreCaracteristica3);0)]
     Si tCaracteristicas->encontro
         gRenglon =  tCaracteristicas(cNombreCaracteristica)[c10]
     Finsi

     imprime gRenglon
     gRenglon = '' 

   Finsi
   Si @pos(@col(pInformacion;0);'3') != -1     
      //               Impuesto 1    Impuesto 2     Impuesto 3    Retención 1       Retención 2   
      Columnas 20;2.4,0.15,3.3,0.15,3.15,0.15,2.85,0.15,2.4,0.15,3.15,1.05,0.15,0
     gRenglon = '"'&@str(tProductos(cImpuesto1);2)[c2]
     gRenglon = '"'&@str(tProductos(cImpuesto2);2)[c4]
     gRenglon = '"'&@str(tProductos(cImpuesto3);2)[c6]
     gRenglon = '"'&@str(tProductos(cRetencion1);2)[c8]
     gRenglon = '"'&@str(tProductos(cRetencion2);2)[c10]

     imprime gRenglon
     gRenglon = '' 
   Finsi
   Si @pos(@col(pInformacion;0);'2') != -1     
     //               Porcentaje de Margen de Utilidad           Método de costeo
     Columnas 20;2.4,0.15,6.6,0.15,7.65,0.15
     gRenglon = '"'&@str(tProductos(cMargenUtilidad);2)[c2]
     Si tProductos(cMetodoCosteo)=1
       gRenglon = 'Costo promedio en base a entradas'[c4]
     Sino
       Si tProductos(cMetodoCosteo)=2
         gRenglon = 'Costo promedio por almacén en base a entradas'[c4]
       Sino
         Si tProductos(cMetodoCosteo)=3
           gRenglon = 'Ultimo costo'[c4]
         Sino
           Si tProductos(cMetodoCosteo)=4 
             gRenglon = 'UEPS'[c4]
           Sino 
             Si tProductos(cMetodoCosteo)=5
               gRenglon = 'PEPS'[c4]
             Sino 
               Si tProductos(cMetodoCosteo)=6
                 gRenglon = 'Costo específico'[c4]
               Sino
                 gRenglon = 'Costo estandar'[c4]
               Finsi
             Finsi
           Finsi
         Finsi
       Finsi
     Finsi
   
     imprime gRenglon
     gRenglon = '' 

   Finsi
   Si @pos(@col(pInformacion;0);'4') != -1     
      //               desdcripcion detallada
      Columnas 20;2.4,0.15,14.1,0.15
      gRenglon = tProductos(cDescripcionProducto)[c2]
      si @col(gRenglon;2) =''
        gRenglon = '(ninguna)'[c2]
      Finsi
      imprime gRenglon
      gRenglon = '' 

   Finsi
   texto ' ' 
   imprime

   tProductos.Saltareg[1]
 FinMientras
