// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// Reporte:     Resumen de operaciones de venta por Agente   (OperAgen)
//
// Sistema:     ADMINPAQ  Versión v1.0 Windows
//
// Descripcion: 
//
// Consideraciones :
// Creación  :  Luis Palau Castañeda.  22/Agosto/2001
// Revisiones : 
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Historia de modificaciones
//  Fecha      Nombre   IDLotus                     Descripcion
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// 17/05/2007   JAAM    N.C.147     Esquema de adicion de unidades de compra y venta  
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

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

// *************************************************************************************************
// INICIO PARAMETROS
// *************************************************************************************************
    Parametro pEjercicio        = 2003
    Parametro pMes              = 5   //enero,feb,...oct, nov,dic
    Parametro pAgenteInicial    = '(Ninguno)' 
    Parametro pAgenteFinal      = '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    
 

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

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

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

  //Agentes
  UsaTabla tAgentes = tEmpresa['mgw10001']
  tAgentes.Usaindice['iCodigoTipo']

  //Acumulados
  UsaTabla tAcumulados = tEmpresa['mgw10018']
  tAcumulados.Usaindice['iAcumImpteOwnerEjerMoneda']

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

  //Tipos de cambio
  UsaTabla tTipoCambio = tEmpresa['mgw10035']          
  tTipoCambio.Usaindice['iMonedaFecha']

  UsaTabla tEjercicioPeriodo = tEmpresa['mgw10031']          
  tEjercicioPeriodo.Usaindice['']                     

// *************************************************************************************************
  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 
// *************************************************************************************************
  Columnas 20;2.4,0.15,5.85,0.15,0.75,0.15,2.25,0.15,2.25,0.15,2.25,0.15,2.25,0.15,0,0,0
  UsaLetra 'Arial'
  Altura 9 
  [C0..C5].Decimales 0
  [C0..C5].Blanco ' '
  tMonedas.Busca[@str(pIdMoneda;0)]
  gDecimales = tMonedas(cDecimalesMoneda)
  [C6..C14].Coma
  [C4,C6..C14].Decimales tParametros(cDecimalesUnidades) // Decimales para unidades
  [C6..C14].Blanco '0.00'
  [C5,C7,C9,C11,C13,C15..C19].Blanco ''

// *************************************************************************************************
//VARIABLES GLOBALES 
// *************************************************************************************************
  gDelaFecha = ''
  gAlaFecha  = ''
  gRenglon = '' 
  gTotalGral = ''
  gTotalAgente = ''
  gTotalPaquetes = ''
  gTotalAgentePaquetes = ''
  gUnidad = pUnidad
  gIdUnidad = pIdUnidad
  vTipoAcumulado = 0
  vImporteModelo  =  0
  vIdEjercicio = 0
  vAcumuladoCotizacion = 0  
  vAcumuladoRemision = 0
  vAcumuladoPedido = 0
  vAcumuladoFacturacion = 0
  vAcumuladoOrdenCompra = 0
  vAcumuladoConsignacion = 0
  vAcumuladoCompra = 0
  vCotizacion = 0
  vPedido = 0
  vRemision = 0
  vFactura = 0
  vOrdenCompra = 0
  vConsignacion = 0
  vCompra = 0

  gNombreMoneda = tMonedas(cNombreMoneda)
 
  kMeses = 'Ene,Feb,Mar,Abr,May,Jun,Jul,Ago,Sep,Oct,Nov,Dic'[C0]

  gDelaFecha = @str(pMes;0) 
  Mientras @len(gDelaFecha)<2
     gDelaFecha   = '0' & gDelaFecha 
  FinMientras
  gDelaFecha = @str(pEjercicio;0) &   gDelaFecha & '02'

// *************************************************************************************************
// FUNCIONES <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// *************************************************************************************************
// =================================================================================================
// Función área sensible al contexto
// =================================================================================================
DefFunc ContextoDetalleProducto(aNumeroColumna; aValor)
    EJECUTA tEmpresa->SysDirDatos & '\Reportes\AdminPAQ\ResAgen.RTW';pEjercicio,pMes,@Escoge(aValor;0),@Escoge(aValor;0),@Escoge(aValor;1),@Escoge(aValor;1),@Escoge(aValor;2),@Escoge(aValor;3),pIdMoneda,pTipoReporte;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  fTotalGral()
