// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//
//	MovDetallado.rpt
//	Nombre del reporte en el sistema: Movimientos detallados
//
//  Sistema: AdminPAQ v1.1
// 
//	Este reporte se manda ejecutar desde la pantalla de documentos. Despliega
//  los movimientos del documento con el mayor detalle posible.
//
//	Consideraciones especiales:
//  
//	Elaboró:    Eduardo Pérez Figueroa
//	Fecha: 	    27 de Septiembre del 2001
//
//  Historia de revisiones:
//	Autor: Hector Valencia Aguilar
//	Fecha: 20/05/2002
//	Agregar productos con caracteristicas y series, ademas de caracteristicas
//	con capas
//	Autor: Hector Valencia Aguilar
//	Fecha: 20/05/2005
//	Agregar 2 columnas costo calculado y total del costo capturado por unidades.
//	Fecha: 07/06/2005
//	Agregar ND 3297
//	Autor: Ivonne Yazmín Padilla Zamora
//	Fecha: 25/06/2008
//	N.D.4145 Se quitan los movimientos ocultos de entrada cuando es un trapaso
//  Se modifica: fProcesaMovimientosOcultos

// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Historia de modificaciones
//  Fecha      Nombre   IDLotus                     Descripcion
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// 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


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

Parametro pIdDocumento = 5              // ID del documento a desplegar


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

UsaEmpresa tEmpresa;'ADMINPAQW'                   // Parámetros

UsaTabla tProducto = tEmpresa['MGW10005'] Alias 'Producto'          // Productos
tProducto.Usaindice['']                           // Indice primario: cIdProducto

UsaTabla tComponente = tEmpresa['MGW10005'] Alias 'Componente'      // Productos
tComponente.Usaindice['']                         // Indice primario: cIdProducto

UsaTabla tDetalleProducto = tEmpresa['MGW10004']  // Productos
tDetalleProducto.Usaindice['']                    // Indice primario: cIdProducto

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

UsaTabla tMovimiento = tEmpresa['MGW10010'] Alias 'Movto'             // Movimientos
tMovimiento.Usaindice['iDoctoNumeroMovto']        // cIdDocumento+cNumeroMovimiento

UsaTabla tMovimientoOculto = tEmpresa['MGW10010'] Alias 'MovtoOculto' // Movimientos
tMovimientoOculto.Usaindice['iMovtoOwnerAfectaExist']      // cIdMovtoOwner+cAfectaExistencias

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

UsaTabla tMovimientoCapa = tEmpresa['MGW10028']   // Movimientos de capas
tMovimientoCapa.Usaindice['']                     // Indice primario: cIdMovimiento+cIdCapa

UsaTabla tSerie = tEmpresa['MGW10032']            // Series
tSerie.Usaindice['']                              // Indice primadio: cIdSerie

UsaTabla tMovimientoSerie = tEmpresa['MGW10036']  // Movimientos de series
tMovimientoSerie.Usaindice['']                    // Indice primario: cIdMovimiento+cIdSerie

UsaTabla tUnidad = tEmpresa['MGW10026']           // Unidades de peso y medida
tUnidad.Usaindice['']                             // Indice primario: cIdUnidad

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

UsaTabla tCaracteristica = tEmpresa['MGW10021']       // Características
tCaracteristica.Usaindice['']                         // Indice primario: cIdPadreCaracteristica

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

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

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


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

// Ancho de columnas = caracteres / 17 * 2.54
// Se consideran columnas intermedias de un espacio
// C0 (Código) = 14 caracteres
// C2 (dummie) = 0 caracteres
// C4 (Nombre del producto) = 39 caracteres
// C6 (Almacén) = 4 caracteres
// C8 (Cantidad) = 13 caracteres
// C10 (Unidad) = 3 caracteres
// C12 (Precio) = 14 caracteres
// C14 (Neto) = 14 caracteres
// C16 (Descuento) = 10 caracteres
// C18 (Impuesto) = 10 caracteres
// C20 (Retención) = 10 caracteres
// C22 (Total) = 14 caracteres
Columnas 24;2.09,0.15,0.00,0.00,5.83,0.15,0.60,0.15,1.94,0.15,0.45,0.15,2.09,0.15,2.09,0.15,1.49,0.15,1.49,0.15,1.49,0.15,2.09,0.15

Usaletra 'Arial'
Altura 9
[C8,C12,C14,C16,C18,C20,C22].Coma


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

gIdioma = 0             // Idioma del reporte
                        // 0 = Español
                        // 1 = Inglés
