// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// Reporte:     Reporte de Pedidos por Cliente (pedclien)
//              Reporte de Cotizaciones por Cliente
//              Reporte de Remisiones por Cliente
//              Reporte de Ordenes de Compra por Proveedor
//              Reporte de Consignaciones por Proveedor
//
// Sistema:     ADMINPAQ  Versión v1.0 Windows
//
// Descripcion: 
//
// Consideraciones :
// Creación  :  Luis Palau Castañeda.  15/Agosto/2001
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Historia de modificaciones
//  Fecha      Nombre   IDLotus                     Descripcion
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// 17/05/2007   JAAM    N.C.147     Esquema de adicion de unidades de compra y venta  
// 23/05/2007		ELVS		N.C.146			Se agrega documento modelo cotización del proveedor.
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<


// *************************************************************************************************
// INCLUSION DE ARCHIVOS
// *************************************************************************************************
  Incluye LibAdminPaq.rpt


// *************************************************************************************************
// INICIO PARAMETROS
// *************************************************************************************************
  Parametro pFechaInicial     = '20050401'    // Fecha inicial del rango
  Parametro pFechaFinal       = '20050430'    // Fecha final del rango
  Parametro pClienteInicial   = '(Ninguno)'
  Parametro pClienteFinal     = 'z'
  Parametro pProductoInicial  = '(Ninguno)' 
  Parametro pProductoFinal    = 'z'
  Parametro pUnidad           = 0  // 0 = Unidad Base  
                                   // 1 = Unidad No Equivalente
                                   // 2 = Seleccionar Unidad
                                   // 3 = Unidad de Compra
                                   // 4 = Unidad de Venta
  Parametro pIdUnidad         = 1  // base de datos de unidades (id)
  Parametro pIdMoneda         = 1  // 1 = ID moneda Peso mexicano
  Parametro pTipoReporte      = 1
                                   // 1     Reporte de Pedidos por Cliente    
                                   // 2     Reporte de Cotizaciones por Cliente
                                   // 3     Reporte de Remisiones por Cliente
                                   // 4     Reporte de Ordenes de Compra por Proveedor
                                   // 5     Reporte de Consignaciones por Proveedor
                                   // 6     Reporte de Cotizaciones del Proveedor


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

  // Parametros de la empresa
  UsaTabla tParametros = tEmpresa['mgw10000']     
  // Productos
  UsaTabla tProductos = tEmpresa['mgw10005']
  tProductos.Usaindice['cIdProducto']
  // Clientes
  UsaTabla tClientes = tEmpresa['mgw10002']
  tClientes.Usaindice['iCodigoTipo']
  // Movimientos
  UsaTabla tMovimientos = tEmpresa['mgw10010'] Alias 'Movimientos'
  tMovimientos.Usaindice['iDoctoNumeroMovto']
  // Movimientos Destino
  UsaTabla tMovimientosDestino = tEmpresa['mgw10010'] Alias 'MovtoDestino'
  tMovimientosDestino.Usaindice['cIdMovtoOrigen']     // cIdMovtoOrigen
  // tMovimientosOcultos
  UsaTabla tMovimientosOcultos = tEmpresa['mgw10010'] Alias 'tMovtosOcultos' 
  tMovimientosOcultos.Usaindice['iMovtoOwnerMovto']
  // Documentos
  UsaTabla tDocumentos = tEmpresa['mgw10008']
  tDocumentos.Usaindice['iDocumentoDeClienteFecha']
  //unidades peso y med
  UsaTabla tUnidadesPM = tEmpresa['mgw10026']
  tUnidadesPM.Usaindice['']
  //EquivalenciasUnidades peso y med
  UsaTabla tEquivaleUnidadesPM = tEmpresa['mgw10027']
  tEquivaleUnidadesPM.Usaindice['']
  //Monedas
  UsaTabla tMonedas = tEmpresa['mgw10034']          
  tMonedas.Usaindice['']                     // Usa el índice primario, por cIdMoneda
  //ejercicio-mes
  UsaTabla tEjercicioPeriodo = tEmpresa['mgw10031']          
  tEjercicioPeriodo.Usaindice['']                     
  // TiposCambio 
  Usatabla tTiposCambio = tEmpresa['mgw10035']
  tTiposCambio.Usaindice['iMonedaFecha']                                 


// *************************************************************************************************
  tParametros.Busca Primero   
  // Esta función se debe ejecutar antes del cuerpo del reporte, para inicializar algunas valores
  // Globales para la biblioteca LibAdminPAQ.rpt
  tEjercicioPeriodo.Usaindice['cNumeroEjercicio']                     
  fIniFechasHistoria(tEjercicioPeriodo)
  tEjercicioPeriodo.Usaindice['']                     


