Punto de Venta
Transcript of Punto de Venta
ÍNDICE
Fase De Inicio 1Documento visión 2Identificación de los procesos de negocio. 2Breve descripción de los procesos de negocio identificados: 2Introducción: 3Sentencia que define el problema 4Perspectiva del producto: 4REQUERIMIENTOS 6Funcionales 6No Funcionales (Calidad) 6Modelo de Casos de Uso 7Lista Actor-Semántica 7Lista Actor-Objetivo 8Lista de casos de uso: 9Descripción breve de cada caso de uso: 9Especificación Complementaria. 10Facilidad de uso: 10Fiabilidad 11Rendimiento 11Interfaces 11Interfaces y hardware destacables 11Interfaces de software 11Glosario 11Casos de uso completos: 13Caso de uso UC03: Registrar Venta 13Caso de uso UC10: Controlar el stock 16DIAGRAMAS DE CASO DE USO 17Fase De Elaboración 18Modelo de Dominio 19Diagramas de Secuencia del Sistema 19CU3: Registrar Ventas 19CU10: Controlar el Stock 20Contratos: 21Contratos del caso de uso Registrar Ventas 21Contratos del caso de uso Controlar el Stock 22Clases conceptuales: 23Diagramas de Clases del Dominio 23MODELO DE DISEÑO 24DIAGRAMAS DE COLABORACION 24CU3 Registrar Ventas: 24
1
CU10: Monitorear el Stock 28Diagrama de clases de diseño 32MODELO DE IMPLEMENTACION 33CODIGO FUENTE 33Loggin 33Principal 35Nueva Ventana 37Almacén 51Articulo 54Catalogo Artículos 54Cliente 55Descripción Articulo 57Línea Venta 59Pago 60Pedidos 61Registro 61Stock 63Sucursal 64Ticket 66Vendedor 67Venta 68
-------------------------------------------------
2
Fase De Inicio
Documento visiónIdentificación de los procesos de negocio.
* Vender artículos de línea blanca. * Comprar artículos a proveedores. * Distribuir artículos por sucursales * Obtener informes de venta de artículo de línea blanca. * Realizar abonos de crédito * Almacenar los artículos comprados a proveedores * Surtir a sucursales con artículos * Transportar los artículos del centro de distribución a los almacenes. * Gestionar los descuentos de los artículos * Obtener
Reportes de artículos por almacén de cada sucursal.
* Informe de artículo no surtido del centro de distribución
Breve descripción de los procesos de negocio identificados:
Vender artículos de línea blanca.
Se realizara la venta de artículos solicitados por el cliente esta podría realizarse
a crédito o de contado, se tomaran en cuenta las políticas del negocio.
Comprar artículos a proveedores.
Se compraran artículos a los proveedores para venderlos después.
Distribuir de artículo por sucursales.
Los centros de distribución surtirán a las sucursales que requieran artículos.
Obtener informes de venta de artículo de línea blanca.
Este será un informe detallado de la venta realizada por algún artículo de línea
blanca, solo que este informe se realizara por sucursal y no en general.
Realizar abonos de crédito
3
Cuando haya una transacción a crédito el pago se administrara de forma
diferente, la cual queda pendiente de definir.
Almacenar los artículos comprados a proveedores.
Se almacenaran en centros de distribución los artículos obtenidos de los
proveedores.
Surtir a sucursales con artículos.
Los almacenistas surtirán con artículos a sus sucursales cuando esto sea
necesario.
Transportar los artículos del centro de distribución a los almacenes.
Los centros de distribución mantendrán el stock mismo de los almacenes de las
sucursales.
Gestionar los descuentos de los artículos
Algunos artículos puede tener porcentajes de descuentos o importe de
descuento.
Obtener reportes de artículos por almacén de cada sucursal
Se mostrara un reporte de los artículos que posea de momento cada sucursal
en su almacén.
Informe de artículo no surtido del centro de distribución
Se realizara un informe de los artículos que no fueron surtidos en alguna de las
sucursales por los centros de distribución.
Introducción:
Este sistema permitirá controlar las actividades de venta e inventario de la
empresa. Lo cual supondrá un acceso rápido y sencillo a los datos, gracias a
interfaces gráficas sencillas y amigables. Además, los datos accedidos estarán
4
siempre actualizados, lo cual es un factor muy importante para poder llevar un
control
Centralizado de las distintas sucursales.
Sentencia que define el problema
El problema de | Controlar el stock existente en los distintos almacenes, de
forma que se puedan servir los pedidos que reciben dichos almacenes.
Gestionar las órdenes de venta de contado y/o a crédito realizadas por los
clientes. Gestionar los pedidos realizados a los proveedores. Gestionar los
pedidos realizados a los centros de distribución. Gestionar los pedidos
realizados a los almacenes. |
afecta a | Propietario de la empresa. Gerente general. Jefe de Sucursal,
Vendedor, Almacenista, Jefe del centro de distribución, Proveedores, Clientes. |
Perspectiva del producto:
Sist. Centro de distribución.
Vendedor
Sist. Centro de Almacén.
Sistema
“Llévatelo”
Jefe de sucursal
Invoca servicios de.
Invoca servicios de.
Sist. De impuestos.
5
Gerente
Sist. De recursos humanos.
Almacenista
Objetivos de alto nivel y problemas claves del personal involucrado: después
de llevar acabo un taller de requisitos se identificaron los siguientes objetivos y
problemas claves:
Objetivo de alto nivel | Prioridad | Problemas e inquietudes | Soluciones
actuales |
Realizar un procesamiento de ventas rápido, robusto e integrado | Alta |
Pérdida de la capacidad de procesamiento de las ventas si los componentes
fallan Imposibilidad de adaptar las reglas de negocio a requisitos únicos. Se
reduce la velocidad cuando se aumenta la carga. | Los artículos existentes
permiten el procesamiento básico de ventas pero no abordan estos problemas |
Mantener el Stock mínimo de cada almacén de las sucursales. Haciéndolo de
manera consistente e integra. | Alta | Perdida de información de la existencia de
los artículos. En algún momento dado la sucursal se quede sin artículos. | Pedir
en el momento los artículos al centro de distribución. |
Consultar reportes | Alta | Proceso lento de toma de decisiones basadas en
datos erróneos, desactualizados o con información no consistente ni integra. |
Reportes manuales tediosos y confusos. |
REQUERIMIENTOS
Funcionales
1. Realizar ventas al contado
2. Realizar ventas a crédito realizando porcentaje de interés al precio de venta
(enganche
6
10% del valor del artículo y el resto en mensualidades).
3. Realizar ventas con tarjeta, utilizando el sistema autorización de pagos.
4. El artículo deberá tener porcentaje de descuento o importe de descuento.
5. Los clientes leales reciben bonos de descuento por compras de contado.
6. Los centros de distribución deberán mantener el stock mínimos de artículos
en cada almacén de las sucursales.
7. Una sucursal podrá solicitar directamente artículos al centro de distribución
que le pertenece.
8. El sistema podrá generar consultas, para que el gerente pueda consultar la
existencia de artículos en un almacén de sucursal o centro de distribución,
detallado cuando se requiera el número de serie del artículo.
9. El sistema podrá generar consultas al gerente de los informes de los
artículos vendidos por sucursal en un periodo de, detallando cuando se
requiera el número de serie del artículo.
10. El sistema podrá generar consultas al gerente para saber el informe de los
artículos que no fueron surtidos por los centros de distribución a las diferentes
sucursales.
11. El sistema podrá generar consultas para el gerente de las ventas que
realizaron los vendedores detallando los artículos que vendió.
No Funcionales (Calidad)
12. El sistema deberá de satisfacer de manera eficiente los intereses y
necesidades de los involucrados.
13. El sistema debe tener la capacidad de detectar y manejar errores y
almacenarlos para su posterior revisión.
14. El sistema tendrá la capacidad de adaptarse a las reglas únicas de cada
sucursal y almacén en el que se encuentre, basando su funcionalidad en ello.
15. Para usar el sistema se requerirá de una clave de acceso y un usuario.
16. El sistema deberá ser capaz de completar ventas u otras operaciones sin
importar si ocurre algún error y deberá manejar las operaciones a modo de
transacciones para que se efectúen de manera atómica.
7
17. El sistema deberá tener que procesar de manera rápida las ventas, así
como manejar un tiempo veloz de impresión de sus tickets.
18. El sistema deberá contar con interfaces que le permitan comunicarse y
colaborar con sistemas externos.
Modelo
De Casos de Uso
Lista Actor-Semántica
Actor | Descripción |
Propietario de la empresa | Persona que está a cargo de la organización, es
aquel que toma las decisiones de importancia para la empresa. |
Gerente | Persona encargada de tener informes del desempeño de la empresa.
|
Almacenista | Persona encargada de llevar un control de los artículos que tiene
en venta la empresa. |
Proveedor | Cualquier empresa o persona que proporciona bienes materiales
hacia la empresa. |
Jefe de sucursal | Persona encargada de tomar las decisiones en una sucursal
de la empresa. |
Vendedor | Persona que interactúa en las funciones de venta y captura de
datos en el sistema e interactúa con el cliente. |
Cliente directo | Cualquier persona que adquiera un artículo de la empresa. |
Cliente leal | Cualquier persona que porte una tarjeta de “cliente leal”. |
Encargado del centro de distribución | Persona encargada de
administrar el centro de distribución y complacer las demandas del
almacenista. |
Lista Actor-Objetivo
Actor | Objetivo |
8
Propietario de la empresa. | 1. Analizar la estadística de los procesos
administrativos de la empresa. 2. Gestionar los descuentos a clientes. 3.
Gestionar los descuentos a artículos. |
Gerente. | 1. Generar informes de existencia de artículos en almacenes
y/o centros de distribución, detallado por número de serie. 2. Generar
informes de artículos vendidos por sucursal en un periodo, detallado por
número de seria cuando sea necesario. 3. Generar informes de artículos que
no fueron surtidos por los centros de distribución a las diferentes sucursales.
4. Generar informes de las ventas que se realizaron los vendedores detallando
los artículos que vendió. |
Jefe de sucursal. | 1. Generar informe de los artículos existentes en el
almacén. 2. Solicitar artículos al centro de distribución. 3. Solicitar artículos
al almacén. 4. Generar informe de productividad de sus trabajadores. 5.
Registrar clientes leales. |
Vendedor. | 1. Realizar el cobro de ventas ha contado. 2. Realizar el cobro
de ventas a crédito. 3. Registrar ventas. 4. Cancelar ventas. 5. Eliminar
artículos
De la lista de venta. 6. Realizar abonos a las ventas de crédito. |
Almacenista. | 1. Registrar los artículos recibidos por el centro de
distribución. 2. Registrar los artículos salientes del almacén. |
Encargado del centro de distribución. | 1. Generar informe de los
artículos existentes en los almacenes de cada sucursal. 2. Registrar los
artículos salientes del centro de distribución. |
Lista de casos de uso:
* CU1: Generar informes.
* CU2: Gestionar los descuentos.
* CU3: Registrar ventas.
* CU4: Realizar cobros.
* CU5: Cancelar ventas.
9
* CU6: Realizar abonos.
* CU7: Solicitar artículos.
* CU8: Registrar artículos.
* CU9: Consultar inventarios.
* CU10: Controlar el stock.
Descripción breve de cada caso de uso:
CU1: Generar informes
El usuario con permisos necesarios, solicitara al sistema reportes relacionados
con los artículos y ventas del negocio, se ocupa más examinación aquí.
CU2: Gestionar los descuentos
El propietario de la empresa será capaz de gestionar tanto como los
descuentos sobre los artículos como los descuentos a los clientes, este
proceso tiene que ver con las políticas del negocio y puede ser cambiante.
CU3: Registrar ventas
El vendedor será capaz de registrar sus ventas realizadas individualmente.
CU4: Realizar cobros
El vendedor será capaz de realizar cobros a los clientes dependiendo de los
artículos registrados en el carrito.
CU5: Cancelar ventas
El vendedor será capaz de cancelar ventas, pero no borrarlas.
CU6: Realizar abonos
El vendedor será capaz de registrar los abonos de los clientes para las ventas
realizadas a crédito.
CU7: Solicitar artículos
El usuario con los permisos necesarios será capaz de solicitar artículos al
almacén o centro de distribución según el caso.
CU8: Registrar artículos
El usuario ya sea al almacenista o el centro de distribución, serán capaces de
registrar los artículos salientes y entrantes de su stock.
CU9: Consultar inventarios
10
El usuario con permisos necesarios, será capaz de consultar el inventario para
obtener información de los artículos de este.
CU10: Controlar el stock
El sistema mismo será capaz de
Monitorear el stock de los almacenes de las sucursales asegurándose de que
siempre tengan el stock mínimo y actuando de manera automática ante ello,
estas son políticas del negocio y pueden cambiar o ser configurables.
Especificación Complementaria.
Facilidad de uso:
El cliente será capaz de ver la información en un gran monitor, por tanto:
* Se debe ver el texto fácilmente a una distancia de 1 metro.
* Evitar colores asociados con formas comunes de daltonismo.
El vendedor está mirando a menudo al cliente o los artículos, no a la pantalla
de la computadora, por tanto, se deben comunicar las señales y avisos con
sonidos, en lugar de sólo mediante gráficos.
El almacenista manejara una pantalla táctil y un Numpad para facilitar el control
de los artículos en el sistema, por lo tanto los botones deberán ser grandes y la
interfaz sencilla.
El encargado del centro de distribución y jefe de sucursal no ocuparan algún
hardware especial, solo ocupa una computadora y que la interfaz del sistema
sea amigable e intuitiva para evitar errores humanos.
El gerente y el propietario utilizaran un gran monitor, ya que así se apreciaran
mejor los reportes, por lo cual se evitara utilizar colores llamativos o cansados
para la vista.
Fiabilidad
Si se produce algún fallo cuando el sistema está haciendo alguna transacción,
ya sea de ventas o de inventario, se buscara solucionar de manera local el
problema. Se ocupa más análisis para este requisito.
Rendimiento
11
Los gerentes, propietario de la empresa, encargado del centro de distribución,
el almacenista y el jefe de departamento quieren que el informe este en tiempo
real y que sea consistente.
Interfaces
Interfaces y hardware destacables
* Monitor con pantalla táctil.
* Escáner láser de código de barras.
* Impresora de recibos.
* Lector de tarjetas de crédito.
* Numpad.
Interfaces de software
Se elaborara una interfaz de colaboración interna para comunicar los diversos
módulos del sistema.
Glosario
Interfaz.- Hace referencia al conjunto de métodos para lograr interactividad
entre un usuario y una computadora. Una interfaz puede ser del tipo GUI,
o línea de comandos, etc. También puede
Ser a partir de un hardware, por ejemplo, el monitor, el teclado y el mouse, son
interfaces entre el usuario y la computadora.
Software.-Se conoce como software al equipamiento lógico o soporte lógico de
una computadora digital; comprende el conjunto de los componentes lógicos
necesarios que hacen posible la realización de tareas específicas.
Hardware.-Hardware corresponde a todas las partes físicas y tangibles de una
computadora: sus componentes eléctricos, electrónicos, electromecánicos y
mecánicos; sus cables, gabinetes o cajas, periféricos de todo tipo y cualquier
otro elemento físico involucrado.
Stock.-Término de origen inglés que puede traducirse como existencias y que
designa principalmente las materias primas, productos semielaborados y
12
terminados que las empresas tienen en sus almacenes.
Proveedor.-Persona o sociedad que suministra la materia prima utilizada para
producir los bienes o servicios necesarios para una actividad.
Almacenista.- Es aquella persona que está encargada de llevar el control de
entradas y salidas de productos de un almacén.
Gerente.-El termino gerente denomina a quien está a cargo de la dirección de
alguna organización, institución o empresa o parte de ella.
Venta.-El proceso personal o impersonal por el que el vendedor comprueba,
activa y satisface las necesidades del comprador para el mutuo y continuo
beneficio de ambos (del vendedor y el comprador).
Pantalla táctil.-Una pantalla táctil es una pantalla que mediante un toque directo
sobre su superficie permite la entrada de datos y órdenes al dispositivo.
Cliente.- persona que acude a la empresa a solicitar la venta de un artículo.
Casos de uso completos:
Caso de uso UC03: Registrar Venta
Actor Principal: Vendedor
Personas involucradas e intereses:
Propietario de la empresa: Quiere que se registren las transacciones con
precisión y satisfacer los intereses de los clientes.
Gerente: Quiere actualización automática y rápida del inventario.
Jefe de Sucursal: Quiere ser informado de las transacciones de las ventas de la
sucursal.
Vendedor: Quiere registrar la venta de los artículos de manera rápida y segura.
Cliente: Quiere adquirir un artículo.
Precondiciones:
13
El vendedor se autentifico en el sistema.
Garantía de éxito (Postcondiciones). Se registra la venta, se actualiza el
inventario, se genera el recibo y se le entrega al cliente.
Escenario Principal de éxito (Flujo básico):
1. El vendedor inicia una venta.
2. El vendedor introduce el código del artículo.
3. El sistema registra el artículo en la lista de venta presentando su
descripción, precio y suma parcial de la venta. El precio se calcula cumpliendo
las políticas de negocio.
El cajero repite los pasos 3 y 4 hasta que se indique.
4. El sistema presenta el total respetando las políticas del negocio.
5. El vendedor le informa al cliente el total de la venta y pide el pago.
6. El cliente paga y el sistema gestiona el pago.
7. El sistema registra la venta y actualiza el inventario.
8. El sistema imprime el recibo.
9. El cliente se va con el recibo y las mercancías.
Extensiones (flujo alternativo).
a) En cualquier momento el Sistema falla.
1. El vendedor reinicia el sistema y se autentifica.
2. El Sistema indica el error al vendedor.
1. El vendedor reinicia el sistema y se autentifica.
2. El vendedor inicia una nueva venta.
3a. Código no valido:
1. El sistema indica el error y rechaza la entrada.
3b. Hay muchos artículos de la misma categoría y si estos no tienen número
de serie no es importante tenerlos en cuenta como una única identidad:
1. El Vendedor introduce el código de la categoría del artículo y la cantidad
deseada.
3-6a. El cliente pide al vendedor que elimine un artículo de la venta:
14
1. El vendedor introduce el código del artículo para eliminarlo de la venta:
1. En caso de ser necesario introduce la cantidad que desea eliminar.
2. El sistema muestra la suma parcial actualizada.
3-6b. El cliente pide al vendedor cancelar la venta:
1. El vendedor cancela la venta en el sistema.
5a. El cliente dice que le son aplicables descuentos adicionales:
1. El vendedor solicita la opción de “CLEINTE LEAL”.
2. El vendedor introduce el código del cliente
3. El sistema el total, con los descuentos basado en las políticas del negocio.
5b. El cliente
Informa al vendedor que tiene crédito en su cuenta, para aplicar a la venta:
1. El vendedor solicita la opción de crédito.
2. En vendedor introduce el código del cliente.
3. El sistema aplica el crédito hasta que el precio = 0, y reduce el crédito que
queda.
3a. El cliente no cuenta con suficiente crédito:
1. El vendedor le informa al cliente que no tiene suficiente crédito:
1a. El cliente utiliza un método de pago alternativo.
1b. El cliente solicita al vendedor que cancele la venta. El vendedor cancela la
venta en el sistema.
1c. El cliente solicita al vendedor que suspenda la venta. El vendedor
suspende la venta en el sistema.
6. El cliente solicita pagar en efectivo pero no tiene el suficiente:
1a. El cliente solicita un método alternativo para pagar.
2b. El cliente le dice al vendedor que cancele la venta. El vendedor cancela la
venta en el sistema.
3c. El cliente solicita al vendedor que suspenda la venta. El vendedor suspende
la venta en el sistema.
15
7. Pago en efectivo:
1. El vendedor introduce la cantidad de dinero en efectivo recibido.
2. El sistema muestra la cantidad de dinero a devolver.
3. El vendedor guarda el dinero recibido y devuelve el cambio al cliente.
4. El sistema registra el pago en efectivo.
Requisitos especiales:
* Interface de usuario amigable, intuitiva y evitar colores llamativos o
cansados para la vista. El texto debe ser visible a un metro de distancia.
* Reglas de negocio que se pueden añadir en tiempo de ejecución en los
pasos 3 y 7.
Lista de tecnología y variaciones de datos:
3a. El identificador del artículo se introduce mediante un escáner laser de
código de barras o atreves del teclado.
Frecuencia: continúo.
Caso de uso UC10: Controlar el stock
Actor Principal: El Sistema
Personas involucradas e intereses:
Propietario de la empresa: Quiere que ninguna sucursal se quede sin artículos.
Gerente: Quiere que ninguna sucursal se quede sin artículos.
Jefe de Sucursal: Quiere que su sucursal no se quede sin artículos.
Cliente: Quiere encontrar el artículo que necesita en la sucursal.
Jefe de almacén: Mantener su Stock mínimo.
Precondiciones:
16
Que se haiga registrado una venta.
Garantía de éxito (Postcondiciones). El sistema verifica el stock de cada
artículo, si se encuentra bajo manda un mensaje al centro de distribución para
que lleven los artículos faltantes.
Escenario Principal de éxito (Flujo básico):
1. El sistema obtiene la venta recién registrada.
2. El sistema obtiene la línea de venta con el artículo y la cantidad.
3. El sistema actualiza la cantidad del artículo en el almacén.
4. El sistema verifica que la nueva cantidad sea mayor a la mínima aceptable.
Repetir pasos del 2 al 4 hasta que se indique.
Extensiones (flujo alternativo).
3. La cantidad del artículo actual es 0.
3.a)- El sistema indica al vendedor del error y prosigue con la siguiente línea de
venta.
4. La cantidad del artículo es igual o menor a la mínima.
4.a)-El sistema envía un mensaje de notificación al jefe de la sucursal, al
gerente y al centro de distribución.
Requisitos especiales:
* La actualización debe ser en tiempo real.
Frecuencia: continúo.
DIAGRAMAS DE CASO DE USO
En la Figura 1se muestra el diagrama de casos de uso con las relaciones
secundarias existentes entre los actores, los casos de uso y los sistemas
externos del punto de venta.
Figura 1: Diagrama Caso de Uso PDV Llévatelo.
17
Fase De Elaboración
Modelo de Dominio
Diagramas de Secuencia del Sistema
Un diagrama de secuencia es un dibujo que muestra, para un escenario
especifico de un caso de uno, los eventos que generan los actores externos, el
orden y los eventos entre los sistemas. Todos los sistemas se tratan como
cajas negras, los diagramas destacan los eventos que cruzan los límites del
sistema desde los actores a los sistemas.
CU3: Registrar Ventas
Figura 2. DSS del CU3: Registrar Ventas
A continuación se muestra en la figura 2, la secuencia Registrar Ventas, donde
se ilustra el escenario principal de éxito del caso de uso procesar venta, se
indica que el Vendedor acciona los eventos del sistema Inicia Nueva Venta,
Ingresar Articulo, Finalizar Venta y Realizar Pago.
CU10: Controlar el Stock
A continuación se muestra en la figura 3, la secuencia Controlar el Stock,
donde se ilustra el escenario principal
De éxito del caso de uso controlar el stock, se indica que el mismo sistema
acciona los eventos Actualizar Inventario, Actualizar Stock, y Monitorear
Mínimo.
Figura 3. DSS Monitorear el Stock
Contratos:
Contratos del caso de uso Registrar Ventas
Contrato C01: Crear Nueva Venta
18
Operación: Crear Nueva Venta()
Referencias cruzadas: Caso de uso registrar venta
Precondiciones: Ninguna
Post condiciones:
1) Se creó instancia de Venta
2) Instancia de Venta se asoció con la Terminal PDV
3) Instancia de Venta se asoció con el Vendedor
4) Se inicializaron los atributos de la instancia de Venta
Contrato C02: Introducir Articulo
Operación: introducir Articulo()
Referencias Cruzadas: Caso de uso registrar venta
Precondiciones: Exista una venta en curso
Post condiciones:
1) Se creó la instancia Línea De Venta ldv
2) Ldv se asocia con la venta actual
3) Ldv se asocia con una Descripción Del Articulo
Contrato C03: Finalizar Venta
Operación: finalizar Venta()
Referencias cruzadas: Caso de uso registrar venta
Precondiciones: Que exista una venta en curso.
Post condiciones:
1) El atributo Venta. Finalizada paso a ser verdadero.
Contrato C04: Realizar Pagó
Operación: realizar Pagó (cantidad)
Referencias Cruzadas: Caso de uso registrar venta
Precondiciones: Venta finalizada.
Post Condiciones:
1) Venta. Liquidada pasó a ser verdadero
19
Contrato C05: verificar Stock
Operación: verificar Stock (artículos)
Referencias Cruzadas: Caso de uso Verificar el Stock
Precondiciones: Venta finalizada.
Post Condiciones:
1) Si la cantidad de artículos es menor que el Stock estipulado, Stock. Nivel
toma el valor de bajo
Contratos del caso de uso Controlar el Stock
Contrato C06: Obtener venta registrada
Operación: Actualizar Inventario ()
Referencias cruzadas: Controlar el stock.
Precondiciones: Se registró una venta.
Post condiciones:
1) Instancia de Venta se asoció con el stock momentáneamente.
Contrato C07: Actualizar el stock del articulo
Operación: Actualizar Stock Articulo ()
Referencias cruzadas: Controlar el stock.
Precondiciones: Se está actualizando el inventario.
Post condiciones:
1) Se actualizo el atributo de
Cantidad en el artículo.
Contrato C08: Monitorear mínimo de stock del articulo
Operación: Monitorear Stock ()
Referencias cruzadas: Controlar el stock.
Precondiciones: Se actualizo la cantidad de un artículo.
20
Post condiciones:
1) Se manda una notificación.
Clases conceptuales:
1.- Cliente
2.- Articulo
3.- Vendedor
4.- Registro
5.- Sucursal
6.- Venta
7.- Línea de venta
8.- Descripción del artículo
9.- Pago
10.- Almacén
11.- Centro de distribución
Diagramas de Clases del Dominio
Figura 4. Diagrama de clases del dominio
MODELO DE DISEÑO
DIAGRAMAS DE COLABORACION
Los diagramas de colaboración ilustran las interacciones entre objetos en un
formato de grafo o red, en el cual los objetos se pueden colocar en cualquier
lugar del diagrama.
CU3 Registrar Ventas:
Crear Nueva Venta ():
Figura 5. Diagrama de colaboración crear nueva venta.
La Figura 5 muestra el diagrama de colaboración que se lee como sigue:
1.- Se envía un mensaje a Crea Nueva Venta al creador registro, no se
21
identifica el emisor.
2.- El creador Registro mediante un créate realiza una instancia de Venta.
Justificación de patrones:
Creador: al ser Registro un objeto contenedor de Ventas se le asigna la
responsabilidad de crear instancias de esta.
Figura 9: Diagrama de Colaboración Ingresar Articulo
Figura 9: Diagrama de Colaboración Ingresar Articulo
Figura 9: Diagrama de Colaboración Ingresar Articulo
introducir Articulo ():
Figura 6. Diagrama de colaboración introducir artículo.
La Figura 6 muestra el diagrama de colaboración que se lee como sigue:
1.- Se envía el mensaje introducir Articulo a una instancia de Registro No se
identifica el emisor.
2.- La instancia de Registro delega la responsabilidad a Venta mediante el
mensaje introducir Articulo.
3.- Venta utiliza el objeto global Catalogo Artículos para obtener y guardar una
descripción en su variable des, mediante el mensaje “getDescripcion”.
4.- Catalogo manda un mensaje para buscar en su colección de Descripción
Articulo, para satisfacer el mensaje recibido.
5.- Venta mediante un créate realiza una instancia de Línea Venta.
6.- Venta envía un mensaje a su colección de Línea Venta para añadir una
Nueva Línea Venta mediante el mensaje addLineaVenta.
Justificación de patrones:
Controlador: Al ser Registro la clase que controla los eventos de este caso de
uso, es este el que delega las responsabilidades.
Creador: Al ser Venta un objeto contenedor de Línea Venta se le asigna la
responsabilidad de crear instancias de esta.
22
Singleton: Al ser Catalogo Artículos una fuente de solo consulta, y será
consultada desde varias partes, se optó por hacer una instancia global.
Experto en información: Al tener Catalogo toda la información para responder a
la petición de descripción Articulo a ella se le delega la responsabilidad.
Finalizar venta ():
Figura 7. Diagrama de colaboración Finalizar Venta.
La Figura 7 muestra el diagrama de colaboración que se lee como sigue:
1.- Se envía el mensaje finalizar Venta a una instancia de Registro No se
identifica el emisor.
2.- La instancia de Registro delega la responsabilidad de calcular el resultado a
Venta mediante el mensaje getTotal.
3.- Venta utiliza su colección de Línea Venta mediante el mensaje getSubTotal
para satisfacer su responsabilidad.
4.- Línea Venta obtiene el precio de su descripción mediante el mensaje
getPrecio.
5.-LineaVenta obtiene el descuento de su descripción mediante el mensaje
getDescuento.
Justificación de patrones:
Controlador: Al ser Registro la clase que controla los eventos de este caso de
uso, es este el que delega las responsabilidades.
Experto en información: Al tener Venta y LineaVenta toda la información para
responder a la petición de sus mensajes a ellas se les delega la
responsabilidad.
Realizar pagó ():
Figura 8. Diagrama de colaboración Realizar Pago.
La Figura 8 muestra el diagrama de colaboración que se lee como sigue:
1.- Se envía el mensaje realizar Pagó a una instancia de Registro No se
identifica el emisor.
2.- La instancia de Registro delega la responsabilidad Venta mediante el
23
mensaje realizar Pagó.
3.- Venta crea una instancia de Pago mediante el mensaje créate.
Justificación de patrones:
Controlador: Al ser Registro la clase que controla los eventos de este caso de
uso, es este el que delega las responsabilidades.
Creador: Al ser Venta la clase contenedora de pago,
A ella se le da la responsabilidad de crear instancias de esta.
DIAGRAMAS DE COLABORACION PARA FLUJOS ALTERNATIVOS
Eliminar Articulo ()
Figura 10. Diagrama de colaboración Eliminar Articulo.
La Figura 10 muestra el diagrama de colaboración que se lee como sigue:
1.- Se envía el mensaje Eliminar Articulo a una instancia de Registro No se
identifica el emisor.
2.- La instancia de Registro delega la responsabilidad Venta mediante el
mensaje Eliminar Articulo.
3.- Venta busca en su colección de Línea Venta el artículo.
4.- La misma colección Línea Venta remueve el artículo.
Justificación de patrones:
Controlador: Al ser Registro la clase que controla los eventos de este caso de
uso, es este el que delega las responsabilidades.
Experto en información: Venta es la única con la información para poder
eliminar un la línea de venta.
CU10: Monitorear el Stock
Actualizar Inventario ():
Figura 9. Diagrama de colaboración Actualizar Inventario.
La Figura 9 muestra el diagrama de colaboración que se lee como sigue:
24
1.- Se envía el mensaje actualizar Inventario a una instancia de Sucursal No se
identifica el emisor.
2.- La instancia de Sucursal delega la responsabilidad a Venta de obtener la
lista de Línea Venta mediante getListLineaVenta.
3.- Venta utiliza Buscar para recorrer su colección de LineaVenta.
4.- Por cada línea Venta en la lista se manda a actualizar Inventario al
Almacén.
5.- Almacén busca mediante la línea de venta el stock de ese artículo en su
colección de Stock.
6.- Almacén manda actualizara Stock mediante ese mensaje con la línea de
venta.
7.- después de los cambios Almacén se Actualiza así mismo.
Justificación de patrones:
Controlador: Sucursal y Almacén delegan responsabilidades.
Singleton: Al ser Almacén una fuente de consulta, y el controlador de
persistencia que será usado en varias partes se optó por hacer una instancia
global.
Experto en información: Al tener venta la lista de Línea Venta se le delega la
responsabilidad de obtenerla.
Actualizar Stock ():
Figura 10. Diagrama de colaboración Actualizar el Stock.
La Figura 10 muestra el diagrama de colaboración que se lee como sigue:
1.- Se envía el mensaje actualizar Stock a una
Instancia de Stock desde Almacén.
2.- Stock obtiene a que artículo se refiere recorriendo la lista mediante el
getArticulosIterator.
3.- Stock remueve o quita el Artículo.
Justificación de patrones:
Controlador: Al ser Almacén la clase que controla los eventos de este caso de
25
uso, es este el que delega las responsabilidades.
Experto en información: Al tener Stock la lista de artículos se le delega la
responsabilidad de actualizarla.
Monitorear Stock ():
Figura 11. Diagrama de colaboración Monitorear el Stock.
La Figura 11 muestra el diagrama de colaboración que se lee como sigue:
1.- Se envía el mensaje Monitorear Stock a una instancia de Stock desde
Almacén.
2.- Stock obtiene su mínimo y su actual, de pendiendo del resultado de la
condición lanza un aviso.
Justificación de patrones:
Experto en información: Stock es el único capaz de saber el Stock mínimo que
permiten los artículos.
PATRONES:
Es una descripción de problema y la solución que se le puede aplicar a nuevos
contextos; idealmente, proporciona consejos sobre el modo de aplicarlo en
varias circunstancias y considerarlos puntos fuertes y compromisos.
A continuación se describe cada uno de los patrones que fueron utilizados.
Creador:
Asignar a la clase B la responsabilidad de crear una instancia de la clase A si
se cumple uno o más de los casos siguientes:
* B agrega objetos de A
* B contiene objetos de A
* B registra instancias de objetos de A
* B tiene los datos de inicialización que se pasarán a un objeto de A cuando
26
sea creado (por tanto, B es un Experto con respecto a la creación de A)
B es un creador de los objetos de la clase A.
Experto en Información:
Asignar una responsabilidad a la clase que tiene la información necesaria para
realizar la responsabilidad
Controlador:
Asignar la responsabilidad de recibir o manejar un evento del sistema a una
clase que representa una de las siguientes opciones:
* Representa el sistema global (controlador de fachada).
* Representa la empresa u organización global (controlador de fachada).
* Algo en el mundo real que es activo (ejemplo el rol de una persona) y que
pueda participar en la tarea
(Controlador de tareas).
* Un manejador artificial de todos los eventos del sistema de un caso de uso
(controlador de caso de uso).
Utilice la misma clase controlador con todos los eventos del sistema en el
mismo caso de uso.
Singleton:
Consiste en crear una instancia de visibilidad global, es muy poco usado.
Diagrama de clases de diseño
MODELO DE IMPLEMENTACION
CODIGO FUENTE
Loggin
import clases.Vendedor;
27
import java.awt.Frame;
import java.util.*;
import java.io.File;
import com.db4o.Db4o;
import com.db4o.ObjectContainer;
import com.db4o.ObjectSet;
import javax.swing.JOptionPane;
public class logging extends javax.swing.JDialog {
public logging(java.awt.Frame parent, boolean modal) {
super(parent, modal);
initComponents();
}
@SuppressWarnings("unchecked")
private void initComponents() {
lblUsuario = new javax.swing.JLabel();
password = new javax.swing.JPasswordField();
lblPassword = new javax.swing.JLabel();
txtUsuario = new javax.swing.JTextField();
btnAceptar = new javax.swing.JButton();
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOS
E);
setTitle("Llevatelo");
getContentPane().setLayout(null);
lblUsuario.setText("Usuario:");
getContentPane().add(lblUsuario);
lblUsuario.setBounds(20, 20, 70, 14);
getContentPane().add(password);
password.setBounds(110, 50, 170, 30);
lblPassword.setText("Password:");
getContentPane().add(lblPassword);
28
lblPassword.setBounds(20, 60, 80, 14);
getContentPane().add(txtUsuario);
txtUsuario.setBounds(110, 10, 170, 30);
btnAceptar.setText("Aceptar");
btnAceptar.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnAceptarActionPerformed(evt);
}
});
getContentPane().add(btnAceptar);
btnAceptar.setBounds(210, 90, 71, 23);
java.awt.Dimension screenSize =
java.awt.Toolkit.getDefaultToolkit().getScreenSize();
setBounds((screenSize.width-315)/2,
(screenSize.height-156)/2, 315, 156);
}//
private void btnAceptarActionPerformed(java.awt.event.ActionEvent evt) {
ObjectContainer db = Db4o.openFile("Llevatelo.yap");
Vendedor vend;
ObjectSet obj = db.get(new Vendedor(0, this.txtUsuario.getText().trim(),
this.password.getText().trim()));
if(obj.hasNext())
{
vend = (Vendedor)obj.next();
db.close();
this.setVisible(false);
principal princ = new principal();
princ.setTitle("Llevatelo: "+ vend.getNombre());
29
princ.setVisible(true);
}
else
{
db.close();
JOptionPane.showMessageDialog(null, "El Usuario o la contraseña son
incorrectos", "Error", JOptionPane.ERROR_MESSAGE);
password.setText("");
}
}
public static void main(String args[]) {
UI.setNimbusLookAndFeel();
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
logging dialog = new logging(new javax.swing.JFrame(), true);
dialog.addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent e) {
System.exit(0);
}
});
dialog.setVisible(true);
}
});
}
private javax.swing.JButton btnAceptar;
private javax.swing.JLabel lblPassword;
private javax.swing.JLabel lblUsuario;
private javax.swing.JPasswordField password;
private javax.swing.JTextField txtUsuario;
}
30
Principal
import clases.*;
import clases.Sucursal;
import java.awt.Frame;
import java.util.*;
import java.io.File;
import com.db4o.Db4o;
import com.db4o.ObjectContainer;
import com.db4o.ObjectSet;
public class principal extends javax.swing.JFrame {
Sucursal sucursal;
public principal() {
initComponents();
sucursal = new Sucursal();
CatalogoArticulos.CreaInstancia();
ObjectSet
obj = sucursal.getM_Almacen().db.get(CatalogoArticulos.class);
//ObjectSet obj = db.get(CatalogoArticulos.class);
CatalogoArticulos catalogo = (CatalogoArticulos)obj.next();
CatalogoArticulos.SetInstancia(catalogo);
System.out.println(CatalogoArticulos.getDescripcionArticulo(1).getNombre());
System.out.println(CatalogoArticulos.getDescripcionArticulo(1).getM_Articulos()
.size());
}
@SuppressWarnings("unchecked")
//
private void initComponents() {
jMenuBar1 = new javax.swing.JMenuBar();
31
jMenu1 = new javax.swing.JMenu();
mniSalir = new javax.swing.JMenuItem();
jMenu2 = new javax.swing.JMenu();
jMenu4 = new javax.swing.JMenu();
mniNuevaVenta = new javax.swing.JMenuItem();
jMenu3 = new javax.swing.JMenu();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setTitle("Llevatelo");
getContentPane().setLayout(null);
jMenu1.setText("Archivo");
mniSalir.setText("Salir");
mniSalir.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
mniSalirActionPerformed(evt);
}
});
jMenu1.add(mniSalir);
jMenuBar1.add(jMenu1);
jMenu2.setText("Edicion");
jMenuBar1.add(jMenu2);
jMenu4.setText("Operacion");
mniNuevaVenta.setText("Nueva Venta");
mniNuevaVenta.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
mniNuevaVentaActionPerformed(evt);
}
});
jMenu4.add(mniNuevaVenta);
jMenuBar1.add(jMenu4);
jMenu3.setText("Acerca de...");
32
jMenuBar1.add(jMenu3);
setJMenuBar(jMenuBar1);
java.awt.Dimension screenSize =
java.awt.Toolkit.getDefaultToolkit().getScreenSize();
setBounds((screenSize.width-789)/2, (screenSize.height-478)/2, 789, 478);
}//
private void mniNuevaVentaActionPerformed(java.awt.event.ActionEvent evt)
{
sucursal.iniciarTurno();
nuevaVenta obj = new nuevaVenta(new Frame(), true);
obj.setSucursal(sucursal);
obj.setRegistro(sucursal.getRegistro());
obj.setVisible(true);
}
private void mniSalirActionPerformed(java.awt.event.ActionEvent evt) {
System.exit(0);
}
public static void main(String args[]) {
UI.setNimbusLookAndFeel();
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new principal().setVisible(true);
}
});
}
private javax.swing.JMenu jMenu1;
private javax.swing.JMenu jMenu2;
private javax.swing.JMenu jMenu3;
33
private javax.swing.JMenu jMenu4;
private javax.swing.JMenuBar jMenuBar1;
private javax.swing.JMenuItem mniNuevaVenta;
private javax.swing.JMenuItem mniSalir;
}
nuevaVentana
mport clases.*;
import java.util.*;
import java.io.File;
import com.db4o.Db4o;
import com.db4o.ObjectContainer;
import com.db4o.ObjectSet;
import java.awt.Frame;
import javax.swing.JOptionPane;
public class nuevaVenta extends javax.swing.JDialog {
private Registro registro;
private Sucursal sucursal;
public nuevaVenta(java.awt.Frame parent, boolean modal) {
super(parent, modal);
initComponents();
lblTarjeta.setVisible(false);
pago = "Efectivo";
panelCliente.setVisible(false);
panelQuitar.setVisible(false);
}
public void setSucursal(Sucursal sucursal)
{
this.sucursal = sucursal;
}
34
public void setRegistro(Registro registro)
{
this.registro = registro;
registro.createNuevaVenta();
}
@SuppressWarnings("unchecked")
private void initComponents() {
lblArticulo = new javax.swing.JLabel();
lblCantidad = new javax.swing.JLabel();
lblFolio = new javax.swing.JLabel();
txtPago = new javax.swing.JTextField();
btnAgregar = new javax.swing.JButton();
jScrollPane1 = new javax.swing.JScrollPane();
tableLV = new javax.swing.JTable();
lblImporte = new javax.swing.JLabel();
lblPago = new javax.swing.JLabel();
txtArticulo = new javax.swing.JTextField();
txtCantidad = new javax.swing.JTextField();
txtNserie = new javax.swing.JTextField();
txtImporte = new javax.swing.JTextField();
btnFinalizar = new javax.swing.JButton();
btnPagar = new javax.swing.JButton();
jLabel1 = new javax.swing.JLabel();
txtPagoTarjeta = new javax.swing.JTextField();
cmboPago = new javax.swing.JComboBox();
jLabel2 = new javax.swing.JLabel();
lblTarjeta = new javax.swing.JLabel();
btnClienteLeal = new javax.swing.JButton();
panelCliente = new javax.swing.JPanel();
jLabel3 = new javax.swing.JLabel();
35
txtCliente = new javax.swing.JTextField();
jLabel4 = new javax.swing.JLabel();
txtMembrecia = new javax.swing.JPasswordField();
btnAceptar = new javax.swing.JButton();
btnCancelar = new javax.swing.JButton();
panelQuitar = new javax.swing.JPanel();
btnEliminar = new javax.swing.JButton();
btnCancelarQuitar = new javax.swing.JButton();
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOS
E);
setTitle("Llevatelo");
getContentPane().setLayout(null);
lblArticulo.setText("Articulo:");
getContentPane().add(lblArticulo);
lblArticulo.setBounds(190, 20, 70, 14);
lblCantidad.setText("Cantidad:");
getContentPane().add(lblCantidad);
lblCantidad.setBounds(370, 20, 80, 14);
lblFolio.setText("N.Serie:");
getContentPane().add(lblFolio);
lblFolio.setBounds(10, 20, 60, 14);
txtPago.setEditable(false);
txtPago.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
txtPagoActionPerformed(evt);
}
});
getContentPane().add(txtPago);
txtPago.setBounds(640, 40, 110, 30);
36
btnAgregar.setText("Agregar");
btnAgregar.addActionListener(new java.awt.event.ActionListener()
{
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnAgregarActionPerformed(evt);
}
});
getContentPane().add(btnAgregar);
btnAgregar.setBounds(570, 10, 90, 23);
tableLV.setModel(new javax.swing.table.DefaultTableModel(
new Object [][] {
},
new String [] {
"idArticulo", "N. Serie", "Articulo", "Precio U.", "Cantidad",
"Descuento", "Subtotal"
}
) {
boolean[] canEdit = new boolean [] {
false, false, false, false, false, false, false
};
public boolean isCellEditable(int rowIndex, int columnIndex) {
return canEdit [columnIndex];
}
});
tableLV.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
tableLVMouseClicked(evt);
}
});
jScrollPane1.setViewportView(tableLV);
37
getContentPane().add(jScrollPane1);
jScrollPane1.setBounds(20, 90, 740, 200);
lblImporte.setText("Importe:");
getContentPane().add(lblImporte);
lblImporte.setBounds(250, 320, 90, 14);
lblPago.setText("Pago:");
getContentPane().add(lblPago);
lblPago.setBounds(610, 320, 50, 14);
getContentPane().add(txtArticulo);
txtArticulo.setBounds(240, 10, 110, 30);
getContentPane().add(txtCantidad);
txtCantidad.setBounds(420, 10, 110, 30);
getContentPane().add(txtNserie);
txtNserie.setBounds(60, 10, 110, 30);
txtImporte.setEditable(false);
getContentPane().add(txtImporte);
txtImporte.setBounds(300, 310, 110, 30);
btnFinalizar.setText("Finalizar");
btnFinalizar.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnFinalizarActionPerformed(evt);
}
});
getContentPane().add(btnFinalizar);
btnFinalizar.setBounds(670, 10, 90, 23);
btnPagar.setText("Pagar");
btnPagar.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnPagarActionPerformed(evt);
}
38
});
getContentPane().add(btnPagar);
btnPagar.setBounds(670, 350, 90, 23);
jLabel1.setText("Descuento:");
getContentPane().add(jLabel1);
jLabel1.setBounds(580, 50, 70, 14);
getContentPane().add(txtPagoTarjeta);
txtPagoTarjeta.setBounds(650, 310, 110, 30);
cmboPago.setModel(new javax.swing.DefaultComboBoxModel(new
String[] { "Efectivo", "Tarjeta" }));
cmboPago.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
cmboPagoActionPerformed(evt);
}
});
getContentPane().add(cmboPago);
cmboPago.setBounds(470, 310, 110, 30);
jLabel2.setText("Pago:");
getContentPane().add(jLabel2);
jLabel2.setBounds(420, 320, 60, 14);
lblTarjeta.setText("N. Tarjeta:");
getContentPane().add(lblTarjeta);
lblTarjeta.setBounds(590, 320, 80, 14);
btnClienteLeal.setText("Cliente Leal");
btnClienteLeal.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnClienteLealActionPerformed(evt);
}
});
getContentPane().add(btnClienteLeal);
btnClienteLeal.setBounds(130, 310, 100, 23);
39
panelCliente.setLayout(null);
jLabel3.setText("Cliente:");
panelCliente.add(jLabel3);
jLabel3.setBounds(10, 10, 70, 14);
panelCliente.add(txtCliente);
txtCliente.setBounds(70, 0, 90, 30);
jLabel4.setText("Membrecia:");
panelCliente.add(jLabel4);
jLabel4.setBounds(180, 10, 70, 14);
panelCliente.add(txtMembrecia);
txtMembrecia.setBounds(260, 0, 120, 30);
btnAceptar.setText("Aceptar");
btnAceptar.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent
evt) {
btnAceptarActionPerformed(evt);
}
});
panelCliente.add(btnAceptar);
btnAceptar.setBounds(403, 10, 100, 23);
getContentPane().add(panelCliente);
panelCliente.setBounds(20, 340, 520, 40);
btnCancelar.setText("Cancelar");
btnCancelar.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnCancelarActionPerformed(evt);
}
});
getContentPane().add(btnCancelar);
btnCancelar.setBounds(553, 350, 110, 23);
40
panelQuitar.setLayout(null);
btnEliminar.setText("Eliminar");
btnEliminar.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnEliminarActionPerformed(evt);
}
});
panelQuitar.add(btnEliminar);
btnEliminar.setBounds(140, 0, 100, 23);
btnCancelarQuitar.setText("Cancelar");
btnCancelarQuitar.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnCancelarQuitarActionPerformed(evt);
}
});
panelQuitar.add(btnCancelarQuitar);
btnCancelarQuitar.setBounds(10, 0, 100, 23);
getContentPane().add(panelQuitar);
panelQuitar.setBounds(10, 50, 260, 30);
java.awt.Dimension screenSize =
java.awt.Toolkit.getDefaultToolkit().getScreenSize();
setBounds((screenSize.width-789)/2, (screenSize.height-434)/2, 789, 434);
}//
private void btnAgregarActionPerformed(java.awt.event.ActionEvent evt) {
int filas = tableLV.getRowCount();
if(txtArticulo.getText().equals("") || txtCantidad.getText().equals(""))
JOptionPane.showMessageDialog(null, "Los campos Articulo y Cantidad son
obligatorios, Gracias", "Error", JOptionPane.ERROR_MESSAGE);
else
41
if(registro.VerificarID(Integer.parseInt(txtArticulo.getText())))
{
if(registro.VerificarStock(Integer.parseInt(txtArticulo.getText()),
Integer.parseInt(txtCantidad.getText())))
{
if(txtNserie.getText().equals(""))
{
registro.introducirArticulo(Integer.parseInt(txtCantidad.getText()),
Integer.parseInt(txtArticulo.getText()),0);
String []encabezado = {"IdArticulo", "N.Serie", "Articulo", "Precio U.", "Cantidad",
"Descuento", "Subtotal"};
tableLV.setModel(new javax.swing.table.DefaultTableModel(
new Object [filas+1][encabezado.length] , encabezado ));
Listlv = registro.getM_Venta().getM_LineaVenta();
String precio = lv.get(lv.size()-1).getDesc().getPrecio()+"";
int descuento = lv.get(lv.size()-1).getDesc().getDescuento();
String subtotal = lv.get(lv.size()-1).getSubTotal()+"";
System.out.println();
tick = new Ticket(this.txtArticulo.getText().trim(),
this.txtNserie.getText().trim(), lv.get(lv.size()-1).getDesc().getNombre(), precio,
this.txtCantidad.getText().trim(), descuento, subtotal);
vec.add(tick);
Iterator it = vec.iterator();
for(int i = 0; it.hasNext(); i++)
{
tick = (Ticket)it.next();
this.tableLV.setValueAt(tick.getIdArticulo(), i, 0);
this.tableLV.setValueAt(tick.getNserie(), i, 1);
this.tableLV.setValueAt(tick.getArticulo(), i, 2);
this.tableLV.setValueAt(tick.getPrecioU(), i, 3);
42
this.tableLV.setValueAt(tick.getCantidad(), i, 4);
this.tableLV.setValueAt(tick.getDescuento(), i, 5);
this.tableLV.setValueAt(tick.getSubTotal(), i, 6);
}
txtArticulo.setText("");
txtCantidad.setText("");
txtNserie.setText("");
}else
{
JOptionPane.showMessageDialog(null, "Este articulo no necesita
Numero
de serie", "Error", JOptionPane.ERROR_MESSAGE);
}
}else
{
JOptionPane.showMessageDialog(null, "La cantidad pedida es
mayor al Stock actual", "Error", JOptionPane.ERROR_MESSAGE);
}
}else
{
if(txtNserie.getText().equals(""))
JOptionPane.showMessageDialog(null, "Este articulo necesita
numero de serie", "Error", JOptionPane.ERROR_MESSAGE);
else
if(registro.VerificarExistencia(Integer.parseInt(txtArticulo.getText()),
Long.parseLong(txtNserie.getText())))
{
if(Integer.parseInt(txtCantidad.getText()) == 1)
{
43
registro.introducirArticulo(Integer.parseInt(txtCantidad.getText()),
Integer.parseInt(txtArticulo.getText()),Integer.parseInt(txtNserie.getText()));
String []encabezado = {"IdArticulo", "N.Serie", "Articulo", "Precio U.", "Cantidad",
"Descuento", "Subtotal"};
tableLV.setModel(new javax.swing.table.DefaultTableModel(
new Object [filas+1][encabezado.length] , encabezado ));
Listlv = registro.getM_Venta().getM_LineaVenta();
String precio = lv.get(lv.size()-1).getDesc().getPrecio()+"";
int descuento = lv.get(lv.size()-1).getDesc().getDescuento();
String subtotal = lv.get(lv.size()-1).getSubTotal()+"";
System.out.println();
tick = new Ticket(this.txtArticulo.getText().trim(),
this.txtNserie.getText().trim(), lv.get(lv.size()-1).getDesc().getNombre(), precio,
this.txtCantidad.getText().trim(), descuento, subtotal);
vec.add(tick);
Iterator it = vec.iterator();
for(int i = 0; it.hasNext(); i++)
{
tick = (Ticket)it.next();
this.tableLV.setValueAt(tick.getIdArticulo(), i, 0);
this.tableLV.setValueAt(tick.getNserie(), i, 1);
this.tableLV.setValueAt(tick.getArticulo(), i, 2);
this.tableLV.setValueAt(tick.getPrecioU(),
i, 3);
this.tableLV.setValueAt(tick.getCantidad(), i, 4);
this.tableLV.setValueAt(tick.getDescuento(), i, 5);
this.tableLV.setValueAt(tick.getSubTotal(), i, 6);
}
txtArticulo.setText("");
44
txtCantidad.setText("");
txtNserie.setText("");
}else
{
JOptionPane.showMessageDialog(null, "Con Numero de serie la
cantidad debe ser de : 1", "Error", JOptionPane.ERROR_MESSAGE);
}
}else
{
JOptionPane.showMessageDialog(null, "Ese numero de serie no
existe", "Error", JOptionPane.ERROR_MESSAGE);
}
}
}
private void btnFinalizarActionPerformed(java.awt.event.ActionEvent evt) {
finalizo = true;
btnAgregar.setVisible(false);
txtImporte.setText(registro.finalizarVenta()+"");
}
private void btnPagarActionPerformed(java.awt.event.ActionEvent evt) {
Almacen al;
al = Almacen.crearInstancia();
if(pago.equals("Tarjeta"))
{
Banco banc;
ObjectSet obj = al.db.get(Banco.class);
while(obj.hasNext())
{
45
banc = (Banco)obj.next();
if(banc.getTarjeta().equals(this.txtPagoTarjeta.getText()))
{
String nombre = banc.getCliente();
String tarjeta = banc.getTarjeta();
double saldo = banc.getSaldo();
if(Double.parseDouble(this.txtImporte.getText()) = 0)
{
JOptionPane.showMessageDialog(null, "Su cambio es de "+dif,"
Pesos", JOptionPane.INFORMATION_MESSAGE);
registro.realizarPago(Double.parseDouble(this.txtImporte.getText()),Double.par
seDouble(this.txtPagoTarjeta.getText()),"Efectivo");
List pedir = sucursal.actualizarInventario(registro.getM_Venta());
if(pedir.size() != 0)
{
LineaVenta lv;
Iterator i = pedir.iterator();
while(i.hasNext())
{
lv = (LineaVenta)i.next();
JOptionPane.showMessageDialog(null, "El articulo: "+
lv.getDesc().getNombre()+" se encuentra al minimo de inventario, pedirmas.",
"Aviso", JOptionPane.INFORMATION_MESSAGE);
}
pedir.clear();
sucursal.setPedir(pedir);
}
dispose();
}
46
else
JOptionPane.showMessageDialog(null, "Lo sentimos, el pago es
menor al importe", "no se puede realizar el pago",
JOptionPane.INFORMATION_MESSAGE);
}
}
private void cmboPagoActionPerformed(java.awt.event.ActionEvent evt) {
pago = this.cmboPago.getSelectedItem()+"";
if(pago.equals("Efectivo"))
{
lblTarjeta.setVisible(false);
lblPago.setVisible(true);
}
else
{
lblTarjeta.setVisible(true);
lblPago.setVisible(false);
}
}
private void txtPagoActionPerformed(java.awt.event.ActionEvent evt) {
}
private void btnClienteLealActionPerformed(java.awt.event.ActionEvent evt) {
panelCliente.setVisible(true);
}
private void btnAceptarActionPerformed(java.awt.event.ActionEvent evt) {
Almacen al;
al = Almacen.crearInstancia();
47
Cliente c = null;
boolean cliente = false;
ObjectSet obj = al.db.get(Cliente.class);
for(int i = 0; obj.hasNext();)
{
c = (Cliente)obj.next();
if(c.getNombre().equals(this.txtCliente.getText().trim()))
if(c.getId_cliente() ==
Integer.parseInt(this.txtMembrecia.getText().trim()))
cliente = true;
}
if(cliente == false)
JOptionPane.showMessageDialog(null, "Cliente no registrado", "Error",
JOptionPane.ERROR_MESSAGE);
else
{
JOptionPane.showMessageDialog(null, "Cliente Correcto", "Gracias por
su preferencia", JOptionPane.INFORMATION_MESSAGE);
this.txtPago.setText("10%");
double nuevoImporte = Double.parseDouble(txtImporte.getText()) -
(Double.parseDouble(txtImporte.getText())*.1);
txtImporte.setText(nuevoImporte+"");
}
}
private void btnCancelarActionPerformed(java.awt.event.ActionEvent evt) {
dispose();
}
private void tableLVMouseClicked(java.awt.event.MouseEvent evt) {
48
if(finalizo == false)
{
int row = tableLV.getSelectedRow();
txtNserie.setText(tableLV.getValueAt(row, 1)+"");
txtArticulo.setText(tableLV.getValueAt(row, 0)+"");
txtCantidad.setText(tableLV.getValueAt(row, 4)+"");
btnAgregar.setVisible(false);
btnFinalizar.setVisible(false);
panelQuitar.setVisible(true);
txtNserie.setEditable(false);
txtArticulo.setEditable(false);
txtCantidad.setEditable(false);
}
}
private void btnCancelarQuitarActionPerformed(java.awt.event.ActionEvent
evt) {
txtNserie.setText("");
txtArticulo.setText("");
txtCantidad.setText("");
txtNserie.setEditable(true);
txtArticulo.setEditable(true);
txtCantidad.setEditable(true);
panelQuitar.setVisible(false);
btnAgregar.setVisible(true);
btnFinalizar.setVisible(true);
}
private void btnEliminarActionPerformed(java.awt.event.ActionEvent evt) {
int filas = tableLV.getRowCount();
String
49
[]encabezado = {"IdArticulo", "N.Serie", "Articulo", "Precio U.", "Cantidad",
"Descuento", "Subtotal"};
tableLV.setModel(new javax.swing.table.DefaultTableModel(
new Object [filas-1][encabezado.length] , encabezado ));
Iterator it = vec.iterator();
int tem=0;
for(int i = 0; it.hasNext(); i++)
{
tick = (Ticket)it.next();
if(tick.getIdArticulo().equals(txtArticulo.getText().trim()))
{
tem = i;
}
}
vec.remove(tem);
registro.EliminarArticulo(tem);
it = vec.iterator();
for(int i = 0; it.hasNext(); i++)
{
tick = (Ticket)it.next();
this.tableLV.setValueAt(tick.getIdArticulo(), i, 0);
this.tableLV.setValueAt(tick.getNserie(), i, 1);
this.tableLV.setValueAt(tick.getArticulo(), i, 2);
this.tableLV.setValueAt(tick.getPrecioU(), i, 3);
this.tableLV.setValueAt(tick.getCantidad(), i, 4);
this.tableLV.setValueAt(tick.getDescuento(), i, 5);
this.tableLV.setValueAt(tick.getSubTotal(), i, 6);
}
btnAgregar.setVisible(true);
btnFinalizar.setVisible(true);
panelQuitar.setVisible(false);
50
txtArticulo.setText("");
txtCantidad.setText("");
txtNserie.setText("");
}
public static void main(String args[]) {
UI.setNimbusLookAndFeel();
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
nuevaVenta dialog = new nuevaVenta(new javax.swing.JFrame(),
true);
dialog.addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent e) {
System.exit(0);
}
});
dialog.setVisible(true);
}
});
}
private javax.swing.JButton btnAceptar;
private javax.swing.JButton btnAgregar;
private javax.swing.JButton btnCancelar;
private javax.swing.JButton btnCancelarQuitar;
private javax.swing.JButton btnClienteLeal;
private javax.swing.JButton btnEliminar;
private javax.swing.JButton btnFinalizar;
private javax.swing.JButton btnPagar;
private javax.swing.JComboBox cmboPago;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
51
private javax.swing.JLabel jLabel3;
private javax.swing.JLabel jLabel4;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JLabel lblArticulo;
private javax.swing.JLabel lblCantidad;
private javax.swing.JLabel lblFolio;
private javax.swing.JLabel lblImporte;
private javax.swing.JLabel lblPago;
private javax.swing.JLabel lblTarjeta;
private javax.swing.JPanel panelCliente;
private javax.swing.JPanel panelQuitar;
private javax.swing.JTable tableLV;
private javax.swing.JTextField txtArticulo;
private javax.swing.JTextField txtCantidad;
private javax.swing.JTextField txtCliente;
private javax.swing.JTextField txtImporte;
private javax.swing.JPasswordField txtMembrecia;
private javax.swing.JTextField txtNserie;
private javax.swing.JTextField txtPago;
private javax.swing.JTextField txtPagoTarjeta;
private Registro reg;
private Sucursal suc;
private String pago;
Vector vec = new Vector();
Ticket tick;
DescripcionArticulo desc;
boolean finalizo = false;
}
Almacen
package clases;
52
import java.util.*;
import com.db4o.Db4o;
import com.db4o.ObjectContainer;
import com.db4o.ObjectSet;
import com.db4o.config.Configuration;
import com.db4o.internal.Config4Impl;
public class Almacen {
private List m_Stock;
private Pedidos m_Pedidos;
private Stock nuevo;
public ObjectContainer db;
private static Almacen almacen;
private Almacen()
{
m_Stock = new LinkedList();
ConnectDB();
}
public static Almacen crearInstancia()
{
if(almacen == null)
almacen = new Almacen();
return almacen;
}
public void ConnectDB()
{
Configuration ci = Db4o.newConfiguration();
ci.activationDepth(20);
ci.updateDepth(20);
db = Db4o.openFile(ci,"Llevatelo.yap");
53
}
public void updateAlmacen(Stock nuevo)
{
db.set(nuevo);
CatalogoArticulos a = CatalogoArticulos.CreaInstancia();
db.set(a);
db.commit();
}
public void llenarAlmacen()
{
ObjectSet obj = db.get(Stock.class);
while(obj.hasNext())
{
m_Stock.add((Stock)obj.next());
}
}
public boolean actualizarInventario(LineaVenta lineaVenta)
{
Stock obj = buscarStock(lineaVenta);
nuevo = obj.actualizarStock(lineaVenta);
updateAlmacen(nuevo);
if(obj.monitorearMinimo())
return true;
return false;
}
private Stock buscarStock(LineaVenta lineaVenta)
{
Stock obj;
int id_articulo = lineaVenta.getDesc().getId_articulo();
Iterator i = m_Stock.iterator();
while(i.hasNext())
54
{
obj = (Stock)i.next();
if(obj.getId_stock() == id_articulo)
{
return obj;
}
}
return null;
}
public boolean VerificarID(int idArticulo)
{
Articulo art;
CatalogoArticulos cat;
cat = CatalogoArticulos.CreaInstancia();
DescripcionArticulo desc = new DescripcionArticulo();
desc = cat.getDescripcionArticulo(idArticulo);
if(desc.getM_Articulos() == null)
return true;
return false;
}
public boolean VerificarExistencia(int idArticulo,long numeroSerie)
{
CatalogoArticulos cat;
cat = CatalogoArticulos.CreaInstancia();
DescripcionArticulo desc = new DescripcionArticulo();
desc = cat.getDescripcionArticulo(idArticulo);
Iterator i = desc.getM_Articulos().iterator();
Articulo art;
while(i.hasNext())
{
55
art = (Articulo)i.next();
if(art.getNumeroSerie() == numeroSerie)
return true;
}
return false;
}
public boolean VerificarStock(int idArticulo,int cantidad)
{
Stock obj;
Iterator i = m_Stock.iterator();
while(i.hasNext())
{
obj = (Stock)i.next();
if(obj.getId_stock() == idArticulo)
{
if(obj.getActual() >= cantidad)
return true;
}else
return false;
}
return false;
}
public void setM_Stock(List m_Stock) {
this.m_Stock = m_Stock;
}
}
Articulo
package clases;
public class Articulo {
56
private long numeroSerie;
public Articulo(){
this.numeroSerie = 0;
}
public Articulo(long numeroSerie){
this.numeroSerie = numeroSerie;
}
public long getNumeroSerie() {
return numeroSerie;
}
public void setNumeroSerie(long numeroSerie) {
this.numeroSerie = numeroSerie;
}
}
CatalogoArticulos
package clases;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Vector;
public class CatalogoArticulos {
public Vector m_DescripcionArticulo;
static CatalogoArticulos cat;
public static CatalogoArticulos CreaInstancia()
{
if(cat == null)
cat = new CatalogoArticulos();
return cat;
}
57
public static void SetInstancia(CatalogoArticulos s)
{
cat = s;
}
private CatalogoArticulos(){
m_DescripcionArticulo = new Vector();
}
public int getSizeVector()
{
return m_DescripcionArticulo.size();
}
public void addDescripcionArticulo(DescripcionArticulo desc)
{
m_DescripcionArticulo.add(desc);
}
public static DescripcionArticulo getDescripcionArticulo(int id_articulo){ //
TODO: static
CreaInstancia();
Iterator it = cat.m_DescripcionArticulo.iterator();
DescripcionArticulo desc;
while(it.hasNext())
{
desc = (DescripcionArticulo)it.next();
if(desc.getId_articulo()
== id_articulo)
return desc;
}
return null;
}
}
58
Cliente
package clases;
public class Cliente {
private int id_cliente;
private String nombre;
private String apellidos;
private String telefono;
private String direccion;
@Override
public String toString() {
return "Cliente{" + "id_cliente=" + id_cliente + ", nombre=" + nombre + ",
apellidos=" + apellidos + ", telefono=" + telefono + ", direccion=" + direccion+ '}';
}
public String getApellidos() {
return apellidos;
}
public void setApellidos(String apellidos) {
this.apellidos = apellidos;
}
public String getDireccion() {
return direccion;
}
public void setDireccion(String direccion) {
this.direccion = direccion;
}
public int getId_cliente() {
return id_cliente;
}
public void setId_cliente(int id_cliente) {
59
this.id_cliente = id_cliente;
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public String getTelefono() {
return telefono;
}
public void setTelefono(String telefono) {
this.telefono = telefono;
}
public Cliente(int id_cliente, String nombre, String apellidos, String telefono,
String direccion) {
this.id_cliente = id_cliente;
this.nombre = nombre;
this.apellidos = apellidos;
this.telefono = telefono;
this.direccion = direccion;
}
public Cliente(){
}
public void finalize() throws Throwable {
}
}
DescripcionArticulo
package clases;
60
import java.util.LinkedList;
import java.util.List;
public class DescripcionArticulo {
@Override
public String toString() {
return "DescripcionArticulo{" + "id_articulo=" + id_articulo + ", nombre=" +
nombre + ", descripcion=" + descripcion + ", descuento=" + descuento + ",
precio=" + precio + '}';
}
private int id_articulo;
private String nombre;
private String descripcion;
private int descuento;
private double precio;
private List m_Articulos;
public DescripcionArticulo(int id_articulo, String nombre, String
descripcion, int descuento, double precio)
{
this.id_articulo = id_articulo;
this.nombre = nombre;
this.descripcion = descripcion;
this.descuento = descuento;
this.precio = precio;
this.m_Articulos = new LinkedList();
}
public int getId_articulo() {
return id_articulo;
}
public String getNombre() {
61
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public String getDescripcion() {
return descripcion;
}
public int getDescuento() {
return descuento;
}
public void setDescuento(int descuento) {
this.descuento = descuento;
}
public void setDescripcion(String descripcion) {
this.descripcion = descripcion;
}
public double getPrecio() {
return precio;
}
public void setPrecio(double precio) {
this.precio = precio;
}
public List getM_Articulos() {
return m_Articulos;
}
public void setM_Articulos(List m_Articulos) {
this.m_Articulos = m_Articulos;
}
public DescripcionArticulo(){
}
62
public void finalize() throws Throwable {
}
}
LineaVenta
package clases;
public class LineaVenta {
private int id_lineaVenta;
private String fecha;
private String hora;
private int cantidad;
private DescripcionArticulo desc;
private int numeroSerie;
public LineaVenta(DescripcionArticulo desc, int cantidad, int numeroSerie)
{
this.desc = desc;
this.cantidad = cantidad;
this.numeroSerie = numeroSerie;
}
public double getSubTotal()
{
return (desc.getPrecio()*cantidad)-( (desc.getPrecio()*cantidad) *
(desc.getDescuento()/100.0));
}
public int getCantidad() {
return cantidad;
}
public void setCantidad(int cantidad) {
this.cantidad = cantidad;
}
63
public DescripcionArticulo getDesc() {
return desc;
}
public void setDesc(DescripcionArticulo desc) {
this.desc = desc;
}
public String getFecha() {
return fecha;
}
public void setFecha(String fecha) {
this.fecha
= fecha;
}
public String getHora() {
return hora;
}
public void setHora(String hora) {
this.hora = hora;
}
public int getId_lineaVenta() {
return id_lineaVenta;
}
public void setId_lineaVenta(int id_lineaVenta) {
this.id_lineaVenta = id_lineaVenta;
}
public int getNumeroSerie() {
return numeroSerie;
}
}
64
Pago
package clases;
public class Pago {
private int id_pago;
private double pago;
private double importe;
private String tipo;
public int getId_pago() {
return id_pago;
}
public void setId_pago(int id_pago) {
this.id_pago = id_pago;
}
public double getImporte() {
return importe;
}
public void setImporte(double importe) {
this.importe = importe;
}
public double getPago() {
return pago;
}
public void setPago(double pago) {
this.pago = pago;
}
public String getTipo() {
return tipo;
}
public void setTipo(String tipo) {
this.tipo = tipo;
65
}
public Pago(double importe)
{
this.importe = importe;
}
public double darCambio(double pago)
{
return pago - importe;
}
public void finalize() throws Throwable {
}
}
Pedidos
package clases;
public class Pedidos {
private int id_pedido;
private String fecha;
private String CentroDeDistribucion;
private Stock[] stock;
public Pedidos(){
}
public void finalize() throws Throwable {
}
}
Registro
package clases;
public class Registro {
private int id_registro;
66
private String fecha;
private Venta m_Venta;
public Registro(){
}
public void createNuevaVenta()
{
m_Venta = new Venta();
}
public void introducirArticulo(int cantidad, int idArticulo, int numeroSerie)
{
m_Venta.introducirArticulo(cantidad, idArticulo, numeroSerie);
}
public void EliminarArticulo(int idArticulo)
{
m_Venta.EliminarArticulo(idArticulo);
}
public double finalizarVenta()
{
double total = m_Venta.getTotal();
return total;
}
public void realizarPago(double
importe,double pago,String tipo)
{
m_Venta.realizarPago(importe,pago,tipo);
}
public boolean VerificarID(int idArticulo)
{
Almacen almacen;
67
almacen = Almacen.crearInstancia();
return almacen.VerificarID(idArticulo);
}
public boolean VerificarExistencia(int idArticulo, long numeroSerie)
{
Almacen almacen;
almacen = Almacen.crearInstancia();
return almacen.VerificarExistencia(idArticulo,numeroSerie);
}
public boolean VerificarStock(int idArticulo, int cantidad)
{
Almacen almacen;
almacen = Almacen.crearInstancia();
return almacen.VerificarStock(idArticulo,cantidad);
}
public Venta getM_Venta() {
return m_Venta;
}
public void setM_Venta(Venta m_Venta) {
this.m_Venta = m_Venta;
}
}
Stock
package clases;
import java.util.Iterator;
public class Stock {
private int id_stock;
private int actual;
private int minimo;
public Stock(int id_stock, int actual, int minimo) {
68
this.id_stock = id_stock;
this.actual = actual;
this.minimo = minimo;
}
public int getId_stock() {
return id_stock;
}
public Stock(){}
public Stock actualizarStock(LineaVenta lv)
{
System.out.println(actual);
if(lv.getNumeroSerie() != 0)
{
Articulo obj;
Iterator i = lv.getDesc().getM_Articulos().iterator();
while(i.hasNext())
{
obj = (Articulo)i.next();
System.out.println(obj.getNumeroSerie());
if(obj.getNumeroSerie() == lv.getNumeroSerie())
{
lv.getDesc().getM_Articulos().remove(obj);
this.actual = lv.getDesc().getM_Articulos().size();
break;
}
}
}else
{
this.actual -= lv.getCantidad();
}
System.out.println(actual);
69
return this;
}
public boolean monitorearMinimo()
{
70