// Las siguientes variables se utilizan en el cuerpo principal del reporte
gDecimalesPrecioVenta = 2 // Número de decimales para precios de venta
gDecimalesMonedaBase = 2  // Número de decimales de la moneda base
gMascarillaProducto = ''  // Mascarilla para el código del producto
gMascarillaAlmacen = ''   // Mascarilla para el código del almacén
gDocumentoDe  = 4         // Documento Modelo al que pertence el documento 

gProcesa = 0 // Le indica a la parte principal del reporte si procesarlo o no
gDoctoInventario = 0 // 0 - Las columnas de importes van de neto a total
                     // 1 - Las columnas de importes son costo unitario y costo total
// Lee el documento
tDocumento.Busca[@Str(pIdDocumento;0)]
Si tDocumento->Encontro
   gProcesa = 1
	gDocumentoDe = tDocumento(cIdDocumentoDe)
	// N.D.3049 Incluir el Documento de Ajustes al Costo como un documento de Inventarios
   Si gDocumentoDe = 32 O gDocumentoDe = 33 O gDocumentoDe = 34 O gDocumentoDe = 37
     gDoctoInventario = 1
     Columnas 24;2.09,0.15,0.00,0.00,5.83,0.15,0.60,0.15,1.94,0.15,0.45,0.15,2.09,0.15,2.09,0.15,1.49,0.15,0
     Si gDocumentoDe = 33 O gDocumentoDe = 34  
        Columnas 24;2.09,0.15,0.00,0.00,3.6,0.15,0.60,0.15,1.5,0.15,0.15,0.15,2.1,0.15,2.65,0.15, 2.35, 0.15, 2.65, 0.15
     FinSi       
   FinSi
FinSi

// *****************************************************************************
//  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(aIdMoneda)

  // Busca el registro de la empresa
  tParametros.Busca Primero
  Si tParametros->Encontro // Si lo encontró
    [C8].Decimales tParametros(cDecimalesUnidades)
    Si gDoctoInventario = 0
      [C12].Decimales tParametros(cDecimalesPrecioVenta)
    FinSi
    gDecimalesPrecioVenta = tParametros(cDecimalesPrecioVenta)
    gMascarillaProducto = tParametros(cMascarillaProducto) // mascarilla para el código del producto
    gMascarillaAlmacen = tParametros(cMascarillaAlmacen) // mascarilla para el código del almacen
  Sino // Si no encontró el registro de la empresa
    [C8,C12].Decimales 2
    gDecimalesPrecioVenta = 2
  FinSi

  Si gDoctoInventario = 0
    // Busca los decimales en la moneda
    tMoneda.Busca[@Str(aIdMoneda;0)]
    Si tMoneda->Encontro // Si lo encontró
      [C14,C16,C18,C20,C22].Decimales tMoneda(cDecimalesMoneda)
    Sino // Si no encontró el registro de la empresa
      [C14,C16,C18,C20,C22].Decimales 2
    FinSi
  SiNo // Docto de inventario
    Si tParametros->Encontro
      [C14,C16].Decimales tParametros(cDecimalesCostos)
    SiNo
      [C14,C16].Decimales 2
    FinSi
  FinSi

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


