// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//
//	Comisiones.rpt
//	Nombre del reporte en el sistema: Comisiones de Venta
//                                    Comisiones de Cobro
//                                    Comisiones de Venta por Producto
//  Sistema: AdminPAQ v1.1
// 
//	Este reporte perteneciente al módulo de clientes, despliega en Excel
//  los movimientos de un agente y calcula la comisión de cada uno
//
//	Elaboró:    Gabriela Cuevas Jurado
//	Fecha: 	    13 de febrero del 2002
//
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Historia de modificaciones
//  Fecha      Nombre   IDLotus                     Descripcion
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// 26/02/2002   RPC                 Se agregó la línea abajo de los datos del 
//                                  agente cuando tiene movimientos
// 27/08/2003   EGV     2403        Se modificó la función: fCalculaImportes. 
// 02/05/2005   LAP    N.D.3240     Expresar los importes de los documentos en la moneda 
//                                  del reporte. Considerando que los documentos en moneda 
//                                  base tienen el tipo de cambio de la moneda del cliente 
//                                  a la moneda base. Utilizar fCambiarMonedaDoctoAReporte y
//                                  fCambiarMonedaImporteAReporte de LibAdminPAQ.rpt
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<


// *****************************************************************************
// Funciones de librería

Incluye LibAdminPAQ.Rpt
Incluye LibCliProv.Rpt

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

Parametro pFechaInicial = '20040101'    // Fecha inicial del rango
Parametro pFechaFinal = '20041231'      // Fecha final del rango
Parametro pAgenteInicial = ' '        // Código del agente inicial del rango (' ' = Todos)
Parametro pAgenteFinal = ' '          // Código del agente final del rango (' ' = Todos)
Parametro pImprimirAgentes = 0        // Agentes a imprimir:
                                        // 0 = Todos
                                        // 1 = Solo agentes con documentos
Parametro pTipoAgente = 0           // Incluir agentes con estado:
                                        // 0 = Todos
                                        // 1 = Venta
													 // 2 = Venta/Cobranza
                                        // 3 = Cobranza

// Id de la unidad equivalente
Parametro pIdClase1 = 0                 // Clasificaciones del agente (0 = Ninguna)
Parametro pIdClase2 = 0                 // Estos seis parámetros corresponden a las seis clasificaciones
Parametro pIdClase3 = 0                 // del producto, y pueden contener una lista de IDs
Parametro pIdClase4 = 0                 // de clasificaciones separados por coma.
Parametro pIdClase5 = 0               
Parametro pIdClase6 = 0               
Parametro pIdMoneda = 1                 // Id de la moneda a expresar el reporte
Parametro pTipoReporte = 0              // 0 = Comisiones de venta
                                        // 1 = Comisiones de cobro
                                        // 2 = Comisiones de venta por producto
                                        // 3 = Comisiones de venta por cliente
                                        // 4 = Comisiones de cobro por cliente
                                        // 5 = Comisiones de venta por movimiento

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

UsaEmpresa tEmpresa;'ADMINPAQW'                   // Parámetros

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

UsaTabla tClientes = tEmpresa['mgw10002']         // Clientes
tClientes.Usaindice['']                           // Indice primario: cIdCliente

UsaTabla tProducto = tEmpresa['MGW10005']         // Productos
tProducto.Usaindice[''] 					               // Indice Primario cIdProducto

UsaTabla tDocumento = tEmpresa['MGW10008']  Alias 'Docto'  // Documentos
tDocumento.Usaindice['iAgenteFechaSerieFolio']             // cIdAgente+cFecha+cSerieDocumento+cFolio
UsaTabla tDoctoLib = tEmpresa['MGW10008']  Alias 'DoctoLib'  // Documentos
tDoctoLib.Usaindice['']                           // indice primario cIdDocumento

UsaTabla tMovimiento = tEmpresa['MGW10010']       // Movimientos
tMovimiento.Usaindice['iDoctoNumeroMovto']     // CIdDocumento + cNumeroMovimiento

UsaTabla tEjercicio = tEmpresa['MGW10031']        // Ejercicios
tEjercicio.Usaindice['cNumeroEjercicio']          // cNumeroEjercicio

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

UsaTabla tTipoCambio = tEmpresa['MGW10035']       // Tipo de cambio
tTipoCambio.Usaindice['iMonedaFecha']             // cIdMoneda+cFecha

UsaTabla tConcepto = tEmpresa['MGW10006']         // Concepos de documentos
tConcepto.Usaindice['']                           // Indice primario: cIdConceptoDocumento

UsaTabla tCargosAbonosLib = tEmpresa['mgw10009']   
tCargosAbonosLib.UsaIndice['iDoctoCargoAbono']        // IDDoctoCargo + IDDoctoAbono

UsaTabla tValoresDeClasif = tEmpresa['MGW10020']
tValoresDeClasif.UsaIndice['']                    // Indice primario: cIdValorClasificacion

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


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

Columnas 16;1

Usaletra 'Arial'
Altura 9


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

gIdioma = 0               // Idioma del reporte
                          // 0 = Español
                          // 1 = Inglés
// Las siguientes variables se utilizan en el cuerpo principal del reporte
gPeriodo = 0              // Numero de período que corresponde a la fecha de inicio del reporte
gIdEjercicio = 0          // ID del ejercicio que contiene la fecha de inicio del reporte

