 // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//	PedimentosLotes.rpt
//	Nombre del reporte en el sistema: Pedimentos y Lotes
//
//  Sistema: AdminPAQ v1.1
// 
//	Este reporte perteneciente al módulo de inventarios, despliega los 
//  movimientos de entrada y salida de pedimentos y lotes de productos.
//
//	Consideraciones especiales:
//  Este reporte aunque está programado como uno solo, representa en realidad
//  dos reportes en el ámbito del sistema:
//    Pedimentos
//    Lotes
//  
//	Elaboró:    Eduardo Pérez Figueroa
//	Fecha: 	    13 de Septiembre del 2001
//
//	>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Historia de modificaciones
//  Fecha      Nombre   IDLotus                     Descripcion
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// 15/05/2002  MOFM     S.C. 41         Se agregó el manejo de características en productos con
//                                      capas. Se agregaron las tablas  tValoresCaracteristica
//                                      y tProductoDetalle
//                                      Se agrega que el reporte despliegue algún lote o pedi-
//                                      mento en especial  
// 06/06/2002  DRdA     N.C.0134        Para series huerfana no aparecía el pedimento o lote y
//                                      ni siquiera un menaseje al usuario para indicarle que
//                                      hacer.
//                                      Se modificó:
//                                      - fImprimeLoteSerie
//                                      - fImprimePedimentoSerie
// 28/07/2003   CILA    N.D.2335        Se cambio el numero de decimales de 2 a 4
//                                      para la columna de tipo de cambio.
//                                      - fImprimePedimento,
//                                      - fImprimePedimentoSerie.
// 16/03/2011   ALRH    N.D.6846        ERROR MODIFICAR EL NOMBRE DE AGENCIA ADUANAL POR ADUANA 
//                                      EN LA VENTANA DE CAPTURA DE PEDIMENTOS PARA QUE SEA IGUAL 
//                                      A LA EMISION DE COMPROBANTES FISCALES DIGITALES YA QUE CAUSA 
//                                      CONFUSION AL MOMENTO DE CAPTURAR LA INFORMACION DE LOS PRODUCTOS 
//                                      DEBE COINCIDIR CON LOS DATOS QUE MENCIONA EL ANEXO 20.
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

// *****************************************************************************
// Funciones de librería

Incluye LibAdminPAQ.Rpt
Incluye LibInventarios.Rpt


// *****************************************************************************
//	Parámetros del reporte:

Parametro pFechaInicial = '20020101'    // Fecha inicial del rango
Parametro pFechaFinal = '20021231'      // Fecha final del rango
Parametro pProductoInicial = ' '        // Código del producto inicial del rango (' ' = Todos)
Parametro pProductoFinal = ' '          // Código del producto final del rango (' ' = Todos)
Parametro pImprimirProductos = 0        // Productos a imprimir:
                                        // 0 = Todos
                                        // 1 = Solo productos con movimientos 
Parametro pEstadoProducto = 0           // Incluir productos con estado:
                                        // 0 = Todos
                                        // 1 = Activos
                                        // 2 = Inactivos
Parametro pSeleccionLotePedimento = 0   // 0 = Todos
                                        // 1 = Seleccionar Pedimento
Parametro pPedimentoLote = ''           // Campo capturado con el lote o pedimento
Parametro pIdClase1 = 0                 // Clasificaciones del produto (0 = Ninguna)
Parametro pIdClase2 = 0                 // Estos seis parámetros corresponden a las seis clasificaciones
Parametro pIdClase3 = 0                 // del producto, y pueden contener una lista de IDs
Parametro pIdClase4 = 0                 // de clasificaciones separados por coma.
Parametro pIdClase5 = 0               
Parametro pIdClase6 = 0               
Parametro pTipoReporte = 0              // Tipo de Reporte (este parámetro es interno a AdminPAQ)
                                        // 0 = Pedimentos
                                        // 1 = Lotes

// *****************************************************************************
//	Tablas a utilizar e Indices de búsqueda por omisión

UsaEmpresa tEmpresa;'ADMINPAQW'                   // Parámetros

UsaTabla tProducto = tEmpresa['MGW10005']         // Productos
tProducto.Usaindice['iCodigoTipo']                // cCodigoProducto+cTipoProducto

UsaTabla tDocumento = tEmpresa['MGW10008']        // Documentos
tDocumento.Usaindice['']                          // Indice primario: cIdDocumento

UsaTabla tMovimiento = tEmpresa['MGW10010'] Alias 'Movto'      // Movimientos
tMovimiento.Usaindice['']                         // Indice primario: cIdMovimiento

UsaTabla tMovtoOwner = tEmpresa['MGW10010'] Alias 'MovtoOwner'  // Movimientos
tMovtoOwner.Usaindice['']                         // Indice primario: cIdMovimiento

UsaTabla tAlmacen = tEmpresa['MGW10003']          // Almacenes
tAlmacen.Usaindice['']                            // Indice primario: cIdAlmacen

UsaTabla tConcepto = tEmpresa['MGW10006']         // Conceptos de documentos
tConcepto.Usaindice['']                           // Indice primario: cIdConceptoDocumento

UsaTabla tCapa = tEmpresa['MGW10025']             // Capas
tCapa.Usaindice['']                               // Indice primario: cIdCapa

UsaTabla tMovimientoCapa = tEmpresa['MGW10028']   // Movimientos de capas
tMovimientoCapa.Usaindice['iCapaFecha']           // cIdCapa+cFecha

UsaTabla tSerie = tEmpresa['MGW10032']            // Series
tSerie.Usaindice['iProdAlmacenSerie']             // cIdProducto+cIdAlmacen+cNumeroSerie

UsaTabla tMovimientoSerie = tEmpresa['MGW10036']  // Movimientos de series
tMovimientoSerie.Usaindice['iSerieFecha']         // cIdSerie+cFecha

UsaTabla tMoneda = tEmpresa['MGW10034']           // Monedas
tMoneda.Usaindice['']                             // Indice primario: cIdMoneda

UsaTabla tValoresDeClasif = tEmpresa['MGW10020']
tValoresDeClasif.UsaIndice['']                    // Indice primario: cIdValorClasificacion

UsaTabla tParametros = tEmpresa['MGW10000']       // Parámetros de la empresa
tParametros.Usaindice['']                         // Indice primario: cIdEmpresa

UsaTabla tProductoDetalle = tEmpresa['MGW10004']       // Producto Detalles
tProductoDetalle.Usaindice['iProdPadreValoresCarac']   // cIdProductoPadre+cIdValorCaracteristica1+cIdValorCaracteristica2+cIdValorCaracteristica3

UsaTabla tValoresCaracteristica = tEmpresa['MGW10022']       // Valores de característica
tValoresCaracteristica.Usaindice['']                         // Indice primario: cIdValorCaracteristica

