Private Sub cmdGenerarFactura_Click()
Dim FolioFactura As Integer
Dim dbName As String
Dim conn As ADODB.Connection
Dim Agencia As String
Dim FechaFactura As Date
Dim strInsert As String
Dim strUpdate As String
Dim strSelect As String
Dim Filas As Integer
Dim i As Integer
Dim j As Integer
Dim l As Integer
Dim tFields() As String
Dim sTmp As String
Dim Exportada As Boolean
Dim Cancelada As Boolean
Dim Folio As Integer
Dim ActualizaCupones As String
Dim ActualizaFactura As String
Dim EliminaCuponesFacturados As String
Dim EliminaDetalleFacturas As String
Dim FacturaEncontrada As Boolean
Dim FacturaCancelada As Boolean
Dim CanceladaAdmin As Boolean
Dim SQL As String
	Si ha cambiado el valor de la fila actual, entonces se invoca el procedimiento validateRow, que actualiza la fila en la tabla Facturacin Temporal
   If blnFieldChanged Then
    If validateRow Then
        SCGrid1.Refresh
    End If
    End If
    
    FolioFactura = ComboFactura
    Agencia = ComboAgencia
    FechaFactura = Format(txtFechaFactura, "mm/dd/yy")
    dbName = frmMain.Ap_Path & frmMain.dbName
        Set conn = New ADODB.Connection
    conn.ConnectionString = _
        "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=" & dbName & ";" & _
        "Persist Security Info=False"
    conn.Open
    
Si el numero de factura que se desea generar existe en la tabla Maestro Facturas, entonces checa si esta exportada y/o cancelada         
If DLookup("Numero", "Maestro Facturas", "Numero = " & FolioFactura) <> "No encontrado" Then
strSelect = "SELECT [Maestro Facturas].Numero, [Maestro Facturas].Exportada, [Maestro Facturas].Cancelada FROM [Maestro Facturas]" & _
" Where (([Maestro Facturas].Numero) = " & FolioFactura & ")"
rcds.Open strSelect, db, adOpenStatic, adLockOptimistic

Exportada = rcds.Fields(1)
Cancelada = rcds.Fields(2)
rcds.Close
Si la factura no esta exportada a AdminPaq, y no esta cancelada en el Sicres entonces no se puede generar
If Exportada = False And Cancelada = False Then
    MsgBox "No se puede generar este numero de factura ya que existe y no esta cancelada"
    Exit Sub
End If
Si la factura no esta exportada a AdminPaq, y ya ha sido cancelada en el
Sicres, entonces pregunta si desea hacerla de nuevo
If Exportada = False And Cancelada = True Then
    If MsgBox("Esta facturada ya ha sido cancelada, desea hacerla de nuevo?", vbYesNo, "Advertencia") = vbYes Then
Actualiza el numero de factura en la tabla Maestro Facturas
        conn.Execute "Update [Maestro Facturas] Set Subcanal = '" & Agencia & "', FechaFactura = #" & FechaFactura & "#, Cancelada = 0 where Numero = " & FolioFactura
Borra de las tablas Detalle Facturas y Cupones Facturas, todos los registros que estaban relacionados con el nmero de factura que se esta generando una vez ms
        conn.Execute "delete * from [Detalle Facturas] where Numero = " & FolioFactura
        conn.Execute "delete * from [Cupones Facturados] where Factura = " & FolioFactura
        
        Filas = SCGrid1.Rows
   Realiza un bucle con las filas del Grid, selecciona donde la columna Facturar sea verdadera
    For j = 0 To Filas - 1
    If SCGrid1.Text(j, 11) = "Verdadero" Then
    Si el valor de la columna Menores es diferente a cero, entonces
        If SCGrid1.Text(j, 7) <> 0 Then
        ReDim tFields(SCGrid1.Cols - 1)
    Realiza un bucle con las columnas, para almacenar el valor de la celda en un vector 
    For i = 0 To SCGrid1.Cols - 1
            sTmp = SCGrid1.Text(j, i)
    Select Case i
        Case 0, 7, 9, 10
                    tFields(i) = sTmp
        Case 2, 4
            tFields(i) = "'" & sTmp & "'"
        Case 3
            tFields(i) = "#" & Format(sTmp, "mm/dd/yy") & "#"
          Case 11
                    tFields(i) = IIf(sTmp = "", "False", "True")
        Case 5
