Private Sub cmdExportarAdminpaq_Click()
Dim strSelect As String
Dim NumeroFactura As Integer
Dim Cancelada As Boolean
Dim Exportada As Boolean
Dim ActualizaFactura As String
Dim FacturaEncontrada As Boolean
Dim FacturaCancelada As Boolean

Dim UltimoConsecutivoDocumento As Integer
Dim FolioFactura As Integer
Dim FechaFactura As Date
Dim NombreAgenciaSicres As String
Dim IdCliente As Integer
Dim CodigoCliente As String
Dim NombreCliente As String
Dim RFCCliente As String
Dim FechaVencimiento As Date
Dim TotalUnidades As Integer

Dim Servicio As String
Dim Pax As Integer
Dim PrecioConIVA As Single
Dim PorcentajeIVA As Single
Dim TipoCambio As Single
Dim PorcentajeComision As Single
Dim TotalFactura As Single
Dim TotalDescuentos As Single
Dim TotalImpuestos As Single
Dim NetoFactura As Single
Dim FechaNula As Variant

Dim i As Integer
Dim j As Integer
Dim NumeroMovimientos As Integer
Dim UltimoMovimiento As Integer
Dim MovimientoDocumento As Integer
Dim IdProducto() As Integer
Dim CodServicio() As String
Dim PrecioPorPaxSinIVA As Single
Dim PrecioPorPaxConIVA As Single
Dim ImporteBruto As Single
Dim Impuesto As Single
Dim Descuento As Single
Dim ImporteNeto As Single
Dim FechaTour As String

Dim UltimoConsecutivoEncabezado As Integer
Dim strSelect2 As String
Dim DireccionCliente As String
Dim NumeroExterior As String
Dim NumeroInterior As String
Dim Colonia As String
Dim CodigoPostal As String
Dim Pais As String
Dim Estado As String
Dim Ciudad As String
Dim HoraActual As Date
Dim HoraActualCadena As String

Dim FechaHora As String

Dim MovimientoAGenerar As Integer

Dim UltimaDireccion As Integer

Dim FechaInicial As Date
Dim Fechafinal As Date

Dim NumEjercicio As Integer
Dim MesFactura As String
PorcentajeIVA = 10
NumeroFactura = ComboFactura
Selecciona los campos Exportada y Cancelada, para conocer si se puede exportar la factura, es decir no debe de estar ni exportada ni cancelada.
strSelect = "SELECT [Maestro Facturas].Numero, [Maestro Facturas].Exportada, [Maestro Facturas].Cancelada FROM [Maestro Facturas]" & _" Where (([Maestro Facturas].Numero) = " & NumeroFactura & ")"

rcds.Open strSelect, db, adOpenStatic, adLockOptimistic

Exportada = rcds.Fields(1)
Cancelada = rcds.Fields(2)
rcds.Close

If Exportada = False And Cancelada = True Then
    MsgBox "Esta Factura ya fue cancelada, no puede exportarla a AdminPaq"
    Exit Sub
End If

If Exportada = True And Cancelada = False Then
    MsgBox "Esta factura ya fue exportada"
    Exit Sub
End If

If Exportada = True And Cancelada = True Then
    MsgBox "Esta factura ya fue exportada, y esta actualmente cancelada, si desea volver a enviarla a AdminPaq, vuelva a generarla"
    Exit Sub
End If
Se conecta a la base de datos de AdminPaq, para abrir las diferentes tablas que se van afectar en la exportacin de la factura
cn.Connect = "SourceType=DBF;" _
            & "SourceDB=\\Fserver\COACCION\LFVR2006;" _
            & "Driver={Microsoft Visual FoxPro Driver}"

        cn.CursorDriver = rdUseOdbc
        cn.EstablishConnection "rdDriverNoPrompt"
      Se abre la tabla MGW10008,que es Maestro de Facturas en Adminpaq
        SQL = "select * from MGW10008"
        Set rs = cn.OpenResultset(SQL, rdOpenKeyset, rdConcurRowVer)
        
    rs.MoveFirst
    
    For i = 1 To rs.RowCount
        If rs(1) = 4 And rs(2) = 4 And rs(4) = NumeroFactura And rs(25) = 1 Then
        FacturaEncontrada = True
        FacturaCancelada = True
        End If
        If rs(1) = 4 And rs(2) = 4 And rs(4) = NumeroFactura And rs(25) = 0 Then
        FacturaEncontrada = True
        FacturaCancelada = False
        End If
        rs.MoveNext
    Next i
    
    If FacturaEncontrada = True And FacturaCancelada = False Then
        MsgBox "Factura Encontrada y No Cancelada, debe estar eliminada de AdminPaq, para que se pueda exportar"
        Exit Sub
    End If
    
    If FacturaEncontrada = True And FacturaCancelada = True Then
        MsgBox "Factura Encontrada y Cancelada En AdminPaq, debe estar eliminada de AdminPaq, para que se pueda exportar"
        Exit Sub
    End If
    NumeroFactura = ComboFactura