local LTotalLinea

  LTotalLinea = '==========================='[c0]
  Texto c6; @col(LTotalLinea;0)
  Texto c8; @col(LTotalLinea;0)
  Texto c10; @col(LTotalLinea;0)
  Texto c12; @col(LTotalLinea;0)
  imprime
  gTotalGral = ''[c0..c4]
  gTotalGral[2] = 'Total Agentes'
  imprime gTotalGral

  // Impresion del Total de Paquetes. Solo aplica para ventas
  Si (@Col(gTotalPaquetes;6) > 0) O (@Col(gTotalPaquetes;8) > 0) O (@Col(gTotalPaquetes;10) > 0) O (@Col(gTotalPaquetes;12) > 0)
    gTotalPaquetes = ''[c0..c4]
    gTotalPaquetes[2] = 'Total Cantidad de Paquetes'
    Imprime gTotalPaquetes
  FinSi
Finfunc

// *************************************************************************************************
// Descripcion: imprime los totales del Agente de las variables gTotalAgente
// Entradas :  
// Salida :    
// *************************************************************************************************
DefFunc  fTotalAgente()

  Si @col(gTotalAgente;6)!=0 o @col(gTotalAgente;8)!=0 o @col(gTotalAgente;10)!=0 o @col(gTotalAgente;12)!=0    
    Texto '@L{6,8,10,12}'
    imprime
    gTotalAgente = ''[c0..c4]
    gTotalAgente[2] = 'Total Agente'
    imprime gTotalAgente
  Finsi

  // Impresion del Total de Paquetes. Solo aplica para ventas
  Si (@Col(gTotalAgentePaquetes;6) > 0) O (@Col(gTotalAgentePaquetes;8) > 0) O (@Col(gTotalAgentePaquetes;10) > 0) O (@Col(gTotalAgentePaquetes;12) > 0)
    gTotalAgentePaquetes = ''[c0..c4]
    gTotalAgentePaquetes[2] = 'Total Cantidad de Paquetes'
    Imprime gTotalAgentePaquetes
  FinSi
  gTotalAgentePaquetes = ''
  gTotalAgente  = ''
Finfunc

// *************************************************************************************************
// Descripcion: imprime los datos del Agente
// Entradas :  
// Salida :    
// *************************************************************************************************
Deffunc ImprimeA()
local vimprime
   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
   Negritas True
   vimprime = 'Agente:' [c0]
   vimprime = fMascarilla(tAgentes(cCodigoAgente);tParametros(cMascarillaAgente))[c2]
   imprime vimprime
   vimprime = 'Nombre:' [c0]
   vimprime = tAgentes(cNombreAgente) [c2]
   imprime vimprime
   Negritas False
   Columnas 20;2.4,0.15,5.85,0.15,0.75,0.15,2.25,0.15,2.25,0.15,2.25,0.15,2.25,0.15,0,0,0
Finfunc

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

  Si PrimVez = 0
    ImprimeA()
    PrimVez = 1
  Finsi 
  DEFREGION ContextoDetalleProducto
  Si @col(gRenglon;6) != 0
    [C6].REGIONINFO atAgentes(cCodigoAgente) & ',' & atProductos(cCodigoProducto) & ',' & pUnidad & ',' & pIdUnidad
  FinSi
  Si @col(gRenglon;8) != 0
    [C8].REGIONINFO atAgentes(cCodigoAgente) & ',' & atProductos(cCodigoProducto) & ',' & pUnidad & ',' & pIdUnidad
  FinSi
  Si @col(gRenglon;10) != 0
    [C10].REGIONINFO atAgentes(cCodigoAgente) & ',' & atProductos(cCodigoProducto) & ',' & pUnidad & ',' & pIdUnidad
  FinSi
  Si @col(gRenglon;12) != 0
    [C12].REGIONINFO atAgentes(cCodigoAgente) & ',' & atProductos(cCodigoProducto) & ',' & pUnidad & ',' & pIdUnidad
  FinSi
  imprime gRenglon

  // Adición de un total por paquete. Solo aplica para ventas
  Si aTipoProducto = 2
    gTotalPaquetes = gTotalPaquetes + gRenglon
    gTotalAgentePaquetes = gTotalAgentePaquetes + gRenglon
  Sino
    gTotalGral  = gTotalGral + gRenglon
    gTotalAgente = gTotalAgente + gRenglon
  FinSi
  gRenglon = '' 
Finfunc

