// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// Reporte:     Reporte de Notas de Venta con desglose de porcentajes de impuesto y estado facturado
//
// Sistema:     ADMINPAQ  Versión v2.0 Windows
//
// Descripcion: Revisa las aperturas de cajas con corte del módulo de Punto de Venta y aquellas desglosa las ventas por 
//              porcentaje de impuesto, su estado y factura generada.
//
// Consideraciones :
// Creación  :  Roberto Del Alto Torres.  3/Junio/2003
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// Historia de modificaciones
//  Fecha      Nombre   IDLotus     Descripcion
//  12/07/2007 LAP      N.D.4624    Los campos de fechas son campos cadena por lo que las busquedas y rango no sirven
//                                  Afortunadamente los cortes de caja toman la fecha de la PC por lo cual se graban
//                                  en forma consecutiva.
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

//======================================================================================================================
// PARAMETROS
//======================================================================================================================
Parametro pCajaInicial    = 'CAJA1'
Parametro pCajaFinal      = 'CAJA1'
Parametro pFechaInicial   = '20030601'
Parametro pFechaFinal     = '20030630'
Parametro pCajeroInicial  = ' '
Parametro pCajeroFinal    = 'z'
Parametro pTipoDoctos     = 0   // 0 = Todos, 1 = Facturados, 2 = No Facturados


//======================================================================================================================
//======================================================================================================================
Columnas 10;2, 2
USALETRA 'Arial'
ALTURA 9

//======================================================================================================================
//======================================================================================================================
UsaEmpresa tEmpresa;'ADMINPAQW'

UsaTabla tParametros = tEmpresa['MGW10000']   // Parametros de la Empresa

UsaTabla tCajas = tEmpresa['MGW10041']        // Catálogo de Cajas
tCajas.Usaindice['CCODIGOC01']

UsaTabla tAperCajas = tEmpresa['MGW10042']    // Catálogo de Cajas
tAperCajas.Usaindice['CAJAFECAPE']

UsaTabla tPagosNV = tEmpresa['MGW10043']      // Pago de Notas de Venta
tPagosNV.Usaindice['APERTDOC']

UsaTabla tAgentes = tEmpresa['MGW10001']      // Agentes
tAgentes.Usaindice['']

UsaTabla tDocumentos = tEmpresa['MGW10008']   // Documentos
tDocumentos.Usaindice['']

UsaTabla tMovimientos = tEmpresa['MGW10010']  // Movimientos
tMovimientos.Usaindice['iDoctoNumeroMovto']

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


//======================================================================================================================
// VARIABLES GLOBALES 
//======================================================================================================================
// *************************************
// 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 xlLineaGruesa		4
constante xlVerticalDentro	11
constante xlHorizontalDentro	12

kMeses = 'Ene,Feb,Mar,Abr,May,Jun,Jul,Ago,Sep,Oct,Nov,Dic'[C0]
kAvance = '.....................'
lAvance = 1

// *************************************
// 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 = 10[C0]
ws.Columns(2).ColumnWidth = 10[C0]
ws.Columns(3).ColumnWidth = 15[C0]
ws.Columns(4).ColumnWidth = 15[C0]
ws.Columns(5).ColumnWidth = 15[C0]
ws.Columns(6).ColumnWidth = 15[C0]
ws.Columns(7).ColumnWidth = 15[C0]
ws.Columns(8).ColumnWidth = 15[C0]
ws.Columns(9).ColumnWidth = 15[C0]
ws.Columns(10).ColumnWidth = 15[C0]

//======================================================================================================================
//FUNCIONES <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
//======================================================================================================================
//**********************************************************************************************************************
// 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


//======================================================================================================================
//Encabezado.
//======================================================================================================================
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]
  RenActual = RenActual + 1

  // Pone el nombre de la empresa
  ws.Range('A' & RenActual).Font.Size = 14[C0]
  ws.Range('A' & RenActual).Font.FontStyle = 'Negrita'[C0]
  ws.Range('A' & RenActual & ':J' & RenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0]
  ws.Range('A' & RenActual ).Value = tEmpresa->Nombre
  RenActual = RenActual + 1[C0]

  ws.Range('A' & RenActual).Font.Name = 'Arial'[C0]
  ws.Range('A' & RenActual).Font.Size = 12[C0]
  ws.Range('A' & RenActual).Font.FontStyle = 'Negrita'[C0] 
  ws.Range('A' & RenActual).Value = 'Estado de Facturación de Notas de Venta'
  ws.Range('A' & RenActual & ':J' & RenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0]
  RenActual = RenActual + 1

  ws.Range('A' & RenActual).Font.Name = 'Arial'[C0]
  ws.Range('A' & RenActual).Font.Size = 11[C0]
  ws.Range('A' & RenActual).Font.FontStyle = 'Negrita'[C0] 
  ws.Range('A' & RenActual).Value = 'Del: ' & fEditaFecha(pFechaInicial) & ' Al: ' & fEditaFecha(pFechaFinal)
  ws.Range('A' & RenActual & ':J' & RenActual).HorizontalAlignment = xlCentrarEnSeleccion[C0]
  RenActual = RenActual + 2

  Excel.Rows(RenActual & ':' & RenActual).Select
  Excel.ActiveWindow.FreezePanes = True
  ws.Range('A' & RenActual).Select   
  RenAvance = RenActual - 1
  ws.Range('A' & RenAvance).Font.FontStyle = 'Negrita'[C0] 
  ws.Range('A' & RenAvance).Font.Color = @RGB(255;0;0)[C0]
