// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// Reporte:     Seguimiento de Operaciones de Venta              
//              Seguimiento de Operaciones de Compra  
//
// Sistema:     ADMINPAQ  Versión v1.0 Windows
//
// Descripcion: 
//
// Consideraciones :
// Creación  :  Luis Palau Castañeda.  25/Agosto/2001
// Revisiones :
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// 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.145			Se agrega documento modelo cotización del proveedor.	 	
// 30/05/2007		DRdA		N.C.143			Consolidación.
// 16/01/2009   ELVS    N.D.5133    ERROR APARECE LA CANTIDAD DEVUELTA EN LA COLUMNA SURTIDO
//                                  CUANDO SE DEVUELVE PARCIALMENTE UNA FACTURA SIENDO QUE LA 
//                                  COLUMNA SE LLAMA SURTIDO EN EL REPORTE SEGUIMIENTO DE 
//                                  OPERACIONES DE VENTA DEL MENU REPORTES, RESUMEN DE OPERACIONES
//                                  DE VENTA.
// 30/01/2009   ELVS    N.D.5634    APARECE LA CANTIDAD DEVUELTA EN LA COLUMNA SURTIDO CUANDO
//                                  SE DEVUELVE PARCIALMENTE UNA COMPRA EN EL REPORTE SEGUIMIENTO
//                                  DE OPERACIONES DE COMPRA.
// 27/02/2009   ELVS    N.D.5625    ERROR SE DUPLICA EL TOTAL DEL DOCUMENTO AL EJECUTAR EL REPORTE
//                                  DE SEGUIMIENTO DE OPERACIONES DE VENTA CUANDO SE EJECUTA POR MEDIO
//                                  DE LOS REPORTES SENSIBLES AL CONTEXTO.
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// *************************************************************************************************
// INCLUSION DE ARCHIVOS
// *************************************************************************************************
   Incluye LibAdminPaq.rpt

// *************************************************************************************************
// INICIO PARAMETROS
// *************************************************************************************************
   Parametro pFechaIni          = '20020219'
   Parametro pFechaFin          = '20020228'
   Parametro pTipoDocumento     = 0           //<cot> <ped> <rem>   o bien  <orden> <compra><cot prov>
   Parametro pIdMoneda          = 1           //id de la moneda
   Parametro pUnidad            = 0	          //0 = Unidad Base·	1 = Unidad No Equivalente·	2 = Seleccionar Unidad
   Parametro pIdUnidad          = 1           //base de datos de unidades (id)    
   Parametro pTipoReporte       = 1           //0 Seguimiento de Operaciones de Venta 
                                              //1 Seguimiento de Operaciones de Compra
   Parametro pIncluirCancelados = 0           // 0 = No se incluyen los Documentos Cancelados.
                                              // 1 = Se incluyen los Documentos Cancelados pero no se totalizan.
   Parametro pIdDocumento       = 0           // Id del documento a procesar
   Parametro pIdProducto        = 0           // Id del producto a procesar
  
// *************************************************************************************************
// INICIO APERTURA TABLAS
// *************************************************************************************************
  UsaEmpresa tEmpresa;'AdminpaqW'

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

  // Productos
  UsaTabla tProductos = tEmpresa['mgw10005']
  tProductos.Usaindice['cIdProducto']

  // Movimientos
  UsaTabla tMovimientos = tEmpresa['mgw10010'] Alias 'tMovtos0'
  tMovimientos.Usaindice['iDoctoNumeroMovto'] 

  // esta tabla se usa para que no se pierda el puntero del recorrido principal
  UsaTabla tMovimientos1 = tEmpresa['mgw10010'] Alias 'tMovtos1' 
  tMovimientos1.Usaindice['cIdMovtoOrigen'] 
  // esta tabla se usa para que no se pierda el puntero del recorrido principal
  UsaTabla tMovimientos2 = tEmpresa['mgw10010'] Alias 'tMovtos2' 
  tMovimientos2.Usaindice['cIdMovtoOrigen'] 
  // esta tabla se usa para que no se pierda el puntero del recorrido principal
  UsaTabla tMovimientos3 = tEmpresa['mgw10010'] Alias 'tMovtos3' 
  tMovimientos3.Usaindice['cIdMovtoOrigen'] 
  // esta tabla se usa para que no se pierda el puntero del recorrido principal
  UsaTabla tMovimientos4 = tEmpresa['mgw10010'] Alias 'tMovtos4' 
  tMovimientos4.Usaindice['cIdMovtoOrigen'] 
  // esta tabla se usa para que no se pierda el puntero del recorrido principal
  UsaTabla tMovimientos5 = tEmpresa['mgw10010'] Alias 'tMovtos5' 
  tMovimientos5.Usaindice['cIdMovtoOrigen'] 

  //documentos
  UsaTabla tDocumentos = tEmpresa['mgw10008']
  tDocumentos.Usaindice['iDocumentoDeFechaSerieFol']
  // esta tabla se usa para que no se pierda el puntero del recorrido principal
  UsaTabla tDocumentos1 = tEmpresa['mgw10008'] Alias 'tDoctos1' 
  tDocumentos1.Usaindice['']

  //Clientes
  UsaTabla tClientes = tEmpresa['mgw10002']
  tClientes.Usaindice['']

  //conceptosdocumentos
  UsaTabla tConceptosDocumentos = tEmpresa['mgw10006']
  tConceptosDocumentos.Usaindice['']

  //ejercicios periodos
  UsaTabla tEjercicioPeriodo = tEmpresa['mgw10031']          
  tEjercicioPeriodo.Usaindice['']                     

  //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

  // TiposCambio 
  Usatabla tTiposCambio = tEmpresa['mgw10035']
  tTiposCambio.Usaindice['iMonedaFecha']                                 