gTotal = 0.0            // Total de documentos
gNeto = 0.0             // Neto-Descuentos de los documentos
gPagado = 0.0           // Total pagado de los documentos
gGTotal = 0.0            // Total de documentos
gGNeto = 0.0             // Neto-Descuentos de los documentos
gGPagado = 0.0           // Total pagado de los documentos
gDatosAgente = 0        // Bandera utilizada para saber si los datos del agente ya fueron impresos
gMascarillaAgente = ''  // Mascarilla para el código del agente
gMascarillaCliente = '' // Mascarilla para el código de los clientes
gMascarillaProducto = '' // Mascarilla para el código de los productos
gFinReporte = ':L'
gMoneda = 'K'
gEmpresa = ':K'
Si pTipoReporte = 1 O pTipoReporte = 4
	gFinReporte = ':H'
	gMoneda = 'G'
	gEmpresa = ':G'
FinSi
Si pTipoReporte = 2 O pTipoReporte = 5
	gFinReporte = ':J'
	gMoneda = 'I'
	gEmpresa = ':I'
FinSi

// *************************************
// Definicion de constantes de EXCEL
// *************************************
constante xlCentrarEnSeleccion  7
constante xlAutomatico          -4105
constante xlManual              -4135
constante xlInferior            -4107
constante xlSubrayadoDoble      -4119
constante xlIzquierda           -4131
constante xlMediano             -4138
constante xlNinguno             -4142
constante xlDerecha             -4152
constante xlSuperior            -4160
constante xlHojaCalculo         -4167
constante xlLineaSimple		1
constante xlBordeSuperior	8
constante xlBordeInferior	9
constante xlBordeIzquierda	7
constante xlBordeDerecha	10
constante xlCentro		-4108

// *************************************
// Inicializa EXCEL
// *************************************
// Accesa objetos de excel. Crea un objeto de Excel con la funcion @CreaObjeto(). A esta funcion
// se le pasa un identificador de OLE de la aplicacion que se desea crear. En este caso el identificador
// es Excel.Application.5
Objeto Excel = @CreaObjeto('Excel.Application')

// Invoca el metodo de EXCEL Libros y luego el metodo Agregar para crear un libro de hoja de calculo
// representado por la constante de EXCEL (xlHojaCalculo).
// Es importante notar que estos metodos NO LOS EJECUTA EL REPORTEADOR sino que los hace EXCEL
// y estan documentados en el Help de EXCEL
Objeto wb = Excel.WorkBooks.Add(xlHojaCalculo)

// Accesa la hoja de calculo (HojasCalculo) numero 1 del Libro creado anteriormente
// y representado por la variable wb, de la instruccion anterior
Objeto ws = wb.Worksheets(1)

// Hace visible a EXCEL. Para Excel, TRUE o VERDADERO es -1, FALSE o FALSO es 0
Excel.ActiveWindow.DisplayGridlines = FALSE[C0]
Excel.Visible = -1[C0]

RenActual = 1

// Pone la longitud de cada columna
ws.Columns(1).ColumnWidth = 12[C0]
ws.Columns(2).ColumnWidth = 8[C0]
ws.Columns(3).ColumnWidth = 10[C0]
ws.Columns(4).ColumnWidth = 30[C0]
ws.Columns(5).ColumnWidth = 20[C0]
ws.Columns(6).ColumnWidth = 15[C0]
ws.Columns(7).ColumnWidth = 15[C0]
ws.Columns(8).ColumnWidth = 15[C0]
// Si el reporte es comisiones de venta o venta por producto
Si pTipoReporte = 0 o pTipoReporte = 2 O pTipoReporte = 3 o pTipoReporte = 5
	ws.Columns(9).ColumnWidth = 15[C0]
	ws.Columns(10).ColumnWidth = 15[C0]
	Si pTipoReporte = 0 O pTipoReporte = 3 // Si el reporte es comisiones de venta
		ws.Columns(11).ColumnWidth = 15[C0]
		ws.Columns(12).ColumnWidth = 15[C0]
	FinSi
FinSi

// *****************************************************************************
//  fConfiguraDecimales
//
//	Configura el número de decimales de las columnas de importes, basado en
//  en los parámetros de la empresa.
//
//  Parámetros 
//
//  Salidas 
// *****************************************************************************
DefFunc fConfiguraDecimales()
  LOCAL lDecs, lFormato, lDigsDecimales

	lDigsDecimales = '0000000000'
	tMoneda.Busca[@Str(pIdMoneda;0)]

  ws.Columns(6).NumberFormat = '0.00%'[C0]
  lDecs = @SUBSTR(lDigsDecimales;1;tMoneda(cDecimalesMoneda))
  lFormato = '#,##0.' & lDecs & '_);(#,##0.' & lDecs & ')'
  ws.Columns(7).NumberFormat = lFormato[C0]
  ws.Columns(8).NumberFormat = lFormato[C0]
	Si pTipoReporte = 0 o pTipoReporte = 2 O pTipoReporte = 3 o pTipoReporte = 5
	  ws.Columns(9).NumberFormat = lFormato[C0]
  	ws.Columns(10).NumberFormat = lFormato[C0]
		Si pTipoReporte = 0 O pTipoReporte = 3
		  ws.Columns(11).NumberFormat = lFormato[C0]
  		ws.Columns(12).NumberFormat = lFormato[C0]
		FinSi
	FinSi

	// Busca el registro de la empresa
  tParametros.Busca Primero
  Si tParametros->Encontro 
		gMascarillaProducto = tParametros(cMascarillaProducto)  // mascarilla para el código del producto
    gMascarillaCliente = tParametros(cMascarillaClientes)
		gMascarillaAgente = tParametros(cMascarillaAgente)
	FinSi	