// *************************************************************************************************
// Descripcion: despues de buscar en acumulados se extrae el campo 1..12 de acumulados
// Entradas :   mes en formato numerico
// Salida :    importe del acumulado
// *************************************************************************************************
DefFunc fAcumulados(aMes) 
Local lRegreso
  Escoge   aMes
    caso 1
      lRegreso = tAcumulados(cImportePeriodo1)
    fincaso
    caso 2
      lRegreso = tAcumulados(cImportePeriodo2)
    fincaso
    caso 3
      lRegreso = tAcumulados(cImportePeriodo3)
    fincaso
    caso 4
      lRegreso = tAcumulados(cImportePeriodo4)
    fincaso
    caso 5
      lRegreso = tAcumulados(cImportePeriodo5)
    fincaso
    caso 6
      lRegreso = tAcumulados(cImportePeriodo6)
    fincaso
    caso 7
      lRegreso = tAcumulados(cImportePeriodo7)
    fincaso
    caso 8
      lRegreso = tAcumulados(cImportePeriodo8)
    fincaso
    caso 9
      lRegreso = tAcumulados(cImportePeriodo9)
    fincaso
    caso 10
      lRegreso = tAcumulados(cImportePeriodo10)
    fincaso
    caso 11
      lRegreso = tAcumulados(cImportePeriodo11)
    fincaso
    caso 12
      lRegreso = tAcumulados(cImportePeriodo12)
    fincaso
  FinEscoge
  Retorna lRegreso
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
    Texto '^@TC{0,0,0}@S{16}' & ' Resumen de Operaciones de Venta por Agente'
    Texto '"@TC{0,0,0}@S{8}Hora: ' & @Hora()
    Imprime    
    Texto '^@TC{0,0,0}@S{16}'& 'Periodo: ' & @substr(fEditaFecha(gDelaFecha);3;20)
    Imprime 
    NEGRITAS TRUE
    Altura 10
    //Código         Nombre(Producto)                          Cotizado      Pedido        Remisionado   Facturado    
    Columnas 20;2.4,0.15,5.85,0.15,0.75,0.15,2.25,0.15,2.25,0.15,2.25,0.15,2.25,0.15,0,0,0
    Texto '@TC{0,0,0}@L{-1}'
	  Imprime 
    Texto C0;'Código'
    Texto C2;'Nombre (Producto)'
    Texto c4;'' 
    Texto c6;'^Cotizado' 
    Texto c8;'^Pedido'
    Texto c10;'^Remisionado'
    Texto c12;'^Facturado'
    Imprime   
    Texto '@TC{0,0,0}@L{-1}'
	  Imprime 
    NEGRITAS FALSE
    Altura 10
FinEncab

