
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// Reporte:     MOVIMIENTO POR CUENTA BANCARIA
//
// Sistema:     ADMINPAQ  Versión v10.0 Windows
//
// Descripcion:  Reporte que imprime la relación de abonos timbrados vs xml generado y factura pagada
// Consideraciones :  La información se obtiene de datos almacenados en tablas, no lee los xml
// Creación  :  Agosto 2017
// Revisiones : 
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

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

  Incluye LibAdminPaq.rpt
  Incluye LibCliProv.rpt

//******************************************************************************
//Parámetros.
    
  Parametro pDeLaFecha      = '20170101'
  Parametro pAlaFecha       = '20171231'
  Parametro pDeLaCuenta     = ' '      // Código de la Cuenta bancaria
  Parametro pALaCuenta      = ' '      // Código de la Cuenta bancaria
  Parametro pIdMoneda       = 1
  

//******************************************************************************
//Apertura de tablas.

//Nombres terminados en Lib, indican que la tabla fue abierta explícitamente 
//para alguna Fx de librería

  UsaEmpresa tEmpresa;'AdminpaqW'               

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

  UsaTabla tDocumentos = tEmpresa['mgw10008'] Alias 'tDoctos1'  
  tDocumentos.Usaindice['CIDCUENTA']   //CIDCUENTA + FECHA DOCUMENTO

  UsaTabla tDigitales = tEmpresa['mgw10045']
  tDigitales.Usaindice['CIDDOCTO']

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

  Usatabla tCuentas = tEmpresa['mgw10056'] Alias 'tCuenta1'
  tCuentas.Usaindice['INUMEROC01']      
  
  Usatabla tCuentasCP = tEmpresa['mgw10056'] Alias 'tCuenta2'
  tCuentasCP.Usaindice['']

  UsaTabla tMonedas = tEmpresa['mgw10034']          
  tMonedas.Usaindice['']                        

  Columnas 1;5

  pIdMoneda = 1
  tMonedas.Busca[@Str(pIdMoneda;0)] 
  gDecimales = tMonedas(cDecimalesMoneda)


//******************************************************************************
//Declaración de variables globales.
  
  gHoy = fFormateaFecha(@Hoy();0)
  gNombreMoneda = tMonedas(cNombreMoneda)

// *************************************
// 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
constante xlSaltoPagina -4135

// *************************************
// 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 = 18[C0] // A
ws.Columns(2).ColumnWidth = 18[C0] // B
ws.Columns(3).ColumnWidth = 8[C0] // C
ws.Columns(4).ColumnWidth = 10[C0] // D
ws.Columns(5).ColumnWidth = 40[C0] // E
ws.Columns(6).ColumnWidth = 15[C0]  //F
ws.Columns(7).ColumnWidth = 12[C0]   //G
ws.Columns(8).ColumnWidth = 25[C0]  //H
ws.Columns(9).ColumnWidth = 20[C0]  //I
ws.Columns(10).ColumnWidth = 20[C0]  //J
ws.Columns(11).ColumnWidth = 20[C0]  //K
ws.Columns(12).ColumnWidth = 20[C0]  //L
ws.Columns(13).ColumnWidth = 20[C0]  //M
ws.Columns(14).ColumnWidth = 38[C0]  //N

lDigsDecimales = '0000000000'
lDecs = @SUBSTR(lDigsDecimales;1;gDecimales)

lFormato = '#,##0.' & lDecs & '_);(#,##0.' & lDecs & ')'
ws.Columns(6).NumberFormat = lFormato[C0]

//******************************************************************************
//Funciones.


// ==========================================================================================
// fImpDatosCuenta (Procedimiento)
// Descripcion : Imprime los datos de la cuenta de la empresa (DESTINO)
// Entrada : aTblCuenta
// Salida  : No regresa valor
// ==========================================================================================
DefFunc fImpDatosCuenta(aTblCuenta:TABLA)
       
    Si gCuentaImpreso = 1
        Retorna
    Sino
        gCuentaImpreso = 1
    FinSi  

    RenActual = RenActual + 1[C0]
    ws.Range('A' & RenActual ).Value = 'Número de Cuenta:'[C0]
    ws.Range('A' & RenActual).Font.Bold = true[C0]
    ws.Range('B' & RenActual).Font.Bold = true[C0]
    ws.Range('B' & RenActual ).Value = @chr(39) & aTblCuenta(cNumeroC01)[C0]	
    RenActual = RenActual + 1[C0]

    ws.Range('A' & RenActual ).Value = 'Alias:'[C0]
    ws.Range('A' & RenActual).Font.Bold = true[C0]
    ws.Range('B' & RenActual).Font.Bold = true[C0]
    ws.Range('B' & RenActual ).Value = aTblCuenta(cNombreC01)[C0]	
    ws.Range('A' & RenActual & ':' & gFinReporte & RenActual).Borders(xlInferior).LineStyle = xlLineaSimple[C0]
    RenActual = RenActual + 1[C0]	

    
       