FinFunc
// *****************************************************************************
//  fCalculaImportes
//
//	Calcula el importe de comisiones y unifica a la moneda requerida por el 
//  reporte
//  Parámetros 
//
//  Salidas 
// *****************************************************************************
// Historial de cambios:
// Fecha        Nombre   N.D.    Descripcion
// *****************************************************************************
// 27/Ago/2003  EGV      2403    Se corrige la comparación para hacer el total,
//                               el neto y el pago a un valor negtivo. 
//                               Consideraba más que las devoluciones para hacer
//                               dichos importes negativos.
// *****************************************************************************
DefFunc fCalculaImportes(atMovimiento: Tabla; atDocumento: Tabla; aTotal; aNeto; aPagado)
	Local lTipoCambio
  Local lIdMonedaCliente

  Local lImporteDoctoMonedaRpt, lImporteDoctoMonedaBase, lTipoCambioRpt

	Si pTipoReporte = 2 O pTipoReporte = 5
		aTotal[0]  = atMovimiento(cTotal)
		aNeto[0]   = atMovimiento(cNeto) - atMovimiento(cDescuento1)- atMovimiento(cDescuento2)- atMovimiento(cDescuento3)- atMovimiento(cDescuento4)- atMovimiento(cDescuento5)
	SiNo
	  aTotal[0]  = atDocumento(cTotal)
		Si pTipoReporte = 0 O pTipoReporte = 3
	  	aNeto[0]   = atDocumento(cNeto) - atDocumento(cDescuentoMov)
	  	aPagado[0] = atDocumento(cTotal) - FSaldoDocumento('';pFechaFinal;tCargosAbonosLib;atDocumento;tDoctoLib)
		FinSi
	FinSi

	//! N.D.3240 // La moneda del Reporte es distinta a la moneda del Docto
  //! N.D.3240 Si atDocumento(cIdMoneda) != pIdMoneda
  //! N.D.3240   aTotal[0]  = @Col(aTotal;0) * atDocumento(cTipoCambio)
	//! N.D.3240 	Si !(pTipoReporte = 1 O pTipoReporte = 4)
	//! N.D.3240 		aNeto[0]   = @Col(aNeto;0) * atDocumento(cTipoCambio)
	//! N.D.3240 		Si pTipoReporte = 0 O pTipoReporte = 3
	//! N.D.3240 			aPagado[0] = @Col(aPagado;0) * atDocumento(cTipoCambio)
	//! N.D.3240 		FinSi
	//! N.D.3240 	FinSi
  //! N.D.3240   // Si el reporte es requerido en una Moneda distinta a la Moneda Base
  //! N.D.3240   Si pIdMoneda != 1
  //! N.D.3240     // Convierte de la Moneda Base a la Moneda requerida en el Reporte
  //! N.D.3240     lTipoCambioRpt      = fTipoCambio(atDocumento(cFecha);pIdMoneda;tTipoCambio)
  //! N.D.3240     aTotal[0]  = @Col(aTotal;0) / lTipoCambioRpt            
	//! N.D.3240 		Si !(pTipoReporte = 1 O pTipoReporte = 4)
	//! N.D.3240 			aNeto[0]   = @Col(aNeto;0) / lTipoCambioRpt            
	//! N.D.3240 			Si pTipoReporte = 0 O pTipoReporte = 3
	//! N.D.3240 				aPagado[0] = @Col(aPagado;0) / lTipoCambioRpt            
	//! N.D.3240 			FinSi
	//! N.D.3240 		FinSi
  //! N.D.3240   Finsi
  //! N.D.3240 Finsi
	tClientes.Busca[@Str(atDocumento(cIdClienteProveedor);0)]
	lIdMonedaCliente = atDocumento(cIdMoneda)
	Si tClientes->Encontro
    lIdMonedaCliente = tClientes(cIdMoneda)
  FinSi

  // Expresar los importes en la moneda del reporte  
  aTotal[0] = fCambiarMonedaDoctoAReporte(atDocumento; tTipoCambio; aTotal; pIdMoneda; lIdMonedaCliente)
  aNeto[0] = fCambiarMonedaDoctoAReporte(atDocumento; tTipoCambio; aNeto; pIdMoneda; lIdMonedaCliente)
  aPagado[0] = fCambiarMonedaDoctoAReporte(atDocumento; tTipoCambio; aPagado; pIdMoneda; lIdMonedaCliente)

  aTotal[1] = ws.Range('F' & RenActual ).Value * @Col(aTotal;0)
	Si !(pTipoReporte = 1 O pTipoReporte = 4)
		aNeto[1]  = ws.Range('F' & RenActual ).Value * @Col(aNeto;0)
		Si pTipoReporte = 0 O pTipoReporte = 3
			aPagado[1]= ws.Range('F' & RenActual ).Value * @Col(aPagado;0)
		FinSi
	FinSi

	Si !(pTipoReporte = 1 O pTipoReporte = 4) Y (atDocumento(cIdDocumentoDe) = 5 O tDocumento(cIdDocumentoDe) = 36 ) 
		aTotal  = aTotal * -1 // Las devoluciones se restan, Devoluciones de venta y de Notas de venta
		aNeto   = aNeto  * -1
		Si pTipoReporte = 0 O pTipoReporte = 3
			aPagado = aPagado * -1
		FinSi
	FinSi