Debido a que el cupn contiene menores, entonces la tarifa para los menores es la mitad que la tarifa en la columna 5
            tFields(i) = sTmp / 2
            Case 6
                tFields(i) = ""
            Case 8
Calcula el importe real a cobrar por los menores
                tFields(i) = tFields(5) * tFields(7)
        End Select
 Next i
Crea la cadena que se ejecutar e insertar en la tabla Detalle Facturas los valores para los menores del cupn, es decir la factura va a incluir un servicio, generalmente llamado Cigarrette Angel Menores, cuyo precio de venta es la mitad del servicio Cigarrette Angel (para adultos)
    strInsert = "insert into [Detalle Facturas] values ("
        strInsert = strInsert & FolioFactura
Columnas Actividad, Fecha, Cupn
        For l = 2 To SCGrid1.Cols - 7
            strInsert = strInsert & "," & tFields(l)
        Next l
Columnas Tarifa, Menores, Importe, Tipo Cambio, Porcentaje Comision
        For l = 7 To SCGrid1.Cols - 2
            strInsert = strInsert & "," & tFields(l)
        Next l
        
        strInsert = strInsert & ")"
        db.Execute strInsert
        
    End If
Si la fila o el cupn contiene adultos, entonces
    If SCGrid1.Text(j, 6) <> 0 Then
        ReDim tFields(SCGrid1.Cols - 1)
        Realiza un bucle con las columnas, para almacenar el valor de la celda en un vector 
    For i = 0 To SCGrid1.Cols - 1
        sTmp = SCGrid1.Text(j, i)
    Select Case i
        Case 0, 5, 6, 9, 10
            tFields(i) = sTmp
        Case 2, 4
            tFields(i) = "'" & sTmp & "'"
        Case 3
            tFields(i) = "#" & Format(sTmp, "mm/dd/yy") & "#"
          Case 11
                    tFields(i) = IIf(sTmp = "", "False", "True")
            Case 7
                tFields(i) = ""
            Case 8
El importe es la cantidad de adultos por la tarifa del cupn
                tFields(i) = tFields(5) * tFields(6)
        End Select
         
    Next i
Crea la cadena que se ejecutar e insertar en la tabla Detalle Facturas los valores para los adultos del cupn
        strInsert = "insert into [Detalle Facturas] values ("
        strInsert = strInsert & FolioFactura
Columnas Actividad, Fecha, Cupn, Tarifa
        For l = 2 To SCGrid1.Cols - 6
            strInsert = strInsert & "," & tFields(l)
        Next l
Columnas Adultos, Importe, Tipo de Cambio y Porcentaje de Comision
        For l = 8 To SCGrid1.Cols - 2
            strInsert = strInsert & "," & tFields(l)
        Next l
        strInsert = strInsert & ")"
        db.Execute strInsert
    End If
Inserta en la tabla Cupones Facturados los valores del Folio del pago, Concepto pago, Forma pago, Numero de cupn y Numero de factura
        strInsert = "insert into [Cupones Facturados] values ("
        strInsert = strInsert & tFields(0) & "," & tFields(2) & ", 'Cupon agencia'," & tFields(4) & "," & FolioFactura & ")"
        db.Execute strInsert
        Actualiza la tabla Cash_flow Nuevo, indicando que cupones se facturaron
        strUpdate = "update [Cash_flow Nuevo] set CFFacturado ="  'CFFacturado = " & Facturar
        strUpdate = strUpdate & tFields(11)
        strUpdate = strUpdate & " where CFNFolio =" & tFields(0) & " And CFCPago =" & tFields(2) & " And CFFPago='Cupon agencia' And CFCupon =" & tFields(4)
        db.Execute strUpdate
    
    End If
    
    Next j
    
           Unload Me
           frmFacturacion.Show
        Exit Sub
    End If