Selecciona de diferentes tablas los campos necesarios para exportar la factura a AdminPaq 
strSelect = "SELECT [Detalle Facturas].Numero, [Maestro Facturas].Subcanal, Agencias.AgenciaCodAdmin, [Maestro Facturas].FechaFactura, [Detalle Facturas].FechaMovto, [Detalle Facturas].Servicio, [Servicios Adminpaq].CodServicioAdmin, [Detalle Facturas].Tarifa, Sum([Detalle Facturas].Cantidad) AS Cantidad, Sum([Detalle Facturas].Importe) AS Importe, [Detalle Facturas].Porcentajecomision, [Detalle Facturas].Tipocambio" & _
" FROM (([Detalle Facturas] INNER JOIN [Maestro Facturas] ON [Detalle Facturas].Numero = [Maestro Facturas].Numero) INNER JOIN Agencias ON [Maestro Facturas].Subcanal = Agencias.Agenciaident) INNER JOIN [Servicios Adminpaq] ON ([Detalle Facturas].Tarifa = [Servicios Adminpaq].Tarifa) AND (Agencias.Agenciaident = [Servicios Adminpaq].Agencia) AND ([Detalle Facturas].Servicio = [Servicios Adminpaq].Servicio)" & _
" Where ((([Detalle Facturas].Numero) = " & NumeroFactura & "))" & _
" GROUP BY [Detalle Facturas].Numero, [Maestro Facturas].Subcanal, Agencias.AgenciaCodAdmin, [Maestro Facturas].FechaFactura, [Detalle Facturas].FechaMovto, [Detalle Facturas].Servicio, [Servicios Adminpaq].CodServicioAdmin, [Detalle Facturas].Tarifa, [Detalle Facturas].Porcentajecomision, [Detalle Facturas].Tipocambio"

rcds.Open strSelect, db, adOpenStatic, adLockOptimistic
Primero seleccionemos el campo donde se almacena la Agencia, para encontrar sus datos fiscales
NombreAgenciaSicres = rcds.Fields(1)

rcds.Close
Selecciona los datos fiscales de la agencia a la cual se factur
    strSelect = "Select DireccionFiscal,NumeroExterior,Colonia,CodigoPostal,Pais,Estado,Ciudad" & _
    " from Agencias where Agenciaident = '" & NombreAgenciaSicres & "'"
        
    rcds.Open strSelect, db, adOpenStatic, adLockOptimistic

DireccionCliente = rcds.Fields(0)
NumeroExterior = rcds.Fields(1)
NumeroInterior = ""
Colonia = rcds.Fields(2)
CodigoPostal = rcds.Fields(3)
Pais = rcds.Fields(4)
Estado = rcds.Fields(5)
Ciudad = rcds.Fields(6)
rcds.Close
Seleccionamos los campos necesarios de diferentes columnas
strSelect = "SELECT [Detalle Facturas].Numero, [Maestro Facturas].Subcanal, Agencias.AgenciaCodAdmin, [Maestro Facturas].FechaFactura, [Detalle Facturas].FechaMovto, [Detalle Facturas].Servicio, [Servicios Adminpaq].CodServicioAdmin, [Detalle Facturas].Tarifa, Sum([Detalle Facturas].Cantidad) AS Cantidad, Sum([Detalle Facturas].Importe) AS Importe, [Detalle Facturas].Porcentajecomision, [Detalle Facturas].Tipocambio" & _
" FROM (([Detalle Facturas] INNER JOIN [Maestro Facturas] ON [Detalle Facturas].Numero = [Maestro Facturas].Numero) INNER JOIN Agencias ON [Maestro Facturas].Subcanal = Agencias.Agenciaident) INNER JOIN [Servicios Adminpaq] ON ([Detalle Facturas].Tarifa = [Servicios Adminpaq].Tarifa) AND (Agencias.Agenciaident = [Servicios Adminpaq].Agencia) AND ([Detalle Facturas].Servicio = [Servicios Adminpaq].Servicio)" & _
" Where ((([Detalle Facturas].Numero) = " & NumeroFactura & "))" & _
" GROUP BY [Detalle Facturas].Numero, [Maestro Facturas].Subcanal, Agencias.AgenciaCodAdmin, [Maestro Facturas].FechaFactura, [Detalle Facturas].FechaMovto, [Detalle Facturas].Servicio, [Servicios Adminpaq].CodServicioAdmin, [Detalle Facturas].Tarifa, [Detalle Facturas].Porcentajecomision, [Detalle Facturas].Tipocambio"