// *************************************************************************************************
// DEFINICION DE COLUMNAS 
// *************************************************************************************************
// Si se trata de los reportes de remisiones se agrega una columa más, por lo que las columnas existentes se reducen de tamaño
  Si pTipoReporte = 3 o pTipoReporte = 5
    Columnas 16;2.7,0.15,4.78,0.15,0.75,0.15,2.10,0.15,2.10,0.15,2.10,0.15,2.10,0.15,2.10,0.15
  Sino 
    Columnas 20;2.7,0.15,5.25,0.15,0.75,0.15,2.25,0.15,2.25,0.15,2.25,0.15,2.25,0.15,0
  Finsi
 
  UsaLetra 'Arial'
  Altura 9 
  [C0..C5].Decimales 0
  [C0..C5].Blanco ' '
  tMonedas.Busca[@Str(pIdMoneda;0)]
  gDecimales = tMonedas(cDecimalesMoneda)
  Si pTipoReporte = 3 o pTipoReporte = 5
    [C6..C14].Coma
    [C4, C6..C12].Decimales tParametros(cDecimalesUnidades) // Decimales para unidades
    [C14].Decimales gDecimales
    [C4, C6..C14].Blanco // N.D.4250 No asignar este valor por omisión ya que deseamos que se muestre en base a la configuración de la columna '0.00'
    [C7,C9,C11,C13..C19].Blanco ''
  Sino 
    [C6..C12].Coma
    [C4, C6..C10].Decimales tParametros(cDecimalesUnidades) // Decimales para unidades
    [C12].Decimales gDecimales
    [C4, C6..C12].Blanco // N.D.4250 No asignar este valor por omisión ya que deseamos que se muestre en base a la configuración de la columna '0.00'
    [C7,C9,C11,C13..C19].Blanco ''
  Finsi 


// *************************************************************************************************
// VARIABLES GLOBALES 
// *************************************************************************************************
  vFechaIni = ''
  gRenglon = '' 
  gTotalCliente = ''
  gTotalGral = ''
  gTotalPaquetes = ''
  gTotalClientePaquetes = ''
  gUnidad = pUnidad
  gIdUnidad = pIdUnidad
  idRenglonIni = 5  //inicio de la hoja
  idRenglonFin = 5  //fin de la hoja (inicializacion)
  vDocumento = 0
  gNombreMoneda = tMonedas(cNombreMoneda)
 
  kMeses = 'Ene,Feb,Mar,Abr,May,Jun,Jul,Ago,Sep,Oct,Nov,Dic'[C0]


// *************************************************************************************************
// FUNCIONES
// *************************************************************************************************
// =================================================================================================
// Función área sensible al contexto
// =================================================================================================
DefFunc ContextoDetalleCliente(aNumeroColumna; aValor)
Local lTipoReporte

    Si pTipoReporte = 1   // 1    Reporte de pedidos por Cliente
       lTipoReporte = 1   // 1.   Reporte Detallado de pedidos agrupados por cliente
    FinSi
    Si pTipoReporte = 2   // 2    Reporte de cotizaciones por Cliente
       lTipoReporte = 4   // 4.   Reporte Detallado de Cotizaciones agrupado por cliente
    FinSi
    Si pTipoReporte = 3   // 3    Reporte de remisiones por Cliente
       lTipoReporte = 7   // 7.   Reporte Detallado de Remisiones agrupado por cliente
    FinSi
    Si pTipoReporte = 4   // 4    Reporte de ordenes de compra por Proveedor
       lTipoReporte = 10  //10.   Reporte Detallado de ordenes de compra agrupado por proveedor
    FinSi
    Si pTipoReporte = 5   // 5    Reporte de consignaciones por Proveedor
       lTipoReporte = 12  //12.   Reporte Detallado de consignaciones agrupadas por proveedor
    FinSi
		//N.C.146
    Si pTipoReporte = 6   // 6    Reporte de consignaciones por Proveedor
       lTipoReporte = 0  	//   		Revisar por definir
    FinSi
    EJECUTA tEmpresa->SysDirDatos & '\Reportes\AdminPAQ\ImpPed.RTW';lTipoReporte,pFechaInicial,pFechaFinal,' ',' ',aValor,aValor,' ',' ',' ',0,0,1,0,0,0,pIdMoneda,0,0,0,0,0,0;tEmpresa->Directorio
FinFunc


// *************************************************************************************************
// Descripcion: Esta función recibe una fecha con formato ddmmaaaa y la convierte a formato dd/mmm/aaaa
// Entradas :  Fecha : contiene la fecha AAAAMMDD
// Salida :    regresa una cadena con la fecha en formato DD/MMM/AAAA
// *************************************************************************************************
DefFunc fEditaFecha(aFecha)
Local lMes
Local lRegreso

  lMes = @INT(@SubStr(aFecha;4;2))
  lRegreso[0] = @SubStr(aFecha;6;2) & '/' & @Escoge(kMeses;lMes-1) & '/' & @SubStr(aFecha;0;4)
  Retorna lRegreso
FinFunc