FinFunc

// *****************************************************************************
//  fImprimeDatosAgente
//
//	Esta función imprime los datos del agente (código, nombre, tipo de agente)
//
//  Parámetros 
//
//  Salidas 
// *****************************************************************************
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Historia de modificaciones
//  Fecha      Nombre   IDLotus                     Descripcion
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// 26/02/2002   RPC                 Agregar la línea abajo del agente
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
DefFunc fImprimeDatosAgente(atAgente: Tabla)
Local vImprime, lCodigoEditado, lFechaEditada

  lCodigoEditado = fMascarilla(atAgente(cCodigoAgente); gMascarillaAgente)

  // Avanza de renglon
  RenActual = RenActual + 1[C0]
  ws.Range('A' & RenActual & ':C' & RenActual).Font.FontStyle = 'Negrita'[C0]
  ws.Range('A' & RenActual ).Value = 'Agente:'[C0]
  ws.Range('C' & RenActual ).Value = @Col(lCodigoEditado;0)[C0]
  
  // Avanza de renglon
  RenActual = RenActual + 1[C0]
  ws.Range('A' & RenActual & ':C' & RenActual).Font.FontStyle = 'Negrita'[C0]
  ws.Range('A' & RenActual ).Value = 'Nombre:'[C0]
  ws.Range('C' & RenActual ).Value = atAgente(cNombreAgente)[C0]

  
  vImprime = 'Tipo de Agente: '[C0]
  vImprime = 'Venta/Cobranza'[C1]
  Escoge atAgente(cTipoAgente)
    Caso 1
      vImprime = 'Venta'[C1]
    FinCaso
    Caso 3
      vImprime = 'Cobranza'[C1]
    FinCaso
  FinEscoge

  // Avanza de renglon
  RenActual = RenActual + 1[C0]
  ws.Range('A' & RenActual & gFinReporte & RenActual).Borders(xlinferior).LineStyle = xlLineaSimple[C0] 
  ws.Range('A' & RenActual & ':C' & RenActual).Font.FontStyle = 'Negrita'[C0]
  ws.Range('A' & RenActual ).Value = @COL(vImprime;0)[C0]
  ws.Range('C' & RenActual ).Value = @COL(vImprime;1)[C0]

  // Modifica la variable global que indica que los datos del producto ya fueron impresos
  gDatosAgente = 1
FinFunc

