Curso de Software de Ventas Pt 46 Modulo Cartera de Clientes 5

En esta lección del Modulo Cartera de Clientes se creara el formulario de listado de pagos.

Colabora y Suscribete a mi canal de   

El formulario de listado de pagos permite ver los pagos de una factura o de todas las facturas de un cliente determinado.

El formulario se llama frmPagosClientes y se ve de la siguiente manera.

Lo primero que se programa es el evento load del formulario y se ve de la siguiente manera:

Private Sub Form_Load()
    cmbMeses.ListIndex = 0
    txtAnio.Text = Format(Date, "yyyy")
    Num_Factura_Sel = frmFacturasCliente.msGrid.TextMatrix(frmFacturasCliente.msGrid.Row, 1)
    If Num_Factura_Sel = "" Then
       Num_Factura_Sel = 0
    End If
    Call Listado_PagosCliente
End Sub

Lo siguiente es el Listado_PagosCliente

Sub Listado_PagosCliente()
    Dim Sql As String
    Dim Filtro As String
    Dim Columnas As Integer
    
    Anio = txtAnio.Text
    Mes = cmbMeses.ListIndex
    If cmbMeses.ListIndex > 0 Then
       Filtro = " Month(Fecha) = " & Mes & " and Year(Fecha) = " & Anio
    Else
       Filtro = " Year(Fecha) = " & Anio
    End If
    If chkFacturaActual.Value = 1 Then
       Filtro = Filtro & " and Num_Factura = " & Num_Factura_Sel
    End If
    Sql = "Select IdSaldoFactVen, Num_Rec_Pago, Fecha, Num_Factura, ValorPago, Id_FormaPago, EstadoPago  From tblPagos_Factura_Venta Where " & Filtro
    
    Columnas = 7
    Call LlenarGrid(msGrid, Sql, Columnas)
    
    
    msGrid.ColWidth(0) = 0
    msGrid.ColWidth(1) = 0
    msGrid.ColWidth(2) = 1000
    msGrid.ColWidth(3) = 1400
    msGrid.ColWidth(4) = 1200
    msGrid.ColWidth(5) = 1400
    msGrid.ColWidth(6) = 1400
    msGrid.ColWidth(7) = 1400


    
    msGrid.TextMatrix(0, 2) = "No. Rec"
    msGrid.TextMatrix(0, 3) = "Fecha"
    msGrid.TextMatrix(0, 4) = "No. Fact"
    msGrid.TextMatrix(0, 5) = "Valor"
    msGrid.TextMatrix(0, 6) = "Tipo"
    msGrid.TextMatrix(0, 7) = "Estado"

 
    For I = 1 To msGrid.Rows - 1
        msGrid.Row = I
        msGrid.Col = 1
        msGrid.CellAlignment = flexAlignCenterCenter
        msGrid.Col = 4
        msGrid.CellAlignment = flexAlignCenterCenter
        
        msGrid.TextMatrix(I, 3) = Format(msGrid.TextMatrix(I, 3), "dd/mm/yyyy")
        
        msGrid.TextMatrix(I, 5) = Format(msGrid.TextMatrix(I, 5), "currency")
        
        If msGrid.TextMatrix(I, 6) = 0 Then
           msGrid.TextMatrix(I, 6) = "Efectivo"
        Else
           msGrid.TextMatrix(I, 6) = "Tarjeta"
        End If
        If msGrid.TextMatrix(I, 7) = "V" Then
           msGrid.TextMatrix(I, 7) = "Valida"
        Else
           msGrid.Col = 7
           msGrid.Row = I
           msGrid.TextMatrix(I, 7) = "Anulada"
           msGrid.CellBackColor = &HC0&   'color de fondo
           msGrid.CellForeColor = &H80000005  'color de la letra
        End If
    Next I
    
    
    
End Sub

El botón buscar Pagos llama al listado de pagos:

Private Sub cmdBuscarPagos_Click()
    Call Listado_PagosCliente
End Sub

El Botón Salir:

Private Sub cmdSalir_Click()
    Unload Me
End Sub

Botón Anular pago:

Private Sub cmdAnular_Click()
    Call AnularPago
End Sub

Y este boton llama a un procedimiento AnularPago que es el siguiente:

Sub AnularPago()
    Res = MsgBox("¿Esta seguro de anular el pago?", vbYesNo, "Anular Pago")
    If Res = vbYes Then
       Id_Pago = msGrid.TextMatrix(msGrid.Row, 1)
       Num_Factura = msGrid.TextMatrix(msGrid.Row, 4)
       If Id_Pago <> "" Then
          Sql = "Update tblPagos_Factura_Venta SET EstadoPago = 'A' Where IdSaldoFactVen = " & Id_Pago
          ConexionADO.Execute Sql
          Call CalcularSaldoFactura(Num_Factura)
          Call Listado_PagosCliente
       End If
    End If
    
End Sub

Nos faltaría una variable a nivel de formulario que es la primera linea en la parte superior:

Dim Num_Factura_Sel

Que es la que guarda el numero de la factura actual.

Como se van a estar anulando y creando pagos cree un procedimiento que se puede llamar desde cualquier lugar del proyecto por eso lo coloque en el Modulo md_Consultas que se encarga de actualizar el saldo de la factura de venta y  el saldo en la tabla Saldos Clientes, entonces cada ves que se haga un cambio se llama a esta función para ahorrar código.

Sub CalcularSaldoFactura(Num_Factura)
    Dim RecordSaldoAct As New ADODB.RecordSet
    Dim RecordFactura As New ADODB.RecordSet
    Dim RecordFacturas As New ADODB.RecordSet
     
    'Sumas los pagos actuales de la factura
    Sql = "Select TotalFactura, IdCliente From  tblVentas Where Num_Factura = " & Num_Factura & " and EstadoFact = 1"
    Set RecordFactura = ConexionADO.Execute(Sql)
    TotalFactura = 0
    IdCliente = 0
    If RecordFactura.RecordCount > 0 Then
       TotalFactura = RecordFactura("TotalFactura")
       IdCliente = RecordFactura("IdCliente")
    Else
       MsgBox "No se pudo calcular el saldo total la factura no existe", vbCritical, "Error"
       Exit Sub
    End If
    
    'Sumas los pagos actuales de la factura
    sqlSald = "Select SUM(ValorPago) as Saldo From tblPagos_Factura_Venta Where Num_Factura = " & Num_Factura & " and EstadoPago = 'V'"
    Set RecordSaldoAc = ConexionADO.Execute(sqlSald)
    
    SaldoFacturaSel = 0
    If RecordSaldoAc.RecordCount > 0 Then
       If IsNull(RecordSaldoAc("Saldo")) = False Then
          SaldoFacturaSel = CCur(TotalFactura) - RecordSaldoAc("Saldo")
       Else
          SaldoFacturaSel = CCur(TotalFactura)
       End If
    End If
    
    sqlUp = "Update tblVentas SET SaldoFactura = " & SaldoFacturaSel & " Where Num_Factura = " & Num_Factura
    ConexionADO.Execute sqlUp
    
    'TotalSaldoCliente
    Sql = "Select Sum(SaldoFactura) as Saldo From tblVentas Where SaldoFactura > 0 and IdCliente = " & IdCliente & " and EstadoFact = 1 "
    Set RecordFacturas = ConexionADO.Execute(Sql)
    SaldoTotal = 0
    If RecordFacturas.RecordCount > 0 Then
       SaldoTotal = RecordFacturas("Saldo")
    End If
    
    Sql = "Update tblSaldos_Clientes SET Saldo = " & SaldoTotal & ", FechaMod = now() Where IdCliente = " & IdCliente
    ConexionADO.Execute Sql
    
End Sub

Solo falta abrir el formulario desde el botón Ver Pagos de la ventana de Facturas cliente:

Private Sub cmdVerPagos_Click()
    frmPagosClientes.Show
End Sub

Algo que falto en el vídeo es registrar el saldo en la tabla Saldos_cliente cuando se guarda la factura de Venta a Crédito para eso debe modificar el procedimiento Finalizar_Guardado_Factura en frmVentas (Cambio Nuevo)