// *************************************************************************************************
// Variables públicas
// *************************************************************************************************
	gDecimalesUnidades = 0
	gDecimales = 0
	gIdioma    = 0
  gUnidad = pUnidad
  gIdUnidad = pIdUnidad
  gRenglon = '' 
  vDocumento = ''
  vIdEjercicio = ''
	gNombreMoneda = ''
	gTotalDocumento = 0
	gTotalReporte   = 0

// *************************************************************************************************
// *************************************************************************************************
  // Busca el registro de la empresa
  tParametros.Busca Primero
  Si tParametros->Encontro // Si lo encontró
    gDecimalesUnidades = tParametros(cDecimalesUnidades)
	FinSi
	// Decimales en importes
  tMonedas.Busca[@Str(pIdMoneda;0)]
  gDecimales = tMonedas(cDecimalesMoneda)
	gNombreMoneda = tMonedas(cNombreMoneda)

  // 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['']                     

	// Ancho de columnas = caracteres / 17 * 2.54
	// Se consideran columnas intermedias de un espacio
	// *** Encabezado del documento ***
	// C0 (Fecha) = 11 caracteres
	// C2 (Serie) = 5 caracteres
	// C4 (Folio) = 8 caracteres
	// C6 (Concepto) = 25 caracteres
	// C8 (Cliente/Proveedor) = 14 caracteres
	// C10 (Fecha de entrega) = 18 caracteres
	// *** Movimientos del documento ***
	// C0 (Código del producto) = 14 caracteres
	// C2 (Nombre) = 52 caracteres
	// C4 (Cantidad) = 13 caracteres
	// C6 (Unidad de medida o peso) = 3 caracteres
	// C8 (Surtido) = 13 caracteres
	// C10 (Total) = 16 caracteres
	Columnas 18;1.70,0.15,0.75,0.15,1.20,0.15,3.74,0.15,1.99,0.15,1.94,0.16,0.45,0.13,1.94,0.15,2.39,0.15

  UsaLetra 'Arial'
  Altura 9 

//***********************************************************************************************
// fConvierteMoneda 
// Descripcion : El importe del documento lo cambia al IdMoneda que recibe
// Entrada :aTblDocto : Documento que se convertira su importe
//          aIdMoneda : ID de la moneda en que se quiere el importe
// Salida  :Importe del documento reflejado en la moneda que recibe 
//***********************************************************************************************
Deffunc fConvierteMoneda(aTblDocto:TABLA; aIdMoneda; aTblMovto:TABLA)

	Local lTipoCambio , lRenglon 
  Local lImporteDoctoMonedaRpt, lImporteDoctoMonedaBase, lTipoCambioRpt

	// La moneda del Reporte es distinta a la moneda del Docto
  Si aTblDocto(cIdMoneda) != aIdMoneda
    lImporteDoctoMonedaBase = aTblMovto(cTotal) * aTblDocto(cTipoCambio)

    // Si el reporte es requerido en una Moneda distinta a la Moneda Base
    Si aIdMoneda != 1
      // Convierte de la Moneda Base a la Moneda requerida en el Reporte

      lTipoCambioRpt      = fTipoCambio(aTblDocto(cFecha);aIdMoneda;tTiposCambio)

      lImporteDoctoMonedaRpt = lImporteDoctoMonedaBase / lTipoCambioRpt            
    Sino
      lImporteDoctoMonedaRpt = lImporteDoctoMonedaBase
    Finsi
  Sino
    lImporteDoctoMonedaRpt = aTblMovto(cTotal)
  Finsi

  Retorna lImporteDoctoMonedaRpt
