Hola Corlo... lo terminé de probar el sábado por la mañana, pero he estaod todo el día fuera de casa...
Aquí la descarga, por si lo quieres ir probando:
https://workupload.com/file/9rRxdbcR2wv 76Kb. aprox. comprimido (incluye los ficheros de ejemplo).
Mañana me edito y pongo algunas explicaciones con capturas, hoy ya es tarde por aquí.
Te explico por encima...
Al abrir la aplicación, ahora una ventana hace de la principal, desde ella se accede a las principales características de la aplicación. También muestra un resumen de las ofertas activas a modo de recordatorio.
Se puede aprovechar para poner un logo y personalizarlo más.
El menú muestra las 4 principales ventanas a las que acceder: cuando se pulsa se abre la ventana correcpondiente.
La aplicación funcionará correctamente cuando se introduzcan artículo al almacén.
La siguiente imagen muestra el listado de los artículos en el almacén.
La columna 'stock', lleva la cuenta de la cantidad que queda de dicho artículo en el almacén, cuandos e compra, el stock se reduce en la cantidad comprada.
A la cantidad inicial que se establece como stock se le señala un porcentaje (columna umbral), tal que cuando en stock queda igual o menos de esa cantidad (columna pedido) , debería avisarse al departamento de compra-fabricación, para reponer el stock del almacén.
El menú precios tiene esa posibilidad que pedías de aumentar/reducir el precio a todos los artículos en una cantidad fija o porcentaje, pero a todos el mismo.
Desde el prpio menú, puede indicarse si se aplicará a todos o solo a los seleccionados.
Desde el menú 'Artículos' del almacén, puede crearse nuevo artículo o editar uno existente (clonar es crear uno nuevo partiendo de los datos del que actualmente tiene el foco).
También puede borrarse un artículo, pero esto solo debeiera usarse es circunstancias remotas, incluso introduciendo un artículo erróneo, puede luego ser editado, por lo que técnicamente no habría necesidad de eliminar ninguno.
Un modo de deshabilitar un artículo, por cualquier razón es poner su stock a 0, no aparecerá en los listados de compra noi oferta.
El almacén cuenta con un 'artículo vacío', que es el primero que se mostrará, para indicar al usuario que debe elegir uno de la lista.
Esta es la ventana de edición de los artículos:
En ella se establece el nombre del artículo, el precio de venta al público, el porcentaje de impuestos aplicados (se desglosa a la derecha), la cantidad en stock en el almacén y el porcentaje del mismo para su aviso (esto solo se establece cuando se crea el artículo pero también puede modificarse pulsando el checkbox), a su derecha señala la cantidad exacta mínima que una vez alcanzada o menor, debería dar aviso para el departamento de adquisiciones (compra, fabricación), también el valor en unidades, en el ejemplo siendo agua de 5 litros 5.000 cl, si es un paquete de yogures, 6, 8, si son huevos 6,12, etc... es decir la cantidad que trae lo que se compra.
Finalmente hay un aviso para señalas si el artículo está actualmente en oferta.
La sección de la derecha, no aparece cuando se crea un 'nuevo' artículo, solo al editar-clonar, por si se prefiere modificar ciertos precios en una cantidad igual a varios artículos, así se evitar la necesidad de calcular e introducir a mano el valor concreto.
Cuando se pulsa uno de los botones verde, se valida y cierra la ventana, tras lo que cual se reflejará en el lstado del almacén y en fichero.
La edición no debería utilizarse para cambiar el nombre del artículo, salvo un error tipográfico (es decir que refiera siempre al mismo artículo), de lo contrario al leer la facturación la próxima vez para el artículo con dicho código, reflejará el nuevo nombre que podría ser distinto a lo originalmente comprado. En cambio si puede modificarse el precio y descuentos, pués ambos valores son guardados a fichero cuando se compra, en tanto que para el artículo, en vez de guardar su nombre (20 caracteres), se guarda el código del artículo (2 bytes), que se rescata al leer la factura de compra.
Así se ve la ventana cuando se elige crear un nuevo artículo:
La siguiente ventana es para las 'promociones'.
Facilita crear ofertas. Establece una fecha y una duración vinculada a un nombre. Así cuando haya que crear ofertas para determinados artículos, bastará elegir la misma promoción para ellos, lo que ahorra por un lado escribir más dats y sobretodo elimina la posibilidad de errores, al poner fecha y/o duración de la oferta.
Nótese que estas se crean automáticamente al iniciar la aplicación (si no existe el fichero 'promociones...'), pero pueden ser editadas (para mantener la fecha y duración deseadas), así como poner el nombre que se considere más acorde, también pueden añadirse más promociones, que será la siguiente ventana a mostrar.
Aquí la ventana para crear una nueva promoción. No requiere más comentarios.
Aquí la ventana cuando se trata de editar la promoción. Como se ve, tampoco requiere más comentarios:
Esta, es la ventana del listado de ofertas. Como se ve, hay dos listados:
- El de ofertas activas (arriba)
- El de foertas inactivas (abajo)
Cuando se crean ofertas nuevas, van al listado de abajo (inactivas), igualmente para editar una oferta debe estar desactivada.
Las ofertas se activan o desactivan seleccionado en el listado las deseadas y yendo al menú elegir 'activar/desactivar', cada opción solo está activa en función del listado que se trate.
El objetivo de tener dos listados, es que no haya que crear nuevas ofertas ...cada vez... si no reutilizar las existentes, ya que lo que cambiará básicamente será la fecha, quizás la duración o tipos de ofertas.
Se ha diseñado 5 tipos de ofertas (aparte la inactiva), que cubre la mayoría de posibilidades. No obstante esto se explica mejor en la ventana de edición de las ofertas.
Algo importante es que no pueden activarse cualquier tipo de oferta, algunas son incompatibles con otras, las compatibles entre sí son los tipos 1,2 y 4, luego la 3 es aparte y la 5 también aparte, es decir enel listado activo de ofertas solo puede haber ofertas compatibles... el programa se encarga de hacer la revisión y señalar el caso si no es posible.
Esta e sla ventana para crear nuevas ofertas (hay dos capturas, para mostrar el listado de combos, falta un tercero, que deja la imagen demasiado ancha y que se mostrará luego):
Cada oferta se vincula a un artículo, como se ve en el combo a la derecha, debe elegirse un artículo de la lista deesplegable. La lista solo contendrá aquellos artículos cuyo stock no esté a 0.
Además cada oferta se vincula con un tipo de oferta... se han creado por defecto 5 (como son pocas y no hay posibilidad de que ese número aumente notablemente, no requiere fichero se cargan con la ventana por código).
Los tipos explicados someramente son:
0 - Inactiva: La oferta no está activa. Es lo nromal para ofertas que por ejemplo estén destinada a Navidad...
1 - Porcentural: Al artículo elegido se el aplica un porcentaje de descuento (que se indica).
2 - Sin impuestos: Como el anterior, pero el procentaje aplicado es exactamente el valor que tiene el artículo aplicado en impuestos.
3 - Sorteo: Esto no se aplica al artículo en sí, si no a toda la compra. Indica que al vencer las ofertas, se realizará un sorteo entre los que hayan comprado durante la vigencia de la oferta, 1 o más premiados se les devolverá íntegramente el valor de su compra. Se supone que podría haber una cantidad máxima, por ejemplo 500euros, si alguien hizo una compra por valor de 800 euros, solo se le devolverán 500, si el afortunado hizo una compra por valor de 63'87 euros esa es la cantidad que se le devuelve. La resolución de este tipo de oferta, no está implementada, ya que la forma de realizar el sorteo así como quienes participan y otros detalles, son demasiado amplios como para aventurar una solución que al final se vayaa descartar por completo.
4 - Gradual: El descuento aplicado es el típico '3x2', es decir esos donde dicen 'por cada x artículos que compres te regalamos 1', en el ejemplo compras 3 y pgas solo dos, ergo... e descuento es del 33'33%, lógicamente si uno compra 4, el descuento aplica a 3 de ellos luego paga 3, (el 4 no forma parte de ese descuento, precisaría comprar 6, para aplicar nuevamente ese desceunto).
5 - Abosluto: Este descuento, es por el total de la compra. Por ejemplo si se señala un valor de 50 euros, y se pone un descuento del 10%, aquellas compras cuyo valor total iguale o supere 50 euros se el aplica un 10% al total de la compra. Si compra vale menos de 50 euros, nos e aplica descuentos.
En la siguiente ventana termino de explicar el resto de la misma, pués se refiere a la edición de un registor de oferta ya creado (o clonado).
La edición de ofertas, como se ha dicho antes, solo se puede hacer desde el listaod de ofertas inactivas (ofertas que no están en vigor), para evitar trastocar ofertas que estén activas con las consecuencias de 'clientes finales con quejas'. Aún así si fuera preciso por detectarse un error, puede desactivarse, editarse y volverse a activar.
Según el tipo de oferta elegido, el porcentaje así como el valor pueden estar o no activos.
En esta última ventana se puede ver desplegado el listado de la spromociones, la oferta se vincula con una promoción (el nombre), facilita elegir la asociación para más artículos de una fecha y duración. Ambos datos pueden ser cambiados individualmente para cada oferta, pero si no es deseable puede ser modificado para que muestren su valor como solo lectura. Recuerda que las promociones pueden modificarse desde la ventana del listado de promociones.
Cuando se elige desde el combo, el artículo, se rescata del alamcén sus valores y se señala su precio.
A la derecha d ela oferta, se mantiene el valor de la oferta previa que tenía esta oferta (el tipo de oferta al estar en el listado de inactivas, permanece siempre a 0, por tanto el valor elegido se mantiene en un campo que es copia, como si fuera temporal, cuando la oferta se activa, el tipo de oferta toma el valor que se retiene en este campo de copia.
Por su parte activar o desactivar una oferta, se refleja en el alamcén que mantiene un campo que lo vincula a una oferta. Solo puede ahber una oferta activa por cada artículo, pero puede haber diferentes ofertas inactivas para un mismo artículo siempre y cuando tengan distinta promoción (por ejemplo el vino puede estar en oferta inactiva para una promoción de Navidad y tener otra oferta inactiva para una oferta de verano y tener una oferta activa para la promoción de Semana Santa, en cambio no tiene sentido que ese vino (el artículo), tenga 2 ofertas activas distintas para 'Semana Santa'... el programa también se encarga de hacer tal revisión antes de activarlas...
En la imagen del almacén, puede verse a la derecha del todo que hay 3 artículos con ofertas activas.
Básicamente eso es todo lo nuevo en la aplicación, ahora los cambos a lo que había previamente (pues ha afectado a todo, ha sido finalmente necesario modificar absolutamente todo).
Esta que antes era la ventana principal ahora tiene el nombre de facturación:
En un principio la aplicación suponía ser un ejemplo para ir aprendiendo, luego una aplicación real para mantener la propia compra de uno mismo, por lo que no hacía falta un almacén dada la inabarcable variedad de artículos que uno puede comprar, (libros, CDs, ordenador, teléfono, tablet, gasolina, manzanas, tabaco, etc...), luego en esa suposición lo pertienente era introducir manualmente el nombre del artículo comprado y el precio pagado y no mucho más... al final parece ser la aplicación real para una pequeña tienda de tipo familiar, puesto que ahora hay necesidad de hacer ofertas y tal, se hizo preciso un almacén que detalle cada artículo a la venta en sus valores esenciales (como tal, para mi sigue siendo un ejemplo del que puedas aprender).
Como se ve en la imagen, ahora la ventana de facturación se compone de dos listados... en el superior se muestran las compras únicas, y debajo se detallan los artículos asociados a una compra dada.
Cuando se pulsa en una compra (listado superior), se rescatan los registros de artículos asociados al lote de la compra. Ahora sí, cada compra mantiene el total de la compra, así como el descuento aplicaod a la compra (siempre 0, salvo esos casos de ofertas de tipo 'absoluto' (descuento al total de la compra si superan cierto volumen).
En la última compra se ha puesto exprofeso un ejemplo de ese caso, el valor debia ser superior a 50 euros para aplicar un descuento dle 10%.
A la derecha dle listado, la suma d elos totales de lo facturado.
Por suparte el listado inferior, como se ha indicado desglosa los artículos comprados en ese lote (ticket de compra).
El carrito de la compra, no tiene cambios sustanciales en la interfaz, pero sí internamente, el listado es básicamente lo mismo que el listado inferior, excepto los dos campos de códigos de la izquierda:
Como se ve, el cambio más importante (aunque aquí se muestre vacío), es el campo 'descuento' que que se actualiza (si procede) con cada artículo añadido al carrito.
El mayor cambio en esta ventana (así reseñable), en que justo antes de pagar, se vuelve de nuevo a revisar si el artículo tiene stock suficiente en el almacén para comprarlo en las cantidad requeridas... algo necesario, dado que el carrito d ela compra puede estar bastante tiempo abierto... y alguien podría haber comprado las existencias restantes. En tal caso avisa antes de proceder al pago, permite eliminar ese artículo o anular toda la compra...
Cuando se realiza el pedido (se ha validado que existen en stock las cantidades que se quierne comprar), se reduce el stock en el almacén en tales cantidades... Se ha añadido a proposito el último artículo con poca cantidad en stock, para probar que cuando se quiera comprar más d elo que hay en stock, avisa y que si llega a 0, ya no se liste (cuando esto ocurre fuerza a recargar los listados que mantienen los artículos). Estas partes no han sido probadas, creo recordar...
El carrito de la compra, se abre tanto desde la ventana de facturación como desde la misma ventana de compra, que se presenta a continuación:
Esa es la ventana de compra, como se ve, la principal diferencia respecto de la previa es que ahora el artículo no se introduce manualmente, si no que es elegible entre el listado de artículos con existencias en el almacén. Y como ya en el alamcén se reflejan sus valore,s ahí simplemente se hace constar sus valores (previo, impuestos aplicados, etc..., tampoco hubiera sobrado indicar el remanente en stock, así sabe si está tratando de comprar mas de lo que puede venderse).
Desde luego la lista se carga con todos los artículos cuya existencia sea superior a 1, ignorando los artículo cuyo stock sea 0.
Básicamente aunque la interfaz se ha simplificado al extremo (solo hay que elegir el artículo y la cantidad a comprar), el código ha requerido un cambio profundo.
Cuando se pulsa el botón añadir al carrito, verifica si la cantidad existe en stock, si no es el caso avisa para poder cambiar la cantidad... como ya dije esta comprobación se realiza de nuevo cuando se acepta pagar el lote desde el carrito de la compra.
La úlitma venta (la de elegir un fichero de facturación para abrir), a pesar de que solo tiene unas decenas de líneas también tuvo que ser ligeramente modificada, pués antes el programa solo mantenía un unico fichero (el de facturación.dat) y si procedía el caso el de 'carrito.'dat (si se cerraba la aplicación con un carrito sin procesar (comprar)), ahora el de facturación se ha desglosado en dos ficheros, el de los lotes comprados y de cada artículo comprado que se asocian con el lote comprado...
El almacén, ofertas y promociones tambié se mantienen en sus propio ficheros, al final son 6 (más el del carrito que es creado y eliminado, es decir es transitorio), entonces excepto de lote cuya extensión es *.dat', para los demás se ha elegido como extensión 'regdata', así esa ventana de selección del fichero de facturación no tiene posibilidad de elegir un fichero que no contiene los registros esperados y por tanto también evita malograrlos, toda vez que no se realiza ninguna comprbación sobre los ficheros mas que abrir el fichero de nombre elegido.
Sobre los ficheros hay que decir además, que los ficheros son creados y existe una única copia de ellos, excepto para el de facturación (que se crean 2 por cada facturación creada).
Una pequeña tienda familiar o de barrio, suele tener a lo smo unos pocos cientos de artículos a la venta, así una aplicación como esta puede ser perfectamente suficiente, aunque no sea óptima (se ha diseñado e implementado con el objetivo en mente de aprender a solucionar casos típicos), para eficiencia, como mínimo deberían usarse clases y tirar de colecciones basadas en hash, al final hay muchas búsquedas que pueden requerir un recorrido secuencial, que para unos pocos cientos es casi inmediato, peor que basada en hashes, permitiria multplicar el tamaño de las colecciones por 1000 y ser aún 10-100 veces más rápido aún que esta solución.
La implementación con colecciones basada en hashes requiere conocimientos sólidos de programación y del lenguej usado, si no es el caso, entonces lo preferible es tirar de nases de datos que ya implementan tales colecciones por uno mismo... en ese caso se reqiere un conocimieto más o menos sólido de la base de datos usar... para VB6, las bases de datos Access, son bastante asequibles y su rendimeito adecuado, para algo más profesional recomiendo SQL-Server, Oracle, etc... Estas bases de datos son mucho más complejas y exigen más conocimientos del programador, aunque para aplicaciones de pequeñas empresas, no se requiere tanto.
La ventaja de una aplicación diseñada al 100% con código propio, es que es independiente de cambios a posteirori de versioes que con el tiempo arroja incompatibilidades, la otra ventaja es que contrlas al 100%, lo que quieres hacer, según lo que necesites sin apenas restricciones, si bien VB6, no arroja la adecuada capacidad de creación de tipos como por ejemplo oferce ADA o incluso Pascal... se podrá ver en el código como para poder operar con valores con 2-3 decimales hay que hacer 'tontarías' que con un acertado posiblidades de tipos, sería inecesario.
La otra gran desventaja de escribir todo el código es que es más lento al tener que escribir todo en vez de delgar en librerías quye ya hacen tal o cual cosa.
Por ejemplo, podría delegarse los textbox numéricos en controles de usuario diseñados específicamente para tener cierta funconalidad integrada (por ejemplo, porcentajes, donde muestran 3 textbox, el del valor sin el porcentaje, el del porcentaje y el dle valor una vez aplicado el procentaje y que modificando uno solo de ellos, los otros dos se actualicen en base a ello, u otro contro de usuario para mantener justo esa cantidad de dimales que uno quiere sin estar cada vez haciendoese parsing estúpido... o incluso un control con un calendario para elegir la fecha de las promociones y ofertas, forzando así a que las fechas sean siempre a presente o futuro, en vez de tirar de un simple 'now' o un textbox, donde existe la posibilidad de meter una fecha errónea, ahora bien aunque VB dispone de control de calendario, exige entonces instalar tal librería si el cliente no la tiene, la propia librería es de más tamaño que la propia aplicación... tengo por ahí algún control de usuario que es un calendario, pero igualmente es añadir 70kb. y si tuviera que quitarle funcionalidad para hacerlo más simple y ligero, llevaría bastante tiempo asegurarse que lo eliminado no trastoca la funcionalidad residente. ...igualmente por lo mismo abordar otros controles, no procede dado el tiempo disponible y las prisas que pueda tene rel cliente.
En cualquier caso, tienes ahí lo suficiente para modificar a tus necesidades y crear nueva funcionalidad basada en las soluciones dadas... por ejemplo, imagina que te solicitan que crees categorías de artículos y ahora todas las que son de la categoría de bebidas alcohólicas see les aplique un descuento del 10%, en vez de aplicar ofertas artículo por artículo...
...aunque por experiencia ya te digo que si ofreces la capacidad de hacer ofertas por categorías, siempre habrá artículos que no quieran incluir (a pesar de estar en la categoría) y artículos que sin ser de esa categoría quieran incluir... ...lo que al final supone ser la capacidad para que cada artículo pueda tener su propia oferta (es la solución al aque finalmente 'por tanteo', con nuevas exisgencias se llega, pero sin dejarlo jamás así de claro descrito).
Así las categorías, podían ser simplemente colección de códigos de artículos, es decir un registro con un nombre de categoría al que se asocian x artículos (x códigos de artículos)... asociar un artículo a una categoría implicaría eliminarlo de la previa, y en el almacén debería aparecer un codigo de categoría (en los registros se han previsto y dejado campos reservados para permitir cierta flexibilidad de ampliación sin cambiar los propios ficheros). La funcionalidad prevista para las categorías sería pues:
- Añadir-editar-clonar categoría
- Añadir artículos (existentes en el almacén), a dicha cetegoría (exige quitarlo d ela categoría previa si estuieran en otra que no fuera 0 (0=sin categoría definida).
- Ofertar los artículos enla categoría 'x'.
...etc...
Por último, como esto ya pasa de ser un mero ejemplo e incluso de un proyecto personal, cualquier cosa que requieras a futuro, irá solo en explicaciones, le habré dedicado unos 30 o 40 minutos de la mitad de estos días, lo que pueden ser unas 8-10 horas, que es más tiempo del que uno quiere ofrecer como ayuda, aunque 30 ó 40 minutos al día no sea mucho, es más de lo que uno espera cuando requiere varios días...
Saludos.