// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// Reporte:             Paquetes y Componentes Ordenado por Código
//                     
//
// Sistema:     ADMINPAQ  Versión v1.0 Windows
//
// Descripcion: Este reporte debe imprimir los componentes que conforman los paquetes, La columna 
//   Nivel debe desplegar el nivel del componente, es útil cuando el páquete está formado por 
//   otros paquetes, dado que se imprimen los componentes de estos paquetes.
// 
// Consideraciones :
// Creación  :  Félix      18/09/2001
// Modificación: 
// Revisiones : Fernando   09/07/2002  Los decimales se toman de la tabla de parametros
// HVA 25/09/2002  Incluir 2 columnas una para el costo y otra para el precio (1)
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// INCLUSION DE ARCHIVOS
      Incluye LibAdminPaq.rpt
      Incluye LibInventarios.rpt //hva


// INICIO PARAMETROS
    Parametro pProductoInicial = ' '
    Parametro pProductoFinal =   ' '
    Parametro pEstadoProducto =   0 // 0 = Todos     1 =  Activos     2 = Inactivos

    Parametro pIdClase1   = 0       // por omisión deben recibir 0 =  ninguna
    Parametro pIdClase2   = 0
    Parametro pIdClase3   = 0
    Parametro pIdClase4   = 0       // deben ser los ID´s de los valores de las clases seleccionadas
    Parametro pIdClase5   = 0       // para cada tipo de clasificación.
    Parametro pIdClase6   = 0       // por omisión deben recibir 0 =  ninguna

    Parametro pOrden      = 1       // 1 = Ordenado por Código
                                    // 2 = Ordenado por Nombre


// INICIO APERTURA TABLAS

  UsaEmpresa tEmpresa;'AdminpaqW'

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

  //Productos  
  UsaTabla tProductos = tEmpresa['Mgw10005'] Alias 'tProd1'
  tProductos.Usaindice['iCodigoTipo'] 

  UsaTabla tProductosXID = tEmpresa['Mgw10005'] Alias 'tProd2'
  tProductosXID.UsaIndice[''] 

  //Componentes
  UsaTabla tComponentes = tEmpresa['mgw10015']
  tComponentes.Usaindice['iPaqProdValoresCarac']

  //caracteristicas
  UsaTabla tValorCaracteristicas = tEmpresa['mgw10022']
  tValorCaracteristicas.Usaindice['']

  UsaTabla tUnidades = tEmpresa['Mgw10026']
  tUnidades.UsaIndice['']

  UsaTabla tValoresDeClasif = tEmpresa['mgw10020']
  tValoresDeClasif.UsaIndice['']

  UsaTabla tPeriodos = tEmpresa['mgw10031']            // Usa el indice primario, cIDEjercicio
  tPeriodos.UsaIndice['cNumeroEjercicio']

  UsaTabla tCostoHistorico = tEmpresa['MGW10017']   // Costo histórico hva
  tCostoHistorico.Usaindice['iProdAlmacenFecha']    // cIdProducto+cIdAlmacen+cFechaCostoH+cTipoCosto hva

  UsaTabla tTipoCambio = tEmpresa['MGW10035']       // Tipo de cambio hva


  tParametros.Busca Primero   
//DEFINICION DE COLUMNAS 
//             C0      C2       C4     C6        C8       C10       C12       C14
//  Columnas 16;1.2,0.15,2.1,0.15,6,0.15,1.35,0.15,0.9,0.15,1.35,0.15,1.35,0.15,1.35,0.15
  Columnas 20;1.2,0.15,2.1,0.15,5.1,0.15,1.35,0.15,0.9,0.15,1.35,0.15,1.35,0.15,1.35,0.15, 2.4,0.15, 2.4,0.15 // hva

  UsaLetra 'Arial'
  Altura 9 

  gDecimales = tParametros(cDecimalesUnidades)

  [C6].Decimales gDecimales
  [C8,C10,C12,C14].Decimales 0


//VARIABLES GLOBALES 

  gHoy = fFormateaFecha(@Hoy();0)