// *****************************************************************************
//  fImprimeCaracteristicas
//
//	Esta función imprime las características capturadas del movimiento
//
//  Parámetros 
//
//  Salidas 
// *****************************************************************************
DefFunc fImprimeCaracteristicas(atDetalleProducto: Tabla; atMovimientoOculto: Tabla; aTextoCaracteristicas)
Local vImprime, lValoresCaracteristicas, lTextoCaracteristicas, lCantidad

  // Redefine el ancho de las columnas
  Columnas 24;2.09,0.15,0.00,0.00,3.14,0.15,3.29,0.15,1.94,0.15,0.45,0.15,2.09,0.15,0

  // Procesa solo si existen valores de características
  Si atDetalleProducto(cIdValorCaracteristica1) o atDetalleProducto(cIdValorCaracteristica2) o atDetalleProducto(cIdValorCaracteristica3)
    vImprime = ' '[C0..C23]
    lValoresCaracteristicas = ' '
    lTextoCaracteristicas = ' '

    // Lee los valores de las características
    // Caracteristica 1
    Si atDetalleProducto(cIdValorCaracteristica1)
      tValorCaracteristica.Busca[@Str(atDetalleProducto(cIdValorCaracteristica1);0)]
      Si tValorCaracteristica->Encontro
        lValoresCaracteristicas = tValorCaracteristica(cValorCaracteristica)
        // Verifica si leer el nombre de la caracteristica
        Si !aTextoCaracteristicas
          tCaracteristica.Busca[@Str(tValorCaracteristica(cIdPadreCaracteristica);0)]
          Si tCaracteristica->Encontro
            lTextoCaracteristicas = tCaracteristica(cNombreCaracteristica)
          FinSi
        FinSi
      FinSi
    FinSi

    // Caracteristica 2
    Si atDetalleProducto(cIdValorCaracteristica2)
      tValorCaracteristica.Busca[@Str(atDetalleProducto(cIdValorCaracteristica2);0)]
      Si tValorCaracteristica->Encontro
        lValoresCaracteristicas = lValoresCaracteristicas & '-' & tValorCaracteristica(cValorCaracteristica)
        // Verifica si leer el nombre de la caracteristica
        Si !aTextoCaracteristicas
          tCaracteristica.Busca[@Str(tValorCaracteristica(cIdPadreCaracteristica);0)]
          Si tCaracteristica->Encontro
            lTextoCaracteristicas = lTextoCaracteristicas & '-' & tCaracteristica(cNombreCaracteristica)
          FinSi
        FinSi
      FinSi
    FinSi

    // Caracteristica 3
    Si atDetalleProducto(cIdValorCaracteristica3)
      tValorCaracteristica.Busca[@Str(atDetalleProducto(cIdValorCaracteristica3);0)]
      Si tValorCaracteristica->Encontro
        lValoresCaracteristicas = lValoresCaracteristicas & '-' & tValorCaracteristica(cValorCaracteristica)
        // Verifica si leer el nombre de la caracteristica
        Si !aTextoCaracteristicas
          tCaracteristica.Busca[@Str(tValorCaracteristica(cIdPadreCaracteristica);0)]
          Si tCaracteristica->Encontro
            lTextoCaracteristicas = lTextoCaracteristicas & '-' & tCaracteristica(cNombreCaracteristica)
          FinSi
        FinSi
      FinSi
    FinSi

    // Imprime características y valores
    // Verifica si se imprime la leyenda 
    Si !aTextoCaracteristicas
      vImprime = @Col(lTextoCaracteristicas;0)[C4]
      // Enciende bandera de que el texto ya fue impreso
      aTextoCaracteristicas = 1
    FinSi
    vImprime = @Col(lValoresCaracteristicas;0)[C6]

    // Cantidad capturada
    vImprime = atMovimientoOculto(cUnidadesCapturadas)[C8]
    // Unidad de medida o peso capturada
    Si atMovimientoOculto(cIdUnidad)
      tUnidad.Busca[@Str(atMovimientoOculto(cIdUnidad);0)] 
      Si tUnidad->Encontro
        vImprime = tUnidad(cDespliegue)[C10]
      FinSi
    FinSi

    Lista vImprime

    // Si existe una unidad no convertible, la despliega
    Si atMovimientoOculto(cIdUnidadNC)
      vImprime = ' '[C0..C23]
      vImprime = atMovimientoOculto(cUnidadesNC)[C8]
      tUnidad.Busca[@Str(atMovimientoOculto(cIdUnidadNC);0)] 
      Si tUnidad->Encontro
        vImprime = tUnidad(cDespliegue)[C10]
      FinSi  
      Lista vImprime
    FinSi
  FinSi
  // Regresa las columnas a su ancho original
  Si gDoctoInventario = 0
    Columnas 24;2.09,0.15,0.00,0.00,5.83,0.15,0.60,0.15,1.94,0.15,0.45,0.15,2.09,0.15,2.09,0.15,1.49,0.15,1.49,0.15,1.49,0.15,2.09,0.15
  SiNo // Doscto de inventario
    Columnas 24;2.09,0.15,0.00,0.00,5.83,0.15,0.60,0.15,1.94,0.15,0.45,0.15,2.09,0.15,2.09,0.15,1.49,0.15,0
    Si gDocumentoDe = 33 O gDocumentoDe = 34  
      Columnas 24;2.09,0.15,0.00,0.00,3.6,0.15,0.60,0.15,1.5,0.15,0.15,0.15,2.1,0.15,2.65,0.15, 2.35, 0.15, 2.65, 0.15
    FinSi       
  FinSi
FinFunc