FinFunc

// *************************************************************************************************
// *************************************************************************************************
DefFunc fImprimeTotales(aTotal; aTipo)
Local lLinea

	Columnas 18;2.09,0.15,7.67,0.15,1.94,0.15,0.45,0.15,1.94,0.15,2.39,0.01
  lLinea = ''
  lLinea = '================='[C4,C8,C10]
  Imprime lLinea
	lLinea = ''
	Si aTipo = 0
		lLinea = 'Total del documento'[C2]		
	SiNo
		lLinea = 'Total General'[C2]
	FinSi
	lLinea = @col(aTotal;0)[C4]
	lLinea = @col(aTotal;1)[C8]
	lLinea = @col(aTotal;2)[C10]
	[C4,C8,C10].Coma
	// Configura el número de decimales por columna
  [C4,C8].Decimales gDecimalesUnidades
  [C10].Decimales gDecimales
	Imprime lLinea
	SaltaLin
FinFunc

// *************************************************************************************************
// Descripcion: imprime los datos del producto
// Entradas :  parametro de desgloce del producto
//              0 = encabezado  1,2,3,4 =buscar los datos por la correspondiente tabla de movtos
//              cuando se imprine 1,2,3,4 no se imprime el nombre del producto
// Salida :    
// *************************************************************************************************
DefFunc ImprimeProducto(atMovimientos:Tabla; atDocumentos1:Tabla; aNivel)
Local vLinea
Local lSurtidasPrevias

  lSurtidasPrevias = vSurtidas
	vLinea = ''
	Si aNivel = 0
    Si pTipoDocumento = -1 Y pIdDocumento != 0
      Saltalin
    FinSi
		Columnas 18;2.09,0.15,7.67,0.15,1.94,0.15,0.45,0.15,1.94,0.15,2.39,0.01
		NEGRITAS TRUE
    Texto C0;'Código'
    Texto C2;'Nombre(Producto)'
    Texto c4;'^Cantidad' 
    Texto c8;'^Surtido' 
    Texto c10;'^Total movimiento'
		Imprime 
		Texto '@TC{0,0,0}@L{-1}'
	 	Imprime 
		NEGRITAS FALSE		
		[C4,C8,C10].Coma
	  // Configura el número de decimales por columna
  	[C4,C8].Decimales gDecimalesUnidades
  	[C10].Decimales gDecimales
	SiNo
		Columnas 18;1.70,0.15,0.75,0.15,1.20,0.15,3.74,0.15,1.99,0.15,1.94,0.16,0.45,0.13,1.94,0.15,2.39,0.15
		[C0,C2,C4,C6,C8].Decimales 0
		[C10,C14,C16].Coma
  	// Configura el número de decimales por columna
	  [C10,C14].Decimales gDecimalesUnidades
  	[C16].Decimales gDecimales
	FinSi

  tProductos.busca[@str(atMovimientos(cIdProducto);0)]
  Si tProductos->encontro
		Si aNivel = 0
	    vLinea = fMascarilla(tProductos(cCodigoProducto);tParametros(cMascarillaProducto))[c0]
  	  vLinea = tProductos(cNombreProducto)[c2]
		SiNo
		  vLinea = @col(fFormateaFecha(atDocumentos1(cFecha); gIdioma);0)[c0]
			vLinea = atDocumentos1(cSerieDocumento)[c2]
    	vLinea = atDocumentos1(cFolio)[c4]
    	tConceptosDocumentos.busca[@str(atDocumentos1(cIdConceptoDocumento);0)]
    	Si tConceptosDocumentos->encontro
    		vLinea = tConceptosDocumentos(cNombreConcepto)[c6]
    	Finsi
		  tClientes.busca[@str(atDocumentos1(cIdclienteProveedor);0)]
    	Si tClientes->encontro
    		vLinea = fMascarilla(tClientes(cCodigoCliente);tParametros(cMascarillaClientes))[c8]
	    Finsi
		FinSi
		
		fVerificaUnidad(tProductos)

    Si pUnidad = 1 y tProductos(cidUnidadNoConvertible) != 0
	    vCantidad = atMovimientos(cUnidadesNC)
      vPendientes= atMovimientos(cUnidadesNCPendientes)
    Sino 
 			vCantidad = atMovimientos(cUnidades)
    	vPendientes = atMovimientos(cUnidadesPendientes)
    Finsi

    vSurtidas = vCantidad - vPendientes
    
    //N.D.5133 Si el documento es Factura o Remisión y el documento tuvo una devolución
    //Entonces la columna surtido debe ser lo del campo de pendientes que son las 
    //Unidades devueltas correspondientes a la transformación    
    Si atMovimientos(cIdDocumentoDe) = 4 
    	vSurtidas = vPendientes //(este campo se comporta como las pendientes por devolver y pasa a ser las unidades surtidas de la factura)
		FinSi    	
    
    //En el caso de remisiones si le afecta el que esté o no devuelto
    Si atMovimientos(cIdDocumentoDe) = 3
    	Si atDocumentos1(CDEVUELTO)= 1 
    		vSurtidas = vPendientes //(este campo se comporta como las pendientes por devolver y pasa a ser las unidades surtidas de la remisión)
    	FinSi
    FinSi
    //Fin N.D.5133	    	
    
    //N.D.5634 Si el documento es Compra o Consignación y el documento tuvo una devolución
    //Entonces la columna surtido debe ser lo del campo de pendientes que son las 
    //Unidades devueltas correspondientes a la transformación    
    Si atMovimientos(cIdDocumentoDe) = 19
    	vSurtidas = vPendientes //(este campo se comporta como las pendientes por devolver y pasa a ser las unidades surtidas de la compra)
		FinSi    	
    
    //En el caso de consignaciones si le afecta el que esté o no devuelto
    Si atMovimientos(cIdDocumentoDe) = 18
    	Si atDocumentos1(CDEVUELTO)= 1 
    		vSurtidas = vPendientes //(este campo se comporta como las pendientes por devolver y pasa a ser las unidades surtidas de la consignacion)
    	FinSi
    FinSi
    //Fin N.D.5634	    	    
 
    // N.D.5710 Indicar si el movimiento proviene de una consolidación
    Si aNivel != 0 Y atMovimientos(cNumConsol) > 1 Y vSurtidas > lSurtidasPrevias
      vSurtidas = lSurtidasPrevias
    	vLinea = '*'[C15]
    	gHayMovtosConsolidados = 1
    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)
         lsihubocambio =1
      Finsi
    Finsi

		Si aNivel = 0
	    vLinea =  @col(vCantidad;0)[c4]
      gTotalDocumento = @col(gTotalDocumento;0) + @col(vLinea;4)[c0]
      Si tDocumentos(cCancelado) = 0
        gTotalReporte   = @col(gTotalReporte;0) + @col(vLinea;4)[c0]
      FinSi
		SiNo
			vLinea = @col(vCantidad;0)[c10]
		FinSi

    //busca unidad base
    //SI el Producto tiene Unidad de Medida NO Equivalente  "Y" pUnidad = 1
    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 aNivel = 0
	      vLinea =  tUnidadesPM(cDespliegue)[c6]
  	    Si @col(vLinea;6)='(N)'
    	    vLinea = ''[c6]
      	Finsi 
			SiNo
				vLinea =  tUnidadesPM(cDespliegue)[c12]
  	    Si @col(vLinea;12)='(N)'
    	    vLinea = ''[c12]
      	Finsi 
			FinSi
    Finsi

		Si aNivel = 0
	    vLinea =  @col(vSurtidas;0)[c8]	    
      gTotalDocumento = @col(gTotalDocumento;1) + @col(vLinea;8)[c1]
      Si tDocumentos(cCancelado) = 0
        gTotalReporte   = @col(gTotalReporte;1)  + @col(vLinea;8)[c1]
      FinSi
		Sino
			vLinea =  @col(vSurtidas;0)[c14]			
		FinSi

    //Se cambia a la moneda especificada
		Si aNivel = 0
      vLinea =fConvierteMoneda(atDocumentos1; pIdMoneda; atMovimientos)[c10]
      gTotalDocumento = @col(gTotalDocumento;2) + @col(vLinea;10)[c2]
      Si tDocumentos(cCancelado) = 0
        gTotalReporte   = @col(gTotalReporte;2)   + @col(vLinea;10)[c2]
      FinSi
		SiNo
			vLinea =fConvierteMoneda(atDocumentos1; pIdMoneda; atMovimientos)[c16]
		FinSi

  Finsi
  imprime  vLinea