UsaTabla tUnidadesPM = tEmpresa['MGW10026']        // Valores de característica
tUnidadesPM.Usaindice['']                          // Indice primario:cIdUnidad

// *****************************************************************************
// Definiciones y asumidos globales para el reporte

// Ancho de columnas = caracteres / 17 * 2.54
// Se consideran columnas intermedias de un espacio
// C0 (Fecha) = 11 caracteres
// C2 (Serie) = 5 caracteres
// C4 (Folio) = 8 caracteres
// C6 (Concepto) = 15 caracteres
// C8 (Almacén) = 3 caracteres
// C10 (Cantidad) = 14 caracteres
// C12 (Fecha) = 11 caracteres
// C14 (Serie) = 5 caracteres
// C16 (Folio) = 8 caracteres
// C18 (Concepto) = 15 caracteres
// C20 (Almacén) = 3 caracteres
// C22 (Cantidad) = 14 caracteres
Columnas 24;1.64,0.15,0.75,0.15,1.20,0.15,2.24,0.15,0.45,0.15,1.79,0.75,1.64,0.15,0.75,0.15,1.20,0.15,2.24,0.15,0.45,0.15,1.79,0.45


Usaletra 'Arial'
Altura 9


// *****************************************************************************
//	Variables de ámbito global:

gIdioma = 0               // Idioma del reporte
                          // 0 = Español
                          // 1 = Inglés
gDecimalesUnidades = 2    // Número de decimales para existencias
gDecimalesMoneda = 2      // Número de decimales para la moneda
gAlMenosUno = 0           // Se desplegó al menos un producto
gMascarillaProducto = ''  // Mascarilla para el código del producto


// *****************************************************************************
//  fConfiguraDecimales
//
//	Configura el número de decimales de las columnas de importes, basado en
//  en los parámetros de la empresa.
//
//  Parámetros 
//
//  Salidas 
// *****************************************************************************
DefFunc fConfiguraDecimales()

  // Busca el registro de la empresa
  tParametros.Busca Primero
  Si tParametros->Encontro // Si lo encontró
    gDecimalesUnidades = tParametros(cDecimalesUnidades)
    gMascarillaProducto = tParametros(cMascarillaProducto) // mascarilla para el código del producto
  Sino // Si no encontró el registro de la empresa
    gDecimalesUnidades = 2
  FinSi
  [C10,C22].Decimales gDecimalesUnidades

  // Busca el registro de la moneda base del sistema
  tMoneda.Busca['1']
  Si tMoneda->Encontro
    gDecimalesMoneda = tMoneda(cDecimalesMoneda)
  Sino // Si no encontró el registro de la moneda
    gDecimalesMoneda = 2
  FinSi  
FinFunc


// *****************************************************************************
//  fGuardaMovimiento
//
//	Esta función almacena en el buffer de impresión, los datos del
//  movimiento para ser impresos por pares.
//
//  Parámetros 
//
//  Salidas 
// *****************************************************************************
DefFunc fGuardaMovimiento(atMovimiento: Tabla; aCantidad; aImprime)
Local lFechaEditada, lIdDocumento

  // Si el movimiento es de entrada
  Si atMovimiento(cAfectaExistencia) = 1
    // Fecha del movimiento
    lFechaEditada = fFormateaFecha(atMovimiento(cFecha); gIdioma)
    aImprime = @Col(lFechaEditada;0)[C0]

    // lee el documento del movimiento
    Si atMovimiento(cIdDocumento)
      tDocumento.Busca[@Str(atMovimiento(cIdDocumento);0)]
    Sino // es un movimiento oculto
      // Busca el ID del documento en el movimiento owner
      lIdDocumento = fIdDocumentoMovtoOwner(atMovimiento; tMovtoOwner) 
      tDocumento.Busca[@Str(lIdDocumento;0)]
    FinSi
    Si tDocumento->Encontro
      // Serie
      aImprime = tDocumento(cSerieDocumento)[C2]
      // Folio
      aImprime = tDocumento(cFolio)[C4]
      // lee el concepto del documento
      tConcepto.Busca[@Str(tDocumento(cIdConceptoDocumento);0)]
      Si tConcepto->Encontro
        aImprime = tConcepto(cNombreConcepto)[C6]
      FinSi
    FinSi

    // Almacén  
    tAlmacen.Busca[@Str(atMovimiento(cIdAlmacen);0)]
    Si tAlmacen->Encontro
      aImprime = tAlmacen(cCodigoAlmacen)[C8]
    FinSi

    // Unidades del movimiento
    aImprime = @Col(aCantidad;0)[C10]
  Sino // Movimiento de salida
    // Fecha del movimiento
    lFechaEditada = fFormateaFecha(atMovimiento(cFecha); gIdioma)
    aImprime = @Col(lFechaEditada;0)[C12]

    // lee el documento del movimiento
    Si atMovimiento(cIdDocumento)
      tDocumento.Busca[@Str(atMovimiento(cIdDocumento);0)]
    Sino // es un movimiento oculto
      // Busca el ID del documento en el movimiento owner
      lIdDocumento = fIdDocumentoMovtoOwner(atMovimiento; tMovtoOwner) 
      tDocumento.Busca[@Str(lIdDocumento;0)]
    FinSi
    Si tDocumento->Encontro
      // Serie
      aImprime = tDocumento(cSerieDocumento)[C14]
      // Folio
      aImprime = tDocumento(cFolio)[C16]
      // lee el concepto del documento
      tConcepto.Busca[@Str(tDocumento(cIdConceptoDocumento);0)]
      Si tConcepto->Encontro
        aImprime = tConcepto(cNombreConcepto)[C18]
      FinSi
    FinSi

    // Almacén  
    tAlmacen.Busca[@Str(atMovimiento(cIdAlmacen);0)]
    Si tAlmacen->Encontro
      aImprime = tAlmacen(cCodigoAlmacen)[C20]
    FinSi

    // Unidades del movimiento
    aImprime = @Col(aCantidad;0)[C22]
  FinSi
FinFunc


