3560901064382UTFSM
3560901064382UTFSM
3560901064382UTFSM
Alumna:
Yessica Belén Gómez Silva.
Profesor Guía:
Dagoberto Cabrera Tapia.
2019
5
RESUMEN
RESUMEN
INTRODUCCIÓN 1
CAPÍTULO 1: ASPECTOS RELEVANTES DEL DISEÑO LÓGICO 3
1.1 DESCRIPCIÓN DE LA ORGANIZACIÓN 4
1.2 DESCRIPCIÓN DE LA SITUACIÓN ACTUAL 6
1.3 PROBLEMAS DETECTADOS 8
1.4 DESCRIPCIÓN DEL SISTEMA PROPUESTO 10
CAPÍTULO 2: MEDIO AMBIENTE COMPUTACIONAL Y DESCRIPCIÓN DE LA
BASE DE DATOS 20
2.1. DESCRIPCIÓN DE LAS CARACTERÍSTICAS DEL RECURSO
COMPUTACIONAL 21
2.1.1. Configuración del Sistema 21
2.1.2. DESCRIPCIÓN DE TABLAS 23
CAPÍTULO 3: DESCRIPCIÓN DE PROGRAMAS 29
3.1. Diagrama Modular 31
3.2. Diagrama de Menús 32
3.3. Listado de Programas 33
3.4. Descripción de Programas Seleccionados 34
CONCLUSIONES Y RECOMENDACIONES 48
BIBLIOGRAFÍA 49
ANEXOS A: CÓDIGO FUENTE 50
INTRODUCCIÓN
Fue así como llegamos a la botillería “El Nono (Referencia Frigura 1), donde
conversamos con su dueña, la señora Elizabeth, quien nos permitió adentrarnos en
su lugar de trabajo.
Nuestro objetivo será optimizar los tiempos de compra por cliente, concentrando
toda la información que se encuentra dispersa en un único sistema.
1
Figura 1.
2
CAPÍTULO 1: ASPECTOS RELEVANTES DEL DISEÑO LÓGICO
3
1. ASPECTOS RELEVANTES DEL DISEÑO LÓGICO
Botillería “El Nono” está ubicada en calle Golondrina #479, Población Arboleda,
comuna de La Calera, región de Valparaíso, Chile.
Esta botillería no posee ningún sistema informático, lo que hace difícil la venta y el
control de stock de los productos. Las operaciones son registradas en papel, una
práctica algo arriesgada, ya que se exponen a pérdida de información importante.
Estos son algunos de los productos más vendidos en el local:
4
Figura 2.
Figura 3.
5
1.2 DESCRIPCIÓN DE LA SITUACIÓN ACTUAL
6
En caso de que exista merma o pérdida, esta se registra en el “Cuaderno de
inventario” con su respectivo detalle. Para el caso de los productos que se utilicen
como consumo interno o se deseen regalar o donar, estos no se registran ni como
merma ni como pérdida.
Para hacer los pedidos a los proveedores, se realiza otro proceso, el cual consiste en
que la señora Elizabeth revisa el “Cuaderno de inventario”, con el fin de ir haciendo
un listado de productos que pedirá. En caso de que llegue el vendedor y no esté la
dueña, ella le deja el listado a la otra trabajadora, para que sepa qué productos
pedir.
Figura 4.
7
1.3 PROBLEMAS DETECTADOS
El origen de este sistema informático surge a partir del problema más grave que
pudimos detectar a modo general: el mal manejo de la información y a la ineficiente
atención a los clientes. A continuación, señalaremos detalladamente cada uno de los
problemas detectados.
8
No hay un control del consumo interno, por lo que se podrían extraviar
algunos productos sin poder determinar su causa.
La falta de comunicación entre la dueña y la trabajadora implica que se
cometan más errores al momento de hacer el pedido al proveedor
Figura 5.
9
1.4 DESCRIPCIÓN DEL SISTEMA PROPUESTO
10
1.4.2 Descripción General de la solución propuesta
Las soluciones más destacadas que proponemos para enfrentar los problemas que
presenta este sistema son las siguientes:
Proceso de Ventas:
Este sistema logrará que mejore el tiempo de atención hacia
los clientes, ya que ante cualquier solicitud el tiempo de
respuesta de los trabajadores será más rápido. Tendrá el
registro de los clientes deudores y será más rápido el abono a
las cuentas.
Proceso de Pedidos:
Se hará más fácil y rápido hacer un pedido al proveedor
correspondiente, ya que existirá una bitácora en donde estará
la orden redactada por la dueña. También se implementará
una alerta de los productos con bajo stock.
Proceso de Inventario:
Automáticamente se irán descontando o agregando productos
al inventario, para así contar con un monitoreo más preciso de
los productos existentes en la botillería. Podrá consultar el
stock las veces que quiera del producto seleccionado.
Proceso de Cierre de Caja:
Se obtendrá un total de las ventas hechas en el transcurso del
día, podrá visualizar las ventas históricas, en caso que se haya
perdido alguna información o simplemente para sacar alguna
estadística de ventas.
11
1.4.3 Objetivos específicos del Sistema:
12
1.4.4 Beneficios del Sistema Propuesto
Venta:
Este proceso está encargado de registrar cada compra efectuada en el local. Consta
de los siguientes procesos:
Registrar al usuario que hace la venta.
Ingresar productos que el cliente desea llevar, mediante una
búsqueda por nombre, código o categoría.
Ingresar un cliente deudor, sólo si está registrado.
Cuando la venta finalice se desplegará por pantalla la boleta
con su respectivo detalle de compra (esta boleta es solo para
el usuario) y al cliente se le entrega una boleta manual, ya que
esa boleta es legal.
13
2. Anular Venta: Este proceso consiste en deshacer una venta determinada
cuando un cliente se encuentre insatisfecho con su compra. Se debe regularizar la
devolución de los productos al local y la devolución del dinero al cliente.
5. Ajustes: Este proceso está encargado de llevar la cuenta de todos los productos
existentes en el local. Se detallará todo ajuste ingresado. Cuenta con las siguientes
funcionalidades.
14
6. Mantenedores:
7. Generación de Informes:
1. Entradas:
16
2. Salidas:
3. Entidades de Información.
17
1.4.7 Modelo de Datos.
18
1.4.8 Estructura de Código.
Para llevar a cabo este sistema, contaremos con Visual Basic .NET como lenguaje de
programación, Microsoft Visual Studio como entorno de desarrollo integrado (IDE)
y MySQL como gestor de base de datos.
19
CAPÍTULO 2: MEDIO AMBIENTE COMPUTACIONAL Y DESCRIPCIÓN DE LA BASE DE
DATOS
20
2.1. DESCRIPCIÓN DE LAS CARACTERÍSTICAS DEL RECURSO COMPUTACIONAL
Equipo 1:
Laptop HP
Procesador AMD A6-5200.
Memoria RAM 8 GB.
Disco Duro 500 GB.
Sistema Operativo Windows 10.
Equipo 2:
21
2.1.2 Software utilizado
22
2.1.2. DESCRIPCIÓN DE TABLAS
Describiremos todas las tablas que utilizaremos en la base de datos para el futuro
desarrollo del Sistema Computacional para Botillería “El Nono”.
2.2.2.1. VENTAS:
Nombre : VENTAS.
Descripción : Esta tabla contiene los datos necesarios de las ventas.
Clave primaria : COD_VENTA.
Claves foráneas : RUT_USUARIO – Referencia tabla USUARIO.
23
2.2.2.2 ABONOS.
Nombre : ABONOS.
Descripción : Esta tabla contiene los datos necesarios de los abonos.
Clave primaria : ID.
Claves foráneas : COD_DEUDA – Referencia tabla deudas.
2.2.2.3 USUARIO.
Nombre : USUARIO.
Descripción : Esta tabla contiene los datos personales de cada usuario.
Clave primaria: RUT_USUARIO.
24
2.2.2.4 PRODUCTOS_COMPRAS:
Nombre : PRODUCTOS_COMPRAS.
Descripción : Esta tabla contiene los datos de compras a proveedores.
Clave primaria : COD_COMPRA.
Clave Foránea : COD_PRODUCTO – Referencia tabla productos.
2.2.2.5 PRODUCTOS_VENTAS
Nombre : PRODUCTOS_VENTAS.
Descripción : Esta tabla contiene los datos necesarios de las ventas.
Clave primaria : COD_PRODUCTO.
Clave Foránea : COD_VENTA – Referencia tabla Ventas.
25
2.2.2.6 DEUDAS:
Nombre : DEUDA.
Descripción : Esta tabla contiene datos de deudas entre tabla VENTAS Y DEUDOR.
Clave primaria : COD_DEUDA + COD_VENTA.
Claves foráneas: RUT_DEUDOR- Referencia tabla DEUDORES.
2.2.2.7 DEUDORES.
Nombre : DEUDORES.
Descripción : Esta tabla almacena datos personales de los deudores.
Clave primaria : RUT_DEUDOR.
26
2.2.2.8 PRODUCTOS.
Nombre : PRODUCTOS
Descripción : Esta tabla almacena los datos de los Productos.
Clave primaria : COD_PRODUCTO.
2.2.2.9 COMPRAS:
Nombre : COMPRAS.
Descripción : Esta tabla contiene los datos de las compras efectuadas a los
proveedores.
Clave primaria : COD_PRODUCTO + FECHA.
Claves foráneas: RUT_PROVEEDOR – Referencia tabla PROVEEDOR.
27
2.2.2.10 PROVEEDOR:
Nombre : PROVEEDOR.
Descripción : Esta tabla contiene los datos personales de los proveedores.
Clave primaria: RUT_PROVEEDOR.
2.2.2.11 AJUSTES:
Nombre : AJUSTES.
Descripción : Esta tabla almacena datos de posibles ajustes en el stock.
Clave primaria: COD_PRODUCTO + FECHA_AJUSTE.
28
CAPÍTULO 3: DESCRIPCIÓN DE PROGRAMAS
29
30
3. DESCRIPCIÓN DEL RECURSO COMPUTACIONAL
31
3.2. Diagrama de Menús
32
3.3. Listado de Programas
Se describirán brevemente cada funcionalidad del sistema. Los que tienen (*), se
describirán detalladamente en el siguiente punto.
Nombre Objetivo
33
Permite agregar, eliminar y actualizar los productos que abastece
Productos (*)
la botillería.
Diagrama de Bloques:
Figura 9.
34
Figura 10.
Figura 11.
Si el ingreso del usuario es exitoso, se abrira una nueva ventana la cual será el
menú principal de tal sistema referencia Figura 12.
Figura 12.
3.4.2 Ajustes
Diagrama de Bloques:
Figura 13.
Nombre: Ajustes
Reglas del Proceso: Para poder utilizar esta funcionalidad deberá ingresar al
menú de Mantenedores referencia Figura 14.
Figura 14.
36
Los ajustes lo pueden utilizar los administradores y trabajadores, no tiene
restricciones. A continuación se explicará el uso de tal funcionalidad.
Figura 15.
Figura 16.
37
Para poder hacer un ajuste se necesita seleccionar algun tipo de ajuste, los
cuales son Merma (-), Consumo Interno (-), Incremento de Productos (+) y
Otros (-). Referencia Figura 17.
Figura 17.
Figura 18.
38
La fecha se guarda automaticamente en la base de datos. Todos los ajustes
quedan guardados en la tabla “Ajustes” de la base de datos, pero para
visualizarlos se muestran en una DataGridView referencia Figura 19, la cual se
muestra el tipo de producto, cantidad, fecha y descripción.
Figura 19.
Diagrama de Bloques:
Figura 20.
39
Figura 21.
Figura 22.
40
que desea modificar, surgirá una ventana en donde le mostrará una alerta, pero
solo es para informar tal inconveniente. Referencia Figura 23
Figura 23.
Restricciones de eliminación.
Figura 24.
Si tiene algún tipo de ajuste el producto tampoco dejará eliminar, ya que es una
medida de protección para evitar fraudes. Referencia Figura 25
Figura 25
41
3.4.4 Ventas.
Diagrama de Bloques:
Figura 26.
Nombre: Ventas.
Reglas del Proceso: Si necesita hacer una venta a un cliente solo debe
seleccionar el producto que se muestra en la tabla superior, no se necesitan
permisos de administrador para poder ocupar esta funcionalidad. Referencia
Figura 27.
42
Figura 27.
Figura 28.
Para eliminar una venta antes de ser pagada, solo selecciona la fila de la tabla y
presionar eliminar. Si ya hizo una venta y el cliente se retracta por cualquier
razon, puede dirigirse a mostrar venta y eliminarla totalmente (esta
funcionalidad se necesitan permisos de administrador). Se pueden ver las ventas
del día, mes o año en el boton “Mostrar Ventas”. Referencia Figura 29.
43
Figura 29.
Figura 30.
44
3.4.5. Compras a Proveedor
Diagrama de Bloques:
Figura 31.
Figura 32.
45
En la tabla del medio, se visibilizan todos los productos que se encuentran en la
botillería, con su respectivo stock actual y stock crítico, así se hace mas fácil la
compra de productos. En caso que el producto no se encuentre en la lista, existe
una opción “Producto Nuevo”, y se ingresa automaticamente al sistema.
referencia Figura 33-34.
Figura 33.
Figura 34.
46
Figura 35.
Figura 36.
47
CONCLUSIONES Y RECOMENDACIONES
48
BIBLIOGRAFÍA
49
ANEXOS A: CÓDIGO FUENTE
Clases:
Module Biblioteca
Public Structure Productos
Public cod_producto As String
Public nom_producto As String
Public marca As String
Public descripcion As String
Public estado As String
Public precio_venta As Integer
Public tipo_prod As String
Public stock_actual As Integer
Public stock_critico As Integer
End Structure
Public Structure Deudores
Public rut_deudor As String
Public nom_deudor As String
Public direccion As String
Public celular As String
End Structure
Public Structure Proveedor
Public rut_proveedor As String
Public nom_proveedor As String
Public empresa As String
Public celular As String
End Structure
50
'iterar a través de los rut de deudores para colocarles el guion antes de mostrarlos
Dim datos As DataTable = daoDatos.GetProveedores()
For Each fila As DataRow In datos.Rows
fila.Item(0) = FormatearRutParaMostrar(fila.Item(0))
Next
Return datos
End Function
Public Function GetAjustes()
Return daoDatos.GetAjustes()
End Function
Public Function GetAjustesSegunProducto(cod_producto As String)
Return daoDatos.GetAjustesSegunProducto(cod_producto)
End Function
Public Function InsertarProductos(cod_producto As String, nom_producto As String, marca As String, descripcion As String,
estado As String, precio_venta As Integer, tipo_prod As String, stock_Actual As Integer, stock_critico As Integer)
Dim obj As New DaoDatos()
Dim prod As New Productos()
prod.cod_producto = cod_producto.Trim()
prod.nom_producto = nom_producto.Trim()
prod.marca = marca.Trim()
prod.descripcion = descripcion.Trim()
prod.estado = estado.Trim()
prod.precio_venta = precio_venta
prod.tipo_prod = tipo_prod.Trim()
prod.stock_actual = stock_Actual
prod.stock_critico = stock_critico
Return obj.InsertarProductos(prod)
End Function
Public Function InsertarProductoDesdeCompra(cod_producto As String, nom_producto As String, marca As String,
descripcion As String, precio_venta As Integer, tipo_prod As String, stock_actual As Integer, stock_critico As Integer)
'revisar si cod_producto existe
If daoDatos.CodigoRepetido(cod_producto) Then
MsgBox("El código de producto ya existe en el sistema")
Return Nothing
End If
'agregar producto
Return InsertarProductos(cod_producto, nom_producto, marca, descripcion, "DISPONIBLE", precio_venta, tipo_prod, 0,
stock_critico)
End Function
Public Sub ActualizarProductos(cod_producto As String, nom_producto As String, marca As String, descripcion As String,
estado As String, precio_venta As Integer, tipo_prod As String, stock_Actual As Integer, stock_critico As Integer)
Dim prod As New Productos()
prod.cod_producto = cod_producto.Trim()
prod.nom_producto = nom_producto.Trim()
prod.marca = marca.Trim()
prod.descripcion = descripcion.Trim()
prod.estado = estado.Trim()
prod.precio_venta = precio_venta
prod.tipo_prod = tipo_prod.Trim()
prod.stock_actual = stock_Actual
prod.stock_critico = stock_critico
daoDatos.ActualizarProductos(prod)
End Sub
Function EliminarProductos(cod_producto As String)
Return daoDatos.EliminarProductos(cod_producto)
End Function
'******************************** COMPRAS ********************************
'Inserta la compra en la BD
'Recibe rut del proveedor y datagridview con los productos de la compra
Sub InsertarCompraProductos(rut_proveedor As String, ByRef dgvCompra As DataGridView)
'Insertar en compras, recibe cod_compra
Dim cod_compra As Integer = daoDatos.InsertarCompra(FormatearRutParaInsertar(rut_proveedor))
'Obtener compras
51
'periodo ->(dia, mes o año)
Public Function GetCompras(fecha As Date, periodo As String)
If periodo = "dia" Then
Return daoDatos.GetComprasDia(fecha)
ElseIf periodo = "mes" Then
Return daoDatos.GetComprasMes(fecha)
Else
Return daoDatos.GetComprasAño(fecha)
End If
End Function
Public Function GetDetalleCompras(cod_compra As Integer)
Return daoDatos.GetDetalleCompra(cod_compra)
End Function
Public Sub EliminarCompra(cod_compra As Integer)
daoDatos.BorrarCompra(cod_compra)
End Sub
Public Function GetAñosCompras()
Return daoDatos.GetAñosCompras()
End Function
Public Function GetComprasProveedor(rut_proveedor As String, año As Integer)
If rut_proveedor = "0" Then
'todos los proveedores
Return daoDatos.GetComprasProveedores(año)
Else
'proveedor en específico
Return daoDatos.GetComprasProveedores(año, FormatearRutParaInsertar(rut_proveedor))
End If
End Function
Function Filtrar(tabla As String, filtro As String, texto As String)
Return daoDatos.Filtrar(tabla, filtro, texto)
End Function
Friend Sub EliminarProdutos(producto As Object)
Throw New NotImplementedException()
End Sub
Public Sub InsertarProveedor(rut_proveedor As String, nom_proveedor As String, empresa As String, celular As String)
Dim obj As New DaoDatos()
Dim prov As New Proveedor()
If daoDatos.ExisteProveedor(FormatearRutParaInsertar(rut_proveedor.Trim())) Then
MsgBox("Ya existe el proveedor en el sistema")
Return
End If
prov.rut_proveedor = FormatearRutParaInsertar(rut_proveedor.Trim())
prov.nom_proveedor = nom_proveedor.Trim()
prov.empresa = empresa.Trim()
prov.celular = celular.Trim()
obj.InsertarProveedor(prov)
End Sub
Function EliminarProveedor(rut_proveedor As String)
Return daoDatos.EliminarProveedor(FormatearRutParaInsertar(rut_proveedor))
End Function
Public Sub ActualizarProveedor(rut_proveeedor As String, nom_proveedor As String, empresa As String, celular As String)
Dim prov As New Proveedor()
prov.rut_proveedor = FormatearRutParaInsertar(rut_proveeedor.Trim())
prov.nom_proveedor = nom_proveedor.Trim()
prov.empresa = empresa.Trim()
prov.celular = celular.Trim()
daoDatos.ActualizarProveedor(prov)
End Sub
Public Sub InsertarUsuario(user As Usuario)
Dim obj As New DaoDatos()
user.RutUsuario = FormatearRutParaInsertar(user.RutUsuario)
obj.InsertarUsuario(user)
End Sub
Public Sub ActualizarUsuario(RutUsuario As String, password As String, NombreUsuario As String, tipoUsuario As String,
CelularUsuario As String)
Dim user As New Usuario()
user.RutUsuario = FormatearRutParaInsertar(RutUsuario.Trim())
user.Password = password.Trim()
user.NombreUsuario = NombreUsuario.Trim()
52
user.TipoUsuario = tipoUsuario
user.CelularUsuario = CelularUsuario.Trim()
daoDatos.ActualizarUsuario(user)
End Sub
Function EliminarUsuario(RutUsuario As String)
Return daoDatos.EliminarUsuario(FormatearRutParaInsertar(RutUsuario))
End Function
'************************ Deudor *******************************+++
Public Function GetDeudor(rut_deudor As String)
Return daoDatos.GetDeudor(rut_deudor)
End Function
Public Function GetDeudas(rut_deudor As String)
Return daoDatos.GetDeudas(rut_deudor)
End Function
Public Function GetAbonosDeudas(cod_venta As Integer)
Return daoDatos.GetAbonosDeuda(cod_venta)
End Function
Public Function InsertarAbono(cod_venta, monto)
daoDatos.InsertarAbono(cod_venta, monto)
End Functio
Public Sub InsertarDeudor(rut_deudor As String, nom_deudor As String, direccion As String, celular As String)
Dim obj As New DaoDatos()
Dim deu As New Deudores()
If daoDatos.ExisteDeudor(FormatearRutParaInsertar(rut_deudor.Trim)) Then
MsgBox("El deudor ya existe en el sistema")
Return
End If
deu.rut_deudor = FormatearRutParaInsertar(rut_deudor.Trim())
deu.nom_deudor = nom_deudor.Trim()
deu.direccion = direccion.Trim()
deu.celular = celular.Trim()
obj.InsertarDeudor(deu)
End Sub
Public Sub ActualizarDeudor(rut_deudor As String, nom_deudor As String, direccion As String, celular As String)
Dim deud As New Deudores()
deud.rut_deudor = FormatearRutParaInsertar(rut_deudor.Trim())
deud.nom_deudor = nom_deudor.Trim()
deud.direccion = direccion.Trim()
deud.celular = celular.Trim()
daoDatos.ActualizarDeudor(deud)
End Sub
Function EliminarDeudor(rut_deudor As String)
Return daoDatos.EliminarDeudor(FormatearRutParaInsertar(rut_deudor))
End Function
'********************************* AJUSTES ************************************
Public Sub AgregarAjustes(cod_producto As String, tipo_ajuste As String, descripcion As String, fecha As Date, cantidad As
Integer)
Dim ajus As New Ajustes()
ajus.cod_producto = cod_producto.Trim()
ajus.tipo_ajuste = tipo_ajuste.Trim()
ajus.descripcion = descripcion.Trim()
ajus.fecha = fecha
ajus.cantidad = cantidad
daoDatos.AgregarAjustes(ajus)
End Sub
'rebajar stock
53
For Each prod As ProductoVenta In productos
daoDatos.ActualizarProductos(prod.cod_producto, prod.cantidad, True)
Next
'retorna cod_venta para insertarlo en tabla deuda cuando se vende fiado
Return cod_venta
End Function
Public Function GetAñosVentas()
Return daoDatos.GetAñosVentas()
End Function
Public Sub IngresarVentaConDeuda(ByVal productos As List(Of ProductoVenta), rut_deudor As String)
Dim cod_venta = IngresarVenta(productos)
daoDatos.InsertarDeuda(cod_venta, FormatearRutParaInsertar(rut_deudor))
End Sub
Public Sub EliminarVenta(cod_venta As Integer)
daoDatos.BorrarVenta(cod_venta)
End Sub
'Obtener ventas
'periodo ->(dia, mes o año)
Public Function GetVentas(fecha As Date, periodo As String)
If periodo = "dia" Then
Return daoDatos.GetVentasDia(fecha)
ElseIf periodo = "mes" Then
Return daoDatos.GetVentasMes(fecha)
Else
Return daoDatos.GetVentasAño(fecha)
End If
End Function
'Obtener ventas PARA INFORME
'periodo ->(dia, mes o año)
Public Function GetVentasInforme(fecha As Date, periodo As String)
Dim ventas As DataTable
If periodo = "dia" Then
ventas = daoDatos.GetVentasDiaInforme(fecha)
ElseIf periodo = "mes" Then
ventas = daoDatos.GetVentasMesInforme(fecha)
Else
ventas = daoDatos.GetVentasAñoInforme(fecha)
End If
Return ventas
End Function
'Obtener ventas CON DEUDA PARA INFORME
'periodo ->(dia, mes o año)
Public Function GetVentasDeudaInforme(fecha As Date, periodo As String)
Dim datos As DataTable
If periodo = "dia" Then
datos = daoDatos.GetVentasDiaDeudaInforme(fecha)
ElseIf periodo = "mes" Then
datos = daoDatos.GetVentasMesDeudaInforme(fecha)
Else
datos = daoDatos.GetVentasAñoDeudaInforme(fecha)
End If
For Each fila As DataRow In datos.Rows
fila.Item(2) = FormatearRutParaMostrar(fila.Item(2))
If fila.Item(5).ToString() = "" Then
fila.Item(5) = 0
End If
fila.Item(6) = Integer.Parse(fila.Item(4)) - Integer.Parse(fila.Item(5))
If (Integer.Parse(fila.Item(4)) - Integer.Parse(fila.Item(5))) = 0 Then
fila.Item(7) = "SI"
Else
fila.Item(7) = "NO"
End If
Next
Return datos
End Function
Public Function GetDetalleVentas(cod_venta As Integer)
Return daoDatos.GetDetalleVenta(cod_venta)
End Function
conexionMysql.CerrarConexion()
Return dataset.Tables(0)
End Function
Function Actualizacion(aux As Byte, sentencia As String) As Integer
Dim command As New MySqlCommand
Dim mensaje As Boolean
Dim retorno As Integer
55
command.Connection = conexionMysql.GetConexion()
conexionMysql.AbrirConexion()
command.CommandText = sentencia
Try
retorno = command.ExecuteNonQuery()
mensaje = True
Catch ex As Exception
Select Case aux
Case 1
MsgBox("Error! No se ha podido agregar el registro")
Case 2
MsgBox("Error! No se ha podido actualizar el registro")
Case 3
MsgBox("Error! No se ha podido eliminar el registro")
Case Else
MsgBox(ex.ToString())
End Select
mensaje = False
End Try
conexionMysql.CerrarConexion()
Return retorno
End Function
'******************** PRODUCTOS *******************************
Friend Function InsertarProductos(producto As Productos)
If Not CodigoRepetido(producto.cod_producto) Then
Return Actualizacion(1, "Insert into Productos (cod_producto, nom_producto, marca , descripcion, estado,
precio_venta, tipo_prod, stock_actual, stock_critico) value ('" & producto.cod_producto & "' , '" & producto.nom_producto &
"' ,'" & producto.marca & "', '" & producto.descripcion & "' , '" & producto.estado & "', " & producto.precio_venta & " , '" &
producto.tipo_prod & "' , " & producto.stock_actual & " , " & producto.stock_critico & " )")
End If
Return Nothing
End Function
Friend Function ActualizarProductos(producto As Productos)
Return Actualizacion(2, "Update Productos set nom_producto = '" & producto.nom_producto & "', marca = '" &
producto.marca & "', descripcion = '" & producto.descripcion & "', estado = '" & producto.estado & "', precio_venta = " &
producto.precio_venta & ", tipo_prod = '" & producto.tipo_prod & "', stock_actual = " & producto.stock_actual & ",
stock_critico = " & producto.stock_critico & " where cod_producto = '" & producto.cod_producto & "'")
End Function
Friend Function ActualizarProductos(cod_producto As String, stock_actual As Integer)
Return Actualizacion(2, "Update Productos set stock_actual = " & stock_actual & " where cod_producto = '" &
cod_producto & "'")
End Function
Friend Function ActualizarProductos(cod_producto As String, cantidad As Integer, esRebaja As Boolean)
If esRebaja Then
cantidad *= -1
End If
56
Return Actualizacion(2, "Update Productos set stock_actual = stock_actual +" & cantidad & " where cod_producto = '" &
cod_producto & "'")
End Function
Friend Function EliminarProductos(cod_producto As String)
If ProductoConAjustes(cod_producto) Then
Return -1
End If
If ProductoConCompras(cod_producto) Then
Return -2
End If
If ProductoConVentas(cod_producto) Then
Return -3
End If
Return Actualizacion(3, "Delete from Productos where cod_producto = '" & cod_producto & "'")
End Function
'Obtiene productos con stock critico
Public Function GetProductosBajoStock()
Return Consulta("SELECT cod_producto,nom_producto,stock_actual,stock_critico FROM productos WHERE
stock_actual<=stock_critico")
End Function
'Revisa si producto tiene algún movimiento (ajuste de stock, venta o compra).
'Si tiene alguno de esos 3, no se puede borrar.
Friend Function ProductoConMovimiento(cod_producto As String)
Dim result = Consulta("SELECT p.COD_PRODUCTO FROM productos p JOIN ajustes a ON
p.COD_PRODUCTO=a.COD_PRODUCTO WHERE p.COD_PRODUCTO=" & cod_producto & " UNION SELECT p.COD_PRODUCTO
FROM productos p JOIN productos_ventas pv ON p.COD_PRODUCTO=pv.COD_PRODUCTO WHERE p.COD_PRODUCTO=" &
cod_producto & " UNION SELECT p.COD_PRODUCTO FROM productos p JOIN productos_compras pc ON
p.COD_PRODUCTO=pc.COD_PRODUCTO WHERE p.COD_PRODUCTO=" & cod_producto)
Return result.Rows.Count > 0
End Function
Friend Function ProductoConVentas(cod_producto As String)
Dim result = Consulta("SELECT p.COD_PRODUCTO FROM productos p JOIN productos_ventas pv ON
p.COD_PRODUCTO=pv.COD_PRODUCTO WHERE p.COD_PRODUCTO=" & cod_producto)
Return result.Rows.Count > 0
End Functio
Friend Function ProductoConCompras(cod_producto As String)
Dim result = Consulta("SELECT p.COD_PRODUCTO FROM productos p JOIN productos_compras pc ON
p.COD_PRODUCTO=pc.COD_PRODUCTO WHERE p.COD_PRODUCTO=" & cod_producto)
Return result.Rows.Count > 0
End Function
Friend Function ProductoConAjustes(cod_producto As String)
Dim result = Consulta("SELECT p.COD_PRODUCTO FROM productos p JOIN ajustes a ON
p.COD_PRODUCTO=a.COD_PRODUCTO WHERE p.COD_PRODUCTO=" & cod_producto)
Return result.Rows.Count > 0
End Function
'Revisa si el codigo esta repetido.
Friend Function CodigoRepetido(cod_producto As String)
57
Dim result = Consulta("SELECT COD_PRODUCTO FROM productos WHERE COD_PRODUCTO = " & cod_producto & " ")
Return result.Rows.Count > 0
End Function
'*********************************** COMPRAS ****************************************
'Crear compra nueva. Inserta en tabla compras
'Retorna cod_compra
Friend Function InsertarCompra(rut_proveedor As String)
Actualizacion(1, "INSERT INTO compras (FECHA,RUT_PROVEEDOR) values ('" & DateTime.Now.ToString("yyyy-MM-dd") &
"','" & rut_proveedor & "')")
Dim result As DataTable = Consulta("SELECT cod_compra FROM compras ORDER BY cod_compra DESC LIMIT 0,1")
Return Integer.Parse(result.Rows(0).Item(0))
End Function
'Inserta productos de la compra
Friend Sub InsertarProductosCompra(cod_compra As Integer, ByRef dgvCompra As DataGridView)
For Each producto_compra As DataGridViewRow In dgvCompra.Rows
Dim cod_producto As Integer = Integer.Parse(producto_compra.Cells(0).Value)
Dim cantidad As Integer = Integer.Parse(producto_compra.Cells(2).Value)
Dim precio_compra As Integer = Integer.Parse(producto_compra.Cells(3).Value)
Actualizacion(1, "INSERT INTO productos_compras(COD_PRODUCTO,COD_COMPRA,CANTIDAD,PRECIO_COMPRA)
VALUES(" & cod_producto & "," & cod_compra & "," & cantidad & "," & precio_compra & ")")
Actualizacion(2, "UPDATE productos SET STOCK_ACTUAL = STOCK_ACTUAL+" & cantidad & " WHERE COD_PRODUCTO="
& cod_producto)
Next
End Sub
'Retorna las compras realizadas en una fecha en particular
Public Function GetComprasDia(fecha As Date)
Dim fecha_compra = fecha.ToString("yyyy-MM-dd")
Return Consulta("SELECT c.COD_COMPRA,p.RUT_PROVEEDOR,p.NOM_PROVEEDOR,DATE_FORMAT(c.FECHA,'%d-%m-%Y')
as fecha_compra,SUM((pc.PRECIO_COMPRA*pc.CANTIDAD)) as total_compra FROM proveedores p JOIN compras c ON
p.RUT_PROVEEDOR=c.RUT_PROVEEDOR JOIN productos_compras pc ON c.cod_compra=pc.cod_compra WHERE c.FECHA = '"
& fecha_compra & "' GROUP BY pc.COD_COMPRA")
End Function
'Retorna las compras realizadas en un mes (y año) en particular
Public Function GetComprasMes(fecha As Date)
Return Consulta("SELECT c.COD_COMPRA,p.RUT_PROVEEDOR,p.NOM_PROVEEDOR,DATE_FORMAT(c.FECHA,'%d-%m-%Y')
as fecha_compra,SUM((pc.PRECIO_COMPRA*pc.CANTIDAD)) as total_compra FROM proveedores p JOIN compras c ON
p.RUT_PROVEEDOR=c.RUT_PROVEEDOR JOIN productos_compras pc ON c.cod_compra=pc.cod_compra WHERE
MONTH(c.FECHA) = '" & fecha.Month & "' AND YEAR(c.FECHA) = '" & fecha.Year & "' GROUP BY pc.COD_COMPRA")
End Function
'Retorna las compras realizadas en un año en particular
Public Function GetComprasAño(fecha As Date)
Return Consulta("SELECT c.COD_COMPRA,p.RUT_PROVEEDOR,p.NOM_PROVEEDOR,DATE_FORMAT(c.FECHA,'%d-%m-%Y')
as fecha_compra,SUM((pc.PRECIO_COMPRA*pc.CANTIDAD)) as total_compra FROM proveedores p JOIN compras c ON
p.RUT_PROVEEDOR=c.RUT_PROVEEDOR JOIN productos_compras pc ON c.cod_compra=pc.cod_compra WHERE
YEAR(c.FECHA) = '" & fecha.Year & "' GROUP BY pc.COD_COMPRA")
End Functio
'Retorna detalle de compra
Public Function GetDetalleCompra(cod_compra As Integer)
58
Return Consulta("SELECT
p.COD_PRODUCTO,p.NOM_PRODUCTO,pc.PRECIO_COMPRA,pc.CANTIDAD,(pc.PRECIO_COMPRA*pc.CANTIDAD) as subtotal
FROM productos_compras pc JOIN productos p ON pc.COD_PRODUCTO=p.COD_PRODUCTO WHERE pc.COD_COMPRA = " &
cod_compra)
End Function
Public Sub BorrarCompra(cod_compra)
'Borrar registros en tabla productos_compras
Actualizacion(3, "DELETE FROM productos_compras WHERE cod_compra=" & cod_compra)
'Borrar registros en tabla compras
Actualizacion(3, "DELETE FROM compras WHERE cod_compra=" & cod_compra)
End Sub
'Retorna lista de años en que hay compras
Public Function GetAñosCompras()
Return Consulta("SELECT DISTINCT(YEAR(fecha)) as anio FROM compras ORDER BY FECHA DESC")
End Function
'Obtener las compras de TODOS los proveedores en un año
Public Function GetComprasProveedores(año As Integer)
Return Consulta("SELECT c.COD_COMPRA,p.RUT_PROVEEDOR,p.NOM_PROVEEDOR,c.FECHA as
fecha_compra,SUM(pc.PRECIO_COMPRA*pc.CANTIDAD) as total_compra FROM proveedores p JOIN compras c ON
p.RUT_PROVEEDOR=c.RUT_PROVEEDOR JOIN productos_compras pc ON c.cod_compra=pc.cod_compra WHERE
YEAR(c.FECHA)=" & año & " GROUP BY pc.COD_COMPRA")
End Function
'Obtener las compras de UN PROVEEDOR en un año
Public Function GetComprasProveedores(año As Integer, rut_proveedor As String)
Return Consulta("SELECT c.COD_COMPRA,p.RUT_PROVEEDOR,p.NOM_PROVEEDOR,c.FECHA as
fecha_compra,SUM(pc.PRECIO_COMPRA*pc.CANTIDAD) as total_compra FROM proveedores p JOIN compras c ON
p.RUT_PROVEEDOR=c.RUT_PROVEEDOR JOIN productos_compras pc ON c.cod_compra=pc.cod_compra WHERE
YEAR(c.FECHA)=" & año & " AND p.RUT_PROVEEDOR='" & rut_proveedor & "' GROUP BY pc.COD_COMPRA")
End Function
Function GetProductos()
Return Consulta("Select * from productos")
End Function
Function GetDeudores()
Return Consulta("Select * from Deudores")
End Function
Function GetUsuarios()
Return Consulta("Select * from Usuarios ")
End Function
Function GetProveedores()
Return Consulta("Select * from Proveedores")
End Function
Function Filtrar(tabla As String, filtro As String, texto As String)
Return Consulta("Select * from " & tabla & " Where " & filtro & " Like '%" & texto & "%'")
End Function
' ************************ PROVEEDORES ********************************
Friend Function InsertarProveedor(Proveedor As Proveedor)
59
Return Actualizacion(1, "Insert into Proveedores(rut_proveedor, nom_proveedor, empresa, celular) values ('" &
Proveedor.rut_proveedor & "', '" & Proveedor.nom_proveedor & "' , '" & Proveedor.empresa & "', '" & Proveedor.celular & "')")
End Function
Friend Function EliminarProveedor(rut_proveedor As String)
If Not ProveedorTieneVenta(rut_proveedor) Then
Return Actualizacion(3, "Delete from Proveedores where rut_proveedor = '" & rut_proveedor & "'")
End If
Return Nothing
End Function
Friend Function ActualizarProveedor(proveedor As Proveedor)
Return Actualizacion(2, "Update Proveedores set nom_proveedor = '" & proveedor.nom_proveedor & "' , empresa = '" &
proveedor.empresa & "', celular = '" & proveedor.celular & "' where rut_proveedor = '" & proveedor.rut_proveedor & "'")
End Function
'Revisa si proveedor tiene compras. Si NO tiene, entonces se puede borrar.
'Retorna TRUE si proveedor tiene compras (no se puede borrar) y FALSE si no tiene compras.
Friend Function ProveedorTieneVenta(rut_proveedor As String)
Dim result = Consulta("SELECT * FROM proveedores p JOIN compras c ON p.RUT_PROVEEDOR=c.RUT_PROVEEDOR
WHERE p.RUT_PROVEEDOR='" & rut_proveedor & "'")
Return result.Rows.Count > 0
End Function
Friend Function ExisteProveedor(rut_proveedor As String)
Dim result As DataTable = Consulta("SELECT * FROM proveedores WHERE RUT_PROVEEDOR='" & rut_proveedor & "'")
Return result.Rows.Count > 0
End Function
'****************************** USUARIOS *********************************
Friend Function InsertarUsuario(usuario As Usuario)
Return Actualizacion(1, "Insert into Usuarios(rut_usuario,Password,Nombre_Usuario,Tipo_Usu,celular) values ('" &
usuario.RutUsuario & "' , '" & usuario.Password & "', '" & usuario.NombreUsuario & "', '" & usuario.TipoUsuario & "','" &
usuario.CelularUsuario & "')")
End Function
Friend Function EliminarUsuario(RutUsuario As String)
If Not CheckUsuarioConVenta(RutUsuario) Then
Return Actualizacion(3, "Delete from Usuarios where rut_usuario = '" & RutUsuario & "'")
End If
Return Nothing
End Function
60
u.RUT_USUARIO='" & rut_usuario & "'")
Return result.Rows.Count > 0
End Function
'************************** DEUDORES Y DEUDAS ******************************
Friend Function GetDeudor(rut_deudor As String)
Return Consulta("SELECT * FROM deudores WHERE rut_deudor='" & rut_deudor & "'")
End Function
'Obtiene los abonos hechos a una venta con deuda
Friend Function GetAbonosDeuda(cod_venta As Integer)
Return Consulta("SELECT DATE_FORMAT(a.FECHA_PAGO,'%d-%m-%Y') as fecha_pago,a.MONTO FROM ventas v JOIN
deudas d ON v.COD_VENTA=d.COD_VENTA JOIN abonos a ON d.COD_DEUDA=a.COD_DEUDA WHERE v.COD_VENTA=" &
cod_venta)
End Function
Friend Function InsertarAbono(cod_venta As Integer, monto As Integer)
Dim result As DataTable = Consulta("SELECT cod_deuda FROM deudas WHERE cod_venta=" & cod_venta)
Dim cod_deuda As Integer = Integer.Parse(result.Rows(0).Item(0).ToString())
Dim fecha As String = DateTime.Now.ToString("yyyy-MM-dd")
Return Actualizacion(1, "INSERT INTO abonos(fecha_pago,monto,cod_deuda) VALUES('" & fecha & "'," & monto & "," &
cod_deuda & ")")
End Function
Friend Function InsertarDeudor(deudores As Deudores)
Return Actualizacion(1, "Insert into deudores (rut_deudor,nombre_deudor,direccion,celular) values ('" &
deudores.rut_deudor & "', '" & deudores.nom_deudor & "', '" & deudores.direccion & "', '" & deudores.celular & "' )")
End Function
Friend Function EliminarDeudor(rut_deudor As String)
If DeudorconDeuda(rut_deudor) Then
MsgBox("No se puede eliminar. Esta persona registra deudas")
Return Nothing
Else
Return Actualizacion(3, "Delete from Deudores where rut_deudor = '" & rut_deudor & "'")
MsgBox("Deudor eliminado")
End If
End Function
Friend Function ActualizarDeudor(Deudores As Deudores)
Return Actualizacion(2, "Update Deudores set nombre_deudor = '" & Deudores.nom_deudor & "', direccion = '" &
Deudores.direccion & "', celular = '" & Deudores.celular & "' where rut_deudor = '" & Deudores.rut_deudor & "' ")
End Function
'Revisa si Deudor tiene deudas (registros en tabla deudas). Si NO tiene, entonces se puede borrar.
'Retorna TRUE si deudor tiene ventas (no se puede borrar) y FALSE si no tiene ventas.
Friend Function DeudorconDeuda(rut_deudor As String)
Dim result = Consulta("SELECT * FROM deudores d JOIN deudas de ON d.RUT_DEUDOR =de.RUT_DEUDOR WHERE
d.RUT_DEUDOR='" & rut_deudor & "'")
Return result.Rows.Count > 0
End Function
Friend Function InsertarDeuda(cod_venta As Integer, rut_deudor As String)
Dim total_venta As Integer = ObtenerTotalVenta(cod_venta)
61
Actualizacion(1, "INSERT INTO deudas (total_deuda,rut_deudor,cod_venta) VALUES(" & total_venta & ",'" & rut_deudor &
"'," & cod_venta & ")")
End function
Friend Function GetDeudas(rut_deudor As String)
Return Consulta("SELECT v.COD_VENTA,u.NOMBRE_USUARIO as
vendedor,v.fecha_venta,SUM((p.PRECIO_VENTA*pv.CANTIDAD)-pv.DESCUENTO) as total_venta,(SELECT SUM(monto) FROM
abonos WHERE COD_DEUDA=d.COD_DEUDA) as abonos,(SUM((p.PRECIO_VENTA*pv.CANTIDAD)-pv.DESCUENTO)-(SELECT
SUM(monto) FROM abonos WHERE COD_DEUDA=d.COD_DEUDA)) as deuda FROM deudas d JOIN ventas v ON
d.COD_VENTA=v.COD_VENTA JOIN productos_ventas pv ON v.COD_VENTA=pv.COD_VENTA JOIN productos p on
pv.COD_PRODUCTO=p.COD_PRODUCTO JOIN usuarios u ON v.RUT_USUARIO=u.RUT_USUARIO WHERE d.RUT_DEUDOR='" &
rut_deudor & "' GROUP BY pv.COD_VENTA")
End Function
Friend Function ObtenerTotalVenta(cod_venta As Integer)
Dim result = Consulta("SELECT SUM((p.PRECIO_VENTA*pv.CANTIDAD)-pv.DESCUENTO) as total_venta FROM productos p
JOIN productos_ventas pv ON p.COD_PRODUCTO=pv.COD_PRODUCTO WHERE pv.COD_VENTA=" & cod_venta)
Dim total_venta = result.Rows(0).Item(0)
Return total_venta
End Function
Friend Function ExisteDeudor(rut_deudor As String)
Dim result As DataTable = Consulta("SELECT * FROM deudores WHERE RUT_DEUDOR='" & rut_deudor & "'")
Return result.Rows.Count > 0
End Function
'**************************** AJUSTES ***********************
Function GetAjustes()
Return Consulta("Select * from Ajustes")
End Function
Friend Function AgregarAjustes(ajustes As Ajustes)
Return Actualizacion(1, "Insert into Ajustes (cod_producto, tipo_ajuste,descripcion,fecha,cantidad) values ('" &
ajustes.cod_producto & "','" & ajustes.tipo_ajuste & "', '" & ajustes.descripcion & "', '" &
FormateaFechaParaInsert(ajustes.fecha.Date) & "'," & ajustes.cantidad & ")")
End Function
'Obtiene los ajustes de un producto
Friend Function GetAjustesSegunProducto(cod_producto As String)
Return Consulta("SELECT a.tipo_ajuste,a.cantidad,a.fecha,a.descripcion FROM productos p JOIN ajustes a ON
p.cod_producto = a.cod_producto WHERE p.cod_producto='" & cod_producto & "'")
End Function
Friend Function FormateaFechaParaInsert(fecha As Date)
Return fecha.Year & "-" & fecha.Month & "-" & fecha.Day
End Function
'***************************** VENTAS *************************
'inserta en tabla ventas y luego en tabla productos_ventas
Friend Function AgregarVenta(fecha As Date, rut_usuario As String, ByVal productos As List(Of ProductoVenta))
'insertar en venta
Actualizacion(1, "Insert into ventas (fecha_venta,rut_usuario) values ('" & FormateaFechaParaInsert(fecha) & "', '" &
rut_usuario & "')")
'obtener codigo_venta
Dim result = Consulta("SELECT cod_venta FROM ventas ORDER BY cod_venta DESC LIMIT 0,1")
Dim cod_venta = Integer.Parse(result.Rows(0).Item(0))
62
'insertar en tabla productos_ventas
For Each prod As ProductoVenta In productos
Actualizacion(1, "Insert into productos_ventas (cod_producto,cod_venta,cantidad,descuento) values ('" &
prod.cod_producto & "', '" & cod_venta & "'," & prod.cantidad & ", " & prod.descuento & ")")
Next
'retorna codigo de venta para usarlo en ventas con deudor
Return cod_venta
End Function
Public Sub BorrarVenta(cod_venta)
If VentaTieneDeuda(cod_venta) Then
Dim respuesta As Integer = MessageBox.Show("Esta venta tiene deuda pendiente. ¿Desea continuar de todas formas?
(se eliminará la deuda)", "Confirmación", MessageBoxButtons.YesNo)
If respuesta = DialogResult.No Then
Return
End If
End If
'Borrar registros en tabla producto_venta
Actualizacion(3, "DELETE FROM productos_ventas WHERE cod_venta=" & cod_venta)
'Borrar registros en tabla abonos
Dim cod_deuda As Integer = GetCodigoDeuda(cod_venta)
Actualizacion(3, "DELETE FROM abonos WHERE cod_deuda=" & cod_deuda)
'Borrar registros en tabla deudas
Actualizacion(3, "DELETE FROM deudas WHERE cod_deuda=" & cod_deuda)
'Borrar registros en tabla ventas
Actualizacion(3, "DELETE FROM ventas WHERE cod_venta=" & cod_venta)
End Sub
'Ver si venta tiene deuda. Si tiene deuda asociada retorna su codigo
Public Function GetCodigoDeuda(cod_venta As Integer)
Dim result As DataTable = Consulta("SELECT cod_deuda FROM deudas WHERE cod_venta=" & cod_venta)
Try
Return Integer.Parse(result.Rows(0).Item(0).ToString())
Catch
Return 0
End Try
End Function
'Ver si venta tiene deuda pendiente (abonos no suman deuda total)
Public Function VentaTieneDeuda(cod_venta)
Dim cod_deuda As Integer = GetCodigoDeuda(cod_venta)
Dim result As DataTable = Consulta("SELECT SUM((p.precio_venta*cantidad)-descuento) as total_venta FROM productos p
JOIN productos_ventas pv ON p.cod_producto=pv.cod_producto WHERE pv.cod_venta=" & cod_venta)
Dim total_venta As Integer = Integer.Parse(result.Rows(0).Item(0).ToString())
Dim total_abonos As Integer
If cod_deuda = 0 Then
total_abonos = total_venta
63
Else
result = Consulta("SELECT SUM(monto) as total_abonos FROM abonos WHERE cod_deuda=" & cod_deuda)
Try
total_abonos = Integer.Parse(result.Rows(0).Item(0).ToString())
Catch
total_abonos = 0
End Try
End If
Return total_venta > total_abonos
End Function
'Retorna lista de años en que hay ventas
Public Function GetAñosVentas()
Return Consulta("SELECT DISTINCT(YEAR(fecha_venta)) as año FROM ventas ORDER BY FECHA_VENTA DESC")
End Function
'Retorna las ventas realizadas en una fecha en particular
Public Function GetVentasDia(fecha As Date)
Dim fecha_venta = fecha.ToString("yyyy-MM-dd")
Return Consulta("SELECT v.COD_VENTA,u.NOMBRE_USUARIO,DATE_FORMAT(v.FECHA_VENTA,'%d-%m-%Y') as
fecha_venta,SUM((p.PRECIO_VENTA*pv.CANTIDAD)-pv.DESCUENTO) as total_venta FROM usuarios u JOIN ventas v ON
u.RUT_USUARIO=v.RUT_USUARIO JOIN productos_ventas pv ON v.COD_VENTA = pv.COD_VENTA JOIN productos p ON
pv.COD_PRODUCTO=p.COD_PRODUCTO WHERE v.FECHA_VENTA = '" & fecha_venta & "' GROUP BY pv.COD_VENTA")
End Function
'Retorna las ventas realizadas en un mes (y año) en particular
Public Function GetVentasMes(fecha As Date)
Return Consulta("SELECT v.COD_VENTA,u.NOMBRE_USUARIO,DATE_FORMAT(v.FECHA_VENTA,'%d-%m-%Y') as
fecha_venta,SUM((p.PRECIO_VENTA*pv.CANTIDAD)-pv.DESCUENTO) as total_venta FROM usuarios u JOIN ventas v ON
u.RUT_USUARIO=v.RUT_USUARIO JOIN productos_ventas pv ON v.COD_VENTA = pv.COD_VENTA JOIN productos p ON
pv.COD_PRODUCTO=p.COD_PRODUCTO WHERE MONTH(v.FECHA_VENTA) = '" & fecha.Month & "' AND YEAR(v.FECHA_VENTA)
= '" & fecha.Year & "' GROUP BY pv.COD_VENTA")
End Function
'Retorna las ventas realizadas en un año en particular
Public Function GetVentasAño(fecha As Date)
Return Consulta("SELECT v.COD_VENTA,u.NOMBRE_USUARIO,DATE_FORMAT(v.FECHA_VENTA,'%d-%m-%Y') as
fecha_venta,SUM((p.PRECIO_VENTA*pv.CANTIDAD)-pv.DESCUENTO) as total_venta FROM usuarios u JOIN ventas v ON
u.RUT_USUARIO=v.RUT_USUARIO JOIN productos_ventas pv ON v.COD_VENTA = pv.COD_VENTA JOIN productos p ON
pv.COD_PRODUCTO=p.COD_PRODUCTO WHERE YEAR(v.FECHA_VENTA) = '" & fecha.Year & "' GROUP BY pv.COD_VENTA")
End Function
'Retorna detalle de venta
Public Function GetDetalleVenta(cod_venta As Integer)
Return Consulta("SELECT
p.COD_PRODUCTO,p.NOM_PRODUCTO,p.PRECIO_VENTA,pv.CANTIDAD,pv.DESCUENTO,(p.PRECIO_VENTA*pv.CANTIDAD)-
pv.DESCUENTO as subtotal FROM productos_ventas pv JOIN productos p ON pv.COD_PRODUCTO=p.COD_PRODUCTO WHERE
pv.COD_VENTA = " & cod_venta)
End Function
'********* PARA INFORME VENTAS
'Retorna las ventas realizadas en una fecha en particular
Public Function GetVentasDiaInforme(fecha As Date)
Dim fecha_venta = fecha.ToString("yyyy-MM-dd")
64
Return Consulta("SELECT v.COD_VENTA,DATE_FORMAT(v.FECHA_VENTA,'%d-%m-%Y') as
fecha_venta,SUM((p.PRECIO_VENTA*pv.CANTIDAD)-pv.DESCUENTO) as total_venta FROM ventas v JOIN productos_ventas pv
ON v.COD_VENTA = pv.COD_VENTA JOIN productos p ON pv.COD_PRODUCTO=p.COD_PRODUCTO WHERE v.FECHA_VENTA = '"
& fecha_venta & "' GROUP BY pv.COD_VENTA")
End Function
'Retorna las ventas realizadas en un mes (y año) en particular
Public Function GetVentasMesInforme(fecha As Date)
Return Consulta("SELECT v.COD_VENTA,DATE_FORMAT(v.FECHA_VENTA,'%d-%m-%Y') as
fecha_venta,SUM((p.PRECIO_VENTA*pv.CANTIDAD)-pv.DESCUENTO) as total_venta FROM ventas v JOIN productos_ventas pv
ON v.COD_VENTA = pv.COD_VENTA JOIN productos p ON pv.COD_PRODUCTO=p.COD_PRODUCTO WHERE
MONTH(v.FECHA_VENTA) = '" & fecha.Month & "' AND YEAR(v.FECHA_VENTA) = '" & fecha.Year & "' GROUP BY
pv.COD_VENTA")
End Function
'Retorna las ventas realizadas en un año en particular
Public Function GetVentasAñoInforme(fecha As Date)
Return Consulta("SELECT v.COD_VENTA,DATE_FORMAT(v.FECHA_VENTA,'%d-%m-%Y') as
fecha_venta,SUM((p.PRECIO_VENTA*pv.CANTIDAD)-pv.DESCUENTO) as total_venta FROM ventas v JOIN productos_ventas pv
ON v.COD_VENTA = pv.COD_VENTA JOIN productos p ON pv.COD_PRODUCTO=p.COD_PRODUCTO WHERE
YEAR(v.FECHA_VENTA) = '" & fecha.Year & "' GROUP BY pv.COD_VENTA")
End Function
'Retorna las ventas CON DEUDA realizadas en una fecha en particular
Public Function GetVentasDiaDeudaInforme(fecha As Date)
Dim fecha_venta = fecha.ToString("yyyy-MM-dd")
Return Consulta("SELECT v.COD_VENTA,DATE_FORMAT(v.FECHA_VENTA,'%d-%m-%Y') as
fecha_venta,de.RUT_DEUDOR,de.NOMBRE_DEUDOR,SUM((p.PRECIO_VENTA*pv.CANTIDAD)-pv.DESCUENTO) as total_venta,
(SELECT SUM(monto) FROM abonos WHERE cod_deuda=d.cod_deuda) as abonos, 0 as saldo, 'Si' as deuda_pagada FROM
deudores de JOIN deudas d ON de.rut_deudor=d.rut_deudor JOIN ventas v ON d.cod_venta=v.cod_venta JOIN
productos_ventas pv ON v.COD_VENTA = pv.COD_VENTA JOIN productos p ON pv.COD_PRODUCTO=p.COD_PRODUCTO WHERE
v.FECHA_VENTA = '" & fecha_venta & "' GROUP BY pv.COD_VENTA")
End Function
'Retorna las ventas CON DEUDA realizadas en un mes (y año) en particular
Public Function GetVentasMesDeudaInforme(fecha As Date)
Return Consulta("SELECT v.COD_VENTA,DATE_FORMAT(v.FECHA_VENTA,'%d-%m-%Y') as
fecha_venta,de.RUT_DEUDOR,de.NOMBRE_DEUDOR,SUM((p.PRECIO_VENTA*pv.CANTIDAD)-pv.DESCUENTO) as total_venta,
(SELECT SUM(monto) FROM abonos WHERE cod_deuda=d.cod_deuda) as abonos, 0 as saldo, 'Si' as deuda_pagada FROM
deudores de JOIN deudas d ON de.rut_deudor=d.rut_deudor JOIN ventas v ON d.cod_venta=v.cod_venta JOIN
productos_ventas pv ON v.COD_VENTA = pv.COD_VENTA JOIN productos p ON pv.COD_PRODUCTO=p.COD_PRODUCTO WHERE
MONTH(v.FECHA_VENTA) = '" & fecha.Month & "' AND YEAR(v.FECHA_VENTA) = '" & fecha.Year & "' GROUP BY
pv.COD_VENTA")
End Function
'Retorna las ventas CON DEUDA realizadas en un año en particular
Public Function GetVentasAñoDeudaInforme(fecha As Date)
Return Consulta("SELECT v.COD_VENTA,DATE_FORMAT(v.FECHA_VENTA,'%d-%m-%Y') as
fecha_venta,de.RUT_DEUDOR,de.NOMBRE_DEUDOR,SUM((p.PRECIO_VENTA*pv.CANTIDAD)-pv.DESCUENTO) as total_venta,
(SELECT SUM(monto) FROM abonos WHERE cod_deuda=d.cod_deuda) as abonos, 0 as saldo, 'Si' as deuda_pagada FROM
deudores de JOIN deudas d ON de.rut_deudor=d.rut_deudor JOIN ventas v ON d.cod_venta=v.cod_venta JOIN
productos_ventas pv ON v.COD_VENTA = pv.COD_VENTA JOIN productos p ON pv.COD_PRODUCTO=p.COD_PRODUCTO WHERE
YEAR(v.FECHA_VENTA) = '" & fecha.Year & "' GROUP BY pv.COD_VENTA")
End Function
End Class
65
Ajustes
Imports MySql.Data.MySqlClient
Public Class FrmAjustes
Dim bsnNegocio As New BsnNegocio
Dim primero As Byte = 0
Sub CargarTextbox()
If Not (dgvProductos.Rows.Count = 0) Then
txtCodigo.Text = dgvProductos.SelectedRows.Item(0).Cells(0).Value
txtNombre.Text = dgvProductos.SelectedRows.Item(0).Cells(1).Value
txtActual.Text = dgvProductos.SelectedRows.Item(0).Cells(7).Value
End If
End Sub
Sub CargarCb()
CbTipo.DropDownStyle = ComboBoxStyle.DropDownList
CbTipo.DisplayMember = "Text"
CbTipo.ValueMember = "Value"
Dim tb As New DataTable
tb.Columns.Add("Text", GetType(String))
tb.Columns.Add("Value", GetType(Integer))
tb.Rows.Add("MERMA (-)", 0)
tb.Rows.Add("CONSUMO INTERNO (-)", 1)
tb.Rows.Add("INCREMENTO DE PRODUCTOS (+)", 2)
tb.Rows.Add("OTROS (-)", 3)
CbTipo.DataSource = tb
End Sub
Private Sub FrmAjustes_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Me.WindowState = 2
dgvProductos.DataSource = bsnNegocio.GetProductos()
dgvProductos.Columns(2).Visible = False
dgvProductos.Columns(3).Visible = False
dgvProductos.Columns(4).Visible = False
dgvProductos.Columns(5).Visible = False
dgvProductos.Columns(6).Visible = False
dgvProductos.Columns(8).Visible = False
CargarTextbox()
CargarCb()
txtCodigo.Enabled = False
txtActual.Enabled = False
txtNombre.Enabled = False
BtnActualizar.Visible = True
End Sub
Private Sub FrmAjustes_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
If e.CloseReason = CloseReason.UserClosing Then
e.Cancel = True
Me.Dispose()
FrmMantenedores.Show()
End If
End Sub
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles BtnSalir.Click
Me.Hide()
FrmMantenedores.Show()
End Sub
66
valor = Integer.Parse(txtActual.Text) + Integer.Parse(txtAjustar.Text)
End If
bsnNegocio.AgregarAjustes(
txtCodigo.Text,
CbTipo.Text,
UCase(TxtDescripcion.Text),
DateTimePicker1.Value,
Integer.Parse(txtAjustar.Text.Trim())
)
bsnNegocio.ActualizarProductos(
txtCodigo.Text,
valor
)
MsgBox("Ingreso exitoso")
dgvAjustes.DataSource = bsnNegocio.GetAjustes()
dgvProductos.DataSource = bsnNegocio.GetProductos()
BtnActualizar.Visible = True
txtAjustar.Text = 0
TxtDescripcion.Text = ""
End If
End Sub
Private Sub dgvProductos_CellClick(sender As Object, e As DataGridViewCellEventArgs) Handles dgvProductos.CellClick
CargarTextbox()
End Sub
Private Sub TxtDescripcion_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TxtDescripcion.KeyPress
If InStr(1, "'" & Chr(8), e.KeyChar) = 1 Then
e.KeyChar = ""
End If
End Sub
Private Sub TextBox4_TextChanged(sender As Object, e As EventArgs) Handles txtAjustar.TextChanged
End Sub
Private Sub TextBox4_KeyPress(sender As Object, e As KeyPressEventArgs) Handles txtAjustar.KeyPress
If Char.IsNumber(e.KeyChar) Then
e.Handled = False
ElseIf Char.IsControl(e.KeyChar) Then
e.Handled = False
ElseIf Char.IsSeparator(e.KeyChar) Then
e.Handled = False
Else
e.Handled = True
End If
If InStr(1, "'" & Chr(8), e.KeyChar) = 1 Then
e.KeyChar = ""
End If
If Char.IsWhiteSpace(e.KeyChar) Then
e.Handled = True
MsgBox("No se permiten espacios")
End If
End Sub
Private Sub TxtDescripcion_TextChanged(sender As Object, e As EventArgs) Handles TxtDescripcion.TextChanged
End Sub
Private Sub dgvProductos_SelectionChanged(sender As Object, e As EventArgs) Handles dgvProductos.SelectionChanged
Try
Dim cod_producto As String = dgvProductos.SelectedRows(0).Cells(0).Value
dgvAjustes.DataSource = bsnNegocio.GetAjustesSegunProducto(cod_producto)
Catch ex As Exception
End Try
End Sub
End Class
67
Compras Proveedor
Imports MySql.Data.MySqlClient
Public Class FrmComprasProveedor
Dim bsnNegocio As New BsnNegocio
Dim primero As Byte = 0
Sub CargarTextBox()
If Not (dgvProveedoresVentas.Rows.Count = 0) Then
TxtRut.Text = dgvProveedoresVentas.SelectedRows.Item(0).Cells(0).Value
TxtNombre.Text = dgvProveedoresVentas.SelectedRows.Item(0).Cells(1).Value
TxtEmpresa.Text = dgvProveedoresVentas.SelectedRows.Item(0).Cells(2).Value
End If
End Sub
Private Sub TextBox2_TextChanged(sender As Object, e As EventArgs) Handles TxtNombre.TextChanged
End Sub
Private Sub FrmComprasProveedor_Load(sender As Object, e As EventArgs) Handles MyBase.Load
dgvProveedoresVentas.DataSource = bsnNegocio.GetProveedores()
Me.WindowState = 2
If primero = 0 Then
primero = 1
End If
CargarTextBox()
dgvProductos.DataSource = bsnNegocio.GetProductos()
dgvProductos.Rows(0).Selected = True
CargarDatosProducto()
CargarCbTipo()
CalcularTotalCompra()
End Sub
Private Sub FrmComprasProveedor_FormClosing(sender As Object, e As FormClosingEventArgs) Handles
MyBase.FormClosing
If e.CloseReason = CloseReason.UserClosing Then
e.Cancel = True
Me.Dispose()
FrmPrincipal.Show()
End If
End Sub
Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
Me.Hide()
FrmPrincipal.Show()
End Sub
Private Sub dgvProveedoresVentas_CellClick(sender As Object, e As DataGridViewCellEventArgs) Handles
dgvProveedoresVentas.CellClick
CargarTextBox()
End Sub
Private Sub Button6_Click(sender As Object, e As EventArgs) Handles Button6.Click
Me.Hide()
FrmPrincipal.Show()
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs)
Me.Hide()
FrmProveedores.Show()
End Sub
Private Sub TxtRut_TextChanged(sender As Object, e As EventArgs) Handles TxtRut.TextChanged
End Sub
Private Sub dgvProductos_CellClick(sender As Object, e As DataGridViewCellEventArgs) Handles dgvProductos.CellClick
CargarDatosProducto()
End Sub
'Carga datos de producto seleccionado en textbox de formulario
Public Sub CargarDatosProducto()
txtCodProducto.Enabled = False
txtNomProducto.Enabled = False
txtMarca.Enabled = False
txtDescripcion.Enabled = False
cbTipo.Enabled = False
txtPrecioVenta.Enabled = False
txtStockCritico.Enabled = False
chkProductoNuevo.Checked = False
txtCodProducto.Text = dgvProductos.SelectedRows(0).Cells(0).Value
txtNomProducto.Text = dgvProductos.SelectedRows(0).Cells(1).Value
txtMarca.Text = dgvProductos.SelectedRows(0).Cells(2).Value
68
txtDescripcion.Text = dgvProductos.SelectedRows(0).Cells(3).Value
cbTipo.SelectedValue = dgvProductos.SelectedRows(0).Cells(6).Value.ToString()
txtPrecioVenta.Text = dgvProductos.SelectedRows(0).Cells(5).Value
txtStockCritico.Text = dgvProductos.SelectedRows(0).Cells(8).Value
txtCantidad.Clear()
txtPrecioCompra.Clear()
End Sub
Private Sub btnAgregar_Click(sender As Object, e As EventArgs) Handles btnAgregar.Click
Dim precioCompra, cantidad As Integer
Try
precioCompra = Integer.Parse(txtPrecioCompra.Text.Trim())
cantidad = Integer.Parse(txtCantidad.Text.Trim())
Catch ex As Exception
MsgBox("Indique precio de compra y cantidad del producto")
Return
End Try
If precioCompra <= 0 Or cantidad <= 0 Then
MsgBox("Precio de compra y cantidad deben ser números positivos")
Return
End If
If txtCodProducto.Text = "" Or txtNomProducto.Text = "" Or txtMarca.Text = "" Or txtDescripcion.Text = "" Then
MsgBox("Indique todos los datos del producto")
Return
End If
Dim precioVenta, stockCritico As Integer
Try
precioVenta = Integer.Parse(txtPrecioVenta.Text.Trim())
stockCritico = Integer.Parse(txtStockCritico.Text.Trim())
Catch ex As Exception
MsgBox("Precio venta y stock crítico deben ser números.")
Return
End Try
If precioVenta <= 0 Then
MsgBox("Precio de venta debe ser mayor a cero")
Return
End If
If stockCritico < 0 Then
MsgBox("Stock crítico debe ser mayor o igual a cero")
Return
End If
If precioVenta <= precioCompra Then
Dim respuesta As Integer = MessageBox.Show("El precio de venta es menor o igual al de compra. ¿Desea continuar?",
"Advertencia", MessageBoxButtons.YesNo)
If respuesta = DialogResult.No Then
Return
End If
End If
If cantidad <= stockCritico Then
Dim respuesta As Integer = MessageBox.Show("La cantidad comprada es menor o igual al stock crítico. ¿Desea
continuar?", "Advertencia", MessageBoxButtons.YesNo)
If respuesta = DialogResult.No Then
Return
End If
End If
Dim cod_producto = txtCodProducto.Text.Trim()
If RevisarProductoEnCompra(cod_producto) Then
MsgBox("El producto ya está en la compra")
Return
End If
'agregar producto si es nuevo
If chkProductoNuevo.Checked Then
cod_producto = bsnNegocio.InsertarProductoDesdeCompra(
txtCodProducto.Text.Trim(),
txtNomProducto.Text.Trim(),
txtMarca.Text.Trim(),
txtDescripcion.Text.Trim(),
txtPrecioVenta.Text.Trim(),
cbTipo.SelectedValue,
txtCantidad.Text.Trim(),
txtStockCritico.Text.Trim()
69
)
If cod_producto Is Nothing Then
Return
End If
End If
Dim valores(4) As String
valores(0) = txtCodProducto.Text.Trim()
valores(1) = txtNomProducto.Text.Trim()
valores(2) = txtCantidad.Text.Trim()
valores(3) = txtPrecioCompra.Text.Trim()
valores(4) = Integer.Parse(txtCantidad.Text.Trim()) * Integer.Parse(txtPrecioCompra.Text.Trim())
dgvProductosCompra.Rows.Add(valores)
dgvProductos.DataSource = bsnNegocio.GetProductos()
dgvProductos.Rows(0).Selected = True
CargarDatosProducto()
chkProductoNuevo.Checked = False
txtCantidad.Clear()
txtPrecioCompra.Clear()
CalcularTotalCompra()
End Sub
Private Sub chkProductoNuevo_CheckedChanged(sender As Object, e As EventArgs) Handles
chkProductoNuevo.CheckedChanged
txtCodProducto.Enabled = chkProductoNuevo.Checked
txtNomProducto.Enabled = chkProductoNuevo.Checked
txtMarca.Enabled = chkProductoNuevo.Checked
txtDescripcion.Enabled = chkProductoNuevo.Checked
cbTipo.Enabled = chkProductoNuevo.Checked
txtPrecioVenta.Enabled = chkProductoNuevo.Checked
txtStockCritico.Enabled = chkProductoNuevo.Checked
If chkProductoNuevo.Checked Then
txtCodProducto.Clear()
txtNomProducto.Clear()
txtMarca.Clear()
txtDescripcion.Clear()
cbTipo.SelectedIndex = 0
txtPrecioVenta.Clear()
txtStockCritico.Clear()
txtPrecioCompra.Clear()
txtCantidad.Clear()
Else
CargarDatosProducto()
End If
End Sub
Sub CargarCbTipo()
cbTipo.DropDownStyle = ComboBoxStyle.DropDownList
cbTipo.DisplayMember = "Text"
cbTipo.ValueMember = "Value"
Dim tb As New DataTable
tb.Columns.Add("Text", GetType(String))
tb.Columns.Add("Value", GetType(String))
tb.Rows.Add("BEBIDAS", "BEBIDAS")
tb.Rows.Add("LICORES", "LICORES")
tb.Rows.Add("ABARROTES", "ABARROTES")
tb.Rows.Add("CIGARROS", "CIGARROS")
cbTipo.DataSource = tb
End Sub
Private Sub btnEliminarProductoCompra_Click(sender As Object, e As EventArgs) Handles btnEliminarProductoCompra.Click
dgvProductosCompra.Rows.Remove(dgvProductosCompra.SelectedRows(0))
CalcularTotalCompra()
End Sub
'Determina el total de la compra y lo escribe en el textbox correspondiente
Private Sub CalcularTotalCompra()
Dim totalcompra As Integer = 0
For Each venta As DataGridViewRow In dgvProductosCompra.Rows
totalcompra += Integer.Parse(venta.Cells(4).Value)
Next
txtTotalCompra.Text = totalcompra
End Sub
70
'Revisa si producto ya está en la compra
Private Function RevisarProductoEnCompra(cod_producto As String)
For Each compra As DataGridViewRow In dgvProductosCompra.Rows
If compra.Cells(0).Value.ToString().Equals(cod_producto) Then
Return True
End If
Next
Return False
End Function
Private Sub btnComprar_Click(sender As Object, e As EventArgs) Handles btnComprar.Click
If dgvProductosCompra.Rows.Count <= 0 Then
MsgBox("No ha incluido productos en la compra")
Return
End If
bsnNegocio.InsertarCompraProductos(TxtRut.Text.Trim(), dgvProductosCompra)
CargarTextBox()
dgvProductos.DataSource = bsnNegocio.GetProductos()
dgvProductos.Rows(0).Selected = True
CargarDatosProducto()
dgvProductosCompra.Rows.Clear()
CalcularTotalCompra()
MsgBox("Compra ingresada")
End Sub
Private Sub btnVerCompras_Click(sender As Object, e As EventArgs) Handles btnVerCompras.Click
Dim ventana As New FrmComprasListar(Me)
ventana.Show()
End Sub
End Class
Login y Principal
Public Class FrmPrincipal
Dim usuario As Usuario
Dim formInicial As FrmLogin
Dim bsnNegocio As New BsnNegocio
Public Sub New(ByRef formInicial As FrmLogin, ByRef usuario As Usuario)
InitializeComponent()
Me.usuario = usuario
Me.formInicial = formInicial
'CargarStockCritico()
End Sub
Public Sub New()
InitializeComponent()
'CargarStockCritico()
End Sub
Private Sub Button5_Click(sender As Object, e As EventArgs)
formInicial.Show()
Me.Dispose()
End Sub
Private Sub FrmPrincipal_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Me.WindowState = 2
End Sub
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
Me.Hide()
FrmMantenedores.Show()
End Sub
Private Sub Label3_Click(sender As Object, e As EventArgs) Handles hora.Click
End Sub
Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
hora.Text = TimeOfDay
End Sub
Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
Me.Hide()
FrmInformes.Show()
End Sub
Private Sub FrmPrincipal_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
Mantenedor Productos
Imports MySql.Data.MySqlClient
Public Class FrmProductos
Dim bsnNegocio As New BsnNegocio
Dim tipo As New Integer
Dim primera As Byte = 0
Dim modo As Integer = 0
Dim opc As String
Public Sub New()
' Esta llamada es exigida por el diseñador.
InitializeComponent()
' Agregue cualquier inicialización después de la llamada a InitializeComponent().
End Sub
Sub Recarga()
Me.FrmProductos_Load(Me, Nothing)
'TxtFiltro.Text = ""
End Sub
'Sub CargarCb1()
' cbFiltro.DropDownStyle = ComboBoxStyle.DropDownList
' cbFiltro.DisplayMember = "Text"
' cbFiltro.ValueMember = "Value"
72
' Dim tb As New DataTable
' tb.Columns.Add("Text", GetType(String))
' tb.Columns.Add("Value", GetType(Integer))
' tb.Rows.Add("Sin Filtro", 0)
' tb.Rows.Add("Codigo", 1)
' tb.Rows.Add("Nombre", 2)
' tb.Rows.Add("Marca", 3)
' cbFiltro.DataSource = tb
'End Sub
Sub CargarCb2()
cbEstado.DropDownStyle = ComboBoxStyle.DropDownList
cbEstado.DisplayMember = "Text"
cbEstado.ValueMember = "Value"
Dim tb As New DataTable
tb.Columns.Add("Text", GetType(String))
tb.Columns.Add("Value", GetType(Integer))
tb.Rows.Add("DISPONIBLE", 0)
tb.Rows.Add("NO DISPONIBLE", 1)
cbEstado.DataSource = tb
End Sub
Sub CargarCb3()
cbTipo.DropDownStyle = ComboBoxStyle.DropDownList
cbTipo.DisplayMember = "Text"
cbTipo.ValueMember = "Value"
Dim tb As New DataTable
tb.Columns.Add("Text", GetType(String))
tb.Columns.Add("Value", GetType(Integer))
tb.Rows.Add("BEBIDAS", 0)
tb.Rows.Add("LICORES", 1)
tb.Rows.Add("ABARROTES", 2)
tb.Rows.Add("CIGARROS", 3)
cbTipo.DataSource = tb
End Sub
Sub CargarTextBox()
If Not (dgvProductos.Rows.Count = 0) Then
TxtCodigo.Text = dgvProductos.SelectedRows.Item(0).Cells(0).Value
TxtNombre.Text = dgvProductos.SelectedRows.Item(0).Cells(1).Value
TxtMarca.Text = dgvProductos.SelectedRows.Item(0).Cells(2).Value
TxtDescripcion.Text = dgvProductos.SelectedRows.Item(0).Cells(3).Value
cbEstado.Text = dgvProductos.SelectedRows.Item(0).Cells(4).Value
TxtPrecioVenta.Text = dgvProductos.SelectedRows.Item(0).Cells(5).Value
cbTipo.Text = dgvProductos.SelectedRows.Item(0).Cells(6).Value
TxtStockActual.Text = dgvProductos.SelectedRows.Item(0).Cells(7).Value
73
TxtStockCritico.Text = dgvProductos.SelectedRows.Item(0).Cells(8).Value
End If
End Sub
Private Sub FrmProductos_Load(sender As Object, e As EventArgs) Handles MyBase.Load
dgvProductos.DataSource = bsnNegocio.GetProductos()
Me.WindowState = 2
If primera = 0 Then
'CargarCb1()
CargarCb2()
CargarCb3()
primera = 1
End If
'Filtrar()
CargarTextBox()
TxtCodigo.Enabled = False
TxtNombre.Enabled = False
TxtMarca.Enabled = False
TxtDescripcion.Enabled = False
TxtPrecioVenta.Enabled = False
TxtStockActual.Enabled = False
TxtStockCritico.Enabled = False
cbEstado.Enabled = False
cbTipo.Enabled = False
End Sub
Private Sub FrmProductos_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
If e.CloseReason = CloseReason.UserClosing Then
e.Cancel = True
Me.Dispose()
FrmMantenedores.Show()
End If
End Sub
Private Sub Button4_Click(sender As Object, e As EventArgs)
Me.Close()
End Sub
Private Sub dgvProductos_CellClick(sender As Object, e As DataGridViewCellEventArgs) Handles dgvProductos.CellClick
CargarTextBox()
End Sub
Private Sub cbFiltro_SelectedIndexChanged(sender As Object, e As EventArgs)
End Sub
'Private Sub TxtFiltro_TextChanged(sender As Object, e As EventArgs) Handles TxtFiltro.TextChanged
Private Sub BtnSalir_Click(sender As Object, e As EventArgs) Handles BtnSalir.Click
FrmMantenedores.Show()
Me.Dispose()
74
End Sub
Private Sub BtnAgregar_Click(sender As Object, e As EventArgs) Handles BtnAgregar.Click
opc = "Agregar Producto"
BtnActualizar.Visible = False
BtnEliminar.Visible = False
BtnAgregar.Visible = False
BtnSalir.Visible = False
dgvProductos.Enabled = False
BtnAceptar.Visible = True
BtnCancelar.Visible = True
TxtCodigo.Enabled = True
TxtNombre.Enabled = True
TxtMarca.Enabled = True
TxtDescripcion.Enabled = True
TxtPrecioVenta.Enabled = True
TxtStockActual.Enabled = True
TxtStockCritico.Enabled = True
cbEstado.Enabled = True
cbTipo.Enabled = True
TxtCodigo.Text = ""
TxtNombre.Text = ""
TxtMarca.Text = ""
TxtDescripcion.Text = ""
TxtPrecioVenta.Text = ""
TxtStockActual.Text = ""
TxtStockCritico.Text = ""
End Sub
Private Sub BtnAceptar_Click(sender As Object, e As EventArgs) Handles BtnAceptar.Click
Dim bsnNegocio As New BsnNegocio
Dim obj As New DaoDatos
Dim prod As New Productos
If opc = "Agregar Producto" Then
If TxtCodigo.Text = "" Or TxtNombre.Text = "" Or TxtMarca.Text = "" Or TxtDescripcion.Text = "" Or TxtPrecioVenta.Text =
"" Or TxtStockActual.Text = "" Or TxtStockCritico.Text = "" Then
MsgBox("Por favor, debe rellenar todos los campos", MsgBoxStyle.Information, "Alerta")
Return
End If
If TxtStockActual.Text < TxtStockCritico.Text Then
MsgBox("El Stock Actual es menor que el Stock Crítico")
End If
Dim respuesta = bsnNegocio.InsertarProductos(
UCase(TxtCodigo.Text),
UCase(TxtNombre.Text),
UCase(TxtMarca.Text),
75
UCase(TxtDescripcion.Text),
cbEstado.Text,
Integer.Parse(TxtPrecioVenta.Text),
cbTipo.Text,
Integer.Parse(TxtStockActual.Text),
Integer.Parse(TxtStockCritico.Text))
77
TxtStockCritico.Enabled = False
cbEstado.Enabled = False
cbTipo.Enabled = False
End Sub
Private Sub dgvProductos_CellContentClick(sender As Object, e As DataGridViewCellEventArgs) Handles
dgvProductos.CellContentClic
End Sub
Private Sub BtnActualizar_Click(sender As Object, e As EventArgs) Handles BtnActualizar.Click
Dim negocio As New BsnNegocio
opc = "Actualizar Productos"
BtnActualizar.Visible = False
BtnEliminar.Visible = False
BtnAgregar.Visible = False
BtnSalir.Visible = False
BtnAceptar.Visible = True
BtnCancelar.Visible = True
TxtCodigo.Enabled = False
TxtNombre.Enabled = True
cbTipo.Enabled = True
TxtMarca.Enabled = True
TxtDescripcion.Enabled = True
TxtPrecioVenta.Enabled = True
TxtStockActual.Enabled = True
TxtStockCritico.Enabled = True
cbEstado.Enabled = True
cbTipo.Enabled = True
End Sub
Private Sub BtnEliminar_Click(sender As Object, e As EventArgs) Handles BtnEliminar.Click
opc = "Eliminar Productos"
BtnActualizar.Visible = True
BtnEliminar.Visible = True
BtnAgregar.Visible = True
BtnSalir.Visible = True
BtnAceptar.Visible = False 'ACEPTAR
BtnCancelar.Visible = False 'CANCELAR
TxtCodigo.Enabled = False
TxtNombre.Enabled = False
cbTipo.Enabled = False
TxtMarca.Enabled = False
TxtDescripcion.Enabled = False
TxtPrecioVenta.Enabled = False
TxtStockActual.Enabled = False
TxtStockCritico.Enabled = False
78
cbEstado.Enabled = False
cbTipo.Enabled = False
BtnActualizar.Enabled = False
BtnEliminar.Enabled = True
BtnAgregar.Enabled = False
BtnSalir.Enabled = False
If opc = "Eliminar Productos" Then
If dgvProductos.CurrentRow Is Nothing Then
MsgBox("Error! Debe seleccionar un registro de la tabla.", MsgBoxStyle.Critical, "Alerta")
Else
If MessageBox.Show("¿Está seguro que desea eliminar el producto?", "Alerta", MessageBoxButtons.OKCancel,
MessageBoxIcon.Question) = Windows.Forms.DialogResult.OK Then
Dim respuesta = bsnNegocio.EliminarProductos(TxtCodigo.Text.Trim())
Select Case respuesta
Case -1 : MsgBox("El producto no se puede eliminar porque tiene Ajustes")
Case -2 : MsgBox("El producto no se puede eliminar porque tiene Compras")
Case -3 : MsgBox("El producto no se puede eliminar porque tiene Ventas")
Case Else
MsgBox("Producto eliminado correctamente", MsgBoxStyle.Information, "Alerta")
Recarga()
End Select
End If
End If
End If
BtnActualizar.Enabled = True
BtnEliminar.Enabled = True
BtnAgregar.Enabled = True
BtnSalir.Enabled = True
End Sub
Private Sub TxtMarca_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TxtMarca.KeyPress
If Char.IsLetter(e.KeyChar) Then
e.Handled = False
ElseIf Char.IsControl(e.KeyChar) Then
e.Handled = False
ElseIf Char.IsSeparator(e.KeyChar) Then
e.Handled = False
Else
e.Handled = True
End If
79
End Sub
Private Sub TxtStockActual_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TxtStockActual.KeyPress
If Char.IsNumber(e.KeyChar) Then
e.Handled = False
ElseIf Char.IsControl(e.KeyChar) Then
e.Handled = False
ElseIf Char.IsSeparator(e.KeyChar) Then
e.Handled = False
Else
e.Handled = True
End If
If InStr(1, "'" & Chr(8), e.KeyChar) = 1 Then
e.KeyChar = ""
End If
If Char.IsWhiteSpace(e.KeyChar) Then
e.Handled = True
MsgBox("No se permiten espacios")
End If
End Sub
Private Sub TxtStockCritico_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TxtStockCritico.KeyPress
If Char.IsNumber(e.KeyChar) Then
e.Handled = False
ElseIf Char.IsControl(e.KeyChar) Then
e.Handled = False
ElseIf Char.IsSeparator(e.KeyChar) Then
e.Handled = False
Else
e.Handled = True
End If
If InStr(1, "'" & Chr(8), e.KeyChar) = 1 Then
e.KeyChar = ""
End If
If Char.IsWhiteSpace(e.KeyChar) Then
e.Handled = True
MsgBox("No se permiten espacios")
End If
End Sub
Private Sub TxtPrecioCompra_KeyPress(sender As Object, e As KeyPressEventArgs)
If Char.IsNumber(e.KeyChar) Then
e.Handled = False
ElseIf Char.IsControl(e.KeyChar) Then
e.Handled = False
ElseIf Char.IsSeparator(e.KeyChar) Then
80
e.Handled = False
Else
e.Handled = True
End If
81
End If
If Char.IsWhiteSpace(e.KeyChar) Then
e.Handled = True
MsgBox("No se permiten espacios")
End If
End Sub
Private Sub TxtNombre_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TxtNombre.KeyPress
If InStr(1, "'" & Chr(8), e.KeyChar) = 1 Then
e.KeyChar = ""
End If
End Sub
Private Sub TxtNombre_TextChanged(sender As Object, e As EventArgs) Handles TxtNombre.TextChanged
End Sub
Private Sub TxtDescripcion_TextChanged(sender As Object, e As EventArgs) Handles TxtDescripcion.TextChanged
End Sub
Private Sub TxtDescripcion_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TxtDescripcion.KeyPress
If InStr(1, "'" & Chr(8), e.KeyChar) = 1 Then
e.KeyChar = ""
End If
End Sub
Prvate Sub TxtMarca_TextChanged(sender As Object, e As EventArgs) Handles TxtMarca.TextChanged
End Sub
Private Sub TxtStockActual_TextChanged(sender As Object, e As EventArgs) Handles TxtStockActual.TextChanged
End Sub
Private Sub TxtStockCritico_TextChanged(sender As Object, e As EventArgs) Handles TxtStockCritico.TextChanged
End Sub
Private Sub TxtPrecioCompra_TextChanged(sender As Object, e As EventArgs)
End Sub
Private Sub TxtPrecioVenta_TextChanged(sender As Object, e As EventArgs) Handles TxtPrecioVenta.TextChanged
End Sub
Private Sub Button5_Click(sender As Object, e As EventArgs)
End Sub
Private Sub TxtFiltro_KeyPress(sender As Object, e As KeyPressEventArgs)
If InStr(1, "'" & Chr(8), e.KeyChar) = 1 Then
e.KeyChar = ""
End If
End Sub
End Class.
82
Ventas.
Imports System.ComponentModel
Imports TrabajoBotilleria.FrmDeudores
Public Class FrmVentas
Dim bsnNegocio As New BsnNegocio
Sub Recarga()
dgvProdVenta.DataSource = bsnNegocio.GetProductos()
End Sub
Sub CargarTextBox()
If Not (dgvProdVenta.Rows.Count = 0) Then
TxtCodigo.Text = dgvProdVenta.SelectedRows.Item(0).Cells(0).Value
TxtNombre.Text = dgvProdVenta.SelectedRows.Item(0).Cells(1).Value
TxtPrecio.Text = dgvProdVenta.SelectedRows.Item(0).Cells(5).Value
End If
End Sub
Public Sub CargarCbDeudor()
Dim bsn As New BsnNegocio()
CbRut.DropDownStyle = ComboBoxStyle.DropDownList
CbRut.DataSource = bsn.GetDeudores()
CbRut.DisplayMember = "NOMBRE_DEUDOR"
CbRut.ValueMember = "RUT_DEUDOR"
End Sub
Private Sub GroupBox1_Enter(sender As Object, e As EventArgs) Handles GroupBox1.Enter
End Sub
Private Sub FrmVentas_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Me.WindowState = 2
dgvProdVenta.DataSource = bsnNegocio.GetProductos()
dgvProdVenta.Columns(6).Visible = False
dgvProdVenta.Columns(8).Visible = False
CargarTextBox()
CargarCbDeudor()
TxtCodigo.enabled = False
TxtNombre.enabled = False
TxtPrecio.Enabled = False
End Sub
Private Sub FrmVentas_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
If e.CloseReason = CloseReason.UserClosing Then
e.Cancel = True
Me.Dispose()
FrmPrincipal.Show()
End If
End Sub
Private Sub Button8_Click(sender As Object, e As EventArgs) Handles btnSalir.Click
Me.Hide()
FrmPrincipal.Show()
End Sub
Private Sub dtgProdVenta_CellContentClick(sender As Object, e As DataGridViewCellEventArgs) Handles
dgvProdVenta.CellContentClick
End Sub
Private Sub dgvProdVenta_CellClick(sender As Object, e As DataGridViewCellEventArgs) Handles dgvProdVenta.CellClick
CargarTextBox()
End Sub
Private Sub btnAgregar_Click(sender As Object, e As EventArgs) Handles btnAgregar.Click
If txtCantidad.Text = "" Or TxtDcto.Text = "" Then
MsgBox("Debe indicar cantidad y descuento. Si no hay descuento escriba 0")
Return
End If
Dim cantidad, descuento As Integer
Try
cantidad = Integer.Parse(txtCantidad.Text.Trim())
descuento = Integer.Parse(TxtDcto.Text.Trim())
Catch ex As Exception
MsgBox("Cantidad y descuento deben ser números")
Return
End Try
If cantidad <= 0 Or descuento < 0 Then
MsgBox("Cantidad debe ser mayor a cero y descuento mayor o igual a cero")
Return
End If
83
If RevisarProductoEnVenta(TxtCodigo.Text.Trim()) Then
MsgBox("El producto ya está en la venta")
Return
End If
Dim valores(6) As String
valores(0) = TxtCodigo.Text
valores(1) = TxtNombre.Text
valores(2) = TxtPrecio.Text
valores(3) = txtCantidad.Text
valores(4) = TxtDcto.Text
valores(5) = (Integer.Parse(TxtPrecio.Text) * Integer.Parse(txtCantidad.Text.Trim())) - Integer.Parse(TxtDcto.Text)
dgvProductosVentas.Rows.Add(valores)
CalcularTotalVenta()
txtCantidad.Text = 1
TxtDcto.Text = 0
End Sub
Private Sub btnAgregarDeu_Click(sender As Object, e As EventArgs) Handles btnAgregarDeu.Click
Dim ventana As New FrmDeudores(Me)
ventana.Show()
End Sub
Private Sub btnEliminar_Click(sender As Object, e As EventArgs) Handles btnEliminar.Click
dgvProductosVentas.Rows.Remove(dgvProductosVentas.SelectedRows(0))
CalcularTotalVenta()
End Sub
Private Sub btnCancelar_Click(sender As Object, e As EventArgs) Handles btnCancelar.Click
dgvProductosVentas.Rows.Clear()
CalcularTotalVenta()
End Sub
Private Sub btnNuevaVenta_Click(sender As Object, e As EventArgs) Handles btnNuevaVenta.Click
dgvProductosVentas.Rows.Clear()
CalcularTotalVenta()
txtPagoEfectivo.Text = 0
End Sub
'Calcula total de venta a medida que se agregar/quitan items
Private Sub CalcularTotalVenta()
Dim totalventa As Integer = 0
For Each venta As DataGridViewRow In dgvProductosVentas.Rows
totalventa += Integer.Parse(venta.Cells(5).Value)
Next
txtTotalVenta.Text = totalventa
End Sub
'Revisa si producto ya está en la venta
Private Function RevisarProductoEnVenta(cod_producto As String)
For Each venta As DataGridViewRow In dgvProductosVentas.Rows
If venta.Cells(0).Value.ToString().Equals(cod_producto) Then
Return True
End If
Next
Return False
End Function
Private Sub TextBox3_TextChanged(sender As Object, e As EventArgs)
End Sub
Private Sub txtPagoEfectivo_TextChanged(sender As Object, e As EventArgs) Handles txtPagoEfectivo.TextChanged
End Sub
End Sub
84
If totalventa = 0 Then
MsgBox("Debe incluir productos en la venta")
Return
End If
If totalventa = 0 Then
MsgBox("Debe incluir productos en la venta")
Return
End If
dgvProductosVentas.Rows.Clear()
CalcularTotalVenta()
dgvProdVenta.DataSource = bsnNegocio.GetProductos()
CbRut.SelectedIndex = 0
MsgBox("Venta con deuda ingresada")
End Sub
85