// *****************************************************************************
//  fImprimeComponente
//
//	Esta función imprime los datos del producto componente del paquete
//
//  Parámetros 
//
//  Salidas 
// *****************************************************************************
DefFunc fImprimeComponente(acIdProducto; atMovimientoOculto: Tabla; aTextoComponentes)
Local vImprime, lCodigoEditado

  vImprime = ' '[C0..C23]

  // Verifica si se imprime la leyenda 
  Si !aTextoComponentes
    NEGRITAS TRUE
    Texto 'Componentes del paquete:'
    Imprime
    NEGRITAS FALSE
    // Enciende bandera de que el texto ya fue impreso
    aTextoComponentes = 1
  FinSi

  // Lee los datos del producto
  tComponente.Busca[@Str(acIdProducto;0)]
  Si tComponente->Encontro
    // Codigo del producto
    lCodigoEditado = fMascarilla(tComponente(cCodigoProducto); gMascarillaProducto)
    vImprime = @Col(lCodigoEditado;0)[C0]
    // Descripcion del producto  
    vImprime = tComponente(cNombreProducto)[C4]
  FinSi

  // Cantidad capturada
  vImprime = atMovimientoOculto(cUnidadesCapturadas)[C8]
  // Unidad de medida o peso capturada
  Si atMovimientoOculto(cIdUnidad)
    tUnidad.Busca[@Str(atMovimientoOculto(cIdUnidad);0)] 
    Si tUnidad->Encontro
      vImprime = tUnidad(cDespliegue)[C10]
    FinSi
  FinSi

  Lista vImprime

  // Si existe una unidad no convertible, la despliega
  Si atMovimientoOculto(cIdUnidadNC)
    vImprime = ' '[C0..C23]
    vImprime = atMovimientoOculto(cUnidadesNC)[C8]
    tUnidad.Busca[@Str(atMovimientoOculto(cIdUnidadNC);0)] 
    Si tUnidad->Encontro
      vImprime = tUnidad(cDespliegue)[C10]
    FinSi  
    Lista vImprime
  FinSi

FinFunc


// *****************************************************************************
//  fImprimeEncabezadoLote
//
//	Esta función imprime los datos del encabezado del lote.
//
//  Parámetros 
//
//  Salidas 
// *****************************************************************************
DefFunc fImprimeEncabezadoLote()

  Texto C2;'No. de lote'
  Texto C4;'Caducidad'
  Texto C6;'Fabricación'
  Texto C8;'^Cantidad'
  Imprime
  Texto C2;'@L{2}'
  Texto C3;'@L{3}'
  Texto C4;'@L{4}'
  Texto C5;'@L{5}'
  Texto C6;'@L{6}'
  Texto C7;'@L{7}'
  Texto C8;'@L{8}'
  Imprime
FinFunc


// *****************************************************************************
//  fImprimeEncabezadoPedimento
//
//	Esta función imprime los datos del encabezado del pedimento.
//
//  Parámetros 
//
//  Salidas 
// *****************************************************************************
DefFunc fImprimeEncabezadoPedimento()

  Texto C2;'Pedimento'
  Texto C4;'Fecha'
  // N.D.6846 ALRH
  Texto C6;'Aduana'
  Texto C8;'^Cantidad'
  Texto C12;'^Tipo cambio'
  Imprime
  Texto C2;'@L{2}'
  Texto C3;'@L{3}'
  Texto C4;'@L{4}'
  Texto C5;'@L{5}'
  Texto C6;'@L{6}'
  Texto C7;'@L{7}'
  Texto C8;'@L{8}'
  Texto C9;'@L{9}'
  Texto C10;'@L{10}'
  Texto C11;'@L{11}'
  Texto C12;'@L{12}'
  Imprime
FinFunc


// *****************************************************************************
//  fImprimeEncabezadoSerie
//
//	Esta función imprime los datos del encabezado de la serie.
//
//  Parámetros 
//
//  Salidas 
// *****************************************************************************
DefFunc fImprimeEncabezadoSerie()

  Texto C2;'Serie'
  Imprime
	Texto C2;'@L{2}'
  Imprime
FinFunc


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

  vImprime = ' '[C0..C23]

  // Número de lote
  vImprime = atCapa(cNumeroLote)[C2]
  // Fecha de caducidad
  lFechaEditada = fFormateaFecha(atCapa(cFechaCaducidad); gIdioma)
  vImprime = @Col(lFechaEditada;0)[C4]
  // Fecha de fabricación
  lFechaEditada = fFormateaFecha(atCapa(cFechaFabricacion); gIdioma)
  vImprime = @Col(lFechaEditada;0)[C6]
  // Cantidad
  vImprime = atMovimientoCapa(cUnidades)[C8]

  Lista vImprime
FinFunc