FinFunc

// *************************************************************************************************
// Descripcion: imprime los datos de cualquiera de las tablas de movimientos t0 t1 t2 t3 t4
// Entradas :  seleccion de la tabla 0,1,2,3,4
// Salida :    
// *************************************************************************************************
Deffunc  fImprimeMovimiento(atMovimientos:Tabla; aNivel; aNivel2)
Local vLinea,cid

	tDocumentos1.busca[@str(atMovimientos(cIdDocumento);0)]
	Si aNivel2 =  0
    Si tDocumentos(cCancelado)
      Columnas 1;40
      Texto C0;'(Documento Cancelado. No se suma en el total general.)'
      Imprime
    FinSi
	  //encabezado documento origen
		Columnas 18;1.70,0.15,0.75,0.15,1.20,0.15,3.74,0.15,2.09,0.15,2.69,0.15	
		[C2,C4,C6,C8,C10].Decimales 0
  	[C2,C4,C6,C8,C10].Blanco ''
	  vLinea = @col(fFormateaFecha(atMovimientos(cFecha); gIdioma);0)[c0]
	  Si tDocumentos1->encontro
 			vLinea = tDocumentos1(cSerieDocumento)[c2]
	    vLinea = tDocumentos1(cFolio)[c4]
  	  tConceptosDocumentos.busca[@str(tDocumentos1(cIdConceptoDocumento);0)]
    	Si tConceptosDocumentos->encontro
	    	vLinea = tConceptosDocumentos(cNombreConcepto)[c6]
  	  Finsi
    	tClientes.busca[@str(tDocumentos1(cIdclienteProveedor);0)]
	    Si tClientes->encontro
  	  	vLinea = fMascarilla(tClientes(cCodigoCliente);tParametros(cMascarillaClientes))[c8]
    	Finsi
			vLinea = @col(fFormateaFecha(tDocumentos1(cFechaEntregaRecepcion); gIdioma);0)[c10]
	  Finsi
		NEGRITAS TRUE		
		Imprime vLinea    
		NEGRITAS FALSE
	FinSi
  ImprimeProducto(atMovimientos; tDocumentos1; aNivel)     
