// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// Reporte:     Productos Remisionados por Numero de Serie     
//
// Sistema:     ADMINPAQ  Versión v1.0 Windows
//
// Descripcion: 
// 
// 
// Consideraciones :
// Fernando Gonzalez      30/septiembre/2002 
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Historia de modificaciones
//  Fecha       Nombre   IDLotus      Descripcion
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
//  06/04/09    JENL        5756      EL REPORE DE NUMEROS DE SERIE REMISIONADAS POR CLIENTE EN EL MENU
//                                    DE REPORTES REPORTES DE VENTA NO RESPETA EL RANGO DE FECHAS
//                                    ASIGNADAS EN EL FILTRO DE FECHAS.
//                                    Se modifico: Principal
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

// *************************************************************************************************
// LIBRERIAS
// *************************************************************************************************
Incluye LibAdminPAQ.Rpt
Incluye LibInventariosO.Rpt

// *************************************************************************************************
// INICIO PARAMETROS
// *************************************************************************************************
  Parametro pFechaInicial     = '20020101'	
  Parametro pFechaFinal       = '20021231'	
  Parametro pProductoInicial  = ' '
  Parametro pProductoFinal    = ' '
  Parametro pClienteInicial   = ' '
  Parametro pClienteFinal     = ' '
  Parametro pIdConceptos      = '3'  //Id's de los conceptos de remision seleccionados
  Parametro pEstadoProducto   = 0  //0 = Todos·	1 = Productos Activos·	2 = Productos Inactivos


// *************************************************************************************************
// INICIO APERTURA TABLAS
// *************************************************************************************************
  UsaEmpresa tEmpresa;'AdminpaqW'

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

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

  UsaTabla tProductos = tEmpresa['MGW10005']
  tProductos.UsaIndice['iCodigoTipo']

  UsaTabla tConcepto = tEmpresa['MGW10006']		
  tConcepto.UsaIndice['']

  UsaTabla tDocumentos = tEmpresa['MGW10008']		
  tDocumentos.UsaIndice['']

  UsaTabla tMovimientos = tEmpresa['MGW10010']		
  tMovimientos.UsaIndice['iProductoDoctoDeAfecFecha']

  UsaTabla tSerie = tEmpresa['MGW10032']			
  tSerie.UsaIndice['']

  UsaTabla tMovimientoSerie = tEmpresa['MGW10036']
  tMovimientoSerie.UsaIndice['']

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

  tParametros.Busca Primero   


// *************************************************************************************************
//DEFINICION DE COLUMNAS 
// Ancho de columnas = caracteres / 17 * 2.54
// *************************************************************************************************
  // Campo              Tamaño en caracteres  Tamaño en centimetros aprox
  // Fecha                12                   1.80
  // Serie                 4                   0.70 
  // Folio                12                   1.80
  // Concepto             20                   3.00 
  // Cliente              30                   4.50 
  // Numero de serie      25                   3.75
  // Estado de la serie   20                   3.00
  Columnas 14;1.80,0.15,0.70,0.15,1.80,0.15,3.00,0.15,4.50,0.15,3.75,0.15,3.00,0

  UsaLetra 'Arial'
  Altura 9 
  [C4].Decimales 0

// *************************************************************************************************
//VARIABLES GLOBALES 
// *************************************************************************************************
  gIdioma = 0               // Idioma del reporte
                            // 0 = Español
                            // 1 = Inglés
  gRenglon = '' 

// *************************************************************************************************
// FUNCIONES
// *************************************************************************************************


// *************************************************************************************************
// ENCABEZADO 
// *************************************************************************************************
  Encab
    Texto '@TC{255,0,0}@S{8}AdminPAQ' 
 	  Hoja '"@TC{0,0,0}@S{8}Página: '
    Imprime
    Texto '^@TC{0,0,0}@S{22}' & tEmpresa->Nombre
    Texto '"@TC{0,0,0}@S{8}Fecha: ' & fFormateaFecha(@Hoy();gIdioma)
    Imprime
    Texto '^@TC{0,0,0}@S{16}' & 'Reporte de Número de Serie remisionadas por Producto'
    Imprime
    Texto '^@TC{0,0,0}@S{16}'& 'Del ' & fFormateaFecha(pFechaInicial;gIdioma) & ' al ' & fFormateaFecha(pFechaFinal;gIdioma)
    Imprime 
    Texto '"@TC{0,0,0}@S{8}Hora: ' & @Hora()
    Imprime
    NEGRITAS TRUE
    Altura 10
    Texto '@TC{0,0,0}@L{-1}'
    Imprime 

    Texto ''
    Texto C0;'Fecha'
    Texto C2;'Serie'
    Texto C4;'Folio'  
    Texto C6;'Concepto' 
    Texto C8;'Cliente'
    Texto C10;'Número de Serie'
    Texto C12;'Estado de Serie'
    Imprime   

    Texto '@TC{0,0,0}@L{-1}'
    Imprime 
    Texto '@TC{0,0,0}@L{-1}'
    Imprime
    NEGRITAS FALSE
    Altura 10
  FinEncab