// *****************************************************************************
//  fImprimeMovimiento
//
//	Esta función imprime los datos de cada movimiento de entrada o salida
//  que se incluye en el reporte.
//
//  Parámetros 
//
//  Salidas 
// *****************************************************************************
DefFunc fImprimeMovimiento(atProducto: Tabla; atMovimiento: Tabla)
Local vImprime, lFechaEditada, lCodigoEditado

  vImprime = ' '[C0..C23]

  // Edita el código del producto
  lCodigoEditado = fMascarilla(atProducto(cCodigoProducto); gMascarillaProducto)
  vImprime = @Col(lCodigoEditado;0)[C0]
  // Nombre del producto  
  vImprime = atProducto(cNombreProducto)[C4]
  // lee el almacen
  tAlmacen.Busca[@Str(atMovimiento(cIdAlmacen);0)]
  Si tAlmacen->Encontro
    lCodigoEditado = fMascarilla(tAlmacen(cCodigoAlmacen); gMascarillaAlmacen)
    vImprime = @Col(lCodigoEditado;0)[C6]
  FinSi
  // Cantidad capturada
  vImprime = atMovimiento(cUnidadesCapturadas)[C8]
  // Unidad de medida o peso capturada
  Si atMovimiento(cIdUnidad)
    tUnidad.Busca[@Str(atMovimiento(cIdUnidad);0)] 
    Si tUnidad->Encontro
      vImprime = tUnidad(cDespliegue)[C10]
    FinSi
  FinSi

  Si gDoctoInventario = 0
    // Precio
    vImprime = atMovimiento(cPrecioCapturado)[C12]
    // Neto
    vImprime = atMovimiento(cNeto)[C14]
    // Total de descuentos
    vImprime = (atMovimiento(cDescuento1) + atMovimiento(cDescuento2) + atMovimiento(cDescuento3) + atMovimiento(cDescuento4) + atMovimiento(cDescuento5))[C16]
    // Total de impuestos
    vImprime = (atMovimiento(cImpuesto1) + atMovimiento(cImpuesto2) + atMovimiento(cImpuesto3))[C18]
    // Total de retenciones
    vImprime = (atMovimiento(cRetencion1) + atMovimiento(cRetencion2))[C20]
    // Total del movimiento
    vImprime = atMovimiento(cTotal)[C22]
  SiNo // Docto de inventario

     Si gDocumentoDe = 33 O gDocumentoDe = 34  
      // Costo capturado (Costo Unitario)
      vImprime = atMovimiento(cCostoCapturado)[C12]
      // Total del Movimiento 
      vImprime = atMovimiento(cTotal)[C14]
      // Costo unitario segun metodo de costeo
      vImprime = atMovimiento(cCostoEspecifico)/atMovimiento(cUnidadesCapturadas)[C16]
      // Costo Especifico (Costo Total)
      vImprime = atMovimiento(cCostoEspecifico)[C18] //hva
     Sino

      // Costo capturado (Costo Unitario)
      vImprime = atMovimiento(cCostoCapturado)[C12]
      // Costo Especifico (Costo Total)
      vImprime = atMovimiento(cCostoEspecifico)[C14] //hva

     FinSi

  FinSi
  Lista vImprime
  
  // Si existe una unidad no convertible, la despliega
  Si atMovimiento(cIdUnidadNC)
    vImprime = ' '[C0..C23]
    vImprime = atMovimiento(cUnidadesNC)[C8]
    tUnidad.Busca[@Str(atMovimiento(cIdUnidadNC);0)] 
    Si tUnidad->Encontro
      vImprime = tUnidad(cDespliegue)[C10]
    FinSi  
    Lista vImprime
  FinSi
FinFunc


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

  vImprime = ' '[C0..C23]

  [C12].Decimales gDecimalesMonedaBase

  // Número de pedimento
  vImprime = atCapa(cPedimento)[C2]
  // Fecha de pedimento
  lFechaEditada = fFormateaFecha(atCapa(cFechaPedimento); gIdioma)
  vImprime = @Col(lFechaEditada;0)[C4]
  // Agencia aduanal
  vImprime = atCapa(cAduana)[C6]
  // Cantidad
  vImprime = atMovimientoCapa(cUnidades)[C8]
  // Tipo de cambio
  vImprime = atCapa(cTipoCambio)[C12]

  Lista vImprime

  [C12].Decimales gDecimalesPrecioVenta
FinFunc