rcds.Open strSelect, db, adOpenStatic, adLockOptimistic

FechaFactura = rcds.Fields(3)
FolioFactura = rcds.Fields(0)
NombreAgenciaSicres = rcds.Fields(1)
CodigoCliente = rcds.Fields(2)
NumeroMovimientos = rcds.RecordCount
TotalFactura = 0
TotalDescuentos = 0
TotalImpuestos = 0
NetoFactura = 0
TotalUnidades = 0
rcds.MoveFirst

Iniciamos un vector que corresponde a la cantidad de movimientos de la factura
ReDim CodServicio(NumeroMovimientos - 1)
For i = 1 To NumeroMovimientos
    CodServicio(i - 1) = rcds(6)
        
    Pax = rcds.Fields(8)
    PrecioConIVA = rcds.Fields(7)
    PorcentajeComision = rcds.Fields(10)
    TipoCambio = rcds.Fields(11)
    Acumula los valores de Total Factura, Total Factura con IVA, Total Descuentos y Total Unidades (Pax)
    TotalFactura = (TotalFactura) + ((Pax) * (((PrecioConIVA * 100) / (100 + PorcentajeIVA))) * (TipoCambio))
    'TotalFacturaConIVA = (TotalFacturaConIVA) + ((Pax) * (PrecioConIVA) * (TipoCambio))
    TotalDescuentos = (TotalDescuentos) + ((Pax) * ((PrecioConIVA * 100) / (100 + PorcentajeIVA)) * (TipoCambio)) * (PorcentajeComision / 100)
    TotalUnidades = TotalUnidades + Pax
    
    rcds.MoveNext

Next i
Calcula total de impuestos y neto de la factura
TotalImpuestos = (TotalFactura - TotalDescuentos) * (PorcentajeIVA / 100)
NetoFactura = (TotalFactura - TotalDescuentos + TotalImpuestos)

Abre la tabla MGW10005, donde se va almacenar el detalle de la factura
SQL = "select * from MGW10005"
        Set rs = cn.OpenResultset(SQL, rdOpenKeyset, rdConcurRowVer)
Inicializa un vector donde se va almacenar el producto a facturar
ReDim IdProducto(NumeroMovimientos)

For i = 1 To NumeroMovimientos
    rs.MoveFirst
    For j = 1 To rs.RowCount
          If RTrim(rs(1)) = CodServicio(i - 1) Then
            IdProducto(i - 1) = rs(0)
            End If
            rs.MoveNext
    Next j
Next i
rs.Close

Se abre la tabla donde esta almacenado en AdminPaq los periodos con los que cuenta el Sistema y establece el periodo que corresponde la factura
SQL = "select * from MGW10031"
      Set rs = cn.OpenResultset(SQL, rdOpenKeyset, rdConcurRowVer)
      
        rs.MoveFirst
        FechaInicial = rs(2)
        If FechaFactura < FechaInicial Then
            MsgBox "La fecha de la factura es anterior a el primer periodo de trabajo con la que inicio operaciones en AdnminPaq la empresa"
            Exit Sub
        End If
        rs.MoveLast
        Fechafinal = rs(14)
        If FechaFactura > Fechafinal Then
            MsgBox "La fecha de la factura es posterior a el ultimo periodo de trabajo con la que puede operar la empresa en AdminPaq"
            Exit Sub
        End If
        rs.MoveFirst
        For i = 1 To rs.RowCount
        FechaInicial = rs(2)
        Fechafinal = rs(14)
        If FechaFactura >= FechaInicial And FechaFactura <= Fechafinal Then
            NumEjercicio = rs(1)
        End If
        rs.MoveNext
        Next i