FinFunc

// *************************************************************************************************
// ENCABEZADO 
// *************************************************************************************************
Encab
   Columnas 18;1.70,0.15,0.75,0.15,1.20,0.15,3.74,0.15,1.99,0.15,1.94,0.16,0.45,0.13,1.94,0.15,2.39,0.15		 

   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: ' & fFormateaFecha(@Hoy(); gIdioma)
   Imprime

   Si pTipoReporte = 0
     Texto '^@TC{0,0,0}@S{16}' & 'Seguimiento de Operaciones de Venta'
   Sino
     Texto '^@TC{0,0,0}@S{16}' & 'Seguimiento de Operaciones de Compra'
   Finsi
   Texto '"@TC{0,0,0}@S{8}Hora: ' & @Hora()
   Imprime

   Texto '^@TC{0,0,0}@S{16}'& 'Del: ' &  fFormateaFecha(pFechaIni; gIdioma)  & ' al ' &  fFormateaFecha(pFechaFin; gIdioma)
   Imprime 
   NEGRITAS TRUE
   Altura 10
   Texto '@TC{0,0,0}@L{-1}'
   Imprime 

   Texto C0;'Fecha'
   Texto C2;'Serie'
   Texto c4;'Folio' 
   Texto c6;'Concepto' 
   Si pTipoReporte = 0//venta
     Texto c10;'Entrega'
     Texto c8;'Cliente' 
   Sino
     Texto c10;'Recepción'
     Texto c8;'Proveedor' 
   Finsi
   Imprime 
   Texto '@TC{0,0,0}@L{-1}'
	 Imprime 

   NEGRITAS FALSE
   Altura 10
 FinEncab