End If
Si la factura ya ha sido exportada a AdminPaq, te avisa que an se puede generar pero antes checa si ha sido eliminada en AdminPaq
If Exportada = True Then
    If MsgBox("Esta factura ya fue exportada a Adminpaq, si desea volver a usar esta factura tiene que eliminarla primero de AdminPaq, si continua con este proceso se eliminara del Sicres la factura y generara otra", vbYesNo, "Advertencia") = vbYes Then
        If MsgBox("La factura debe ya estar eliminada de AdminPaq, o el proceso no continuara, desea continuar?", vbYesNo, "Advertencia") = vbYes Then
Se conecta a la base de datos del Sistema AdminPaq
         cn.Connect = "SourceType=DBF;" _
            & "SourceDB=\\Fserver\COACCION\LFVR2006;" _
            & "Driver={Microsoft Visual FoxPro Driver}"

        cn.CursorDriver = rdUseOdbc
        cn.EstablishConnection "rdDriverNoPrompt"
        Abre la tabla MGW10008, que es el Maestro de Facturas en AdminPaq
        SQL = "select * from MGW10008"
        Set rs = cn.OpenResultset(SQL, rdOpenKeyset, rdConcurRowVer)
            rs.MoveFirst
    Realiza un ciclo en los registros de la tabla MGW10008, buscando la factura, y si la encuentra, checa si ha sido cancelada
    For i = 1 To rs.RowCount
        If rs(1) = 4 And rs(2) = 4 And rs(4) = FolioFactura And rs(25) = 1 Then
        FacturaEncontrada = True
        FacturaCancelada = True
        End If
        If rs(1) = 4 And rs(2) = 4 And rs(4) = FolioFactura And rs(25) = 0 Then
        FacturaEncontrada = True
        FacturaCancelada = False
        End If
        rs.MoveNext
    Next i
    cn.Close
    
    If FacturaEncontrada = True And FacturaCancelada = False Then
        MsgBox "Factura Encontrada y No Cancelada, se debe eliminar por completo esta factura en Adminpaq"
        Exit Sub
    End If
    
    If FacturaEncontrada = True And FacturaCancelada = True Then
        MsgBox "Factura Encontrada y Cancelada, se debi eliminar por completo esta factura en Adminpaq, ahora se necesita usar otro nmero de factura"
        Exit Sub
    End If
Solo si la factura no fue encontrada, te deja continuar
    If FacturaEncontrada = False Then
Regresa a el estado de No Facturados, los cupones en la tabla Cash_flow Nuevo        
    strSelect = "SELECT [Cupones Facturados].Folio FROM [Cupones Facturados]" & _
" Where (([Cupones Facturados].Factura) = " & FolioFactura & ")"
   rcds.Open strSelect, db, adOpenStatic, adLockOptimistic

For i = 1 To rcds.RecordCount
        Folio = rcds.Fields(0)
        ActualizaCupones = "Update [Cash_flow Nuevo] set CFFacturado = 0 where CFNFolio = " & Folio
db.Execute ActualizaCupones
Next i

rcds.Close
Actualiza la tabla Maestro Facturas, estableciendo el numero de factura a no exportada y no cancelada
        conn.Execute "Update [Maestro Facturas] Set Subcanal = '" & Agencia & "', FechaFactura = #" & FechaFactura & "#, Exportada = 0, Cancelada = 0 where Numero = " & FolioFactura
Borra los registros en las tablas Detalle Facturas y Cupones Facturados relacionados con el nmero de factura que se desea generar otra vez
        conn.Execute "delete * from [Detalle Facturas] where Numero = " & FolioFactura
        conn.Execute "delete * from [Cupones Facturados] where Factura = " & FolioFactura
        
        Filas = SCGrid1.Rows
   Realiza un bucle con las filas del Grid, selecciona donde la columna Facturar sea verdadera
    For j = 0 To Filas - 1
    If SCGrid1.Text(j, 11) = "Verdadero" Then
     Si el valor de la columna Menores es diferente a cero, entonces
        If SCGrid1.Text(j, 7) <> 0 Then
        ReDim tFields(SCGrid1.Cols - 1)
    Realiza un bucle con las columnas, para almacenar el valor de la celda en un vector 
    For i = 0 To SCGrid1.Cols - 1
        sTmp = SCGrid1.Text(j, i)
        
    Select Case i
        Case 0, 7, 9, 10
            tFields(i) = sTmp
        Case 2, 4
            tFields(i) = "'" & sTmp & "'"
        Case 3
            tFields(i) = "#" & Format(sTmp, "mm/dd/yy") & "#"
          Case 11
                    tFields(i) = IIf(sTmp = "", "False", "True")
        Case 5