// *****************************************************************************
//  fImprimeDatosProducto
//
//	Esta función imprime los datos del producto (código, nombre)
//
//  Parámetros 
//
//  Salidas
// *****************************************************************************
DefFunc fImprimeDatosProducto(atProducto: Tabla)
Local vImprime, lCodigoEditado
  lUnidad =''

  // Redefine el ancho de las columnas
  // C0 17 caracteres
  // C2 50 caracteres
  Columnas 24; 2.54,0.15,7.47,0

  vImprime = ' '[C0..C23]

  NEGRITAS TRUE

  vImprime = 'Producto: '[C0]
  // Falta editar el código del producto
  lCodigoEditado = fMascarilla(atProducto(cCodigoProducto); gMascarillaProducto)
  vImprime = @Col(lCodigoEditado;0)[C2]
  Lista vImprime
  
  vImprime = 'Nombre: '[C0]
  vImprime = atProducto(cNombreProducto)[C2]
  Lista vImprime
	
	Si atProducto(CCONTROL01) = 9 O atProducto(CCONTROL01) = 17 O atProducto(CCONTROL01) = 21
  tUnidadesPM.busca[@str(atProducto(CIDUNIDA01);0)]
		Si tUnidadesPM->encontro
			lUnidad =tUnidadesPM(cDespliegue)[c2]	
			vImprime = 'Unidad Base: '[C0]
			vImprime = lUnidad[C2]
			Lista vImprime
		Finsi
  Finsi
	
  SaltaLin

  NEGRITAS FALSE

  // Regresa las columnas a su ancho original    
  Columnas 24;1.64,0.15,0.75,0.15,1.20,0.15,2.24,0.15,0.45,0.15,1.79,0.75,1.64,0.15,0.75,0.15,1.20,0.15,2.24,0.15,0.45,0.15,1.79,0.45

FinFunc


// *****************************************************************************
//  fImprimeLote
//
//	Esta función imprime los datos del lote.
//
//  Parámetros 
//
//  Salidas 
// *****************************************************************************
DefFunc fImprimeLote(atCapa: Tabla)
Local vImprime, lFechaEditada

  // Redefine las columnas del reporte
  Columnas 24;2.54,0.15,2.54,1.64,2.54,0.15,1.64,0

  vImprime = ' '[C0..C23]

  // Número de lote
  vImprime = 'Número de lote:'[C0]
  vImprime = atCapa(cNumeroLote)[C2]
  // Fecha de caducidad
  vImprime = 'Caducidad:'[C4]
  lFechaEditada = fFormateaFecha(atCapa(cFechaCaducidad); gIdioma)
  vImprime = @Col(lFechaEditada;0)[C6]

  Lista vImprime
  vImprime = ' '[C0..C23]

  // Existencia
  [C2].Coma
  [C2].Decimales gDecimalesUnidades
  [C2].Blanco
  vImprime = 'Disponible:'[C0]
  vImprime = atCapa(cExistencia)[C2]
  // Fecha de fabricación
  vImprime = 'Fabricación:'[C4]
  lFechaEditada = fFormateaFecha(atCapa(cFechaFabricacion); gIdioma)
  vImprime = @Col(lFechaEditada;0)[C6]

  Lista vImprime
  Saltalin

  // Regresa las columnas a su definición original
  
  Columnas 24;1.64,0.15,0.75,0.15,1.20,0.15,2.24,0.15,0.45,0.15,1.79,0.75,1.64,0.15,0.75,0.15,1.20,0.15,2.24,0.15,0.45,0.15,1.79,0.45

  [C2,C4,C14,C16].Decimales 0
  [C2,C4,C14,C16].Blanco ''
FinFunc

// *****************************************************************************
//  fImprimeCaracteristica
//
//	 Esta función imprime las características y valores de características del producto
//
//  Parámetros IdValorCaracterística1, IdValorCaracterística2 y IdValorCaracteristica3
// *****************************************************************************
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Historia de modificaciones
//  Fecha      Nombre   IDLotus                     Descripcion
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// 15/05/2002  MOFM     SC 41          Implementación inicial
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
DefFunc fImprimeCaracteristica(aIdValorCaracteristica1; aIdValorCaracteristica2; aIdValorCaracteristica3)
Local vValorCaracteristica1, vValorCaracteristica2, vValorCaracteristica3 

  Si aIdValorCaracteristica1 > 0 
    // Se busca el valor de característica 1  
    tValoresCaracteristica.Busca[@Str(aIdValorCaracteristica1;0)]
    Si tValoresCaracteristica->Encontro
      // Se obtiene el valor de característica con una logitud de 20 caracteres, 
      // eliminando los espacio de la derecha
      vValorCaracteristica1 = @SubStr(tValoresCaracteristica(cValorCaracteristica);0;20) 
      vValorCaracteristica1 = @TRIM(2;vValorCaracteristica1) 
    Finsi
  Sino
    vValorCaracteristica1 = ''    
  Finsi  

  Si aIdValorCaracteristica2 > 0 
    // Se busca el valor de característica 1  
    tValoresCaracteristica.Busca[@Str(aIdValorCaracteristica2;0)]
    Si tValoresCaracteristica->Encontro
      // Se obtiene el valor de característica con una logitud de 20 caracteres, 
      // eliminando los espacio de la derecha
      vValorCaracteristica2 = @SubStr(tValoresCaracteristica(cValorCaracteristica);0;20) 
      vValorCaracteristica2 = @TRIM(2;vValorCaracteristica2) 
    Finsi
  Sino
    vValorCaracteristica2 = ''    
  Finsi  

  Si aIdValorCaracteristica3 > 0 
    // Se busca el valor de característica 1  
    tValoresCaracteristica.Busca[@Str(aIdValorCaracteristica3;0)]
    Si tValoresCaracteristica->Encontro
      // Se obtiene el valor de característica con una logitud de 20 caracteres, 
      // eliminando los espacio de la derecha
      vValorCaracteristica3 = @SubStr(tValoresCaracteristica(cValorCaracteristica);0;20) 
      vValorCaracteristica3 = @TRIM(2;vValorCaracteristica3) 
    Finsi
  Sino
    vValorCaracteristica3 = ''    
  Finsi  
   
  Si aIdValorCaracteristica1 > 0 y aIdValorCaracteristica2 > 0 y aIdValorCaracteristica3 > 0
    Texto vValorCaracteristica1 & '-' & vValorCaracteristica2 & '-' & vValorCaracteristica3
    Imprime vTexto 
  Sino 
     Si aIdValorCaracteristica1 > 0 y aIdValorCaracteristica2 >0 y aIdValorCaracteristica3 = 0
       Texto vValorCaracteristica1 & '-' & vValorCaracteristica2
       Imprime vTexto 
     Sino
       Si aIdValorCaracteristica1 > 0 y aIdValorCaracteristica = 0 y aIdValorCaracteristica3 = 0
         Texto vValorCaracteristica1
         Imprime vTexto 
       Finsi      
     Finsi
   Finsi 

FinFunc