rs.Close

Se abre la tabla donde esta almacenado el cdigo y nombre del cliente a facturar
SQL = "select * from MGW10002"
        Set rs = cn.OpenResultset(SQL, rdOpenKeyset, rdConcurRowVer)

rs.MoveFirst

For i = 1 To rs.RowCount
    
    If RTrim(rs(1)) = CodigoCliente Then
        IdCliente = rs(0)
        NombreCliente = rs(2)
        RFCCliente = rs(4)
    End If
    rs.MoveNext
Next i

rs.Close
Se abre la tabla maestro de facturas de Adminpaq, para determinar, el consecutivo de factura siguiente
SQL = "select * from MGW10008"
        Set rs = cn.OpenResultset(SQL, rdOpenKeyset, rdConcurRowVer)

rs.MoveLast
UltimoConsecutivoDocumento = rs(0) + 1
FechaVencimiento = FechaFactura + 15
Inserta un registro en la tabla maestro facturas de AdminPaq, con el encabezado de la factura
rs.Edit
rs.MoveLast
rs.AddNew
rs(0) = UltimoConsecutivoDocumento
rs(1) = 4
rs(2) = 4
rs(3) = ""
rs(4) = FolioFactura
rs(5) = FechaFactura
rs(6) = IdCliente
rs(7) = NombreCliente
rs(8) = RFCCliente
rs(9) = 0
rs(10) = FechaVencimiento
rs(11) = FechaFactura
rs(12) = FechaFactura
rs(13) = FechaVencimiento
rs(14) = 1
rs(15) = 1
rs(16) = " "
rs(17) = " "
rs(18) = 0
rs(19) = " "
rs(20) = " "
rs(21) = 1
rs(22) = 0
rs(23) = 1
rs(24) = 0
rs(25) = 0
rs(26) = 0
rs(27) = " "
rs(28) = " "
rs(29) = 1
rs(30) = TotalFactura
rs(31) = TotalImpuestos
rs(32) = 0
rs(33) = 0
rs(34) = 0
rs(35) = 0
rs(36) = TotalDescuentos
rs(37) = 0
rs(38) = 0
rs(39) = 0
rs(40) = 0
rs(41) = 0
rs(42) = NetoFactura
rs(43) = NetoFactura
rs(44) = TotalUnidades
rs(45) = 0
rs(46) = 0
rs(47) = 0
rs(48) = 0
rs(49) = 0
rs(50) = 0
rs(51) = 0
rs(52) = " "
rs(53) = " "
rs(54) = " "
rs(55) = FechaFactura
rs(56) = 0
rs(57) = 0
rs(58) = 0
rs(59) = 0
rs(60) = NombreCliente
rs(61) = 0
rs(62) = ""
rs(63) = ""
rs(64) = 0
rs(65) = 0
rs(66) = " "
rs(67) = " "
rs(68) = " "
rs(69) = " "
rs(70) = TotalUnidades
rs(71) = ""
rs(72) = 0
rs(73) = " "
rs(74) = " "
rs(75) = 0

rs.Update

rs.Close

Inserta un registro en la tabla de detalle de facturas de AdminPaq, con los valores de cada fila de la factura
SQL = "select * from MGW10010"
       Set rs = cn.OpenResultset(SQL, rdOpenKeyset, rdConcurRowVer)

rs.MoveLast
UltimoMovimiento = rs(0)

rcds.MoveFirst
For i = 1 To NumeroMovimientos
    MovimientoDocumento = i * 100
    UltimoMovimiento = UltimoMovimiento + 1
    Pax = rcds.Fields(8)
    PrecioConIVA = rcds.Fields(7)
    PorcentajeComision = rcds.Fields(10)
    TipoCambio = rcds.Fields(11)

PrecioPorPaxSinIVA = ((PrecioConIVA * 100) / (100 + PorcentajeIVA)) * (TipoCambio)
PrecioPorPaxConIVA = (PrecioConIVA * TipoCambio)
ImporteBruto = PrecioPorPaxSinIVA * Pax