Debido a que el cupn contiene menores, entonces la tarifa para los menores es la mitad que la tarifa en la columna 5
            tFields(i) = sTmp / 2
            Case 6
                tFields(i) = ""
            Case 8
Calcula el importe real a cobrar por los menores
                tFields(i) = tFields(5) * tFields(7)
        End Select
         
    Next i
Crea la cadena que se ejecutar e insertar en la tabla Detalle Facturas los valores para los menores del cupn, es decir la factura va a incluir un servicio, generalmente llamado Cigarrette Angel Menores, cuyo precio de venta es la mitad del servicio Cigarrette Angel (para adultos)
    strInsert = "insert into [Detalle Facturas] values ("
        strInsert = strInsert & FolioFactura
Columnas Actividad, Fecha, Cupon
        For l = 2 To SCGrid1.Cols - 7
            strInsert = strInsert & "," & tFields(l)
        Next l
Columnas Tarifa, Menores, Importe, Tipo Cambio, Porcentaje Comision
        For l = 7 To SCGrid1.Cols - 2
            strInsert = strInsert & "," & tFields(l)
        Next l
        
        strInsert = strInsert & ")"
        db.Execute strInsert
        
    End If
Si la fila o el cupn contiene adultos, entonces
    If SCGrid1.Text(j, 6) <> 0 Then
        ReDim tFields(SCGrid1.Cols - 1)
        Realiza un bucle con las columnas, para almacenar el valor de la celda en un vector 
    For i = 0 To SCGrid1.Cols - 1
        sTmp = SCGrid1.Text(j, i)
    Select Case i
        Case 0, 5, 6, 9, 10
            tFields(i) = sTmp
        Case 2, 4
            tFields(i) = "'" & sTmp & "'"
        Case 3
            tFields(i) = "#" & Format(sTmp, "mm/dd/yy") & "#"
          Case 11
                    tFields(i) = IIf(sTmp = "", "False", "True")
            Case 7
                tFields(i) = ""
            Case 8
El importe es la cantidad de adultos por la tarifa del cupn
                tFields(i) = tFields(5) * tFields(6)
        End Select
  Next i
Crea la cadena que se ejecutar e insertar en la tabla Detalle Facturas los valores para los adultos del cupn
        strInsert = "insert into [Detalle Facturas] values ("
        strInsert = strInsert & FolioFactura
Columnas Actividad, Fecha, Cupn, Tarifa
        For l = 2 To SCGrid1.Cols - 6
            strInsert = strInsert & "," & tFields(l)
        Next l
Columnas Adultos, Importe, Tipo de Cambio y Porcentaje de Comision
        For l = 8 To SCGrid1.Cols - 2
            strInsert = strInsert & "," & tFields(l)
        Next l
        strInsert = strInsert & ")"
        db.Execute strInsert
    End If
Inserta en la tabla Cupones Facturados los valores del Folio del pago, Concepto pago, Forma pago, Numero de cupn y Numero de factura
        strInsert = "insert into [Cupones Facturados] values ("
        strInsert = strInsert & tFields(0) & "," & tFields(2) & ", 'Cupon agencia'," & tFields(4) & "," & FolioFactura & ")"
        db.Execute strInsert
        Actualiza la tabla Cash_flow Nuevo, indicando que cupones se facturaron
        strUpdate = "update [Cash_flow Nuevo] set CFFacturado ="  'CFFacturado = " & Facturar
        strUpdate = strUpdate & tFields(11)
        strUpdate = strUpdate & " where CFNFolio =" & tFields(0) & " And CFCPago =" & tFields(2) & " And CFFPago='Cupon agencia' And CFCupon =" & tFields(4)
        db.Execute strUpdate
    
    End If
    
    Next j
Descarga el formulario
           Unload Me
Muestra el formulario principal de facturacin
           frmFacturacion.Show
        Exit Sub
    End If
        Else
            Exit Sub
        End If
    Else
        Exit Sub
    End If