FinFunc

// ==========================================================================================
// fImprimeDocumento (Procedimiento)
// Descripcion : Imprime el movimiento de la cuenta destino (EMPRESA)
// Entrada :La tabla de clientes, con el cliente a imprimir abierto
//
// ==========================================================================================
DefFunc fImprimeDocumento(aTblDocumento:TABLA; aTblDigital:TABLA; aTblCliente:TABLA; aTblMoneda:TABLA; ATblCuenta:TABLA; ATblCuentaCP:TABLA)

    // Fecha del documento
    ws.Range('A' & RenActual ).Value = @chr(39) & fFormateaFecha(aTblDocumento(cFecha);0)[C0]    

    aTblDigital.Busca[@STR(aTblDocumento(cIdDocum01);0)]
    Si aTblDigital->ENCONTRO
        // Fecha de emisión 
        ws.Range('B' & RenActual ).Value = @chr(39) & fFormateaFecha(aTblDigital(cFechaEmi);0)[C0]                
        // Número de operación bancaria 
        ws.Range('I' & RenActual ).Value = @chr(39) & aTblDigital(CDESCONCBA)[C0]
        ws.Range('N' & RenActual ).Value = @chr(39) & aTblDigital(cUUID)[C0]               
    FinSi
    
    ws.Range('C' & RenActual ).Value = aTblDocumento(cSerieDo01)[C0]
    ws.Range('D' & RenActual ).Value = aTblDocumento(cFolio)[C0]
    // Nombre del cliente
    ws.Range('E' & RenActual ).Value = aTblCliente(cRazonSocial)[C0]
        

    // Importe de la moneda
    ws.Range('F' & RenActual ).Value = aTblDocumento(cTotal)[C0] 

	// Forma pago
	lDescFormaPago = ''
	lClaveFormaPago = aTblDocumento(cMetodoPag)

	Escoge lClaveFormaPago
		Caso 1  
			lDescFormaPago = 'Efectivo'
		FinCaso
		Caso 2 
			lDescFormaPago = 'Cheque nominativo'
		FinCaso
		Caso 3 
			lDescFormaPago = 'Transferencia electrónica de fondos'
		FinCaso
		Caso 4  
			lDescFormaPago = 'Tarjeta de crédito'
		FinCaso
		Caso 5 
			lDescFormaPago = 'Monedero electrónico'
		FinCaso
		Caso 6 
			lDescFormaPago = 'Dinero electrónico'
		FinCaso
		Caso 8
			lDescFormaPago = 'Vales de despensa'
		FinCaso
		Caso 12 
			lDescFormaPago = 'Dación en pago'
		FinCaso
		Caso 13 
			lDescFormaPago = 'Pago por subrogación'
		FinCaso
		Caso 14  
			lDescFormaPago = 'Pago por consignación'
		FinCaso
		Caso 15 
			lDescFormaPago = 'Condonación'
		FinCaso
		Caso 17 
			lDescFormaPago = 'Compensación'
		FinCaso	
		Caso 23 
			lDescFormaPago = 'Novación'
		FinCaso
		Caso 24  
			lDescFormaPago = 'Confusión'
		FinCaso
		Caso 25 
			lDescFormaPago = 'Remisión de deuda'
		FinCaso
		Caso 26 
			lDescFormaPago = 'Prescripción o caducidad'
		FinCaso
		Caso 27
			lDescFormaPago = 'A satisfacción del acreedor'
		FinCaso
		Caso 28 
			lDescFormaPago = 'Tarjeta de débito'
		FinCaso
		Caso 29
			lDescFormaPago = 'Tarjeta de servicios'
		FinCaso
		Caso 30
			lDescFormaPago = 'Aplicación de anticipos'
		FinCaso	
		Caso 31
			lDescFormaPago = 'Intermediario pagos'
		FinCaso
		Caso 99 
			lDescFormaPago = 'Por definir'
		FinCaso		
	FinEscoge	

	ws.Range('H' & RenActual ).Value = @chr(39) & lClaveFormaPago & ' - ' & lDescFormaPago[C0] 
	
	
    // Código sat de la moneda del documento
    aTblMoneda.Busca[@STR(aTblDocumento(cIdMoneda);0)]
    Si aTblMoneda->ENCONTRO
        ws.Range('G' & RenActual ).Value = aTblMoneda(cClaveSAT)[C0]        
    FinSi

    // ABONO CLIENTE O DE PROVEEDO 
    // La cuenta origen es del cliente/proveedor y el destino es la de la empresa
    Si aTblDocumento(cNaturaleza) = 1
        ws.Range('L' & RenActual ).Value = @chr(39) & aTblCuenta(cNumeroC01)[C0]        
        ws.Range('M' & RenActual ).Value = @chr(39) & aTblCuenta(cNombreC01)[C0]            
        aTblCuentaCP.BUSCA[@STR(aTblDocumento(CIDMONEDCA);0)]    
        Si aTblCuentaCP->ENCONTRO Y aTblCuentaCP(cIdCuenta) != 0
            ws.Range('J' & RenActual ).Value = @chr(39) & aTblCuentaCP(cNumeroC01)[C0]        
            ws.Range('K' & RenActual ).Value = @chr(39) & aTblCuentaCP(cNombreC01)[C0]        
        FinSi
    SiNo
        // La cuenta origen es la de la empresa y el destino es la del cliente/proveedor
        ws.Range('J' & RenActual ).Value = @chr(39) & aTblCuenta(cNumeroC01)[C0]        
        ws.Range('K' & RenActual ).Value = @chr(39) & aTblCuenta(cNombreC01)[C0]            
        aTblCuentaCP.BUSCA[@STR(aTblDocumento(CIDMONEDCA);0)]    
        Si aTblCuentaCP->ENCONTRO Y aTblCuentaCP(cIdCuenta) != 0
            ws.Range('L' & RenActual ).Value = @chr(39) & aTblCuentaCP(cNumeroC01)[C0]        
            ws.Range('M' & RenActual ).Value = @chr(39) & aTblCuentaCP(cNombreC01)[C0]        
        FinSi
    FinSi

    Si aTblDocumento(CUSAPROV01) = 1  // Documento de Proveedor
        ws.Range('A' & RenActual & ':' & gFinReporte & RenActual).Font.Color = @RGB(68;114;196)[C0]
    FinSi
    ws.Range('A' & RenActual & ':' & gFinReporte & RenActual).Borders(xlInferior).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]

    RenActual = RenActual + 1[C0]    