Descuento = (ImporteBruto) * (PorcentajeComision / 100)
Impuesto = ((ImporteBruto - Descuento) * (PorcentajeIVA)) / (100)
ImporteNeto = ImporteBruto - Descuento + Impuesto
FechaTour = rcds.Fields(4)

rs.Edit
rs.MoveLast
rs.AddNew
rs(0) = UltimoMovimiento
rs(1) = UltimoConsecutivoDocumento
rs(2) = MovimientoDocumento
rs(3) = 1
rs(4) = IdProducto(i - 1)
rs(5) = 1
rs(6) = Pax
rs(7) = 0
rs(8) = Pax
rs(9) = 0
rs(10) = 0
rs(11) = PrecioPorPaxSinIVA
rs(12) = PrecioPorPaxConIVA
rs(13) = 0
rs(14) = 0
rs(15) = ImporteBruto
rs(16) = Impuesto
rs(17) = PorcentajeIVA
rs(18) = 0
rs(19) = 0
rs(20) = 0
rs(21) = 0
rs(22) = 0
rs(23) = 0
rs(24) = 0
rs(25) = 0
rs(26) = Descuento
rs(27) = PorcentajeComision
rs(28) = 0
rs(29) = 0
rs(30) = 0
rs(31) = 0
rs(32) = 0
rs(33) = 0
rs(34) = 0
rs(35) = 0
rs(36) = ImporteNeto
rs(37) = 0
rs(38) = " "
rs(39) = " "
rs(40) = 2
rs(41) = 1
rs(42) = 1
rs(43) = FechaFactura
rs(44) = 0
rs(45) = " "
rs(46) = " "
rs(47) = Pax
rs(48) = 0
rs(49) = 0
rs(50) = 0
rs(51) = 1
rs(52) = 0
rs(53) = FechaTour
rs(54) = " "
rs(55) = " "
rs(56) = FechaFactura
rs(57) = 0
rs(58) = 0
rs(59) = 0
rs(60) = 0
rs(61) = " "
rs(62) = 0
rs(63) = " "
rs(64) = 0
rs.Update
rcds.MoveNext
Next i

rs.Close
rcds.Close

Inserta un registro en la tabla de Direcciones Fiscales de AdminPaq, estos valores son necesarios para que se imprima la factura con la direccin del cliente
SQL = "select * from MGW10011"
        Set rs = cn.OpenResultset(SQL, rdOpenKeyset, rdConcurRowVer)
        
rs.MoveLast
UltimoConsecutivoEncabezado = rs(0) + 1

HoraActual = Format(Now, "dd/mm/yyyy HH:mm:ss")
rs.Edit
rs.MoveLast
rs.AddNew
rs(0) = UltimoConsecutivoEncabezado
rs(1) = UltimoConsecutivoDocumento
rs(2) = 3
rs(3) = 0
rs(4) = DireccionCliente
rs(5) = NumeroExterior
rs(6) = NumeroInterior
rs(7) = Colonia
rs(8) = CodigoPostal
rs(9) = " "
rs(10) = " "
rs(11) = " "
rs(12) = " "
rs(13) = " "
rs(14) = " "
rs(15) = Pais
rs(16) = Estado
rs(17) = Ciudad
rs(18) = " "
rs(19) = HoraActual
rs.Update
rs.Close
Actualiza el ltimo consecutivo de factura en la tabla de los documentos de Adminpaq
SQL = "select * from MGW10007"
      Set rs = cn.OpenResultset(SQL, rdOpenKeyset, rdConcurRowVer)
 
MovimientoAGenerar = 4
For i = 1 To rs.RowCount
    If rs(0) = MovimientoAGenerar Then
        rs.Edit
        rs(5) = FolioFactura
        rs.Update
    End If
    rs.MoveNext
Next i

rs.Close
cn.Close

Unload Me
frmFacturacion.Show
Actualiza la tabla de Sicres: Maestro Facturas a Verdadero en el campo Exportada
ActualizaFactura = "Update [Maestro Facturas] set Exportada = -1 where Numero = " & NumeroFactura
db.Execute ActualizaFactura
db.Close

End Sub