End If

End If
Si no existe el numero de factura en la tabla Maestro Facturas, entonces, la inserta y hace todo el proceso que esta comentado en la parte superior de este codigo: si hay menores, calcula su tarifa e importe, y lo inserta en la tabla Detalle Facturas; si hay adultos, calcula su tarifa e importe, y lo inserta en la tabla Detalle Facturas; inserta los cupones en la Tabla Cupones Facturados; y actualiza la tabla Cash_flow Nuevo estableciendo a facturados los cupones de la factura generada
    conn.Execute "Insert into [Maestro Facturas] (Numero,Subcanal,FechaFactura) Values (" & FolioFactura & ",'" & Agencia & "',#" & FechaFactura & "#)"
    
    Filas = SCGrid1.Rows
    
    For j = 0 To Filas - 1
    If SCGrid1.Text(j, 11) = "Verdadero" Then
    
        If SCGrid1.Text(j, 7) <> 0 Then
        ReDim tFields(SCGrid1.Cols - 1)
            
    For i = 0 To SCGrid1.Cols - 1
        sTmp = SCGrid1.Text(j, i)
        
    Select Case i
        Case 0, 7, 9, 10
            tFields(i) = sTmp
        Case 2, 4
            tFields(i) = "'" & sTmp & "'"
        Case 3
            tFields(i) = "#" & Format(sTmp, "mm/dd/yy") & "#"
          Case 11
                    tFields(i) = IIf(sTmp = "", "False", "True")
        Case 5
            tFields(i) = sTmp / 2
            Case 6
                tFields(i) = ""
            Case 8
                tFields(i) = tFields(5) * tFields(7)
                
        End Select
         
    Next i
    strInsert = "insert into [Detalle Facturas] values ("
        strInsert = strInsert & FolioFactura
        For l = 2 To SCGrid1.Cols - 7
            strInsert = strInsert & "," & tFields(l)
        Next l
        For l = 7 To SCGrid1.Cols - 2
            strInsert = strInsert & "," & tFields(l)
        Next l
        
        strInsert = strInsert & ")"
        db.Execute strInsert
        
    End If
    If SCGrid1.Text(j, 6) <> 0 Then
        ReDim tFields(SCGrid1.Cols - 1)
           
    For i = 0 To SCGrid1.Cols - 1
        'Facturar = SCGrid1.Text(iRow, 11)
        sTmp = SCGrid1.Text(j, i)
        
    Select Case i
        Case 0, 5, 6, 9, 10
            tFields(i) = sTmp
        Case 2, 4
            tFields(i) = "'" & sTmp & "'"
        Case 3
            tFields(i) = "#" & Format(sTmp, "mm/dd/yy") & "#"
          Case 11
                    tFields(i) = IIf(sTmp = "", "False", "True")
            Case 7
                tFields(i) = ""
            Case 8
                tFields(i) = tFields(5) * tFields(6)
        End Select
         
    Next i
        strInsert = "insert into [Detalle Facturas] values ("
        strInsert = strInsert & FolioFactura
        For l = 2 To SCGrid1.Cols - 6
            strInsert = strInsert & "," & tFields(l)
        Next l
        For l = 8 To SCGrid1.Cols - 2
            strInsert = strInsert & "," & tFields(l)
        Next l
        
        strInsert = strInsert & ")"
        db.Execute strInsert
    End If
        strInsert = "insert into [Cupones Facturados] values ("
        strInsert = strInsert & tFields(0) & "," & tFields(2) & ", 'Cupon agencia'," & tFields(4) & "," & FolioFactura & ")"
        db.Execute strInsert
        
        strUpdate = "update [Cash_flow Nuevo] set CFFacturado ="  'CFFacturado = " & Facturar
        strUpdate = strUpdate & tFields(11)
        strUpdate = strUpdate & " where CFNFolio =" & tFields(0) & " And CFCPago =" & tFields(2) & " And CFFPago='Cupon agencia' And CFCupon =" & tFields(4)
        db.Execute strUpdate
    
    End If
    Next j
Descarga el formulario y muestra el formulario principal de facturacin.
           Unload Me
           frmFacturacion.Show
End Sub