// *****************************************************************************
//  fImprimeLoteSerie
//
//	Esta función imprime los datos del lote cuando el producto se procesa
//  por la tabla de series.
//
//  Parámetros 
//
//  Salidas 
//
// 06/06/2002  N.C.0134 Se cambio el bloque de código 'N.C.0134'. (DRdA)
// *****************************************************************************
DefFunc fImprimeLoteSerie(atSerie: Tabla)
Local vImprime, lFechaEditada

  // Redefine las columnas del reporte
  Columnas 24;2.54,0.15,2.54,1.64,2.54,0.15,1.64,0

  vImprime = ' '[C0..C23]

  // Inicia N.C.0134
  // Para una serie huerfana se imprime el texto sugerido al usuario
  //lepc
  Si atSerie(cEstado)= 4 o atSerie(cEstado)= 5 o atSerie(cEstado)= 9 o atSerie(cEstado)= 10
    Texto 'Es necesario dar entrada a la serie huérfana ' & atSerie(cNumeroSerie) & ' para asignarle el lote'
    Imprime
  Sino
    // Número de lote
    vImprime = 'Número de lote:'[C0]
    vImprime = atSerie(cNumeroLote)[C2]
    // Fecha de caducidad
    vImprime = 'Caducidad:'[C4]
    lFechaEditada = fFormateaFecha(atSerie(cFechaCaducidad); gIdioma)
    vImprime = @Col(lFechaEditada;0)[C6]
    Lista vImprime
  Finsi
  // Termina N.C.0134

  vImprime = ' '[C0..C23]

  // Existencia
  [C2].Coma
  [C2].Decimales gDecimalesUnidades
  [C2].Blanco
  vImprime = 'Disponible:'[C0]
  // Si la serie está disponible o consignada del proveedor, la existencia es uno
  Si atSerie(cEstado) = 1 o atSerie(cEstado) = 2
    vImprime = 1.0[C2]
  Sino // de otra forma la existencia es cero
    vImprime = 0.0[C2]
  FinSi  
  // Fecha de fabricación
  vImprime = 'Fabricación:'[C4]
  lFechaEditada = fFormateaFecha(atSerie(cFechaFabricacion); gIdioma)
  vImprime = @Col(lFechaEditada;0)[C6]

  Lista vImprime
  Saltalin

  // Regresa las columnas a su definición original
  Columnas 24;1.64,0.15,0.75,0.15,1.20,0.15,2.24,0.15,0.45,0.15,1.79,0.75,1.64,0.15,0.75,0.15,1.20,0.15,2.24,0.15,0.45,0.15,1.79,0.45
  [C2,C4,C14,C16].Decimales 0
  [C2,C4,C14,C16].Blanco ''
FinFunc


// *****************************************************************************
//  fImprimeMovimiento
//
//	Esta función imprime los datos del movimiento.
//
//  Parámetros 
//
//  Salidas
// *****************************************************************************
DefFunc fImprimeMovimiento(atMovimiento: Tabla; aCantidad; aImprime)
local lUnidad

  //buscamos las unidades
  lUnidad =''[c0]
	/*
  Si atMovimiento(cIdUnidad)>0
    tUnidadesPM.busca[@str(atMovimiento(cIdUnidad);0)]
    Si tUnidadesPM->encontro
      lUnidad =tUnidadesPM(cDespliegue)[c0]
    Finsi
  Finsi
	*/
  // Si el movimiento es de entrada
  Si atMovimiento(cAfectaExistencia) = 1
    aImprime[11] = @col(lUnidad;0)
    // Si los datos de entrada están llenos, imprime el renglón y limpia el buffer
    Si @Col(aImprime;0) != ' ' 
      Lista aImprime
      aImprime = ' '[C0..C23]
    FinSi
  Sino // El movimiento es de salida    
    aImprime[23] = @col(lUnidad;0)
    // Si los datos de salida están llenos, imprime el renglón y limpia el buffer
    Si @Col(aImprime;12) != ' ' 
      Lista aImprime
      aImprime = ' '[C0..C23]
    FinSi
  FinSi  
  fGuardaMovimiento(atMovimiento; aCantidad; &aImprime)
FinFunc


// *****************************************************************************
//  fImprimePedimento
//
//	Esta función imprime los datos del pedimento.
//
//  Parámetros 
//
//  Salidas 
// *****************************************************************************
DefFunc fImprimePedimento(atCapa: Tabla)
Local vImprime, lFechaEditada

  // Redefine las columnas del reporte
  Columnas 24;2.54,0.15,2.54,1.64,2.54,0.15,1.64,0

  vImprime = ' '[C0..C23]


    // Número de pedimento
    vImprime = 'Pedimento:'[C0]
    vImprime = atCapa(cPedimento)[C2]
    // Fecha de pedimento
    vImprime = 'Fecha pedimento:'[C4]
  
    lFechaEditada = fFormateaFecha(atCapa(cFechaPedimento); gIdioma)
    vImprime = @Col(lFechaEditada;0)[C6]


  Lista vImprime
  vImprime = ' '[C0..C23]

  // Agencia aduanal
  // N.D.6846 ALRH
  vImprime = 'Aduana:'[C0]
  vImprime = atCapa(cAduana)[C2]
  // Tipo de cambio
  [C6].Coma
  // N.D.2335 Inicio --------------------------
  //[C6].Decimales gDecimalesMoneda
  [C6].Decimales 4
  // N.D.2335 Fin -----------------------------
  vImprime = 'Tipo de cambio:'[C4]
  vImprime = atCapa(cTipoCambio)[C6]

  Lista vImprime
  vImprime = ' '[C0..C23]

  // Existencia
  [C6].Coma
  [C6].Decimales gDecimalesUnidades
  vImprime = 'Disponible:'[C4]
  vImprime = atCapa(cExistencia)[C6]

  Lista vImprime
  Saltalin

  // Regresa las columnas a su definición original
  Columnas 24;1.64,0.15,0.75,0.15,1.20,0.15,2.24,0.15,0.45,0.15,1.79,0.75,1.64,0.15,0.75,0.15,1.20,0.15,2.24,0.15,0.45,0.15,1.79,0.45
  [C2,C4,C14,C16].Decimales 0
  [C2,C4,C14,C16].Blanco ''
FinFunc