// FUNCIONES 
// ==========================================================================================
// fDiscrimina     Verifica las diferentes razones para descartar un producto, 
// salida :  1 = El Producto debe ser descartado
//           0 = El Producto NO debe ser descartado
// ==========================================================================================
Deffunc fDiscrimina(atProducto:TABLA)
    Local lRegresa

  lRegresa = 0

  // si se trata del Producto (Ninguno)
  Si atProducto(cIdProducto) = 0  
    lRegresa = 1
  Finsi

  // Si no se trata de un paquete
  Si atProducto(cTipoProducto) != 2
    lRegresa = 1
  Finsi

  // Si el estado del producto no checa con el pedido como parametro
  Si (pEstadoProducto != 0) Y (atProducto(cStatusProducto) != pEstadoProducto%2)
    lRegresa = 1
  Finsi

  // Se Revisan las CLASIFICACIONES, solo en el caso de haber seleccionado al menos una 
  Si gNumDeClases > 0
    Si !fMiembroDeUnaClase(atProducto;gNumDeClases;gListIdDeClases;2)
     // Sa salta el Producto actual, por no pertenecer a las clasificaciones
      lRegresa = 1
    Finsi
  Finsi

  Retorna lRegresa

FinFunc

// ==========================================================================================
// fImprimePaquete
// ==========================================================================================
Deffunc fImprimePaquete(atProducto:TABLA; atComponente:TABLA; aNivel;atProductoxID:TABLA)
//Deffunc fImprimePaquete(atProducto:TABLA; atComponente:TABLA; aNivel)
  Local lRenglon

  lRenglon = ''

   //Nivel    Código         Nombre(Producto/Paquete)                 Cantidad  Unidad Caract. 1 Caract. 2 Caract. 3   
  lRenglon[0] = aNivel = 0? @Str(aNivel;0) : '  '& aNivel
  Si pOrden = 1
    lRenglon[2] = fMascarilla(atProducto(cCodigoProducto);tParametros(cMascarillaProducto))
    lRenglon[4] = aNIvel = 0? atProducto(cNombreProducto):'  ' & atProducto(cNombreProducto)
  Sino
    // Se cambia el contenido de las columnas 2 y 4
    lRenglon[4] = fMascarilla(atProducto(cCodigoProducto);tParametros(cMascarillaProducto))
    lRenglon[2] = aNIvel = 0? atProducto(cNombreProducto):'  ' & atProducto(cNombreProducto)
  Finsi

  // Se verifica si se definió peso y medidas asociados.
  Si atProducto(cControlExistencia) = 1
    tUnidades.busca[@str(atProducto(cidUnidadBase);0)]
    Si tUnidades->encontro
      lRenglon[8] = tUnidades(cDespliegue)
    Finsi
  Finsi  

  Si aNivel > 0
    lRenglon[6] = atComponente(cCantidadProducto)
  Finsi

  // Se verifica si se definió caracteristicas asociadas
  Si atProducto(cControlExistencia) = 2 O atProducto(cControlExistencia) = 3

    tValorCaracteristicas.busca[@str(atComponente(cIdValorCaracteristica1);0)]
    Si tValorCaracteristicas->Encontro
      lRenglon[10] = tValorCaracteristicas(cValorCaracteristica)
    Finsi

    tValorCaracteristicas.busca[@str(atComponente(cIdValorCaracteristica2);0)]
    Si tValorCaracteristicas->Encontro
      lRenglon[12] = tValorCaracteristicas(cValorCaracteristica)
    Finsi

    tValorCaracteristicas.busca[@str(atComponente(cIdValorCaracteristica3);0)]
    Si tValorCaracteristicas->Encontro
      lRenglon[14] = tValorCaracteristicas(cValorCaracteristica)
    Finsi

  Finsi


  Si aNivel =0
    Negritas True  
  Sino
    lFecha = @Hoy()
    lCosto = fCostoHistorico(atProducto(cIdProducto); 0; lFecha; atProducto(cMetodoCosteo); tCostoHistorico; tTipoCambio; 1)
    lRenglon[16] = lCosto
  Finsi
  lRenglon[18] = atProducto(cPrecio1)

  Imprime lRenglon 
  Negritas False

  Mientras [atComponente.Busca[@Str(atProducto(cIDProducto);0)];atComponente->Encontro;atComponente.Busca Siguiente[1]]  

    atProductoxID.Busca[@Str(atComponente(cIDProducto);0)]
    Si atProductoxID->Encontro
      fImprimePaquete(atProductoxID; atComponente; aNivel+1;atProductoxID)
    Finsi
  
  FinMientras
    