// *************************************************************************************************
// Descripcion: imprime los totales generales de las variables gTotalGral
// Entradas :  
// Salida :    
// *************************************************************************************************
DefFunc fTotalGeneral()

  local LTotalLinea
  LTotalLinea = '==========================='[c0]
  Texto c6; @col(LTotalLinea;0)
  Texto c8; @col(LTotalLinea;0)
  Texto c10; @col(LTotalLinea;0)
  Texto c12; @col(LTotalLinea;0)
  Si pTipoReporte = 3 o pTipoReporte = 5
    Texto c14; @col(LTotalLinea;0)
  FinSi 
  imprime

  gTotalGral = '' [c0..c4]
  gTotalGral[2] = 'Total General'
  imprime gTotalGral
  gTotalGral = ''
  Si @Col(gTotalPaquetes; 6) > 0
    gTotalPaquetes = ''[c0..c3]
    gTotalPaquetes[2] = 'Total Cantidad de Paquetes'
    Imprime gTotalPaquetes
  FinSi
Finfunc


// *************************************************************************************************
// Descripcion: imprime los totales  de las variable gRenglon y suma los totales 
// Entradas :  
// Salida :    
// *************************************************************************************************
DefFunc fRenglon(aTipoProducto)

  si @col(gRenglon;14)=''
    gRenglon[14] = '"0.00 '
  finsi

  imprime gRenglon
  // Acumula a los Totales
  Si aTipoProducto = 2
    // En caso de paquetes acumular las unidades al total de paquetes
    gTotalPaquetes = gTotalPaquetes + gRenglon[C6,C8,C10]
    gTotalClientePaquetes = gTotalClientePaquetes + gRenglon[C6,C8,C10]
    // Acumular los restantes importes
    gTotalGral = gTotalGral + gRenglon[C12,C14]
    gTotalCliente = gTotalCliente + gRenglon[C12,C14]
  Sino
    // Acumular las cantidades
    gTotalGral  = gTotalGral + gRenglon
    gTotalCliente = gTotalCliente + gRenglon
  FinSi
  gRenglon = '' 
Finfunc


// *************************************************************************************************
// Descripcion: imprime los totales del Cliente de las variables gTotalCliente
// Entradas :  
// Salida :    
// *************************************************************************************************
DefFunc fTotalCliente()

  DEFREGION ContextoDetalleCliente
  Si pTipoReporte = 3 o pTipoReporte = 5
    Si @col(gTotalCliente;6)!=0
      Texto '@L{6,8,10,12,14}'
      imprime
      gTotalCliente = '' [c0..c4]
			//N.C.146 Se agrega pTipoReporte = 6 que es de cotización del proveedor
      Si pTipoReporte = 4 O pTipoReporte = 5 O pTipoReporte = 6 
        gTotalCliente[2] = 'Total Proveedor'
      Sino
        gTotalCliente[2] = 'Total Cliente'
      FinSi
      Si @col(gTotalCliente;6)!=0
        [C6].REGIONINFO tClientes(cCodigoCliente)
      FinSi
      imprime gTotalCliente
    Finsi
  Sino 
    Si @col(gTotalCliente;6)!=0
      Texto '@L{6,8,10,12}'
      imprime
      gTotalCliente = '' [c0..c4]
			//N.C.146 Se agrega pTipoReporte = 6 que es de cotización del proveedor
      Si pTipoReporte = 4 O pTipoReporte = 5 O pTipoReporte = 6 
        gTotalCliente[2] = 'Total Proveedor'
      Sino
        gTotalCliente[2] = 'Total Cliente'
      FinSi
      Si @col(gTotalCliente;6)!=0
        [C6].REGIONINFO tClientes(cCodigoCliente)
      FinSi
      imprime gTotalCliente
    Finsi
  Finsi 

  Si @Col(gTotalClientePaquetes; 6) > 0
    gTotalClientePaquetes = ''[c0..c3]
    gTotalClientePaquetes[2] = 'Total Cantidad de Paquetes'
    Imprime gTotalClientePaquetes
  FinSi
  gTotalClientePaquetes = ''

  gTotalCliente  = ''
Finfunc


// *************************************************************************************************
// Descripcion: imprime los datos del Cliente  o Proveedor
// Entradas :  
// Salida :    
// *************************************************************************************************
Deffunc ImprimeCP()
local vimprime
  // Si se trata de los reportes de remisiones se agrega una columa más, por lo que las columnas existentes
  // se reducen de tamaño
  Si pTipoReporte = 3 o pTipoReporte = 5
    Columnas 16;2.7,0.15,4.78,0.15,0.75,0.15,2.10,0.15,2.10,0.15,2.10,0.15,2.10,0.15,2.10,0.15
  Sino 
    Columnas 20;1.5,0.15,6.6,0.15,1.5,0.15,0.9,0.15,1.65,0.15,1.65,0.15,1.65,0.15,0,0,0
  Finsi 
   Negritas True

   Si pTipoReporte = 1 O pTipoReporte = 2 O pTipoReporte = 3
     vimprime = 'Cliente:' [c0]
   Sino
     vimprime = 'Proveedor:' [c0]
   Finsi
   vimprime = fMascarilla(tClientes(cCodigoCliente);tParametros(cMascarillaClientes)) [c2]
   imprime vimprime
   vimprime = 'Nombre:' [c0]
   vimprime = tClientes(cRazonSocial) [c2]
   imprime vimprime
   Negritas False

  // Si se trata de los reportes de remisiones se agrega una columa más, por lo que las columnas existentes
  // se reducen de tamaño
  Si pTipoReporte = 3 o pTipoReporte = 5
    Columnas 16;2.7,0.15,4.78,0.15,0.75,0.15,2.10,0.15,2.10,0.15,2.10,0.15,2.10,0.15,2.10,0.15
  Sino 
    Columnas 20;2.7,0.15,5.25,0.15,0.75,0.15,2.25,0.15,2.25,0.15,2.25,0.15,2.25,0.15,0
  Finsi 