// *************************************************************************************************
// PRINCIPAL
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Historia de modificaciones
//  Fecha       IDSite-pruebas    Descripcion
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
//  06/04/09          5756        Se estaba usando un argumento inexistente en la busqueda de
//                                movimientos (JENL)
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// *************************************************************************************************
  gRenglon = ''

  Si pProductoInicial = ' '
    tProductos.Busca Primero
    pProductoInicial = tProductos(cCodigoProducto)
  Finsi
  Si pProductoFinal = ' '
    tProductos.Busca Ultimo
    pProductoFinal =  tProductos(cCodigoProducto)
  Finsi

  Si pClienteInicial = ' '
    tClientes.Busca Primero
    pClienteInicial = tClientes(cCodigoCliente)
  Finsi
  Si pClienteFinal = ' '
    tClientes.Busca Ultimo
    pClienteFinal =  tClientes(cCodigoCliente)
  Finsi

  tClientes.UsaIndice['']

  lIdDocumentoModelo = 3 //Remision
  lTotalSeries = 0

  Mientras[tProductos.Busca[pProductoInicial & '..'  & pProductoFinal]; tProductos->Encontro; tProductos.Busca Siguiente[1]]
    // Discrimina el producto 0
    Si tProductos(cIdProducto) = 0
      Continua
    FinSi

    // Discrimina productos cuyo control de existencia es diferente de series
    // El campo cControlExistencia es un mapa de bits. Los valores que nos interesa son:
    // 00100 = Series
    // 01000 = Pedimentos
    // 10000 = Lotes
    // Las combinaciones posibles para series son:
    // Series = 00100 = 4
    // Series-Pedimentos = 01100 = 12
    // Series-Lotes = 10100= 20
    // Series-Pedimentos-Lotes = 11100 = 28
    Si tProductos(cControlExistencia) != 4 y tProductos(cControlExistencia) != 12 y tProductos(cControlExistencia) != 20 y tProductos(cControlExistencia) != 28
      Continua
    FinSi

    Si (pEstadoProducto != 0) Y (pEstadoProducto-1 != tProductos(cStatusProducto))  
      Continua
    FinSi

    ///Imprimir datos del Producto
    NEGRITAS TRUE
    Columnas 6;1.25,0.15,6.00,0.15,6.00,0
    Texto C0;'Producto'
    Texto C2;tProductos(cCodigoProducto)
    Imprime   
    Texto C0;'Nombre'
    Texto C2;tProductos(cNombreProducto)
    Imprime
    NEGRITAS FALSE
    Columnas 14;1.80,0.15,0.70,0.15,1.80,0.15,3.00,0.15,4.50,0.15,3.75,0.15,3.00,0

    // N.D.4048 Búsqueda de un movimiento del producto a la fecha inicial del reporte
    gFechaBusqueda = pFechaInicial
    // NOTA: Es obligatorio volver a fijar el índice a fin de que las búsquedas parciales funcionen correctamente
    tMovimientos.Usaindice['iProductoDoctoDeAfecFecha']
    tMovimientos.busca[tProductos(cIdProducto) & ':' & lIdDocumentoModelo & ':1:' & gFechaBusqueda]
    Si !tMovimientos->ENCONTRO
      // Busquedas parciales: Cursor en el registro más cercano que cumple con la llave
      // NOTA: La propiedad Llave de la tabla nos regresa la llave más cercana que cumple con el criterio de la búsqueda
      //       La llave está en formato cadena y no tiene ningún separador entre los campos, por lo que es necesario revisar
      //      en FoxPro la definición del índice para descomponer los elementos de la Llave
      // Revisar si la llave actual corresponde al Producto / Almacén y al Rango de Fechas.
      Si @Val(@SUBSTR(tMovimientos->Llave;0;11)) = tProductos(cIdProducto)
        Si @Val(@SUBSTR(tMovimientos->Llave;11;11)) = lIdDocumentoModelo
          Si @Val(@SUBSTR(tMovimientos->Llave;22;6)) = 1
            Si @SUBSTR(tMovimientos->Llave;28;8) >= pFechaInicial Y @SUBSTR(tMovimientos->Llave;28;8) <= pFechaFinal
              // Realizar nuevamente la búsqueda a fin de posicionarnos en el registro y activar la propiedad Encontro
              gFechaBusqueda = @SUBSTR(tMovimientos->Llave;28;8)
              //tMovimientos.busca[tProductos(cIdProducto) & ':' & vDocumento & ':1:' & gFechaBusqueda] N.D.5756
              tMovimientos.busca[tProductos(cIdProducto) & ':' & lIdDocumentoModelo & ':1:' & gFechaBusqueda]//N.D.5756
            FinSi
          FinSi
        FinSi
      FinSi        
    FinSi
  
    Mientras tMovimientos->Encontro Y (tMovimientos(cFecha) <= pFechaFinal)
      Si tMovimientos(cIdDocumento)
        tDocumentos.Busca[@Str(tMovimientos(cIdDocumento);0)]
      Sino
        lIdDocumento = fIdDocumentoMovtoOwner(tMovimientos; tMovtoOwner) 
        tDocumentos.Busca[@Str(lIdDocumento;0)]
      FinSi
      Si !tDocumentos->Encontro
        tMovimientos.BUSCA SIGUIENTE[3]
        Continua
      FinSi 

      // Discriminación del concepto del documento
      lConceptoIncluido = False
      lNum = 0
      Mientras (!lConceptoIncluido) Y @Escoge(pIdConceptos;lNum) != ''
        Si @Escoge(pIdConceptos;lNum) = tDocumentos(cIdConceptoDocumento)
          lConceptoIncluido = true  
        FinSi
        lNum = lNum +1
      FinMientras
      Si !lConceptoIncluido
        tMovimientos.BUSCA SIGUIENTE[3]
        Continua
      FinSi 

      // Discriminación del cliente del documento
      tClientes.Busca[@Str(tDocumentos(cIdClienteProveedor);0)]
      Si !tClientes->Encontro
        tMovimientos.BUSCA SIGUIENTE[3]
        Continua
      FinSi
      Si (tClientes(cCodigoCliente) > pClienteFinal) O (tClientes(cCodigoCliente) < pClienteInicial)
        tMovimientos.BUSCA SIGUIENTE[3]
        Continua
      FinSi

      tConcepto.Busca[@str(tDocumentos(cIdConceptoDocumento);0)]
      Mientras[tMovimientoSerie.Busca[@Str(tMovimientos(cIdMovimiento);0)]; tMovimientoSerie->Encontro; tMovimientoSerie.Busca Siguiente[1]]
        tSerie.Busca[@Str(tMovimientoSerie(cIdSerie);0)]
        Si !tSerie->Encontro O tMovimientos(cAfectae01) = 2
          Continua
        FinSi

        // No mostrar las series facturadas, no disponibles, disponibles
        Si tSerie(cEstado) = 7 O tSerie(cEstado) = 4 O tSerie(cEstado) = 10 O tSerie(cEstado) = 1 O tSerie(cEstado) = 2
          Continua
        FinSi

        Si tSerie(cEstado) = 5 // huerfana remisionada
          lEstado = 'Remisionada Sin Entrada'
        Sino
    	    Si tSerie(cEstado) = 8 // remisionada
      	    lEstado = 'Remisionada'
        	Sino
            Si tSerie(cEstado) = 12
              lEstado = 'Remisionada de Consignación'
            Sino
              lEstado = 'Estado Erroneo'
            FinSi
          FinSi
        FinSi

        gRenglon = fFormateaFecha(tMovimientos(cFecha);gIdioma)[C0]
        gRenglon = tDocumentos(cSerieDocumento)[C2]
        gRenglon = tDocumentos(cFolio)[C4]
        gRenglon = tConcepto(cNombreConcepto)[C6]
        gRenglon = tClientes(cRazonSocial)[C8]
        gRenglon = tSerie(cNumeroSerie)[C10]
        gRenglon = lEstado[C12]
        Imprime  gRenglon
        lTotalSeries = lTotalSeries + 1
      FinMientras
      // Fin mientras de los movimientos de series del movimiento
      tMovimientos.BUSCA SIGUIENTE[3]
    FinMientras
    // Fin de recorrido de fechas
    Saltalin
  FinMientras
  // Fin mientras de los productos

  Saltalin
  Texto '@TC{0,0,0}@L{-1}'
  Imprime 
  Columnas 5;6.45,0.15,1.80,0
  [C2].Decimales 0
  NEGRITAS TRUE
  gRenglon = ' '
  gRenglon = '"Total Números de Series Remisionadas:'[C0]
  gRenglon = lTotalSeries[C2]
  Imprime gRenglon
  NEGRITAS FALSE