// *****************************************************************************
//  fImprimeSerie
//
//	Esta función imprime los datos de la serie
//
//  Parámetros 
//
//  Salidas 
// *****************************************************************************
DefFunc fImprimeSerie(atSerie: Tabla; aProceso)
Local vImprime, lFechaEditada

  vImprime = ' '[C0..C23]

  // Esta función procesa también pedimentos y lotes cuando el producto tiene también series
  Escoge aProceso
    Caso 1 // Series
      vImprime = atSerie(cNumeroSerie)[C2]
    FinCaso
    Caso 2 // Lotes
      // Número de lote
      vImprime = atSerie(cNumeroLote)[C2]
      // Fecha de caducidad
      lFechaEditada = fFormateaFecha(atSerie(cFechaCaducidad); gIdioma)
      vImprime = @Col(lFechaEditada;0)[C4]
      // Fecha de fabricación
      lFechaEditada = fFormateaFecha(atSerie(cFechaFabricacion); gIdioma)
      vImprime = @Col(lFechaEditada;0)[C6]
      // Cantidad
      vImprime = 1.0[C8]
    FinCaso
    Caso 3 // Pedimentos
      // Número de pedimento
      vImprime = atSerie(cPedimento)[C2]
      // Fecha de pedimento
      lFechaEditada = fFormateaFecha(atSerie(cFechaPedimento); gIdioma)
      vImprime = @Col(lFechaEditada;0)[C4]
      // Agencia aduanal
      vImprime = atSerie(cAduana)[C6]
      // Cantidad
      vImprime = 1.0[C8]
      // Tipo de cambio
      [C12].Decimales gDecimalesMonedaBase
      vImprime = atSerie(cTipoCambio)[C12]
    FinCaso
  FinEscoge

  Lista vImprime

  [C12].Decimales gDecimalesPrecioVenta
FinFunc


// *****************************************************************************
//  fProcesaSeries
//
//  Esta función lee los movimientos de series a partir de los movimientos
//  del producto.
//
//  Parámetros
//
//  Salidas
// *****************************************************************************
DefFunc fProcesaSeries(atMovimiento: Tabla; aProceso)
Local lEncabezadoSerie

  // Redefine el ancho de las columnas
  Columnas 24;2.09,0.15,2.09,0.15,2.09,0.15,2.09,0.15,1.94,0.15,0.45,0.15,2.09,0.15,0

  // No se ha impreso el encabezado de la serie
  lEncabezadoSerie = 0
  // Busca todos los movimientos de series
  Mientras [ tMovimientoSerie.Busca[@Str(atMovimiento(cIdMovimiento);0)]; tMovimientoSerie->Encontro; tMovimientoSerie.Busca Siguiente[1] ]
    // Busca la serie del movimiento
    tSerie.Busca[@Str(tMovimientoSerie(cIdSerie);0)]
    Si tSerie->Encontro
      // Si no se ha impreso el encabezado de la serie, lo imprime
      Si !lEncabezadoSerie
        // Esta función procesa también pedimentos y lotes cuando el producto tiene también series
        Escoge aProceso
          Caso 1 // Series
            fImprimeEncabezadoSerie()
          FinCaso
          Caso 2 // Lotes
            fImprimeEncabezadoLote()
          FinCaso
          Caso 3 // Pedimentos
            fImprimeEncabezadoPedimento()
          FinCaso
        FinEscoge
        lEncabezadoSerie = 1
      FinSi
      fImprimeSerie(tSerie; aProceso)
    FinSi
  FinMientras

  // Regresa las columnas a su ancho original
  Si gDoctoInventario = 0
    Columnas 24;2.09,0.15,0.00,0.00,5.83,0.15,0.60,0.15,1.94,0.15,0.45,0.15,2.09,0.15,2.09,0.15,1.49,0.15,1.49,0.15,1.49,0.15,2.09,0.15
  SiNo // Doscto de inventario
    Columnas 24;2.09,0.15,0.00,0.00,5.83,0.15,0.60,0.15,1.94,0.15,0.45,0.15,2.09,0.15,2.09,0.15,1.49,0.15,0
    Si gDocumentoDe = 33 O gDocumentoDe = 34  //hva
       Columnas 24;2.09,0.15,0.00,0.00,3.6,0.15,0.60,0.15,1.5,0.15,0.15,0.15,2.1,0.15,2.65,0.15, 2.35, 0.15, 2.65, 0.15
    FinSi       
  FinSi
FinFunc