Finfunc


// *************************************************************************************************
// Descripcion: lista la hoja de trabajo
// Entradas :  rango de renglones
// Salida :   
// *************************************************************************************************
DefFunc Imprimehoja()
local idtemp
   //si el cliente tiene movimientos en el mes 
  Si idRenglonIni <idRenglonFin
    ImprimeCP()
    idtemp = idRenglonIni
    Mientras  @col(idtemp;0) <@col(idRenglonFin;0)
      gRenglon [0]= @col({idtemp};1)
      gRenglon [2]= @col({idtemp};2)
      gRenglon [4]= @col({idtemp};3)
      gRenglon [6]= @col({idtemp};4)
      gRenglon [8]= @col({idtemp};5)
      gRenglon [10]= @col({idtemp};6)
      gRenglon [12]= @col({idtemp};7)
      Si pTipoReporte = 3 o pTipoReporte = 5
        gRenglon [14] = @col({idtemp};8)
      Finsi
      fRenglon(@col({idtemp};9))
      {idtemp} = ''[c0..c9]
      idtemp [0] = @col(idtemp;0) +1
    finmientras
  Finsi
  idRenglonFin = idRenglonIni
FinFunc


// *************************************************************************************************
// Descripcion:  busca en la hoja de calculo si el producto ya existe y si no lo inserta
// Entradas :   el producto
// Salida :   id del renglon
// *************************************************************************************************
DefFunc fAgregaProducto(cProducto)  
local idtemp
  vRegreso = 0
  idtemp = idRenglonIni 
  Mientras  @col(idtemp;0)<@col(idRenglonFin;0)
    Si @col(cProducto;0) = @col({idtemp};1)
      vRegreso = idtemp
      FinCiclo
    finsi
    idtemp = @col(idtemp;0) +1[c0]
  Finmientras

  Si vRegreso = 0  
    {idtemp}[1] = @col(cProducto;0)
    vRegreso = idtemp
    idRenglonFin = vRegreso + 1
  Finsi
FinFunc


// *************************************************************************************************
//  Esta función ordena los elemantos de la hoja de trabajo basados en el código
//  Utiliza el algoritmo de Buble Sort
// *************************************************************************************************
DefFunc OrdenaHoja(vInicio; vCuantos)
Local vTmp, vj, vi, vc1, vc2

  vi = 0[C0]
  Mientras vi < vCuantos - 1
    vj = 0[C0]
    Mientras vj < vCuantos - vi - 1
      vc1 = vInicio + vj
      vc2 = vInicio + vj + 1
      // verifica la columna a comparar
      Si @Col({vc1};1) > @Col({vc2};1)
        vTmp = {vc1}[C1..C9]
        {vc1} = {vc2}[C1..C9]
        {vc2} = vTmp[C1..C9]
      Finsi
      vj = vj + 1[C0]
    FinMientras
    vi = vi + 1[C0]
  FinMientras   
FinFunc


// *************************************************************************************************
// ENCABEZADO 
// *************************************************************************************************
Encab
  Texto '@TC{255,0,0}@S{8}AdminPAQ' 
  Hoja '"@TC{0,0,0}@S{8}Página: '
  Imprime

  Texto '@TC{0,0,0}@S{8}Moneda: '& gNombreMoneda
  Texto '^@TC{0,0,0}@S{22}' & tEmpresa->Nombre
  Texto '"@TC{0,0,0}@S{8}Fecha: ' & fEditaFecha(@Hoy())
  Imprime

  Si pTipoReporte = 1
    Texto '^@TC{0,0,0}@S{16}' & 'Reporte de Pedidos por Cliente'
  Sino
    Si pTipoReporte = 2
      Texto '^@TC{0,0,0}@S{16}' & 'Reporte de Cotizaciones por Cliente'
    Sino
      Si pTipoReporte = 3
        Texto '^@TC{0,0,0}@S{16}' & 'Reporte de Remisiones por Cliente'
      sino
        Si pTipoReporte = 4
          Texto '^@TC{0,0,0}@S{16}' & 'Reporte de Ordenes de Compra por Proveedor'
				Sino
        	Si pTipoReporte = 5
          	Texto '^@TC{0,0,0}@S{16}' & 'Reporte de Consignaciones por Proveedor'
					//N.C.146
					Sino
          	Texto '^@TC{0,0,0}@S{16}' & 'Reporte de Cotizaciones del Proveedor'
					FinSi
        Finsi 
      Finsi
    Finsi
  Finsi
  Texto '"@TC{0,0,0}@S{8}Hora: ' & @Hora()
  Imprime

  Texto '^@TC{0,0,0}@S{16}'& 'Del: ' & fEditaFecha(pFechaInicial) & ' al: ' & fEditaFecha(pFechaFinal)
  Imprime 

  NEGRITAS TRUE
  Altura 10
  Si pTipoReporte = 3 o pTipoReporte = 5
    // Código         Nombre(Producto)                            Cantidad     Facturado     Devueltos     Pendientes    Total                      
    Columnas 16;2.7,0.15,4.78,0.15,0.75,0.15,2.10,0.15,2.10,0.15,2.10,0.15,2.10,0.15,2.10,0.15
  Sino
    Columnas 20;2.7,0.15,5.25,0.15,0.75,0.15,2.25,0.15,2.25,0.15,2.25,0.15,2.25,0.15,0
  Finsi
  Texto '@TC{0,0,0}@L{-1}'
  Imprime 

  Texto C0;'Código'
  Texto C2;'Nombre (Producto)'
  Texto c4;'' 
  Texto c6;'^Cantidad' 
	//N.C.146
  Si pTipoReporte = 4 o pTipoReporte = 5 o pTipoReporte = 6
    Texto c8;'^Recibidos'
  Sino  
    Si pTipoReporte = 3
      Texto c8;'^Facturado'
    Sino
      Texto c8;'^Surtidos'
    Finsi
  Finsi
  Si pTipoReporte = 3 o pTipoReporte = 5
    Texto c10;'^Devuelto'
    Texto c12;'^Pendientes'
    Texto c14;'^Total'
  Sino
    Texto c10;'^Pendientes'
    Texto c12;'^Total'
  Finsi  
  Imprime   
  Texto '@TC{0,0,0}@L{-1}'
  Imprime 

  NEGRITAS FALSE
  Altura 10