FinEncab

//======================================================================================================================
//PRINCIPAL <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
//======================================================================================================================
tParametros.BUSCA PRIMERO
Si pCajaInicial = ' '
   tCajas.BUSCA PRIMERO
   pCajaInicial = tCajas(ccodigoc01)

   tCajas.BUSCA ULTIMO
   pCajaFinal = tCajas(ccodigoc01)
FinSi

tAperCajas.Usaindice['APERTCAJA']   // cIdCaja + cIdApertura
MIENTRAS[tCajas.BUSCA[pCajaInicial & '..' & pCajaFinal]; tCajas->Encontro; tCajas.BUSCA SIGUIENTE[1]]

  // Localización de la primer Apertura de la Caja en el rango de fechas
  tAperCajas.BUSCA[@Str(tCajas(cIdCaja);0)]   
  Mientras tAperCajas->Encontro Y (pFechaInicial > @SUBSTR(tAperCajas(cFecHoraAp);6;4) & @SUBSTR(tAperCajas(cFecHoraAp);0;2) & @SUBSTR(tAperCajas(cFecHoraAp);3;2))
    ws.Range('A' & RenAvance).Value = 'Procesando, espere un momento' & @Substr(kAvance; 0; lAvance)
    lAvance = lAvance + 1
    Si lAvance = 20
      lAvance = 1
    FinSi
    tAperCajas.BUSCA SIGUIENTE[1]
  FinMientras  
  
  Mientras tAperCajas->Encontro Y (@SUBSTR(tAperCajas(cFecHoraAp);6;4) & @SUBSTR(tAperCajas(cFecHoraAp);0;2) & @SUBSTR(tAperCajas(cFecHoraAp);3;2) <= pFechaFinal)
    tAgentes.BUSCA[ @STR(tAperCajas(cidagente);0) ]
    Si pCajeroInicial != ' '
      Si tAgentes->Encontro
        Si tAgentes(ccodigoagente) < pCajeroInicial O tAgentes(ccodigoagente) > pCajeroFinal
          tAperCajas.BUSCA SIGUIENTE[1]
          Continua
        FinSi
      FinSi
    FinSi 

    Si tAperCajas(cestadoape) = 1
      ws.Range('A' & RenActual).Value = 'Caja: ' & tCajas(ccodigoc01) & ' ' & tCajas(cnombrec01)[C0]
      RenActual = RenActual + 1
      ws.Range('A' & RenActual).Value = 'Fecha y Hora de Apertura: ' & @Substr(tAperCajas(cfechoraap);0;19)
      RenActual = RenActual + 1
      ws.Range('A' & RenActual).Value = 'Cajero: ' & tAgentes(ccodigoagente) & ' ' & tAgentes(cnombreagente)
      RenActual = RenActual + 2

      ws.Range('A' & RenActual & ':J' & RenActual).Borders(xlBordeIzquierda).LineStyle = xlLineaSimple[C0]
      ws.Range('A' & RenActual & ':J' & RenActual).Borders(xlBordeDerecha).LineStyle = xlLineaSimple[C0]
      ws.Range('A' & RenActual & ':J' & RenActual).Borders(xlBordeSuperior).LineStyle = xlLineaSimple[C0]
      ws.Range('A' & RenActual & ':J' & RenActual).Borders(xlBordeInferior).LineStyle = xlLineaSimple[C0]
      ws.Range('A' & RenActual & ':J' & RenActual).Borders(xlVerticalDentro).LineStyle = xlLineaSimple[C0]
      ws.Range('A' & RenActual & ':J' & RenActual).Font.Name = 'Arial'[C0]
      ws.Range('A' & RenActual & ':J' & RenActual).Font.Size = 9[C0]
      ws.Range('A' & RenActual & ':J' & RenActual).Font.FontStyle = 'Negrita'[C0] 
      ws.Range('C' & RenActual & ':I' & RenActual).HorizontalAlignment = xlDerecha[C0]
      ws.Range('A' & RenActual & ':J' & RenActual).Value = 'Folio','Factura','Al 15%','Al 10%','Al 0%','Exento','Otros%','IVA Otros%','Total','Estado'
      RenActual = RenActual + 1

      Totales = ''
      MIENTRAS[ tPagosNV.BUSCA[ @STR(tAperCajas(cidapertur);0)]; tPagosNV->Encontro; tPagosNV.BUSCA SIGUIENTE[1] ]
        ws.Range('A' & RenAvance).Value = 'Procesando, espere un momento' & @Substr(kAvance; 0; lAvance)
        lAvance = lAvance + 1
        Si lAvance = 20
          lAvance = 1
        FinSi
          Si tPagosNV(ciddocum01) > 0 
            tDocumentos.BUSCA[ @STR(tPagosNV(ciddocum01);0) ]
            Si tDocumentos->Encontro 

               // Si documentos a imprimir son solo facturados,
               // verifica si el tiene facturación global o facturación por nota de venta
               Si pTipoDoctos = 1 Y ( tAperCajas(ciddocum01) = 0 Y tPagosNV(ciddocum03) = 0 )
                  Continua 
               FinSi

               // Si documentos a imprimir son los no facturados,
               // verifica si el tiene facturación global o facturación por nota de venta
               Si pTipoDoctos = 2 Y ( tAperCajas(ciddocum01) != 0 O tPagosNV(ciddocum03) != 0 )
                  Continua 
               FinSi

               Linea = ''
               Linea = @Chr(39) & tDocumentos(cseriedocumento) & ' ' & tDocumentos(cfolio)[C0]
               Linea = tDocumentos(ccancelado) = 1 ? 'Cancelado' : 'Afectado'[C9]

               Si tPagosNV(ciddocum03) != 0
                  tDocumentos.BUSCA[ @STR(tPagosNV(ciddocum03);0) ]
                  Linea = @Chr(39) & tDocumentos(cseriedocumento) & ' ' & tDocumentos(cfolio)[C1]
               SiNo
                  Si tAperCajas(ciddocum01) != 0
                     tDocumentos.BUSCA[ @STR(tAperCajas(ciddocum01);0) ]
                     Linea = @Chr(39) & tDocumentos(cseriedocumento) & ' ' & tDocumentos(cfolio)[C1]
                  FinSi
               FinSi

               Ventas = 0 
               MIENTRAS[ tMovimientos.BUSCA[ @STR(tPagosNV(ciddocum01);0)]; tMovimientos->Encontro; tMovimientos.BUSCA SIGUIENTE[1] ] 
                ws.Range('A' & RenAvance).Value = 'Procesando, espere un momento' & @Substr(kAvance; 0; lAvance)
                lAvance = lAvance + 1
                Si lAvance = 20
                  lAvance = 1
                FinSi
                  Si tParametros(cnumimpu01) = 1
                     lImpuestos = tMovimientos(cporcent01)[C0]  
                     lImpuestos = tMovimientos(cimpuesto1)[C1]  
                     lImpuestos = tMovimientos(cporcent02)[C2]  
                     lImpuestos = tMovimientos(cimpuesto2)[C3]  
                     lImpuestos = tMovimientos(cporcent03)[C4]  
                     lImpuestos = tMovimientos(cimpuesto3)[C5]   
                  SiNo
                     Si tParametros(cnumimpu01) = 2
                        lImpuestos = tMovimientos(cporcent02)[C0]  
                        lImpuestos = tMovimientos(cimpuesto2)[C1]  
                        lImpuestos = tMovimientos(cporcent01)[C2]  
                        lImpuestos = tMovimientos(cimpuesto1)[C3]  
                        lImpuestos = tMovimientos(cporcent03)[C4]  
                        lImpuestos = tMovimientos(cimpuesto3)[C5]   
                     SiNo
                        lImpuestos = tMovimientos(cporcent03)[C0]  
                        lImpuestos = tMovimientos(cimpuesto3)[C1]  
                        lImpuestos = tMovimientos(cporcent01)[C2]  
                        lImpuestos = tMovimientos(cimpuesto1)[C3]  
                        lImpuestos = tMovimientos(cporcent02)[C4]  
                        lImpuestos = tMovimientos(cimpuesto2)[C5]   
                     FinSi 
                  FinSi 

                  lAplImpOtro = False
                  lBaseImpuesto = tMovimientos(cneto) - (tMovimientos(cdescuen01) + tMovimientos(cdescuen02) + tMovimientos(cdescuen03) + tMovimientos(cdescuen04) + tMovimientos(cdescuen05))[C0]

                  Si @COL(lImpuestos;0) = 15
                     Ventas = @COL(Ventas;0) + @COL(lBaseImpuesto;0)[C0]
                  SiNo  
                     Si @COL(lImpuestos;0) = 10
                        Ventas = @COL(Ventas;1) + @COL(lBaseImpuesto;0)[C1]
                     SiNo  
                        Si @COL(lImpuestos;0) = 0
                           tProducto.BUSCA[ @STR(tMovimientos(cidprodu01);0) ]
                           Si tProducto(cesexento) = 1
                              Ventas = @COL(Ventas;3) + @COL(lBaseImpuesto;0)[C3]
                           SiNo
                              Ventas = @COL(Ventas;2) + @COL(lBaseImpuesto;0)[C2]
                           FinSi 
                        SiNo  
                           Ventas = @COL(Ventas;4) + @COL(lBaseImpuesto;0)[C4]
                           Ventas = @COL(Ventas;5) + @COL(lImpuestos;1)[C5]
                           lAplImpOtro = True
                        FinSi
                     FinSi
                  FinSi

                  Si @COL(lImpuestos;3) != 0
                     Si !lAplImpOtro 
                        Ventas = @COL(Ventas;4) + @COL(lBaseImpuesto;0)[C4]
                        lAplImpOtro = True
                     FinSi 
                     Ventas = @COL(Ventas;5) + @COL(lImpuestos;3)[C5]
                  FinSi

                  Si @COL(lImpuestos;5) != 0
                     Si !lAplImpOtro 
                        Ventas = @COL(Ventas;4) + @COL(lBaseImpuesto;0)[C4]
                        lAplImpOtro = True
                     FinSi 
                     Ventas = @COL(Ventas;5) + @COL(lImpuestos;5)[C5]
                  FinSi
               FINMIENTRAS

               Linea = @COL(Ventas;0)[C2]
               Linea = @COL(Ventas;1)[C3]
               Linea = @COL(Ventas;2)[C4]
               Linea = @COL(Ventas;3)[C5]
               Linea = @COL(Ventas;4)[C6]
               Linea = @COL(Ventas;5)[C7]
               Linea = @COL(Ventas;0) + @COL(Ventas;1) + @COL(Ventas;2) + @COL(Ventas;3) + @COL(Ventas;4) + @COL(Ventas;5)[C8]  

               ws.Range('A' & RenActual & ':J' & RenActual).Borders(xlBordeIzquierda).LineStyle = xlLineaSimple[C0]
               ws.Range('A' & RenActual & ':J' & RenActual).Borders(xlBordeDerecha).LineStyle = xlLineaSimple[C0]
               ws.Range('A' & RenActual & ':J' & RenActual).Borders(xlBordeSuperior).LineStyle = xlLineaSimple[C0]
               ws.Range('A' & RenActual & ':J' & RenActual).Borders(xlBordeInferior).LineStyle = xlLineaSimple[C0]
               ws.Range('A' & RenActual & ':J' & RenActual).Borders(xlVerticalDentro).LineStyle = xlLineaSimple[C0]
               ws.Range('A' & RenActual & ':J' & RenActual).Font.Name = 'Arial'[C0]
               ws.Range('A' & RenActual & ':J' & RenActual).Font.Size = 9[C0]
               ws.Range('C' & RenActual & ':J' & RenActual).NumberFormat = '###,###,##0.00'

               ws.Range('A' & RenActual & ':J' & RenActual).Value = Linea[C0..C9]
               RenActual = RenActual + 1

               Totales = Totales + Linea[C2..C8]
            FINSI
          FINSI
      FINMIENTRAS

      ws.Range('B' & RenActual & ':J' & RenActual).Borders(xlBordeIzquierda).LineStyle = xlLineaSimple[C0]
      ws.Range('B' & RenActual & ':J' & RenActual).Borders(xlBordeDerecha).LineStyle = xlLineaSimple[C0]
      ws.Range('B' & RenActual & ':J' & RenActual).Borders(xlBordeSuperior).LineStyle = xlLineaSimple[C0]
      ws.Range('B' & RenActual & ':J' & RenActual).Borders(xlBordeInferior).LineStyle = xlLineaSimple[C0]
      ws.Range('B' & RenActual & ':J' & RenActual).Borders(xlVerticalDentro).LineStyle = xlLineaSimple[C0]
      ws.Range('B' & RenActual & ':J' & RenActual).Font.Name = 'Arial'[C0]
      ws.Range('B' & RenActual & ':J' & RenActual).Font.Size = 9[C0]
      ws.Range('B' & RenActual & ':J' & RenActual).Font.FontStyle = 'Negrita'[C0] 
      ws.Range('C' & RenActual & ':J' & RenActual).NumberFormat = '###,###,##0.00'

      Totales = 'Totales:'[C1]
      ws.Range('A' & RenActual & ':J' & RenActual).Value = Totales[C0..C9]
      RenActual = RenActual + 2
    FinSi

    tAperCajas.BUSCA SIGUIENTE[1]	       
  FINMIENTRAS
FINMIENTRAS
ws.Range('A' & RenAvance).Select   
ws.Range('A' & RenAvance).Value = ' '   