Finfunc


// ==========================================================================================
// fDiscriminaCuenta()
// Salidas:  1 = indica que la cuenta no aplica y se debe descartar
//           0 = indica que la cuenta no debe descartarse.
// ==========================================================================================
DefFunc fDiscriminaCliente(aTblCliente:TABLA)
  Local lRegresa
    
  lRegresa = 0

  // Se salta el Cliente NINGUNO
  Si aTblCliente(cIdClienteProveedor) = 0
    lRegresa = 1
  Finsi
  // Clientes inactivos 
  Si aTblCliente(cEstatus) = 0
    lRegresa = 1
  Finsi

  Retorna lRegresa

FinFunc


// =============================================================================
// fDiscriminaDocto()
// Salidas:  1 = indica que el Docto no aplica, debe descartarse
//           0 = indica que el Docto no debe descartarse.
// =============================================================================
DefFunc fDiscriminaDocto(aTblDocumento:TABLA)
  Local lRegresa

  lRegresa = 0

  // si no es cargo o abono  
  Si aTblDocumento(cNaturaleza) = 2  
    lRegresa = 1
  Finsi

  Si aTblDocumento(cCancelado) = 1
    lRegresa = 1
  FinSi
 
  Retorna lRegresa

FinFunc

//******************************************************************************
//Encabezado.
Encab
    // Valida el rango de fechas
    pALaFecha = pALaFecha < pDeLaFecha ? pDeLaFecha : pAlaFecha

    // Pone el nombre del sistema
    gFinReporte = 'N'[C0]
    gEmpresa = 'I'[C0]
    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]
    RenActual = RenActual + 1[C0]

    ws.Range(gFinReporte & RenActual).HorizontalAlignment = xlDerecha[C0]
    ws.Range(gFinReporte & RenActual).Value = gHoy
    RenActual = RenActual + 1[C0]

    // Pone el nombre de la empresa
    ws.Range('A' & RenActual).Font.Size = 14[C0]
    ws.Range('A' & RenActual).Font.Bold = true[C0]
    ws.Range('A' & RenActual & ':' & gEmpresa & RenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0]
    ws.Range('A' & RenActual ).Value = tEmpresa->Nombre

    RenActual = RenActual + 1[C0]

    ws.Range('A' & RenActual).Font.Size = 12[C0]
    ws.Range('A' & RenActual).Font.Bold = true[C0]
    ws.Range('A' & RenActual & ':' & gEmpresa & RenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0]
    ws.Range('A' & RenActual ).Value = 'Movimientos por Cuenta Bancaria'[C0]
  
    RenActual = RenActual + 1[C0]
    
    ws.Range('A' & RenActual).Font.Size = 12[C0]
    ws.Range('A' & RenActual).Font.Bold = true[C0]    
    ws.Range('A' & RenActual & ':' & gEmpresa & RenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0]
    gDelaFecha = fFormateaFecha(pDelaFecha;0)
    gAlaFecha  = fFormateaFecha(pAlaFecha;0)
    ws.Range('A' & RenActual ).Value = 'Del: ' & gDelaFecha & ' Al: ' & gAlaFecha[C0]

    RenActual = RenActual + 2[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.Bold = true[C0]    
    ws.Range('A' & RenActual & ':' & gFinReporte & RenActual).Font.Color = @RGB(255;255;255)[C0]
    ws.Range('A' & RenActual & ':' & gFinReporte & RenActual).WrapText = True
    ws.Range('A' & RenActual & ':' & gFinReporte & RenActual).HorizontalAlignment = xlCentro[C0]	
      
    ws.Range('A' & RenActual).Value = 'Fecha Pago'
    ws.Range('B' & RenActual).Value = 'Fecha Emisión'
    ws.Range('C' & RenActual).Value = 'Serie'
    ws.Range('D' & RenActual).Value = 'Folio'
    ws.Range('E' & RenActual).Value = 'Cliente/Proveedor'
    ws.Range('F' & RenActual).Value = 'Cargo/Abono'
    ws.Range('G' & RenActual).Value = 'Moneda'
	ws.Range('H' & RenActual).Value = 'Forma de Pago'
    ws.Range('I' & RenActual).Value = 'Número Operación'
    ws.Range('J' & RenActual).Value = 'Cuenta Origen'
    ws.Range('K' & RenActual).Value = 'Alias Cuenta Origen'
    ws.Range('L' & RenActual).Value = 'Cuenta Destino'
    ws.Range('M' & RenActual).Value = 'Alias Cuenta Destino'
    ws.Range('N' & RenActual).Value = 'UUID'

    RenActual = RenActual + 1

  FinEncab


//******************************************************************************
//Cuerpo principal.
//******************************************************************************


  tParametros.Busca Primero   

  Si pDeLaCuenta = ' '
    tCuentas.Busca Primero
    pDeLaCuenta = tCuentas(cNumeroC01)
  FinSi

  Si pAlaCuenta = ' '
    tCuentas.Busca Ultimo
    pALaCuenta = tCuentas(cNumeroC01)
  FinSi


  Mientras[tCuentas.Busca[pDeLaCuenta & '..'  & pAlaCuenta ]; tCuentas->Encontro ; tCuentas.Busca Siguiente[1]]

    Si tCuentas(cIdCuenta) = 0 O tCuentas(cIdCatal01) != 0   // Quita la cuenta 0, y las cuentas que no son de la empresa
        Continua
    FinSi

    // Se inicializa la fecha con la que se realizaran las busquedas en el rango de fechas
    gFechaBusqueda = pDeLaFecha  

    // NOTA: Es obligatorio volver a fijar el índice a fin de que las búsquedas parciales funcionen correctamente
    tDocumentos.Usaindice['CIDCUENTA']
    tDocumentos.Busca[tCuentas(cIdCuenta) & ':' & gFechaBusqueda]
    Si !tDocumentos->ENCONTRO
      Si tCuentas(cIdCuenta) = @Val(@SUBSTR(tDocumentos->Llave;0;11))
        Si @SUBSTR(tDocumentos->Llave;11;8) >= pDeLaFecha Y @SUBSTR(tDocumentos->Llave;11;8) <= pAlaFecha
          gFechaBusqueda = @SUBSTR(tDocumentos->Llave;11;8)
          tDocumentos.Busca[tCuentas(cIdCuenta) & ':' & gFechaBusqueda]
        FinSi
      FinSi        
    FinSi

    gCuentaImpreso = 0   // Bandera para controlar la impresión de la cuenta

    Mientras tDocumentos->Encontro Y (tDocumentos(cFecha) <= pAlaFecha)

	    tClientes.BUSCA[@STR(tDocumentos(cIdClien01);0)]
		
        Si fDiscriminaCliente(tClientes) = 1  
		    tDocumentos.BUSCA SIGUIENTE[1]
      		Continua
    	Finsi

        Si fDiscriminaDocto(tDocumentos) = 1
          tDocumentos.BUSCA SIGUIENTE[1]
          Continua
        Finsi

        fImpDatosCuenta(tCuentas)
        fImprimeDocumento(tDocumentos;tDigitales;tClientes;tMonedas;tCuentas;tCuentasCP)
                
         // Búsqueda del siguiente registro que cumpla con la cuenta
        tDocumentos.BUSCA SIGUIENTE[1]


    FinMientras

    tDocumentos.Usaindice['']  // Para las busquedas parciales
  FinMientras

      
  //  FIN DEL REPORTE