FinEncab


// *************************************************************************************************
// PRINCIPAL <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// *************************************************************************************************
//vDocumento =  2(pedidos), 1(cotizaciones), 3(remisiones), 17(ordenes de compra), 18(consignaciones), 38(cotizaciones del proveedor)
Si pTipoReporte = 1
  vDocumento = 2
Sino
  Si pTipoReporte = 2
    vDocumento = 1
  Sino
    Si pTipoReporte = 3
      vDocumento = 3
    sino
      Si pTipoReporte = 4
        vDocumento = 17
      Sino
				Si pTipoReporte = 5
	        vDocumento = 18
				Sino
					Si pTipoReporte = 6
		        vDocumento = 38
					Finsi				
				FinSi
      Finsi
    Finsi 
  Finsi
Finsi

gRenglon = '' 
gTotalGral = ''
gTotalCliente  = ''
gIdMonedaCte = 1

Si @str(pClienteInicial;0) = ' '
  tClientes.busca Primero
Sino
  tClientes.busca[@str(pClienteInicial;0) & ':']
Finsi

Mientras tClientes->Encontro
  Si @str(pClienteFinal;0) != ' '
    Si tClientes(cCodigoCliente)> @str(pClienteFinal;0)
      Finciclo
    Finsi 
  Finsi
  
  // Se salta el Cliente NINGUNO
  Si tClientes(cIdClienteProveedor) = 0
    tClientes.Saltareg[1]
    Continua  
  Finsi
  
  // Si se requieren los clientes y no se trata de un cliente:(1=cliente,2=cliente/provedor,3= proveedor)
  Si pTipoReporte < 4 Y ((pTipoReporte = 1 )  Y (tClientes(cTipoCliente) > 2))
    tClientes.saltareg[1]
    Continua
  Finsi
  // Si se requieren los Proveedores y no se trata de un Proveedor
  Si pTipoReporte > 3 Y ((pTipoReporte = 2 )  Y (tClientes(cTipoCliente) < 2))
    tClientes.saltareg[1]
    Continua
  Finsi

  gIdMonedaCte = tClientes(cIdMoneda)

  // 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
  tDocumentos.Usaindice['iDocumentoDeClienteFecha']
  tDocumentos.busca[vDocumento & ':' & tClientes(cIdClienteProveedor) & ':' & gFechaBusqueda]
  Si !tDocumentos->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 vDocumento = @Val(@SUBSTR(tDocumentos->Llave;0;11))
      Si tClientes(cIdClienteProveedor) = @Val(@SUBSTR(tDocumentos->Llave;11;11))
        Si @SUBSTR(tDocumentos->Llave;22;8) >= pFechaInicial Y @SUBSTR(tDocumentos->Llave;22;8) <= pFechaFinal
          // Realizar nuevamente la búsqueda a fin de posicionarnos en el registro y activar la propiedad Encontro
          gFechaBusqueda = @SUBSTR(tDocumentos->Llave;22;8)
          tDocumentos.busca[vDocumento & ':' & tClientes(cIdClienteProveedor) & ':' & gFechaBusqueda]
        FinSi
      FinSi
    FinSi        
  FinSi
  
  Mientras tDocumentos->Encontro Y (tDocumentos(cFecha) <= pFechaFinal)
      Si tDocumentos(cAfectado) != 1 O tDocumentos(cCancelado) = 1
        tDocumentos.BUSCA SIGUIENTE[2]
        Continua
      FinSi
           
      tMovimientos.busca[@str(tDocumentos(cIdDocumento);0)]
      Mientras tMovimientos->encontro
        Si tMovimientos(cIDdocumento) != @str(tDocumentos(cIdDocumento);0)  
          Finciclo
        Finsi
				//N.C.146
        Si pTipoReporte = 4 o pTipoReporte = 5 o pTipoReporte = 6
          Si tProductos(cTipoProducto) = 2
            tProductos.Saltareg[1]
            continua
          Finsi
        Finsi
        
        tProductos.busca[@str(tMovimientos(cIdProducto);0)]
        
        Si tProductos->encontro y (tProductos(cCodigoProducto) >= @str(pProductoInicial;0) o @str(pProductoInicial;0) = ' ') y (tProductos(cCodigoProducto) <= @str(pProductoFinal;0)o @str(pProductoFinal;0) = ' ')
          fAgregaProducto(fMascarilla(tProductos(cCodigoProducto);tParametros(cMascarillaProducto)))  
          
          //regresa el renglon del susodicho producto
          idRenglon = vRegreso
          fVerificaUnidad(tProductos)
          
          //SI el Producto tiene Unidad de Medida NO Equivalente  "Y" pUnidad = 1
          Si pUnidad = 1 y tProductos(cidUnidadNoConvertible) != 0
           vCantidad = tMovimientos(cUnidadesNC)
            vPendientes= tMovimientos(cUnidadesNCPendientes)
          Sino 
            vCantidad =  tMovimientos(cUnidades)
            vPendientes = tMovimientos(cUnidadesPendientes)
          Finsi
          // Si es el reporte de Remisiones o de Consignaciones buscar los movimientos 
          // destino para determinar si son facturas, compras o devoluciones
          Si pTipoReporte = 3 o pTipoReporte = 5
            Mientras [tMovimientosDestino.busca[@Str(tMovimientos(cIdMovimiento);0)];tMovimientosDestino->encontro;tMovimientosDestino.Busca Siguiente[1]]
              Si tMovimientosDestino(cIdDocumentoDe) = 4  // Factura
                vSurtidas = vSurtidas + tMovimientosDestino(cUnidadesOrigen)
              Finsi
              Si tMovimientosDestino(cIdDocumentoDe) = 6  // Dev. Remisión
                vDevueltas = vDevueltas + tMovimientosDestino(cUnidadesOrigen)
              Finsi
              Si tMovimientosDestino(cIdDocumentoDe) = 19  // Compra
                vSurtidas = vSurtidas + tMovimientosDestino(cUnidadesOrigen)
              Finsi
              Si tMovimientosDestino(cIdDocumentoDe) = 21  // Dev. Consignación
                vDevueltas = vDevueltas + tMovimientosDestino(cUnidadesOrigen)
              Finsi
            FinMientras
          Sino  // No es reporte de remisiones o de consignaciones
            vSurtidas = vCantidad - vPendientes
          Finsi
          
          lsihubocambio =0
          //Convertir Importes en la Moneda del Reporte
          Si pUnidad = 2  Y tProductos(cidUnidadBase) != 0
            //el Producto tiene Unidad de Medida y Peso
            //  Unificar vCantidad de acuerdo a la unidad deseada en el reporte.
            //  EquivalenciaUnidadMedidayPeso.BUSCA[Productos(cIdUnidadBase)+cIdUnidad]  
            tEquivaleUnidadesPM.busca[@str(tProductos(cIdUnidadBase);0) &':'& @str(pIdUnidad;0)]
            Si tEquivaleUnidadesPM->encontro
              vCantidad = vCantidad * tEquivaleUnidadesPM(cFactorConversion)
              vPendientes = vPendientes * tEquivaleUnidadesPM(cFactorConversion)
              vSurtidas = vSurtidas * tEquivaleUnidadesPM(cFactorConversion)
              Si pTipoReporte = 3 o pTipoReporte = 5
                vDevueltas = vDevueltas * tEquivaleUnidadesPM(cFactorConversion)
              Finsi
              lsihubocambio =1
            Finsi
          Finsi
          
          //Se cambia a la moneda especificada
          vMoneda =tDocumentos(cIdMoneda)
          vTotal = tMovimientos(cNeto)-tMovimientos(cDescuento1)-tMovimientos(cDescuento2)-tMovimientos(cDescuento3)- tMovimientos(cDescuento4) - tMovimientos(cDescuento5)    
          
          {idRenglon}[2] = tProductos(cNombreProducto)
          {idRenglon}[9] = tProductos(cTipoProducto)
          Si  pUnidad = 1 y tProductos(cidUnidadNoConvertible) != 0
            tUnidadesPM.busca[@str(tProductos(cidUnidadNoConvertible);0)]
          Sino
            Si pUnidad = 2
              Si lsihubocambio =1 
                tUnidadesPM.busca[@str(@col(pIdUnidad;0);0)]
              Sino 
                tUnidadesPM.busca[@str(tProductos(cIdUnidadBase);0)]
              Finsi
            Sino
              tUnidadesPM.busca[@str(tProductos(cIdUnidadBase);0)]
            Finsi
          Finsi
          
          Si tUnidadesPM->encontro
            Si tUnidadesPM(cDespliegue)='(N)'
              {idRenglon}[3] =''
            Sino
              {idRenglon}[3] =tUnidadesPM(cDespliegue)
            Finsi
          Finsi
          Si pTipoReporte = 3 o pTipoReporte = 5
            {idRenglon}[4] = @col({idRenglon};4) +  @col(vCantidad;0)
            {idRenglon}[5] = @col({idRenglon};5) +  @col(vSurtidas;0)
            {idRenglon}[6] = @col({idRenglon};6) +  @col(vDevueltas;0) 
            {idRenglon}[7] = @col({idRenglon};7) +  @col(vPendientes;0)
            vTotal = fCambiarMonedaDoctoAReporte(tDocumentos; tTiposCambio; vTotal; pIdMoneda; gIdMonedaCte)[C0]
            {idRenglon}[8] = @col({idRenglon};8) +  @col(vTotal ;0)
          Sino 
            {idRenglon}[4] = @col({idRenglon};4) +  @col(vCantidad;0)
            {idRenglon}[5] = @col({idRenglon};5) +  @col(vSurtidas;0)
            {idRenglon}[6] = @col({idRenglon};6) +  @col(vPendientes;0)
            vTotal = fCambiarMonedaDoctoAReporte(tDocumentos; tTiposCambio; vTotal; pIdMoneda; gIdMonedaCte)[C0]
            {idRenglon}[7] = @col({idRenglon};7) +  @col(vTotal ;0)
          Finsi 
          
          vCantidad = 0
          vSurtidas = 0
          vPendientes = 0
          vDevueltas = 0 
          vTotal = 0
          
          //vamos por los movtos hijos del movto origen
          tMovimientosOcultos.busca[@str(tMovimientos(cidMovimiento);0)]
          Mientras tMovimientosOcultos->encontro
            Si tMovimientosOcultos(cIdMovtoOwner)!=tMovimientos(cidMovimiento)
              Finciclo
            Finsi 
            //ped. cot
            Si (tMovimientosOcultos(cIdDocumentoDe) = 1 o tMovimientosOcultos(cIdDocumentoDe) = 2) y (tMovimientosOcultos(cTipoTraspaso)=4)
              tMovimientosOcultos.Saltareg[1]  
              Continua
            Finsi                        
            //remisiones
            Si (tMovimientosOcultos(cIdDocumentoDe) = 3 ) y (tMovimientosOcultos(cTipoTraspaso)!=2)
              tMovimientosOcultos.Saltareg[1]  
              Continua                 
            Finsi                        
						//N.C.146
            //ord. compra ,consig, cotizaciones del proveedor
            Si (tMovimientosOcultos(cIdDocumentoDe) = 17 o tMovimientosOcultos(cIdDocumentoDe) = 18 O tMovimientosOcultos(cIdDocumentoDe) = 38) y (tMovimientosOcultos(cTipoTraspaso)=4)
              tMovimientosOcultos.Saltareg[1]  
              Continua                 
            Finsi
            
            tProductos.busca[@str(tMovimientosOcultos(cIdProducto);0)]
            Si tProductos->encontro y (tProductos(cCodigoProducto) >= @str(pProductoInicial;0) o @str(pProductoInicial;0) = ' ') y (tProductos(cCodigoProducto) <= @str(pProductoFinal;0)o @str(pProductoFinal;0) = ' ')
              fAgregaProducto( fMascarilla(tProductos(cCodigoProducto);tParametros(cMascarillaProducto)))  
              idRenglon = vRegreso
              
              //SI el Producto tiene Unidad de Medida NO Equivalente  "Y" pUnidad = 1
              Si pUnidad = 1 y tProductos(cidUnidadNoConvertible) != 0
                vCantidad = tMovimientosOcultos(cUnidadesNC)
                vPendientes= tMovimientosOcultos(cUnidadesNCPendientes)
              Sino 
                vCantidad =  tMovimientosOcultos(cUnidades)
                vPendientes = tMovimientosOcultos(cUnidadesPendientes)
              Finsi
              // Si es el reporte de Remisiones o de Consignaciones buscar los movimientos 
              // destino para determinar si son facturas, compras o devoluciones
              Si pTipoReporte = 3 o pTipoReporte = 5
                Mientras [tMovimientosDestino.busca[@Str(tMovimientosOcultos(cIdMovimiento);0)];tMovimientosDestino->encontro;tMovimientosDestino.Busca Siguiente[1]]
                  Si tMovimientosDestino(cIdDocumentoDe) = 4  // Factura
                    vSurtidas = vSurtidas + tMovimientosDestino(cUnidadesOrigen)
                  Finsi
                  Si tMovimientosDestino(cIdDocumentoDe) = 6  // Dev. Remisión
                    vDevueltas = vDevueltas + tMovimientosDestino(cUnidadesOrigen)
                  Finsi
                  Si tMovimientosDestino(cIdDocumentoDe) = 19  // Compra
                    vSurtidas = vSurtidas + tMovimientosDestino(cUnidadesOrigen)
                  Finsi
                  Si tMovimientosDestino(cIdDocumentoDe) = 21  // Dev. Consignación
                    vDevueltas = vDevueltas + tMovimientosDestino(cUnidadesOrigen)
                  Finsi
                FinMientras
              Sino  // No es reporte de remisiones o de consignaciones
                vSurtidas = vCantidad - vPendientes
              Finsi
              
              lsihubocambio =0
              //Convertir Importes en la Moneda del Reporte
              Si pUnidad = 2  Y tProductos(cidUnidadBase) != 0
                //el Producto tiene Unidad de Medida y Peso
                //  Unificar vCantidad de acuerdo a la unidad deseada en el reporte.
                //  EquivalenciaUnidadMedidayPeso.BUSCA[Productos(cIdUnidadBase)+cIdUnidad]  
                tEquivaleUnidadesPM.busca[@str(tProductos(cIdUnidadBase);0) &':'& @str(pIdUnidad;0)]
                Si tEquivaleUnidadesPM->encontro
                  vCantidad = vCantidad * tEquivaleUnidadesPM(cFactorConversion)
                  vPendientes = vPendientes * tEquivaleUnidadesPM(cFactorConversion)
                  vSurtidas = vSurtidas * tEquivaleUnidadesPM(cFactorConversion)
                  Si pTipoReporte = 3 o pTipoReporte = 5
                    vDevueltas = vDevueltas * tEquivaleUnidadesPM(cFactorConversion)
                  Finsi
                  lsihubocambio =1
                Finsi
              Finsi
              
              //Se cambia a la moneda especificada
              vMoneda =tDocumentos(cIdMoneda)
              vTotal = tMovimientosOcultos(cNeto)-tMovimientosOcultos(cDescuento1)-tMovimientosOcultos(cDescuento2)-tMovimientosOcultos(cDescuento3)- tMovimientosOcultos(cDescuento4) - tMovimientosOcultos(cDescuento5)             
              
              {idRenglon}[2] = tProductos(cNombreProducto)
              {idRenglon}[9] = tProductos(cTipoProducto)          
              Si  pUnidad = 1 y tProductos(cidUnidadNoConvertible) != 0
                tUnidadesPM.busca[@str(tProductos(cidUnidadNoConvertible);0)]
              Sino
                Si pUnidad = 2
                  Si lsihubocambio =1 
                    tUnidadesPM.busca[@str(@col(pIdUnidad;0);0)]
                  Sino 
                    tUnidadesPM.busca[@str(tProductos(cIdUnidadBase);0)]
                  Finsi
                Sino
                  tUnidadesPM.busca[@str(tProductos(cIdUnidadBase);0)]
                Finsi
              Finsi
              
              Si tUnidadesPM->encontro
                Si tUnidadesPM(cDespliegue)='(N)'
                  {idRenglon}[3] =''
                Sino
                  {idRenglon}[3] =tUnidadesPM(cDespliegue)
                Finsi
              Finsi
              Si pTipoReporte = 3 o pTipoReporte = 5
                {idRenglon}[4] = @col({idRenglon};4) +  @col(vCantidad;0)
                {idRenglon}[5] = @col({idRenglon};5) +  @col(vSurtidas;0)
                {idRenglon}[6] = @col({idRenglon};6) +  @col(vDevueltas;0)
                {idRenglon}[7] = @col({idRenglon};7) +  @col(vPendientes;0)
                vTotal = fCambiarMonedaDoctoAReporte(tDocumentos; tTiposCambio; vTotal; pIdMoneda; gIdMonedaCte)[C0]
                {idRenglon}[8] = @col({idRenglon};8) +  @col(vTotal ;0)
              Sino 
                {idRenglon}[4] = @col({idRenglon};4) +  @col(vCantidad;0)
                {idRenglon}[5] = @col({idRenglon};5) +  @col(vSurtidas;0)
                {idRenglon}[6] = @col({idRenglon};6) +  @col(vPendientes;0)
                vTotal = fCambiarMonedaDoctoAReporte(tDocumentos; tTiposCambio; vTotal; pIdMoneda; gIdMonedaCte)[C0]
                {idRenglon}[7] = @col({idRenglon};7) +  @col(vTotal ;0)
              Finsi
              vCantidad = 0
              vSurtidas = 0
              vDevueltas = 0 
              vPendientes = 0
              vTotal = 0
            Finsi  // Si el producto del movto oculto pertenece al rango 
            tMovimientosOcultos.saltareg[1]
          Finmientras  // Hay movimientos ocultos
        Finsi  // Si el producto del movto real pertenece al rango 
        
        tMovimientos.saltareg[1]
      Finmientras  // Hay movimientos
      
    tDocumentos.BUSCA SIGUIENTE[2]
  Finmientras  // Hay Documentos
    
  
  //Ordena la Hoja de trabajo de acuerdo al codigo del Producto
  Ordenahoja(idRenglonIni ;idRenglonFin -idRenglonIni )
  //Imprime Datos de la Hoja de trabajo y limpia la hoja
  Imprimehoja()
  fTotalCliente()
  tClientes.saltareg[1]
Finmientras  // Mientras Hay clientes

// Imprime Totales Generales
fTotalGeneral()

// FIN REPORTE