// *****************************************************************************
//  fImprimePedimentoSerie
//
//	Esta función imprime los datos del pedimento cuando el producto se procesa
//  por la tabla de series.
//
//  Parámetros 
//
//  Salidas 
//
// 06/06/2002  N.C.0134 Se cambio el bloque de código 'N.C.0134'. (DRdA)
// *****************************************************************************
DefFunc fImprimePedimentoSerie(atSerie: Tabla)
Local vImprime, lFechaEditada

  // Redefine las columnas del reporte
  Columnas 24;2.54,0.15,2.54,1.64,2.54,0.15,1.64,0

  vImprime = ' '[C0..C23]

  // Inicia N.C.0134
  // Para una serie huerfana se imprime el texto sugerido al usuario
  //lepc
  Si atSerie(cEstado)= 4 o atSerie(cEstado)= 5 o atSerie(cEstado)= 9 o atSerie(cEstado)= 10
    Texto 'Es necesario dar entrada a la serie huérfana ' & atSerie(cNumeroSerie) & ' para asignarle el pedimento'
    Imprime
  Sino
    // Número de pedimento
    vImprime = 'Pedimento:'[C0]
    vImprime = atSerie(cPedimento)[C2]
    // Fecha de pedimento
    vImprime = 'Fecha pedimento:'[C4]
    lFechaEditada = fFormateaFecha(atSerie(cFechaPedimento); gIdioma)
    vImprime = @Col(lFechaEditada;0)[C6]
    Lista vImprime
  Finsi
  // Inicia N.C.0134


  vImprime = ' '[C0..C23]

  // Agencia aduanal
  vImprime = 'Agencia aduanal:'[C0]
  vImprime = atSerie(cAduana)[C2]
  // Tipo de cambio
  [C6].Coma
  // N.D.2335 Inicio ----------------------
  //[C6].Decimales gDecimalesMoneda
  [C6].Decimales 4
  // N.D.2335 Inicio ----------------------
  vImprime = 'Tipo de cambio:'[C4]
  vImprime = atSerie(cTipoCambio)[C6]

  Lista vImprime
  vImprime = ' '[C0..C23]

  // Existencia
  [C6].Coma
  [C6].Decimales gDecimalesUnidades
  vImprime = 'Disponible:'[C4]
  // Si la serie está disponible o consignada del proveedor, la existencia es uno
  Si atSerie(cEstado) = 1 o atSerie(cEstado) = 2
    vImprime = 1.0[C6]
  Sino // de otra forma la existencia es cero
    vImprime = 0.0[C6]
  FinSi  

  Lista vImprime
  Saltalin

  // Regresa las columnas a su definición original
  Columnas 24;1.64,0.15,0.75,0.15,1.20,0.15,2.24,0.15,0.45,0.15,1.79,0.75,1.64,0.15,0.75,0.15,1.20,0.15,2.24,0.15,0.45,0.15,1.79,0.45
  [C2,C4,C14,C16].Decimales 0
  [C2,C4,C14,C16].Blanco ''
FinFunc


// *****************************************************************************
//  fImprimeUltimoRenglon
//
//	Esta función imprime el ultimo renglón de movimentos pares, si es que no 
//  ha sido impreso
//
//  Parámetros 
//
//  Salidas 
// *****************************************************************************
DefFunc fImprimeUltimoRenglon(aImprime)
  
  Si @Col(aImprime;0) != ' ' o @Col(aImprime;12) != ' ' 
    Lista aImprime
    Saltalin
  FinSi
FinFunc


// *****************************************************************************
//  fProcesaProducto
//
//  Esta función obtiene los lotes y pedimentos del producto conforme al rango
//  de fechas del reporte.
//
//  Parámetros 
//
//  Salidas 
// *****************************************************************************
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Historia de modificaciones
//  Fecha      Nombre   IDLotus                     Descripcion
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// 15/05/2002   MOFM                Dependiendo de si el productos que maneja
//                                  capas tiene características se agrega la   
//                                  impresión de las mismas
// 15/05/2002   MOFM                Si se busca un lote o pedimento específico
//                                  se discriminan todos los demás      
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
DefFunc fProcesaProducto(atProducto: Tabla; aTieneCaracteristicas)
Local lFecha, lImprime, lDatosProducto, lDatosCapa, lAlMenosUno

  Si !pImprimirProductos // Imprimir productos sin importar si tiene o no movimientos?
    fImprimeDatosProducto(atProducto)
    lDatosProducto = 1
  Sino
    // No se han impreso los datos del producto
    lDatosProducto = 0
  FinSi

  // No se ha impreso algun pedimento o lote
  lAlMenosUno = 0


  Si aTieneCaracteristicas
    Mientras [tProductoDetalle.busca[@Str(tProducto(cIdProducto);0)];tProductoDetalle->encontro;tProductoDetalle.Busca Siguiente[1]]
        // Recupera todas las capas del producto
      Mientras [ tCapa.Busca[@Str(tProductoDetalle(cIdProducto);0)]; tCapa->Encontro; tCapa.Busca Siguiente[1] ]

        // Discrimina capas que no sean de pedimentos o lotes
        Si pTipoReporte = 1 // Lotes?
          Si tCapa(cTipoCapa) != 3 y tCapa(cTipoCapa) != 4
            Continua
          FinSi
        Sino // Pedimentos
          Si tCapa(cTipoCapa) != 2 y tCapa(cTipoCapa) != 4
            Continua
          FinSi
        FinSi
        // Si se busca algún lote o pedimento específico
        Si pSeleccionLotePedimento != 0
          Si pTipoReporte = 1 // Lotes?
            Si pPedimentoLote != tCapa(cNumeroLote)
              Continua
            Finsi
          Sino // Pedimentos
            Si pPedimentoLote != tCapa(cPedimento)
              Continua
            Finsi
          Finsi
        Finsi 
        // No se han impreso los datos de la capa
        lDatosCapa = 0
        // Inicializa el buffer de impresión
        lImprime = ' '[C0..C23]
        // Inicializa la Fecha de inicio del rango de fechas del reporte
        lFecha = pFechaInicial 
        // Recorre todas las fechas en el rango de fechas del reporte
        Mientras lFecha <= pFechaFinal
          // Recupera los movimientos de capa del producto a partir de la fecha de inicio del reporte
          Mientras [ tMovimientoCapa.Busca[tCapa(cIdCapa) & ':' & lFecha]; tMovimientoCapa->Encontro; tMovimientoCapa.Busca Siguiente[2] ]
            // Lee el movimiento a partir de la capa
            tMovimiento.Busca[@Str(tMovimientoCapa(cIdMovimiento);0)]
            Si tMovimiento->Encontro
              Si tMovimiento(cAfectaExistencia) != 1 y tMovimiento(cAfectaExistencia) != 2
                Continua
              FinSi
              // Al menos se imprime una capa
              lAlMenosUno = 1
              // Si el producto no ha sido impreso, se imprime
              Si !lDatosProducto
                fImprimeDatosProducto(atProducto)
                lDatosProducto = 1
              FinSi
              // Si la capa no ha sido impresa, se imprime
              Si !lDatosCapa
                Si pTipoReporte = 1 // Lotes?
                  fImprimeLote(tCapa)
                Sino // Pedimentos
                  fImprimePedimento(tCapa)
                FinSi
                //lepc
                fImprimeCaracteristica(tProductoDetalle(cIdValorCaracteristica1);tProductoDetalle(cIdValorCaracteristica2);tProductoDetalle(cIdValorCaracteristica3))
                //fImpirmeUnidad                    
                lDatosCapa = 1
              FinSi
              // Imprime el movimiento
              fImprimeMovimiento(tMovimiento; tMovimientoCapa(cUnidades); &lImprime)
            FinSi // tMovimiento->Encontro
          FinMientras // tMovimientoCapa.Busca
         // Incrementa un día a la fecha
          lFecha = fFechaSiguiente(lFecha)
        FinMientras // lFecha <= pFechaFinal
        // Si el último renglón no ha sido impreso, lo imprime
        fImprimeUltimoRenglon(lImprime)
      FinMientras // tCapa.Busca
    FinMientras   
  Sino   
    // Recupera todas las capas del producto
    Mientras [ tCapa.Busca[@Str(atProducto(cIdProducto);0)]; tCapa->Encontro; tCapa.Busca Siguiente[1] ]
      // Discrimina capas que no sean de pedimentos o lotes
      Si pTipoReporte = 1 // Lotes?
        Si tCapa(cTipoCapa) != 3 y tCapa(cTipoCapa) != 4
          Continua
        FinSi
      Sino // Pedimentos
        Si tCapa(cTipoCapa) != 2 y tCapa(cTipoCapa) != 4
          Continua
        FinSi
      FinSi
      // Si se busca algún lote o pedimento específico
      Si pSeleccionLotePedimento != 0
        Si pTipoReporte = 1 // Lotes?
          Si pPedimentoLote != tCapa(cNumeroLote)
            Continua
          Finsi
        Sino // Pedimentos
          Si pPedimentoLote != tCapa(cPedimento)
            Continua
          Finsi  
        Finsi
      Finsi 
      // No se han impreso los datos de la capa
      lDatosCapa = 0
      // Inicializa el buffer de impresión
      lImprime = ' '[C0..C23]
      // Inicializa la Fecha de inicio del rango de fechas del reporte
      lFecha = pFechaInicial 
      // Recorre todas las fechas en el rango de fechas del reporte
      Mientras lFecha <= pFechaFinal
        // Recupera los movimientos de capa del producto a partir de la fecha de inicio del reporte
        Mientras [ tMovimientoCapa.Busca[tCapa(cIdCapa) & ':' & lFecha]; tMovimientoCapa->Encontro; tMovimientoCapa.Busca Siguiente[2] ]
          // Lee el movimiento a partir de la capa
          tMovimiento.Busca[@Str(tMovimientoCapa(cIdMovimiento);0)]
          Si tMovimiento->Encontro
            Si tMovimiento(cAfectaExistencia) != 1 y tMovimiento(cAfectaExistencia) != 2
              Continua
            FinSi
            // Al menos se imprime una capa
            lAlMenosUno = 1
            // Si el producto no ha sido impreso, se imprime
            Si !lDatosProducto
              fImprimeDatosProducto(atProducto)
              lDatosProducto = 1
            FinSi
            // Si la capa no ha sido impresa, se imprime
            Si !lDatosCapa
              Si pTipoReporte = 1 // Lotes?
                fImprimeLote(tCapa)
              Sino // Pedimentos
                fImprimePedimento(tCapa)
              FinSi
              //lepc
              //fImpirmeUnidad                    
              lDatosCapa = 1
            FinSi
            // Imprime el movimiento
            fImprimeMovimiento(tMovimiento; tMovimientoCapa(cUnidades); &lImprime)
          FinSi // tMovimiento->Encontro
        FinMientras // tMovimientoCapa.Busca
       // Incrementa un día a la fecha
        lFecha = fFechaSiguiente(lFecha)
      FinMientras // lFecha <= pFechaFinal
      // Si el último renglón no ha sido impreso, lo imprime
      fImprimeUltimoRenglon(lImprime)
    FinMientras // tCapa.Busca
  Finsi 
  // Si al menos se imprimió una capa
  Si lAlMenosUno
    Saltalin 1
    gAlMenosUno = 1
  FinSi