// *************************************************************************************************
// PRINCIPAL <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// *************************************************************************************************
gHayMovtosConsolidados = 0
Si pTipoDocumento = -1 Y pIdDocumento != 0
  tDocumentos.Usaindice['']
  tDocumentos.Busca[@Str(pIdDocumento;0)]
  Si tDocumentos->Encontro
      Mientras [tMovimientos.busca[@str(tDocumentos(cIdDocumento);0)];tMovimientos->encontro;tMovimientos.Busca Siguiente[1]]
        Si (pIdProducto > 0) Y (tMovimientos(cIdProducto) != pIdProducto)
          Continua
        FinSi
        
        fImprimeMovimiento(tMovimientos;0;lImprimeDocumento) 
        lImprimeDocumento = 1

				//N.C.143 y N.C.146
  		  // Movimientos origen
  	    Texto C0;'Origenes:'
				Negritas TRUE
       	Imprime
				Negritas FALSE          		  
			  
        Si tMovimientos(cNumConsol) > 1
          lDest = 1
          tMovimientos1.Usaindice['cIdMovDest']           
        SiNo
          lDest = 0
          tMovimientos1.Usaindice[''] 
        FinSi
 		  	Mientras [tMovimientos1.busca[@str((lDest = 0?tMovimientos(cIdMovtoOrigen):tMovimientos(cIdMovimiento));0)];tMovimientos1->encontro;tMovimientos1.Busca Siguiente[1]]
          fImprimeMovimiento(tMovimientos1;1;1) 
	        Si tMovimientos1(cNumConsol) > 1
	          lDest = 1
	          tMovimientos2.Usaindice['cIdMovDest'] 
	        SiNo
	          lDest = 0
	          tMovimientos2.Usaindice[''] 
	        FinSi
  				Mientras [tMovimientos2.busca[@str((lDest = 0?tMovimientos1(cIdMovtoOrigen):tMovimientos1(cIdMovimiento));0)];tMovimientos2->encontro;tMovimientos2.Busca Siguiente[1]]
	          fImprimeMovimiento(tMovimientos2;1;1) 
		        Si tMovimientos2(cNumConsol) > 1
		          lDest = 1
		          tMovimientos3.Usaindice['cIdMovDest'] 
		        SiNo
		          lDest = 0
		          tMovimientos3.Usaindice[''] 
		        FinSi
  	        Mientras [tMovimientos3.busca[@str((lDest = 0?tMovimientos2(cIdMovtoOrigen):tMovimientos2(cIdMovimiento));0)];tMovimientos3->encontro;tMovimientos3.Busca Siguiente[1]]
      	      fImprimeMovimiento(tMovimientos3;1;1) 
			        Si tMovimientos3(cNumConsol) > 1
			          lDest = 1
			          tMovimientos4.Usaindice['cIdMovDest'] 
			        SiNo
			          lDest = 0
			          tMovimientos4.Usaindice[''] 
			        FinSi
       	    	Mientras [tMovimientos4.busca[@str((lDest = 0?tMovimientos3(cIdMovtoOrigen):tMovimientos3(cIdMovimiento));0)];tMovimientos4->encontro;tMovimientos4.Busca Siguiente[1]]
            	  fImprimeMovimiento(tMovimientos4;1;1) 
				        Si tMovimientos4(cNumConsol) > 1
				          lDest = 1
				          tMovimientos5.Usaindice['cIdMovDest'] 
				        SiNo
				          lDest = 0
				          tMovimientos5.Usaindice[''] 
				        FinSi
							  Mientras [tMovimientos5.busca[@str((lDest = 0?tMovimientos4(cIdMovtoOrigen):tMovimientos4(cIdMovimiento));0)];tMovimientos5->encontro;tMovimientos5.Busca Siguiente[1]]
  	          	  fImprimeMovimiento(tMovimientos5;1;1) 
					  		FinMientras
				  		FinMientras
			  		FinMientras
          FinMientras 
	      FinMientras

 		    Texto C0;'Destinos:'
				Negritas TRUE
        Imprime
	  		Negritas FALSE	          

        Si tMovimientos(CIDMOVDEST) != 0
          lDest = 1
          tMovimientos1.Usaindice[''] 	          
        Sino
          lDest = 0
          tMovimientos1.Usaindice['cIdMovtoOrigen'] 
        FinSi
		  	Mientras [tMovimientos1.busca[@str((lDest = 1?tMovimientos(CIDMOVDEST):tMovimientos(CIDMOVIMIENTO));0)];tMovimientos1->encontro;tMovimientos1.Busca Siguiente[1]]
          fImprimeMovimiento(tMovimientos1;1;1) 
	        Si tMovimientos1(CIDMOVDEST) != 0
	          lDest = 1
	          tMovimientos2.Usaindice[''] 
	        Sino
	          lDest = 0
	          tMovimientos2.Usaindice['cIdMovtoOrigen'] 
	        FinSi
  				Mientras [tMovimientos2.busca[@str((lDest = 1?tMovimientos1(CIDMOVDEST):tMovimientos1(CIDMOVIMIENTO));0)];tMovimientos2->encontro;tMovimientos2.Busca Siguiente[1]]
	          fImprimeMovimiento(tMovimientos2;1;1) 
		        Si tMovimientos2(CIDMOVDEST) != 0
		          lDest = 1
		          tMovimientos3.Usaindice[''] 
		        Sino
		          lDest = 0
		          tMovimientos3.Usaindice['cIdMovtoOrigen'] 
		        FinSi
  	        Mientras [tMovimientos3.busca[@str((lDest = 1?tMovimientos2(CIDMOVDEST):tMovimientos2(CIDMOVIMIENTO));0)];tMovimientos3->encontro;tMovimientos3.Busca Siguiente[1]]
      	      fImprimeMovimiento(tMovimientos3;1;1) 
			        Si tMovimientos3(CIDMOVDEST) != 0
			          lDest = 1
			          tMovimientos4.Usaindice[''] 
			        Sino
			          lDest = 0
			          tMovimientos4.Usaindice['cIdMovtoOrigen'] 
			        FinSi
       	    	Mientras [tMovimientos4.busca[@str((lDest = 1?tMovimientos3(CIDMOVDEST):tMovimientos3(CIDMOVIMIENTO));0)];tMovimientos4->encontro;tMovimientos4.Busca Siguiente[1]]
            	  fImprimeMovimiento(tMovimientos4;1;1) 
				        Si tMovimientos4(CIDMOVDEST) != 0
				          lDest = 1
				          tMovimientos5.Usaindice[''] 
				        Sino
				          lDest = 0
				          tMovimientos5.Usaindice['cIdMovtoOrigen'] 
				        FinSi
							  Mientras [tMovimientos5.busca[@str((lDest = 1?tMovimientos4(CIDMOVDEST):tMovimientos4(CIDMOVIMIENTO));0)];tMovimientos5->encontro;tMovimientos5.Busca Siguiente[1]]
  	          	  fImprimeMovimiento(tMovimientos5;1;1) 
					  		FinMientras
				  		FinMientras
			  		FinMientras
          FinMientras
  			FinMientras
			  //Fin N.C.143 y N.C.146
        Saltalin
  		FinMientras
		  fImprimeTotales(gTotalDocumento;0)
  FinSi