// *****************************************************************************
//  fProcesaCapas
//
//  Esta función lee los movimientos de capas a partir de los movimientos
//  del producto.
//
//  Parámetros
//
//  Salidas
// *****************************************************************************
DefFunc fProcesaCapas(atProducto: Tabla; atMovimiento: Tabla; aProceso)
Local lEncabezadoCapa

  // Verifica si el producto tiene series, además de pedimentos o lotes
  // 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
  // Las combinaciones posibles para pedimentos son:
  // Pedimentos = 01000 = 8
  // Pedimentos-Series = 01100 = 12
  // Pedimentos-Lotes = 11000 = 24
  // Pedimentos-series-Lotes = 11100 = 28
  // Si el producto tiene series, lo procesa a través de la tabla de series
  Si (aProceso = 2 y atProducto(cControlExistencia)  = 20 ) o (aProceso = 3 y atProducto(cControlExistencia)  = 12) o atProducto(cControlExistencia) = 28
    fProcesaSeries(atMovimiento; aProceso)
  Sino // De otra forma, lo procesa por la tabla de capas
    // Redefine el ancho de las columnas
    Columnas 24;2.09,0.15,2.09,0.15,2.09,0.15,2.09,0.15,1.94,0.15,0.45,0.15,2.09,0.15,0

    // No se ha impreso el encabezado de la capa
    lEncabezadoCapa = 0
    // Busca todos los movimientos de capas
    Mientras [ tMovimientoCapa.Busca[@Str(atMovimiento(cIdMovimiento);0)]; tMovimientoCapa->Encontro; tMovimientoCapa.Busca Siguiente[1] ]
      // Busca la capa del movimiento
      tCapa.Busca[@Str(tMovimientoCapa(cIdCapa);0)]
      Si tCapa->Encontro
        // Discrimina capas que no sean de pedimentos o lotes
        Si aProceso = 2 // 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 no se ha impreso el encabezado de la capa, lo imprime
        Si !lEncabezadoCapa
          SI aProceso = 2 // Lotes
            fImprimeEncabezadoLote()
          Sino // Pedimentos
            fImprimeEncabezadoPedimento()
          FinSi
          lEncabezadoCapa = 1
        FinSi
        SI aProceso = 2 // Lotes
          fImprimeLote(tCapa; tMovimientoCapa)
        Sino // Pedimentos
          fImprimePedimento(tCapa; tMovimientoCapa)
        FinSi
      FinSi // tCapa->Encontro
    FinMientras

    // Regresa las columnas a su ancho original
    Si gDoctoInventario = 0
      Columnas 24;2.09,0.15,0.00,0.00,5.83,0.15,0.60,0.15,1.94,0.15,0.45,0.15,2.09,0.15,2.09,0.15,1.49,0.15,1.49,0.15,1.49,0.15,2.09,0.15
    SiNo // Doscto de inventario
      Columnas 24;2.09,0.15,0.00,0.00,5.83,0.15,0.60,0.15,1.94,0.15,0.45,0.15,2.09,0.15,2.09,0.15,1.49,0.15,0
      Si gDocumentoDe = 33 O gDocumentoDe = 34  //hva
        Columnas 24;2.09,0.15,0.00,0.00,3.6,0.15,0.60,0.15,1.5,0.15,0.15,0.15,2.1,0.15,2.65,0.15, 2.35, 0.15, 2.65, 0.15
      FinSi       
    FinSi
  FinSi
FinFunc


// *****************************************************************************
//  fProcesaMovimientosOcultos
//
//  Esta función lee los movimientos ocultos para desplegar los componentes
//  de paquetes y/o características de productos.
//
//  Parámetros
//
//  Salidas
//	25/06/2008  N.D.4145   Se quitan los movimientos ocultos de entrada cuando es un traspaso
// *****************************************************************************
DefFunc fProcesaMovimientosOcultos(atProducto: Tabla; atMovimiento: Tabla)
Local lTextoComponentes, lTextoCaracteristicas

  // Inicializa los valores de las banderas de textos
  lTextoComponentes = 0 // No se ha impreso el texto "Componentes del paquete"
  lTextoCaracteristicas = 0 // No se ha impreso el texto "Características"

  // Busca los movimientos ocultos del movimiento
  Mientras [ tMovimientoOculto.Busca[@Str(atMovimiento(cIdMovimiento);0)]; tMovimientoOculto->Encontro; tMovimientoOculto.Busca Siguiente[1] ]
    // Verifica si el documento es una remisión o una devolución de remisiones (clientes)
    // En este caso al ser un traspaso entre almacenes, tenemos que discriminar uno de los movimientos ocultos
    Si gDocumentoDe = 3 // Si es una remisión
      // Discrimina los movimientos de Entrada
      Si tMovimientoOculto(cAfectaExistencia) = 1
        Continua
      FinSi
    FinSi
    Si gDocumentoDe = 6 // Si es una devolución de remisión
      // Discrimina los movimientos de Salida
      Si tMovimientoOculto(cAfectaExistencia) = 2
        Continua
      FinSi
    FinSi
    //N.D. 4145
    Si gDocumentoDe = 34 // Si es un trapaso
      // Discrimina los movimientos de Entrada
      Si tMovimientoOculto(cAfectaExistencia) = 1  
        Continua
      FinSi
    FinSi
    // fin N.D. 4145
    // Busca el producto del movimiento oculto
    tDetalleProducto.Busca[@Str(tMovimientoOculto(cIdProducto);0)]
    SI !tDetalleProducto->Encontro
      Continua
    FinSi

		// No se debe procesar los movimientos ocultos que sean productos con características y 
		// formen parte de un paquete
		SI tMovimientoOculto(cMovtoOculto) = 2
			Continua
		FinSi

    // Si el producto es un componente de paquete
    Si atProducto(cTipoProducto) = 2
      // Si el movimiento oculto pertenece a un producto (componente del paquete)
      Si tDetalleProducto(cTipoProducto) = 0
        fImprimeComponente(tMovimientoOculto(cIdProducto); tMovimientoOculto; &lTextoComponentes)
        // Imprime series
        fProcesaSeries(tMovimientoOculto; 1)
        // Imprime lotes
        fProcesaCapas(atProducto; tMovimientoOculto; 2)
        // Imprime pedimentos
        fProcesaCapas(atProducto; tMovimientoOculto; 3)
      Sino // El movimiento oculto pertenece a un detalle de características del componente del paquete
        // Imprime el componente
        fImprimeComponente(tDetalleProducto(cIdProductoPadre); tMovimientoOculto; &lTextoComponentes)
        lTextoCaracteristicas = 0 // No se ha impreso el texto "Características"
        // Imprime la característica
        fImprimeCaracteristicas(tDetalleProducto; tMovimientoOculto; &lTextoCaracteristicas)
      FinSi
    Sino
      Si tDetalleProducto(cTipoProducto) = 1 // Detalle de productos con características?
        // Imprime la característica
        fImprimeCaracteristicas(tDetalleProducto; tMovimientoOculto; &lTextoCaracteristicas)

	// inicia modificacion hva

        // Imprime series
        fProcesaSeries(tMovimientoOculto; 1)
        // Imprime lotes
        fProcesaCapas(atProducto; tMovimientoOculto; 2)
        // Imprime pedimentos
        fProcesaCapas(atProducto; tMovimientoOculto; 3)


	// termina modificacion hva

      FinSi
    FinSi
  FinMientras

  Retorna lTextoComponentes