FinFunc

 
 //////////////////////////////////////////////////////////////////////////////////
//ENCABEZADO 
Encab

  Texto '@TC{0,0,0}@S{8}AdminPAQ' 
 	Hoja '"@TC{0,0,0}@S{8}Hoja: ' 
  Imprime 
  Texto '"@TC{0,0,0}@S{8}Fecha: ' & gHoy
  Imprime
  Texto '^@TC{0,0,0}@S{22}' & tEmpresa->Nombre
  Imprime
  Texto '^@TC{0,0,0}@S{16}' & ' Paquetes y Componentes Ordenado por '& (pOrden=1?'Código':'Nombre')

  Texto '"@TC{0,0,0}@S{8}Hora: ' & @Hora()
  Imprime

  // ===== Se Revisan las clasificaciones, para recuperarlas e imprimirlas en el encabezado
  fRevisaClases(tValoresDeClasif)
  // ===== Fin de la revision de clasificaciones

  NEGRITAS TRUE
    Si pOrden  = 2 // si el orden es por nombre, intercambia columnas 2 y 4
             //      C0      C2     C4       C6        C8       C10       C12       C14
        Columnas 16;1.2,0.15,6,0.15,2.1,0.15,1.35,0.15,0.9,0.15,1.35,0.15,1.35,0.15,1.35
    Finsi

    Altura 9
    Texto '@TC{0,0,0}@L{-1}'
    Imprime 
    //Nivel    Código         Nombre(Producto/Paquete)                 Cantidad  Unidad Caract. 1 Caract. 2 Caract. 3   
   Texto ''
   Texto C0;'Nivel'
   Texto C2; pOrden = 1? 'Código' : 'Nombre(Producto/Paquete)'
   Texto C4; pOrden = 1? 'Nombre(Producto/Paquete)' : 'Código'
   Texto c6;'Cantidad' 
   Texto c8;'Unidad' 
   Texto c10;'Caract.1'
   Texto c12;'Caract.2'
   Texto c14;'Caract.3'
   Texto c16;'        Costo'  // hva
   Texto c18;'    Precio 1'  // hva
   Imprime   
   Texto ''
   Texto '@TC{0,0,0}@L{-1}'
   Imprime 
  NEGRITAS FALSE
  Altura 9

FinEncab

//PRINCIPAL <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

  // Esta función se debe ejecutar antes del cuerpo del reporte, para inicializar algunas valores
  // Globales para la biblioteca LibAdminPAQ.rpt
  fIniFechasHistoria(tPeriodos)

  // Si el orden es por nombre, lo cambia,
  Si pOrden = 2
    tProductos.UsaIndice['iNombreTipo']
  Finsi

  Si pProductoInicial = ' '
    tProductos.Busca Primero
    pProductoInicial = pOrden = 1? tProductos(cCodigoProducto) : tProductos(cNombreProducto)
  Finsi
  
  Si pProductoFinal = ' '
    tProductos.Busca Ultimo
    pProductoFinal   = pOrden = 1? tProductos(cCodigoProducto) : tProductos(cNombreProducto)
  Finsi

tParametros.Busca Primero   

Mientras [tProductos.Busca[pProductoInicial &'..'& pProductoFinal];tProductos->Encontro;tProductos.Busca Siguiente[1]]

  Si fDiscrimina(tProductos) = 1
    Continua
  Finsi
    
  fImprimePaquete(tProductos;tComponentes;0;tProductosXID)

  Saltalin 1  

FinMientras