FinFunc


// *****************************************************************************
//  fProcesaProductoPorSeries
//
//  Esta función obtiene los lotes y pedimentos del producto conforme al rango
//  de fechas del reporte. El proceso se realiza a través de la tabla
//  de series, en lugar de la tabla de capas.
//
//  Parámetros 
//
//  Salidas 
// *****************************************************************************
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Historia de modificaciones
//  Fecha      Nombre   IDLotus                     Descripcion
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// 15/05/2002   MOFM                Si se busca un lote o pedimento específico
//                                  se discriminan todos los demás      
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
DefFunc fProcesaProductoPorSeries(atProducto: Tabla;aTieneCaracteristicas)
Local lFecha, lImprime, lDatosProducto, lDatosCapa, lAlMenosUno

  Si !pImprimirProductos // Imprimir productos sin importar si tiene o no movimientos?
    fImprimeDatosProducto(atProducto)
    lDatosProducto = 1
  Sino
    // No se han impreso los datos del producto
    lDatosProducto = 0
  FinSi

  // No se ha impreso algun pedimento o lote
  lAlMenosUno = 0


  Si aTieneCaracteristicas =1 

    Mientras [tProductoDetalle.busca[@Str(tProducto(cIdProducto);0)];tProductoDetalle->encontro;tProductoDetalle.Busca Siguiente[1]]
        // Recupera todas las capas del producto
      // Recupera todas las capas del producto
      Mientras [ tSerie.Busca[@Str(tProductoDetalle(cIdProducto);0)]; tSerie->Encontro; tSerie.Busca Siguiente[1] ]
        // No se han impreso los datos de la capa
        lDatosCapa = 0
        // Inicializa el buffer de impresión
        lImprime = ' '[C0..C23]
         // Inicializa la Fecha de inicio del rango de fechas del reporte
         lFecha = pFechaInicial 
        // Recorre todas las fechas en el rango de fechas del reporte
        Mientras lFecha <= pFechaFinal
          // Recupera los movimientos de capa del producto a partir de la fecha de inicio del reporte
          Mientras [ tMovimientoSerie.Busca[tSerie(cIdSerie) & ':' & lFecha]; tMovimientoSerie->Encontro; tMovimientoSerie.Busca Siguiente[2] ]
            // Lee el movimiento a partir de la capa
            tMovimiento.Busca[@Str(tMovimientoSerie(cIdMovimiento);0)]
            Si tMovimiento->Encontro
              Si tMovimiento(cAfectaExistencia) != 1 y tMovimiento(cAfectaExistencia) != 2
                Continua
              FinSi
              // Si se busca algún lote o pedimento específico
              Si pSeleccionLotePedimento != 0
                Si pTipoReporte = 1 // Lotes?
                  Si pPedimentoLote != tSerie(cNumeroLote)
                    Continua
                  Finsi
                Sino                // Pedimentos? 
                  Si pPedimentoLote != tSerie(cPedimento)
                    Continua
                  Finsi
                Finsi
              Finsi 

              // Al menos se imprime una capa
              lAlMenosUno = 1
              // Si el producto no ha sido impreso, se imprime
              Si !lDatosProducto
                fImprimeDatosProducto(atProducto)
                lDatosProducto = 1
              FinSi
              // Si la capa no ha sido impresa, se imprime
              Si !lDatosCapa
                Si pTipoReporte = 1 // Lotes?
                  fImprimeLoteSerie(tSerie)
                Sino // Pedimentos
                  fImprimePedimentoSerie(tSerie)
                FinSi
                //lepc
                fImprimeCaracteristica(tProductoDetalle(cIdValorCaracteristica1);tProductoDetalle(cIdValorCaracteristica2);tProductoDetalle(cIdValorCaracteristica3))
                lDatosCapa = 1
              FinSi
              // Imprime el movimiento
              fImprimeMovimiento(tMovimiento; 1; &lImprime)
            FinSi // tMovimiento->Encontro
          FinMientras // tMovimientoCapa.Busca
          // Incrementa un día a la fecha
          lFecha = fFechaSiguiente(lFecha)
        FinMientras // lFecha <= pFechaFinal
        // Si el último renglón no ha sido impreso, lo imprime
        fImprimeUltimoRenglon(lImprime)
      FinMientras // tCapa.Busca
  
  
  
  
  
    Finmientras
  Sino
    
    // Recupera todas las capas del producto
    Mientras [ tSerie.Busca[@Str(atProducto(cIdProducto);0)]; tSerie->Encontro; tSerie.Busca Siguiente[1] ]
      // No se han impreso los datos de la capa
      lDatosCapa = 0
      // Inicializa el buffer de impresión
      lImprime = ' '[C0..C23]
       // Inicializa la Fecha de inicio del rango de fechas del reporte
       lFecha = pFechaInicial 
      // Recorre todas las fechas en el rango de fechas del reporte
      Mientras lFecha <= pFechaFinal
        // Recupera los movimientos de capa del producto a partir de la fecha de inicio del reporte
        Mientras [ tMovimientoSerie.Busca[tSerie(cIdSerie) & ':' & lFecha]; tMovimientoSerie->Encontro; tMovimientoSerie.Busca Siguiente[2] ]
          // Lee el movimiento a partir de la capa
          tMovimiento.Busca[@Str(tMovimientoSerie(cIdMovimiento);0)]
          Si tMovimiento->Encontro
            Si tMovimiento(cAfectaExistencia) != 1 y tMovimiento(cAfectaExistencia) != 2
              Continua
            FinSi
            // Si se busca algún lote o pedimento específico
            Si pSeleccionLotePedimento != 0
              Si pTipoReporte = 1 // Lotes?
                Si pPedimentoLote != tSerie(cNumeroLote)
                  Continua
                Finsi
              Sino                // Pedimentos? 
                Si pPedimentoLote != tSerie(cPedimento)
                  Continua
                Finsi
              Finsi
            Finsi 

            // Al menos se imprime una capa
            lAlMenosUno = 1
            // Si el producto no ha sido impreso, se imprime
            Si !lDatosProducto
              fImprimeDatosProducto(atProducto)
              lDatosProducto = 1
            FinSi
            // Si la capa no ha sido impresa, se imprime
            Si !lDatosCapa
              Si pTipoReporte = 1 // Lotes?
                fImprimeLoteSerie(tSerie)
              Sino // Pedimentos
                fImprimePedimentoSerie(tSerie)
              FinSi
              lDatosCapa = 1
            FinSi
            // Imprime el movimiento
            fImprimeMovimiento(tMovimiento; 1; &lImprime)
          FinSi // tMovimiento->Encontro
        FinMientras // tMovimientoCapa.Busca
        // Incrementa un día a la fecha
        lFecha = fFechaSiguiente(lFecha)
      FinMientras // lFecha <= pFechaFinal
      // Si el último renglón no ha sido impreso, lo imprime
      fImprimeUltimoRenglon(lImprime)
    FinMientras // tCapa.Busca

  Finsi //caracteristicas

  // Si al menos se imprimió una capa
  Si lAlMenosUno
    Saltalin 1
    gAlMenosUno = 1
  FinSi