FinFunc


// *****************************************************************************
//  fProcesaDocumento
//
//  Esta función lee y procesa los movimientos del documento.
//
//  Parámetros
//
//  Salidas
// *****************************************************************************
DefFunc fProcesaDocumento(atDocumento: Tabla)
Local lSaltaLin

  lSaltaLin = 0 // Indica si saltar linea despues de imprimir componentes
  Mientras [ tMovimiento.Busca[@Str(atDocumento(cIdDocumento);0)]; tMovimiento->Encontro; tMovimiento.Busca Siguiente[1] ] 
    Si lSaltaLin
      SaltaLin
    FinSi
    // lee el producto
    tProducto.Busca[@Str(tMovimiento(cIdProducto);0)]
    Si !tProducto->Encontro
      Continua
    FinSi
    // Imprime el movimiento
    fImprimeMovimiento(tProducto; tMovimiento)
    // Si el producto tiene componentes, los imprime
    // Imprime características
    lSaltaLin = fProcesaMovimientosOcultos(tProducto; tMovimiento)
    // Imprime series
    fProcesaSeries(tMovimiento; 1)
    // Imprime lotes
    fProcesaCapas(tProducto; tMovimiento; 2)
    // Imprime pedimentos
    fProcesaCapas(tProducto; tMovimiento; 3)
  FinMientras
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

  Texto '^@TC{0,0,0}@S{16}MOVIMIENTOS DETALLADOS'
  Imprime 1

  Texto '@TC{0,0,0}@L{-1}'
  Imprime
  Texto C0;'Código'
  Texto C4;'Nombre del producto'
  Texto C6;'^Alm.'
  Texto C8;'^Cantidad'
  Si gDoctoInventario = 0
    Texto C12;'^Precio'
    Texto C14;'^Neto'
    Texto C16;'^Descuento'
    Texto C18;'^Impuesto'
    Texto C20;'^Retención'
    Texto C22;'^Total'
  SiNo
    Si gDocumentoDe = 33 O gDocumentoDe = 34  
      Texto C12;'"Costo Capturado'
      Texto C14;'"Total Costo Capturado'
      Texto C16;'"Costo Calculado'
      Texto C18;'"Total Costo Movimiento'
    Sino
      Texto C12;'"Costo Capturado'
      Texto C14;'"Total Costo Movimiento'
    FinSi
  FinSi
  Imprime
  Texto '@TC{0,0,0}@L{-1}'
  Imprime 1

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


// *****************************************************************************
// Cuerpo del reporte

Si gProcesa = 1
  // Configura los decimales del reporte
  fConfiguraDecimales(tDocumento(cIdMoneda))
  fProcesaDocumento(tDocumento)
FinSi