Sino
  tEjercicioPeriodo.busca primero
  Mientras tEjercicioPeriodo->encontro
    Si pFechaIni >= tEjercicioPeriodo(cFecIniPeriodo1) y pFechaFin <= tEjercicioPeriodo(cFechaFinal)
      vIdEjercicio = tEjercicioPeriodo(cIdEjercicio)
    Finsi
    tEjercicioPeriodo.Saltareg[1]
  FinMientras

	//N.C.143 y N.C.146
  //SI el Reporte es de Ventas
  Si pTipoDocumento = 0 //(Cotización)
 	  vListaDocumento =  '1'
  Finsi 
  Si pTipoDocumento = 1 //(Pedido)
 	  vListaDocumento = '2'
  Finsi
  Si pTipoDocumento = 2 //(Remisión)
 	  vListaDocumento = '3'
  Finsi
  Si pTipoDocumento = 3 //(Factura)
 	  vListaDocumento = '4'
  Finsi
  SI pTipoDocumento = 4 //(Cotizaciones)
 	  vListaDocumento = '38'
  Finsi
  SI pTipoDocumento = 5 //(Orden de Compra)
	  vListaDocumento = '17'
  FinSi
  SI pTipoDocumento = 6 //(Consignaciones)
 	  vListaDocumento = '18'
  Finsi
  SI pTipoDocumento = 7 //(Compra)
 	  vListaDocumento = '19'
  Finsi

   
  vContador2 = 0[c0]
  vContador = 0[c0]
  Mientras  @escoge(@col(vListaDocumento;0);@col(vContador2;0)) != ''
    vContador2 = @col(vContador2;0) + 1 [c0]
  Finmientras

  gTotalReporte = 0
  Mientras  @col(vContador;0) < @col(vContador2;0)
	  vDocumento =  @val(@escoge(@col(vListaDocumento;0);@col(vContador;0)))
	
    // N.D.4048 Búsqueda de un movimiento del producto a la fecha inicial del reporte
    gFechaBusqueda = pFechaIni
    // NOTA: Es obligatorio volver a fijar el índice a fin de que las búsquedas parciales funcionen correctamente
    tDocumentos.Usaindice['iDocumentoDeFechaSerieFol']
    tDocumentos.busca[vDocumento & ':' & 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
      Si vDocumento = @Val(@SUBSTR(tDocumentos->Llave;0;11))
        Si @SUBSTR(tDocumentos->Llave;11;8) >= pFechaIni Y @SUBSTR(tDocumentos->Llave;11;8) <= pFechaFin
          // Realizar nuevamente la búsqueda a fin de posicionarnos en el registro y activar la propiedad Encontro
          gFechaBusqueda = @SUBSTR(tDocumentos->Llave;11;8)
          tDocumentos.busca[vDocumento & ':' & gFechaBusqueda]
        FinSi
      FinSi        
    FinSi
  
    Mientras tDocumentos->Encontro Y (tDocumentos(cFecha) <= pFechaFin)
  	  lImprimeDocumento = 0
	    gTotalDocumento = 0
      Si tDocumentos(cCancelado) = 1 Y pIncluirCancelados = 0
        tDocumentos.BUSCA SIGUIENTE[1]
        Continua
      FinSi
			//N.C.143 
      lDest = 0
      Mientras [tMovimientos.busca[@str(tDocumentos(cIdDocumento);0)];tMovimientos->encontro;tMovimientos.Busca Siguiente[1]]
  		  fImprimeMovimiento(tMovimientos;0;lImprimeDocumento) 
			  lImprimeDocumento = 1
        Si tMovimientos(CIDMOVDEST) != 0
          lDest = 1
          tMovimientos1.Usaindice[''] 
        Sino
          lDest = 0
          tMovimientos1.Usaindice['cIdMovtoOrigen'] 
        FinSi
		  	Mientras [tMovimientos1.busca[@str((lDest = 1?tMovimientos(CIDMOVDEST):tMovimientos(CIDMOVIMIENTO));0)];tMovimientos1->encontro;tMovimientos1.Busca Siguiente[1]]
          fImprimeMovimiento(tMovimientos1;1;1) 
	        Si tMovimientos1(CIDMOVDEST) != 0
	          lDest = 1
	          tMovimientos2.Usaindice[''] 
	        Sino
	          lDest = 0
	          tMovimientos2.Usaindice['cIdMovtoOrigen'] 
	        FinSi
  				Mientras [tMovimientos2.busca[@str((lDest = 1?tMovimientos1(CIDMOVDEST):tMovimientos1(CIDMOVIMIENTO));0)];tMovimientos2->encontro;tMovimientos2.Busca Siguiente[1]]
	          fImprimeMovimiento(tMovimientos2;1;1) 
		        Si tMovimientos2(CIDMOVDEST) != 0
		          lDest = 1
		          tMovimientos3.Usaindice[''] 
		        Sino
		          lDest = 0
		          tMovimientos3.Usaindice['cIdMovtoOrigen'] 
		        FinSi
  	        Mientras [tMovimientos3.busca[@str((lDest = 1?tMovimientos2(CIDMOVDEST):tMovimientos2(CIDMOVIMIENTO));0)];tMovimientos3->encontro;tMovimientos3.Busca Siguiente[1]]
      	      fImprimeMovimiento(tMovimientos3;1;1) 
			        Si tMovimientos3(CIDMOVDEST) != 0
			          lDest = 1
			          tMovimientos4.Usaindice[''] 
			        Sino
			          lDest = 0
			          tMovimientos4.Usaindice['cIdMovtoOrigen'] 
			        FinSi
       	    	Mientras [tMovimientos4.busca[@str((lDest = 1?tMovimientos3(CIDMOVDEST):tMovimientos3(CIDMOVIMIENTO));0)];tMovimientos4->encontro;tMovimientos4.Busca Siguiente[1]]
            	  fImprimeMovimiento(tMovimientos4;1;1) 
				        Si tMovimientos4(CIDMOVDEST) != 0
				          lDest = 1
				          tMovimientos5.Usaindice[''] 
				        Sino
				          lDest = 0
				          tMovimientos5.Usaindice['cIdMovtoOrigen'] 
				        FinSi
							  Mientras [tMovimientos5.busca[@str((lDest = 1?tMovimientos4(CIDMOVDEST):tMovimientos4(CIDMOVIMIENTO));0)];tMovimientos5->encontro;tMovimientos5.Busca Siguiente[1]]
  	          	  fImprimeMovimiento(tMovimientos5;1;1) 
					  		FinMientras
				  		FinMientras
			  		FinMientras
          FinMientras
	      FinMientras
  		FinMientras
			//Fin N.C.143

		  fImprimeTotales(gTotalDocumento;0)
	  	tDocumentos.BUSCA SIGUIENTE[1]
  	FinMientras
    vContador =   @col(vContador;0) + 1 [c0]		
  FinMientras
  fImprimeTotales(gTotalReporte;1)
FinSi

// N.D.5710 Indicar si existen movimientos consolidados
Si gHayMovtosConsolidados = 1
  Texto '* - Movimientos consolidados'
  Imprime
FinSi

  