// *****************************************************************************
//  fImprime
//
//	Esta función imprime los datos de cada documento (movimiento)
//  y calcula las comisiones que se incluye en el reporte.
//
//  Parámetros 
//
//  Salidas 
// *****************************************************************************
DefFunc fImprime(atAgentes: Tabla; atDocumento: Tabla; atMovimiento: Tabla)
  Local lFechaEditada, lIdDocumento
  Local aTotal, aNeto, aPagado, lPorcentaje
	
  aTotal = 0.00
  aNeto  = 0.00
  aPagado = 0.00
	lPorcentaje = 0

  // Antes de imprimir el movimento, verifica si ya se imprimieron los datos del producto
  Si !gDatosAgente // Si no se han impreso
    // Imprime los datos del producto
    fImprimeDatosAgente(atAgentes)
  FinSi

  // Avanza de renglon
  RenActual = RenActual + 1[C0]
	ws.Range('A' & RenActual & gFinReporte & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0]
  ws.Range('A' & RenActual & gFinReporte & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0]

  // Fecha del documento
  lFechaEditada = fFormateaFecha(atDocumento(cFecha); gIdioma)
  ws.Range('A' & RenActual).Value = @CHR(39) & lFechaEditada[C0]
  // Serie
  ws.Range('B' & RenActual).Value = atDocumento(cSerieDocumento)[C0]
  // Folio
  ws.Range('C' & RenActual).Value = atDocumento(cFolio)[C0]

	Si !(pTipoReporte = 2 O pTipoReporte = 5)
	  // lee el cliente del documento
  	tClientes.Busca[@Str(atDocumento(cIdClienteProveedor);0)]

		Si tClientes->Encontro
  	  ws.Range('D' & RenActual).Value = tClientes(cRazonSocial)[C0] 
	  FinSi
	SiNo
	  // lee el cliente del documento
  	tProducto.Busca[@Str(atMovimiento(cIdProducto);0)]
            Si pTipoReporte = 2
					lPorcentaje = tProducto(cComVentaExcepProducto)
            SiNo
					lPorcentaje = atMovimiento(cComVenta)
            FinSi
		Si tProducto->Encontro
  	  ws.Range('D' & RenActual).Value = tProducto(cNombreProducto)[C0] 
	  FinSi
	FinSi
	
  // lee el concepto del documento
  tConcepto.Busca[@Str(atDocumento(cIdConceptoDocumento);0)]
  Si tConcepto->Encontro
    ws.Range('E' & RenActual).Value = tConcepto(cNombreConcepto)[C0]
  FinSi

  // Lee el porcentaje de comisión de venta o cobro segun sea el tipo de reporte
  Si pTipoReporte < 3
    Si pTipoReporte = 1
		ws.Range('F' & RenActual).Value = atAgentes(cComisionCobroAgente)/100[C0]
	 SiNo
		Si lPorcentaje = 0
		  ws.Range('F' & RenActual).Value = atAgentes(cComisionVentaAgente)/100[C0]
		SiNo
			ws.Range('F' & RenActual).Value = lPorcentaje/100[C0]
		FinSi	
	FinSi
  SiNo
    Si pTipoReporte = 4
		ws.Range('F' & RenActual).Value = tClientes(cComCobro)/100[C0]
	 SiNo
		Si pTipoReporte = 3
		  ws.Range('F' & RenActual).Value = tClientes(cComVenta)/100[C0]
		SiNo
			ws.Range('F' & RenActual).Value = lPorcentaje/100[C0]
		FinSi	
	FinSi
  FinSi

  fCalculaImportes(atMovimiento; atDocumento; &aTotal; &aNeto; &aPagado)
	
  ws.Range('G' & RenActual).Value = @Col(aTotal;0)[C0]
  ws.Range('H' & RenActual).Value = @Col(aTotal;1)[C0]
  
	Si pTipoReporte = 0 o pTipoReporte = 2 O pTipoReporte = 3 o pTipoReporte = 5
	  ws.Range('I' & RenActual).Value = @Col(aNeto;0)[C0]
  	ws.Range('J' & RenActual).Value = @Col(aNeto;1)[C0]
		Si pTipoReporte = 0 O pTipoReporte = 3
		  ws.Range('K' & RenActual).Value = @Col(aPagado;0)[C0]
  		ws.Range('L' & RenActual).Value = @Col(aPagado;1)[C0]
		FinSi
	FinSi

  // Acumula los totales
  gTotal   = @Col(gTotal;0) + @Col(aTotal;0)[C0]
  gTotal   = @Col(gTotal;1) + @Col(aTotal;1)[C1]
	Si pTipoReporte = 0 o pTipoReporte = 2 O pTipoReporte = 3 o pTipoReporte = 5
	  gNeto    = @Col(gNeto;0) + @Col(aNeto;0)[C0]
  	gNeto    = @Col(gNeto;1) + @Col(aNeto;1)[C1]
		Si pTipoReporte = 0 O pTipoReporte = 3
	  	gPagado  = @Col(gPagado;0) + @Col(aPagado;0)[C0]
  		gPagado  = @Col(gPagado;1) + @Col(aPagado;1)[C1]
		FinSi
	FinSi

  // Acumula los totales
  gGTotal   = @Col(gGTotal;0) + @Col(aTotal;0)[C0]
  gGTotal   = @Col(gGTotal;1) + @Col(aTotal;1)[C1]
	Si pTipoReporte = 0 o pTipoReporte = 2 O pTipoReporte = 3 o pTipoReporte = 5
	  gGNeto    = @Col(gGNeto;0) + @Col(aNeto;0)[C0]
  	gGNeto    = @Col(gGNeto;1) + @Col(aNeto;1)[C1]
		Si pTipoReporte = 0 O pTipoReporte = 3
	  	gGPagado  = @Col(gGPagado;0) + @Col(aPagado;0)[C0]
  		gGPagado  = @Col(gGPagado;1) + @Col(aPagado;1)[C1]
		FinSi
	FinSi

FinFunc