Sub Finalizar_Guardado_Factura()
    
    Num_Factura = Ultima_Factura_Venta() 'Ultima venta
     
    FechaHora = txtFechaApro.Text & " " & Time 'fecha y hora
    
    Comentario = "-"
    If txtObervacionesPro.Text <> "" Then  'comentario
       Comentario = txtObervacionesPro.Text
    End If
    
    'calcular saldo
    SaldoFactura = 0
    If cmdTipoFact.ListIndex = 1 Then
        If CCur(txtAbonoFact.Text) > 0 Then
           SaldoFactura = CCur(txtTotalFactura) - CCur(txtAbonoFact.Text)
        Else
           SaldoFactura = CCur(txtTotalFactura)
        End If
    End If

        'Se guarda en la tabla ventas
    
    sql = "Insert Into tblVentas (Num_Factura, FechaHora, TipoFact, Dias, ImpuestoTotal, TotalFactura, EstadoFact, Comentario, Efectivo, Cambio, IdCliente, IdUsuario, SaldoFactura) " _
        & " VALUES (" & Num_Factura & ",'" & FechaHora & "'," & Me.cmdTipoFact.ListIndex & "," & txtDias.Text & ",'" & CCur(txtImpuestoFact) & "','" & CCur(txtTotalFactura) & "',1,'" & Comentario & "','" & CCur(txtVECambio.Text) & "','" & CCur(txtCambio.Text) & "'," & CodigoCliente & "," & Glo_IdUsuario & ", '" & SaldoFactura & "')"
    
    ConexionADO.Execute sql
    
    'A los productos del detalle se les asigna el numero de factura
    sql = "Update tblDetalle_Venta set Num_Factura = '" & Num_Factura & "', Num_VentaTemp = '0'  where Num_VentaTemp = " & ConsecutivoTemp
    ConexionADO.Execute sql
    
    '*************** Consulta que resta todos los articulos de inventario
   sql = "UPDATE tblProductos as ar INNER JOIN tblDetalle_Venta as d ON ar.IdProducto = d.IdProducto SET ar.ExistPro = (ar.ExistPro - d.Cantidad_dv) where d.Num_Factura = " & Num_Factura
   ConexionADO.Execute sql
   
      '/*//*********************** crear el historial de cada articulo en el kardex
   sql = "INSERT INTO tblKardex (Fecha, IdProducto, Detalle, D_C, Cantidad, Costo,Cant_Saldo) Select '" & FechaHora & "', dt.IdProducto, 'Venta de Mercancia según Fra. N° " & Num_Factura & " '," _
        & Num_Factura & ", dt.Cantidad_dv * -1, dt.P_Costo_dv, (Select ExistPro from tblProductos where IdProducto = dt.IdProducto) from tblDetalle_Venta as dt Where dt.Num_Factura = " & Num_Factura
   
   ConexionADO.Execute sql
   
    'Registramos el Saldo Total en la Tabla Saldos
    IdCliente = CodigoCliente
    
    consulta = "Select IdCliente, Saldo from tblSaldos_Clientes Where IdCliente = " & IdCliente
    Set RecordCliente = ConexionADO.Execute(consulta)
    
    
    If RecordCliente.RecordCount = 0 Then
        sqlSaldo = "Insert into tblSaldos_Clientes (IdCliente, Saldo, FechaMod) Values (" & IdCliente & ", '" & SaldoFactura & "', now()) "
    Else
        'Se toma el saldo guardado en la tabla y se le suma al saldo de la factura actual y se actualiza el saldo en la tabla
        Saldo = RecordCliente("Saldo") + SaldoFactura
        sqlSaldo = "Update tblSaldos_Clientes SET Saldo = '" & Saldo & "', FechaMod = Now() Where IdCliente = " & IdCliente
    End If
    
    ConexionADO.Execute sqlSaldo
    
   If chkImprimirSiNo.Value = 1 Then ' si el checkbox esta chuliado se imprime
        If glob_conf_ImpresoraTikets = 0 Then
           Call ImprimirFactura_carta(Num_Factura)
        Else
           Call ImprimirFactura_Ticket(Num_Factura)
        End If
   End If
    
   ConsecutivoTemp = UltimaVentaTemp
   
   Call LlenarGridProductos
   
   MsgBox "Venta Guardada", vbInformation, "Guardar"
   
   Call LimpiarVenta
   
End Sub

 

 

En el vídeo explico en detalle todo el código anterior.

 

Puedes el listado de las lecciones del curso en Curso de Creación de Software de Ventas en Visual Basic 6

No te olvides de Compartir 

Total Page Visits: 2875 - Today Page Visits: 1

Deja una respuesta