FinFunc


// *****************************************************************************
//  fVerificaParametros
//
//  Esta función verifica los parámetros pProductoInicial y pProductoFinal.
//  Si están vacíos toma el primer y último producto de la tabla.
//
//  Parámetros 
//
//  Salidas 
// *****************************************************************************
DefFunc fVerificaParametros()

  // Si el rango inicial es el primer producto, recupera el código del primero
  Si pProductoInicial = ' '
    tProducto.Busca Primero
    Si tProducto->Encontro
      pProductoInicial = tProducto(cCodigoProducto)
    FinSi
  FinSi

  // Si el rango final es el último producto, recupera el código del último
  Si pProductoFinal = ' '
    tProducto.Busca Ultimo
    Si tProducto->Encontro
      pProductoFinal = tProducto(cCodigoProducto)
    FinSi
  FinSi
FinFunc


// *****************************************************************************
// Encabezado del reporte

Encab
	Texto '@TC{255,0,0}@S{8}AdminPAQ'
	Hoja '"@TC{0,0,0}@S{8}Hoja: '
	Imprime
	Texto '"@TC{0,0,0}@S{8}Fecha: ' & fFormateaFecha(@Hoy();gIdioma)
  Imprime

	Texto '^@TC{0,0,0}@S{22}' & tEmpresa->Nombre
	Imprime

  Si pTipoReporte = 1 // Lotes
  	Texto '^@TC{0,0,0}@S{16}LOTES'
  Sino // Pedimentos
  	Texto '^@TC{0,0,0}@S{16}PEDIMENTOS'
  FinSi
	Imprime
	Texto '^@TC{0,0,0}@S{16}Del: ' & fFormateaFecha(pFechaInicial;gIdioma) & ' Al: ' & fFormateaFecha(pFechaFinal;gIdioma)
	Imprime

  // Se Revisan las clasificaciones, para recuperarlas e imprimirlas en el encabezado
  fRevisaClases(tValoresDeClasif)

  Saltalin

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

  // Modifica el ancho de las columnas
  Columnas 24;9.11,0,0,0,0,0,0,0,0,0,0,0.45,9.11,0,0,0,0,0,0,0,0,0,0,0
  Texto C0;'E N T R A D A S'
  Texto C12;'S A L I D A S'
  Imprime
  Columnas 24;1.64,0.15,0.75,0.15,1.20,0.15,2.24,0.15,0.45,0.15,1.79,0.75,1.64,0.15,0.75,0.15,1.20,0.15,2.24,0.15,0.45,0.15,1.79,0.45

	Texto C0;'Fecha'
	Texto C2;'Serie'
	Texto C4;'^Folio'
	Texto C6;'Concepto'
  Texto C8;'Alm'
  Texto C10;'^Cantidad'
	Texto C12;'Fecha'
	Texto C14;'Serie'
	Texto C16;'^Folio'
	Texto C18;'Concepto'
  Texto C20;'Alm'
  Texto C22;'^Cantidad'
	Imprime

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

	NEGRITAS FALSE
	Color @RGB(0;0;0)
	Altura 9