// *****************************************************************************
//  fImprimeTotales
//
//	Esta función imprime los totales por agente
//
//  Parámetros 
//
//  Salidas 
// *****************************************************************************
DefFunc fImprimeTotales(aTotal; aNeto; aPagado)

  // Avanza de renglon
  RenActual = RenActual + 1[C0]
  ws.Range('A' & RenActual & gFinReporte & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0] 

  ws.Range('G' & RenActual & gFinReporte & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0]
  ws.Range('G' & RenActual & gFinReporte & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0]
  ws.Range('G' & RenActual & gFinReporte & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
  ws.Range('G' & RenActual & gFinReporte & RenActual).Font.FontStyle = 'Negrita'[C0]    

  ws.Range('G' & RenActual).Value = @Col(aTotal;0)[C0]
  ws.Range('H' & RenActual).Value = @Col(aTotal;1)[C0]
	Si pTipoReporte = 0 o pTipoReporte = 2 O pTipoReporte = 3 o pTipoReporte = 5
	  ws.Range('I' & RenActual).Value = @Col(aNeto;0)[C0]
  	ws.Range('J' & RenActual).Value = @Col(aNeto;1)[C0]
		Si pTipoReporte = 0 O pTipoReporte = 3
	  	ws.Range('K' & RenActual).Value = @Col(aPagado;0)[C0]
  		ws.Range('L' & RenActual).Value = @Col(aPagado;1)[C0]
		FinSi
	FinSi

  RenActual = RenActual + 1[C0]
FinFunc
// *****************************************************************************
//  fImprimeMovimientos
//
//	Busca los Movimientos del Documento de los agentes e imprimelos
//
//  Parámetros 
//
//  Salidas 
// *****************************************************************************
DefFunc fImprimeMovimientos(atAgentes : Tabla; atDocumento : Tabla)

    // Obtiene los movimientos que pertenecen al documento
    Mientras [tMovimiento.Busca[@str(atDocumento(cIdDocumento);0)]; tMovimiento->Encontro; tMovimiento.Busca Siguiente[1] ]

			fImprime(atAgentes; atDocumento; tMovimiento)

  	FinMientras

FinFunc

// *****************************************************************************
//  fBuscaDocumentos
//
//	Busca Documentos de los agentes e imprimelos
//
//  Parámetros 
//
//  Salidas 
// *****************************************************************************
DefFunc fBuscaDocumentos(atAgentes : Tabla)
Local lFecha
    lFecha = pFechaInicial
    // Obtiene los documentos en el rango de fechas especificado en el reporte
    Mientras lFecha <= pFechaFinal  
      // Si encontro algún documento en esa fecha, recupera todos los documentos en esa fecha
      Mientras [tDocumento.Busca[atAgentes(cIdAgente) & ':' & lFecha]; tDocumento->Encontro; tDocumento.Busca Siguiente[2] ]
					
					// Si el Documento está cancelado no lo consideres
          // FBCS POS, las notas de venta tienen naturaleza 2, por eso se modifica esta validacion.
					Si tDocumento(cCancelado) = 1 O (tDocumento(cNaturaleza) = 2 Y tDocumento(cIdDocumentoDe)!= 35 y tDocumento(cIdDocumentoDe)!= 36)
						Continua
					FinSi
					Si pTipoReporte = 0 o pTipoReporte = 2 O pTipoReporte = 3 o pTipoReporte = 5
						// Unicamente se procesarán las ventas y las devoluciones
						Si tDocumento(cIdDocumentoDe) != 4 y tDocumento(cIdDocumentoDe) != 5 y tDocumento(cIdDocumentoDe) != 35 y tDocumento(cIdDocumentoDe) != 36
							Continua
						FinSi
					SiNo
					  //Unicamente se procesarán los abonos hechos a clientes  //FBCS ND 1813
						//Si tDocumento(cNaturaleza) != 1
						//	Continua
						//FinSi		
            // Se descartan los abonos que no representan un ingreso real.// FBCS ND 1813
            Si tDocumento(cIdDocumentoDe)!= 9 Y tDocumento(cIdDocumentoDe)!=10 Y tDocumento(cIdDocumentoDe)!= 12
                Continua
            Finsi
					FinSi

					Si pTipoReporte = 0 o pTipoReporte = 1 O pTipoReporte = 3 o pTipoReporte = 4
				  	fImprime(atAgentes; tDocumento; tMovimiento)
					SiNo // Reporte de comisiones de venta por producto
						fImprimeMovimientos(atAgentes;tDocumento)
					FinSi

			FinMientras
			// Busca en la siguiente fecha
      lFecha = fFechaSiguiente(lFecha)
  FinMientras
FinFunc

// ==========================================================================================
// fImprimeClasesExcel  (Procedimiento)
// Descripcion : Imprime los nombres de las clases justificados al centro
//   aNumClases = El número total de clases seleccionadas,contando todas las clasificaciones
//   aNumPorClase = Lista que tiene como elementos el numero de clases seleccionadas para cada
//            clasificación.
// ==========================================================================================
Deffunc fImprimeClasesExcel(aListaNombreClases;aNumPorClase)
  
  Local lCont,lNumElem,lContPrincipal,lLeyenda,lOffset

  lOffset = 0
  lContPrincipal = 0
  lLeyenda = ''

  // Se barren las seis listas de ID´s
  Mientras  lContPrincipal < 6

    // solo se imprimen los que si tuvieron al menos un ID 
    Si   @Escoge(aNumPorClase;lContPrincipal) != ''
      // Obtengo el número de elementos para la clase
      lNumElem = @Val(@Escoge(aNumPorClase;lContPrincipal))

      lCont = 0
      // Barre todos los elementos de esta clase
      Mientras lCont < lNumElem
        lLeyenda = lLeyenda &','& @Escoge(aListaNombreClases;lOffset+lCont)
        lCont = lCont +1
      FinMientras 

      lOffset = lOffset + lNumElem 
    
      // Se imprime la clase y sus valores seleccionados
      ws.Range('A' & RenActual ).Value = 'CLASIFICACIÓN No. ' & @Str(lContPrincipal+1;0) & ' : '& @SubStr(lLeyenda;1;@Len(lLeyenda)-1)[C0]
      // Avanza de renglon
      RenActual = RenActual + 1[C0]

      lLeyenda = ''
  
    Finsi
    lContPrincipal = lContPrincipal + 1

  FinMientras
FinFunc

// *****************************************************************************
// Encabezado del reporte

Encab
    // Pone el nombre del sistema
    ws.Range('A' & RenActual).Font.Color = @RGB(255;0;0)[C0]
    ws.Range('A' & RenActual).Font.Size = 10[C0]
    ws.Range('A' & RenActual).Value = 'AdminPAQ'[C0]

    // Pone el nombre de la empresa
    ws.Range('B' & RenActual).Font.Size = 14[C0]
    ws.Range('B' & RenActual).Font.FontStyle = 'Negrita'[C0]
    // Lo centra en las columnas A a la L
    ws.Range('B' & RenActual & gEmpresa & RenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0]
    ws.Range('B' & RenActual ).Value = tEmpresa->Nombre

    // Avanza de renglon
    RenActual = RenActual + 1[C0]

    // Pone el titulo del reporte en EXCEL
    ws.Range('A' & RenActual).Font.Size = 12[C0]
    ws.Range('A' & RenActual).Font.FontStyle = 'Negrita'[C0]
		Si pTipoReporte = 0
	    ws.Range('A' & RenActual ).Value = 'C O M I S I O N E S  D E  V E N T A'[C0]
		FinSi
		Si pTipoReporte = 1
	    ws.Range('A' & RenActual ).Value = 'C O M I S I O N E S  D E  C O B R O'[C0]
		FinSi
		Si pTipoReporte = 2
	    ws.Range('A' & RenActual ).Value = 'C O M I S I O N E S  D E  V E N T A  P O R  P R O D U C T O'[C0]
		FinSi
		Si pTipoReporte = 3
	    ws.Range('A' & RenActual ).Value = 'C O M I S I O N E S  D E  V E N T A  P O R  C L I E N T E'[C0]
		FinSi
		Si pTipoReporte = 4
	    ws.Range('A' & RenActual ).Value = 'C O M I S I O N E S  D E  C O B R O  P O R  C L I E N T E'[C0]
		FinSi
		Si pTipoReporte = 5
	    ws.Range('A' & RenActual ).Value = 'C O M I S I O N E S  D E  V E N T A  P O R  M O V I M I E N T O'[C0]
		FinSi
    // Lo centra en las columnas A a la L
    ws.Range('A' & RenActual & gFinReporte & RenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0]

    // Avanza de renglon
    RenActual = RenActual + 1[C0]

    // Pone el titulo del reporte en EXCEL
    ws.Range('A' & RenActual).Font.Size = 12[C0]
    ws.Range('A' & RenActual).Font.FontStyle = 'Negrita'[C0]    
    ws.Range('A' & RenActual ).Value = 'Del: ' & fFormateaFecha(pFechaInicial;gIdioma) & ' Al: ' & fFormateaFecha(pFechaFinal;gIdioma)[C0]
    // Lo centra en las columnas A a la N
    ws.Range('A' & RenActual & gFinReporte & RenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0]

    // Avanza de renglon
    RenActual = RenActual + 1[C0]

    // Se Revisan las clasificaciones, para recuperarlas e imprimirlas en el encabezado
    // ===== se arman los ID en una LIsta para poder recorrerlos en una iteración
    gClasesRecibidas = fCuentaClases(&gNumClasesPorTipo;pIdClase1;pIdClase2;pIdClase3;pIdClase4;pIdClase5;pIdClase6)
    // se cargan las clasificaciones validas y se obtiene el número de clases validas
    gNumDeClases = fCargaClases(tValoresDeClasif;&gListNombreDeClases; &gListIdDeClases; gClasesRecibidas)
    Si gNumDeClases > 0    // solo si hubo al menos una clase seleccionada
    	 fImprimeClasesExcel(gListNombreDeClases;gNumClasesPorTipo) 
    Finsi

    tMoneda.Busca[@Str(pIdMoneda;0)]
    Si tMoneda->Encontro
			ws.Range(gMoneda & RenActual ).Value = 'Moneda: ' & tMoneda(cNombreMoneda)[C0]
		FinSi

    // Avanza de renglon
    RenActual = RenActual + 1[C0]

    // Pone los titulos de Totales
    ws.Range('G' & RenActual & ':H' & RenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0]
    ws.Range('G' & RenActual & ':H' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
    ws.Range('G' & RenActual & ':H' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0]
    ws.Range('G' & RenActual & ':H' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0]
    ws.Range('G' & RenActual & ':H' & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0]
    ws.Range('G' & RenActual & ':H' & RenActual).Interior.ColorIndex = 3[C0]    
    ws.Range('G' & RenActual).Font.Color = @RGB(255;255;255)[C0]
    ws.Range('G' & RenActual).Font.FontStyle = 'Negrita'[C0]    
    ws.Range('G' & RenActual ).Value = 'EN BASE AL TOTAL'[C0]

		Si pTipoReporte = 0 o pTipoReporte = 2 O pTipoReporte = 3 o pTipoReporte = 5
	    // Pone los titulos de Neto-Descuentos
  	  ws.Range('I' & RenActual & ':J' & RenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0]
    	ws.Range('I' & RenActual & ':J' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
	    ws.Range('I' & RenActual & ':J' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0]
  	  ws.Range('I' & RenActual & ':J' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0]
    	ws.Range('I' & RenActual & ':J' & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0]
	    ws.Range('I' & RenActual & ':J' & RenActual).Interior.ColorIndex = 3[C0]    
  	  ws.Range('I' & RenActual).Font.Color = @RGB(255;255;255)[C0]
    	ws.Range('I' & RenActual).Font.FontStyle = 'Negrita'[C0]    
	    ws.Range('I' & RenActual ).Value = 'EN BASE A NETO-DESCUENTOS'[C0]

			Si pTipoReporte = 0 O pTipoReporte = 3
		    // Pone los titulos de Pagado
  		  ws.Range('K' & RenActual & ':L' & RenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0]
    		ws.Range('K' & RenActual & ':L' & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
	    	ws.Range('K' & RenActual & ':L' & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0]
	  	  ws.Range('K' & RenActual & ':L' & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0]
  	  	ws.Range('K' & RenActual & ':L' & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0]
	  	  ws.Range('K' & RenActual & ':L' & RenActual).Interior.ColorIndex = 3[C0]    
	  	  ws.Range('K' & RenActual).Font.Color = @RGB(255;255;255)[C0]
  	  	ws.Range('K' & RenActual).Font.FontStyle = 'Negrita'[C0]    
	  	  ws.Range('K' & RenActual ).Value = 'EN BASE AL IMPORTE PAGADO'[C0]
			FinSi
		FinSi

    // Avanza de renglon
    RenActual = RenActual + 1[C0]

    // Pone el titulo de cada columna en EXCEL
    ws.Range('A' & RenActual & gFinReporte & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
    ws.Range('A' & RenActual & gFinReporte & RenActual).Borders(xlSuperior).LineStyle = xlLineaSimple[C0]
    ws.Range('A' & RenActual & gFinReporte & RenActual).Borders(xlIzquierda).LineStyle = xlLineaSimple[C0]
    ws.Range('A' & RenActual & gFinReporte & RenActual).Borders(xlDerecha).LineStyle = xlLineaSimple[C0]
    ws.Range('A' & RenActual & gFinReporte & RenActual).Interior.ColorIndex = 55[C0]    
    ws.Range('A' & RenActual & gFinReporte & RenActual).Font.FontStyle = 'Negrita'[C0]    
    ws.Range('A' & RenActual & gFinReporte & RenActual).Font.Color = @RGB(255;255;255)[C0]

    ws.Range('C' & RenActual).HorizontalAlignment = xlDerecha[C0]
    ws.Range('F' & RenActual & gFinReporte & RenActual).HorizontalAlignment = xlDerecha[C0]
		Si pTipoReporte = 0 O pTipoReporte = 3
	    ws.Range('A' & RenActual & gFinReporte & RenActual).Value = 'Fecha','Serie','Folio','Cliente','Concepto','Comisión Venta','Total','Comisión','Neto-Descuentos','Comisión','Importe Pagado','Comisión'
		FinSi
		Si pTipoReporte = 1 O pTipoReporte = 4
	    ws.Range('A' & RenActual & gFinReporte & RenActual).Value = 'Fecha','Serie','Folio','Cliente','Concepto','Comisión Cobro','Total','Comisión'
		FinSi
		Si pTipoReporte = 2 O pTipoReporte = 5
	    ws.Range('A' & RenActual & gFinReporte & RenActual).Value = 'Fecha','Serie','Folio','Producto','Concepto','Comisión Venta','Total','Comisión','Neto-Descuentos','Comisión'
		FinSi
    Excel.Rows('7:7').Select
    Excel.ActiveWindow.FreezePanes = True
    ws.Range('A' & RenActual).Select
FinEncab


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

// Configura los decimales del reporte
fConfiguraDecimales()

// Si el rango inicial es el primer agente, recupera el código del primero
Si pAgenteInicial = ' '
  tAgentes.Busca Primero
  Si tAgentes->Encontro
    pAgenteInicial = tAgentes(cCodigoAgente)
  FinSi
FinSi

// Si el rango final es el último agente, recupera el código del último
Si pAgenteFinal = ' '
  tAgentes.Busca Ultimo
  Si tAgentes->Encontro
    pAgenteFinal = tAgentes(cCodigoAgente)
  FinSi
FinSi

// Inicializa variables de totales
gGTotal = 0.0            // Total de documentos
gGNeto = 0.0             // Neto-Descuentos de los documentos
gGPagado = 0.0           // Total pagado de los documentos

Mientras [ tAgentes.Busca[pAgenteInicial & '..' & pAgenteFinal]; tAgentes->Encontro; tAgentes.Busca Siguiente[1] ]

	// Quita el agente Ninguno
	Si tAgentes(cIdAgente) = 0
    Continua
  Finsi

  // Solo busca los agentes de acuerdo al tipo especificado y omite los de cobranza
	Si pTipoReporte = 0 o pTipoReporte = 2 O pTipoReporte = 3 o pTipoReporte = 5 // reporte de agentes de venta
	  Si tAgentes(cTipoAgente) = 3 o (pTipoAgente != 0 y pTipoAgente != tAgentes(cTipoAgente))
  	  Continua
	  FinSi
	SiNo  // reporte de agentes de cobranza
		Si tAgentes(cTipoAgente) = 1 o (pTipoAgente != 0 y pTipoAgente != tAgentes(cTipoAgente))
			Continua
		FinSi
	FinSi

	// Verifica si el producto cumple con las clasificaciones especificadas 
  Si gNumDeClases > 0
    Si !fMiembroDeUnaClase(tAgentes; gNumDeClases; gListIdDeClases; 3)
     // Discrimina el agente por no pertenecer a alguna de las clasificaciones
      Continua
    FinSi
  FinSi

  // Inicializa variable para impresión de los datos del agente
  gDatosAgente = 0 // No se han impreso los datos del agente

  // Inicializa variables de totales
  gTotal = 0.0            // Total de documentos
  gNeto = 0.0             // Neto-Descuentos de los documentos
  gPagado = 0.0           // Total pagado de los documentos
  

  Si !pImprimirAgentes // No discriminar agentes sin movimientos?
    // Imprime los datos del agente
    fImprimeDatosAgente(tAgentes)
  FinSi

  fBuscaDocumentos(tAgentes)

  // Se imprimieron los datos del agente?
  Si gDatosAgente
    // Imprime los totales por agente
    fImprimeTotales(gTotal; gNeto; gPagado)
  FinSi

FinMientras
// Imprime los totales por agente
fImprimeTotales(gGTotal; gGNeto; gGPagado)