// *************************************************************************************************
//PRINCIPAL <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// *************************************************************************************************
  vAcumuladoCotizacion = 140//
  vAcumuladoRemision = 142//
  vAcumuladoPedido = 141//
  vAcumuladoFacturacion = 21

  gRenglon = '' 
  gTotalGral = ''
  gTotalAgente = ''

  //buscamos el id del ejericio-mes
  tEjercicioPeriodo.busca primero
  Mientras tEjercicioPeriodo->encontro
    Si gDelaFecha >= tEjercicioPeriodo(cFecIniPeriodo1) y gDelaFecha <= tEjercicioPeriodo(cFechaFinal)
      vIdEjercicio = tEjercicioPeriodo(cIdEjercicio)
    Finsi
    tEjercicioPeriodo.Saltareg[1]
  FinMientras

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

  Mientras tAgentes->Encontro
    Si @str(pAgenteFinal;0)!= ' '
      Si tAgentes(cCodigoAgente)> @str(pAgenteFinal;0)
        Finciclo
      Finsi  
    Finsi

    PrimVez = 0

    Si @str(pProductoInicial;0) = ' '
      tProductos.Busca Primero
    Sino
      tProductos.Busca [@str(pProductoInicial;0) & ':']
    Finsi

    Mientras tProductos->Encontro
      Si @str(pProductoFinal;0) != ' '
        Si tProductos(cCodigoProducto)> @str(pProductoFinal;0)
          Finciclo
        Finsi 
      Finsi

      // Si es uno de los servicios para facturar notas de venta no incluirlo
      Si tProductos(cIdProducto) = tParametros(cIdProdu01)
        tProductos.saltareg[1]
        Continua
      FinSi
      Si tProductos(cIdProducto) = tParametros(cIdProdu02)
        tProductos.saltareg[1]
        Continua
      FinSi
      Si tProductos(cIdProducto) = tParametros(cIdProdu03)
        tProductos.saltareg[1]
        Continua
      FinSi
      Si tProductos(cIdProducto) = tParametros(cIdProdu04)
        tProductos.saltareg[1]
        Continua
      FinSi
      Si tProductos(cIdProducto) = tParametros(cIdProdu05)
        tProductos.saltareg[1]
        Continua
      FinSi

      //llamamos a la funcion fVerificaUnidad
      fVerificaUnidad(tProductos)

      // SI el Producto tiene Unidad de Medida NO Equivalente  "Y" pUnidad = 1
      Si pUnidad = 1 y tProductos(cidUnidadNoConvertible) != 0
        vImporteModelo = 2
      Sino 
        vImporteModelo = 1
      Finsi

      tAcumulados.Busca[ @str(vAcumuladoCotizacion;0) &':'& @col(vImporteModelo;0) &':'& @str(tAgentes(cIdAgente);0) &':'& @str(tProductos(cIdProducto);0) &':'&  vIdEjercicio] 
      Si tAcumulados->encontro
        vCotizacion =fAcumulados(pMes) 
      Finsi
      tAcumulados.Busca[ @str(vAcumuladoPedido;0)  &':'& @col(vImporteModelo;0) &':'& @str(tAgentes(cIdAgente);0) &':'& @str(tProductos(cIdProducto);0) &':'&  vIdEjercicio] 
      Si tAcumulados->encontro
        vPedido =fAcumulados(pMes) 
      Finsi
      tAcumulados.Busca[ @str(vAcumuladoRemision;0)  &':'& @col(vImporteModelo;0) &':'& @str(tAgentes(cIdAgente);0) &':'& @str(tProductos(cIdProducto);0) &':'&  vIdEjercicio] 
      Si tAcumulados->encontro
        vRemision =fAcumulados(pMes) 
      Finsi
      tAcumulados.Busca[ @str(vAcumuladoFacturacion;0)  &':'& @col(vImporteModelo;0) &':'& @str(tAgentes(cIdAgente);0) &':'& @str(tProductos(cIdProducto);0) &':'&  vIdEjercicio] 
      Si tAcumulados->encontro
        vFactura =fAcumulados(pMes) 
      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.
        tEquivaleUnidadesPM.busca[@str(tProductos(cIdUnidadBase);0) &':'& @str(pIdUnidad;0)]
        Si tEquivaleUnidadesPM->encontro
          // SI el reporte es de Ventas
          vCotizacion = vCotizacion * tEquivaleUnidadesPM(cFactorConversion)
          vPedido = vPedido * tEquivaleUnidadesPM(cFactorConversion)
          vRemision = vRemision * tEquivaleUnidadesPM(cFactorConversion)
          vFactura = vFactura * tEquivaleUnidadesPM(cFactorConversion)
          lsihubocambio =1
        Finsi
      Finsi

      // Acumula Totales Generales

      // Imprime Producto, vCotizacion, vPedido, vRemision, vFactura
      gRenglon = fMascarilla(tProductos(cCodigoProducto);tParametros(cMascarillaProducto))[c0]
      gRenglon =tProductos(cNombreProducto)[c2]
      gRenglon =@col(vCotizacion;0)[c6]  
      gRenglon =@col(vPedido;0)[c8]
      gRenglon =@col(vRemision;0)[c10]
      gRenglon =@col(vFactura;0)[c12]

      //busac 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
        gRenglon = tUnidadesPM(cDespliegue)[c4]
        Si @col(gRenglon;4)='(N)'
          gRenglon = ''[c4]
        Finsi
      Finsi

      //limpiamos las variables
      Si @col(gRenglon;6)!=0 o @col(gRenglon;8)!=0 o @col(gRenglon;10)!=0 o @col(gRenglon;12)!=0    
        fRenglon(tAgentes;tProductos;tProductos(cTipoProducto))     
      Finsi
      vCotizacion = 0
      vPedido = 0
      vRemision = 0
      vFactura = 0

      tProductos.Saltareg[1]
    FinMientras 

    //Imprime Totales del Agente
    fTotalAgente()

    tAgentes.Saltareg[1]
  FinMientras 

  //Imprime Totales Generales
  fTotalGral()