FinEncab


// *****************************************************************************
// Cuerpo del reporte
// *****************************************************************************
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Historia de modificaciones
//  Fecha      Nombre   IDLotus                     Descripcion
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// 15/05/2002   MOFM                Dependiendo de si el productos que maneja
//                                  capas tiene características se agrega la   
//                                  impresión de las mismas
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

// Configura los decimales del reporte
fConfiguraDecimales()

// Verifica el rango de productos del reporte
fVerificaParametros()

// Establece el índice de recorrido
Si pTipoReporte = 1 // Lotes
  tCapa.Usaindice['iProductoFechaCaducidad'] // cIdProducto+cFechaCaducidad
  tSerie.Usaindice['iProductoFechaCaducidad'] // cIdProducto+cFechaCaducidad
Sino // Pedimentos
  tCapa.Usaindice['iProductoFechaPedimento'] // cIdProducto+cFechaPedimento
  tSerie.Usaindice['iProductoFechaPedimento'] // cIdProducto+cFechaPedimento
FinSi
  
// Obtiene los productos en el rango especificado en los parámetros del reporte
Mientras [ tProducto.Busca[pProductoInicial & '..' & pProductoFinal]; tProducto->Encontro; tProducto.Busca Siguiente[1] ]

  // Solo busca productos, descarta paquetes y servicios
  Si tProducto(cTipoProducto) != 1
    Continua
  FinSi

  // Verifica si el producto es candidato a imprimirse en función de su estado
  // tProducto(cStatusProducto) = 0 (Inactivo)
  // tProducto(cStatusProducto) = 1 (Activo)
  Si pEstadoProducto y pEstadoProducto != @Abs(tProducto(cStatusProducto) - 2)
    Continua
  FinSi

  // Verifica si el producto cumple con las clasificaciones especificadas 
  Si gNumDeClases > 0
    Si !fMiembroDeUnaClase(tProducto; gNumDeClases; gListIdDeClases; 2)
      // Discrimina el producto por no pertenecer a alguna de las clasificaciones
      Continua
    FinSi
  FinSi

  // Discrimina productos cuyo control de existencia es diferente de lotes o pedimentos
  // El campo cControlExistencia es un mapa de bits. Los valores que nos interesa son:
  // 00100 = Series
  // 01000 = Pedimentos
  // 10000 = Lotes
  // Las combinaciones posibles para lotes son:
   // Lotes = 10000 = 16
   // Lotes-Series = 10100 = 20
   // Lotes-Pedimentos = 11000 = 24
   // Lotes-series-pedimentos = 11100 = 28
   // Lotes-Caracteristicas 10010 = 18 
   // Lotes-Pedimentos-Caracteristicas 11010 = 26 
   // nuevas LEPC 23/05/2002
   // Lotes-Unidades = 10001 =17
   // Lotes-Series-Caracteristicas = 10110 = 22
   // Lotes-Pedimentos-Unidades = 11001 = 25
   // Lotes-Caracteristicas-Unidades 10011 = 19 
   // Lotes-Series-Caracteristicas-pedimento = 11110 = 30
   // Lotes-Pedimento-Caracteristicas-Unidades 11011 = 27

  // Las combinaciones posibles para pedimentos son:
   // Pedimentos = 01000 = 8
   // Pedimentos-Series = 01100 = 12
   // Pedimentos-Lotes = 11000 = 24
   // Pedimentos-series-Lotes = 11100 = 28
   // nuevas LEPC 23/05/2002
   // Pedimentos-Lotes-Caracteristicas = 11010 = 26
   // Pedimentos-Caracteristicas = 01010 = 10
   // Pedimentos-Unidades = 01001 = 9
   // Pedimentos-Unidades-lotes = 11001 = 25
   // Pedimentos-Caracteristicas-Serie = 01110 = 14
   // Pedimentos-Caracteristicas-serie-lotes =  11110 = 30
   // Pedimentos-Caracteristicas-lotes-Unidades = 11011 = 27
   // Pedimentos-Caracteristicas-unidades= 01011 = 11
  Si pTipoReporte = 1 // Lotes
    Si tProducto(cControlExistencia) != 16 y tProducto(cControlExistencia) != 20 y tProducto(cControlExistencia) != 24 y tProducto(cControlExistencia) != 28 y tProducto(cControlExistencia) != 18 y tProducto(cControlExistencia) != 26
      Si tProducto(cControlExistencia) != 17 y tProducto(cControlExistencia) != 22 y tProducto(cControlExistencia) != 25  y tProducto(cControlExistencia) != 19 y tProducto(cControlExistencia) != 30 y tProducto(cControlExistencia) != 27
        Continua
      finsi
    FinSi
  Sino // Pedimentos
    Si tProducto(cControlExistencia) != 8 y tProducto(cControlExistencia) != 12 y tProducto(cControlExistencia) != 24 y tProducto(cControlExistencia) != 28 y tProducto(cControlExistencia) != 11
      Si tProducto(cControlExistencia) != 26 y tProducto(cControlExistencia) != 10 y tProducto(cControlExistencia) != 9 y tProducto(cControlExistencia) != 25 y tProducto(cControlExistencia) != 14 y tProducto(cControlExistencia) != 30 y tProducto(cControlExistencia) != 27 
        Continua
      finsi
    FinSi
  FinSi

  // Si el producto tiene series, lo procesa a través de la tabla de series
  Si tProducto(cControlExistencia)  = 12 o tProducto(cControlExistencia)  = 20 o tProducto(cControlExistencia) = 28 o tProducto(cControlExistencia)  = 22 o tProducto(cControlExistencia)  = 14 o tProducto(cControlExistencia)  = 30
    Si  tProducto(cBanCaracteristicas) = 1
      fProcesaProductoPorSeries(tProducto;1)
    Sino 
      fProcesaProductoPorSeries(tProducto;0)
    Finsi
  Sino // De otra forma, lo procesa por la tabla de capas
    // Si el producto tiene características
    Si tProducto(cBanCaracteristicas) = 1
        fProcesaProducto(tProducto;1) 
    Sino  
      fProcesaProducto(tProducto;0)
    Finsi     
  FinSi
FinMientras

// Si desplegó al menos un producto, despliega el siguiente mensaje
Si gAlMenosUno
  Texto '* Nota: La columna de existencia disponible corresponde a la existencia actual.'
  Imprime
  Texto '  No es la existencia calculada a la fecha del reporte.'
  Imprime
FinSi
