From d3d14dc6cdd56603a1a8f6e5d6f182a2e546c0d0 Mon Sep 17 00:00:00 2001 From: Manuel <31109774+megalight09@users.noreply.github.com> Date: Wed, 24 Apr 2019 12:43:59 -0400 Subject: [PATCH] Inicial. --- .gitignore | 149 ++ .idea/codeStyles/Project.xml | 52 + .idea/compiler.xml | 23 + .idea/description.html | 2 + .idea/encodings.xml | 6 + .idea/misc.xml | 12 + .idea/modules.xml | 8 + .idea/vcs.xml | 6 + LICENSE | 21 + README.md | 17 + db/README.txt | 7 + db/venta.sql | 1260 +++++++++++++++++ factura-ventas.iml | 14 + src/META-INF/MANIFEST.MF | 3 + src/business/Articulo.java | 39 + src/business/Cliente.java | 45 + src/business/Factura.java | 30 + src/data/Articulo.java | 276 ++++ src/data/Cliente.java | 302 ++++ src/data/Conexion.java | 20 + src/data/Estatus.java | 18 + src/data/Factura.java | 350 +++++ src/data/FacturaDetalle.java | 140 ++ src/view/Main.java | 105 ++ src/view/RadioButtonCell.java | 54 + src/view/articulo/Articulo.fxml | 44 + src/view/articulo/ArticuloActivo.fxml | 107 ++ .../articulo/ArticuloActivoController.java | 149 ++ src/view/articulo/ArticuloController.java | 202 +++ src/view/cliente/Cliente.fxml | 48 + src/view/cliente/ClienteActivo.fxml | 43 + src/view/cliente/ClienteActivoController.java | 105 ++ src/view/cliente/ClienteController.java | 224 +++ src/view/factura/Factura.fxml | 43 + src/view/factura/FacturaActiva.fxml | 99 ++ src/view/factura/FacturaActivaController.java | 200 +++ src/view/factura/FacturaController.java | 109 ++ src/view/factura/FacturaDetalles.fxml | 145 ++ .../factura/FacturaDetallesController.java | 127 ++ src/view/resources/aceptar.png | Bin 0 -> 2540 bytes src/view/resources/agregarCarrito.png | Bin 0 -> 6317 bytes src/view/resources/articulos.png | Bin 0 -> 2156 bytes src/view/resources/articulosTabla.png | Bin 0 -> 4911 bytes src/view/resources/botonAgregar.png | Bin 0 -> 2183 bytes src/view/resources/botonBuscar.png | Bin 0 -> 5226 bytes src/view/resources/botonEliminar.png | Bin 0 -> 6064 bytes src/view/resources/botonSiguiente.png | Bin 0 -> 26077 bytes src/view/resources/buscarTexto.png | Bin 0 -> 1201 bytes src/view/resources/clientes.png | Bin 0 -> 2462 bytes src/view/resources/clientesTabla.png | Bin 0 -> 15722 bytes src/view/resources/comprar.png | Bin 0 -> 1293 bytes src/view/resources/facturas.png | Bin 0 -> 1570 bytes src/view/resources/facturasTabla.png | Bin 0 -> 65008 bytes src/view/resources/main.png | Bin 0 -> 2838 bytes src/view/resources/removerCarrito.png | Bin 0 -> 6060 bytes src/view/resources/root.png | Bin 0 -> 2553 bytes 56 files changed, 4604 insertions(+) create mode 100644 .gitignore create mode 100644 .idea/codeStyles/Project.xml create mode 100644 .idea/compiler.xml create mode 100644 .idea/description.html create mode 100644 .idea/encodings.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml create mode 100644 LICENSE create mode 100644 README.md create mode 100644 db/README.txt create mode 100644 db/venta.sql create mode 100644 factura-ventas.iml create mode 100644 src/META-INF/MANIFEST.MF create mode 100644 src/business/Articulo.java create mode 100644 src/business/Cliente.java create mode 100644 src/business/Factura.java create mode 100644 src/data/Articulo.java create mode 100644 src/data/Cliente.java create mode 100644 src/data/Conexion.java create mode 100644 src/data/Estatus.java create mode 100644 src/data/Factura.java create mode 100644 src/data/FacturaDetalle.java create mode 100644 src/view/Main.java create mode 100644 src/view/RadioButtonCell.java create mode 100644 src/view/articulo/Articulo.fxml create mode 100644 src/view/articulo/ArticuloActivo.fxml create mode 100644 src/view/articulo/ArticuloActivoController.java create mode 100644 src/view/articulo/ArticuloController.java create mode 100644 src/view/cliente/Cliente.fxml create mode 100644 src/view/cliente/ClienteActivo.fxml create mode 100644 src/view/cliente/ClienteActivoController.java create mode 100644 src/view/cliente/ClienteController.java create mode 100644 src/view/factura/Factura.fxml create mode 100644 src/view/factura/FacturaActiva.fxml create mode 100644 src/view/factura/FacturaActivaController.java create mode 100644 src/view/factura/FacturaController.java create mode 100644 src/view/factura/FacturaDetalles.fxml create mode 100644 src/view/factura/FacturaDetallesController.java create mode 100644 src/view/resources/aceptar.png create mode 100644 src/view/resources/agregarCarrito.png create mode 100644 src/view/resources/articulos.png create mode 100644 src/view/resources/articulosTabla.png create mode 100644 src/view/resources/botonAgregar.png create mode 100644 src/view/resources/botonBuscar.png create mode 100644 src/view/resources/botonEliminar.png create mode 100644 src/view/resources/botonSiguiente.png create mode 100644 src/view/resources/buscarTexto.png create mode 100644 src/view/resources/clientes.png create mode 100644 src/view/resources/clientesTabla.png create mode 100644 src/view/resources/comprar.png create mode 100644 src/view/resources/facturas.png create mode 100644 src/view/resources/facturasTabla.png create mode 100644 src/view/resources/main.png create mode 100644 src/view/resources/removerCarrito.png create mode 100644 src/view/resources/root.png diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e3d32c8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,149 @@ +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* + +## Netbeans Stuff +nbproject/private/ +build/ +nbbuild/ +dist/ +nbdist/ +.nb-gradle/ + +## Eclipse Stuff +.metadata +bin/ +tmp/ +*.tmp +*.bak +*.swp +*~.nib +local.properties +.settings/ +.loadpath +.recommenders + +# External tool builders +.externalToolBuilders/ + +# Locally stored "Eclipse launch configurations" +*.launch + +# PyDev specific (Python IDE for Eclipse) +*.pydevproject + +# CDT-specific (C/C++ Development Tooling) +.cproject + +# Java annotation processor (APT) +.factorypath + +# PDT-specific (PHP Development Tools) +.buildpath + +# sbteclipse plugin +.target + +# Tern plugin +.tern-project + +# TeXlipse plugin +.texlipse + +# STS (Spring Tool Suite) +.springBeans + +# Code Recommenders +.recommenders/ + +# Scala IDE specific (Scala & Java development for Eclipse) +.cache-main +.scala_dependencies +.worksheet + +##------------------------ IntelliJ +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf + +# Generated files +.idea/**/contentModel.xml + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/gradle.xml +.idea/**/libraries + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/modules.xml +# .idea/*.iml +# .idea/modules + +# CMake +cmake-build-*/ + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# File-based project format +*.iws + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# Editor-based Rest Client +.idea/httpRequests + +# Android studio 3.1+ serialized cache file +.idea/caches/build_file_checksums.ser \ No newline at end of file diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml new file mode 100644 index 0000000..6d799a0 --- /dev/null +++ b/.idea/codeStyles/Project.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..217af47 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,23 @@ + + + + + + diff --git a/.idea/description.html b/.idea/description.html new file mode 100644 index 0000000..cc10d56 --- /dev/null +++ b/.idea/description.html @@ -0,0 +1,2 @@ +Simple JavaFX 2.0 application that includes simple .fxml file with attached controller and Main class to quick start. Artifact to build JavaFX application is provided. + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..97626ba --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..f991ccd --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..b85e6f9 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..8b4a7aa --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017 Manuel + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..25e4fd5 --- /dev/null +++ b/README.md @@ -0,0 +1,17 @@ +# Factura-Ventas +Es una aplicación moderna escrita en Java, para facturar +artículos vendidos por una organización. La aplicación provee +registro de artículos y clientes, necesarios para la facturación. + +![Imgur](https://i.imgur.com/xiFsapK.png) + +## Características ++ Registro y consulta de clientes. ++ Registro y consulta de articulos. ++ Facturación de artículos. ++ Consulta de facturas. + +## Software de terceros ++ JavaFX 11 ++ JFoenix 9 ([Apache License 2.0](http://www.jfoenix.com/documentation.html#license)) ++ PostgreSQL y pgJDBC ([PostgreSQL License](https://www.postgresql.org/about/licence)) diff --git a/db/README.txt b/db/README.txt new file mode 100644 index 0000000..77f0344 --- /dev/null +++ b/db/README.txt @@ -0,0 +1,7 @@ +El gestor usado para la creacion de la base de datos es PostgreSQL: https://www.postgresql.org/download/ + +INSTRUCCIONES PARA GENERAR BASE DE DATOS. + +1. Ejecutar el script DROP DATABASE y CREATE DATABASE ubicado en el archivo "script.sql", el cual puede ser abierto con cualquier editor de texto; + +2. Ejecutar los queries restantes en la base de datos creada. diff --git a/db/venta.sql b/db/venta.sql new file mode 100644 index 0000000..ade1596 --- /dev/null +++ b/db/venta.sql @@ -0,0 +1,1260 @@ +-- +-- PostgreSQL database dump +-- + +-- Dumped from database version 10.7 +-- Dumped by pg_dump version 10.7 + +-- Started on 2019-04-24 11:56:12 + +SET statement_timeout = 0; +SET lock_timeout = 0; +SET idle_in_transaction_session_timeout = 0; +SET client_encoding = 'UTF8'; +SET standard_conforming_strings = on; +SELECT pg_catalog.set_config('search_path', '', false); +SET check_function_bodies = false; +SET client_min_messages = warning; +SET row_security = off; + +DO +$do$ +BEGIN + IF NOT EXISTS ( + SELECT -- SELECT list can stay empty for this + FROM pg_catalog.pg_roles + WHERE rolname = 'usuario') THEN + + CREATE ROLE usuario LOGIN; + END IF; + ALTER USER usuario PASSWORD '1234'; +END +$do$; +-- +-- TOC entry 1 (class 3079 OID 12924) +-- Name: plpgsql; Type: EXTENSION; Schema: -; Owner: +-- + +CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog; + + +-- +-- TOC entry 2931 (class 0 OID 0) +-- Dependencies: 1 +-- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner: +-- + +COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language'; + + +-- +-- TOC entry 227 (class 1255 OID 26049) +-- Name: Articulo_HISTORICO(); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION public."Articulo_HISTORICO"() RETURNS trigger + LANGUAGE plpgsql + AS $$ BEGIN +INSERT INTO articuloHis(articuloId, +articuloCodigo, articuloNombre, articuloDescripcion, +articuloPrecio, articuloUnidadesStock, articuloEstatus) +VALUES (OLD.articuloId, OLD.articuloCodigo, +OLD.articuloNombre, OLD.articuloDescripcion, +OLD.articuloPrecio, OLD.articuloUnidadesStock, OLD.articuloEstatus); +END;$$; + + +ALTER FUNCTION public."Articulo_HISTORICO"() OWNER TO postgres; + +-- +-- TOC entry 228 (class 1255 OID 26051) +-- Name: Articulo_LOG(); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION public."Articulo_LOG"() RETURNS trigger + LANGUAGE plpgsql + AS $$ BEGIN +INSERT INTO articuloLog(articuloId, articuloCodigo, articuloNombre, articuloDescripcion, + articuloPrecio, articuloUnidadesStock, articuloEstatus, articuloLogUsuario) +VALUES (NEW.articuloId, NEW.articuloCodigo, NEW.articuloNombre, NEW.articuloDescripcion, NEW.articuloPrecio, NEW.articuloUnidadesStock, NEW.articuloEstatus, current_user); +RETURN NEW; +END;$$; + + +ALTER FUNCTION public."Articulo_LOG"() OWNER TO postgres; + +-- +-- TOC entry 233 (class 1255 OID 26123) +-- Name: Calcular_factura_TOTAL(); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION public."Calcular_factura_TOTAL"() RETURNS trigger + LANGUAGE plpgsql + AS $$ BEGIN + +UPDATE factura +SET facturaTotalBruto = +facturaTotalBruto + NEW.facturaPrecio * NEW.facturaCantidad, +facturaTotalImpuesto = +facturaTotalImpuesto + NEW.facturaImpuesto * NEW.facturaCantidad, +facturaTotalDescto = +facturaTotalDescto + NEW.facturaDescuento * NEW.facturaCantidad, +facturaTotalNeto = +facturaTotalNeto + NEW.facturaNeto * NEW.facturaCantidad +WHERE factura.facturaId = NEW.facturaId; + +UPDATE ONLY articulo +SET articuloUnidadesStock = +articuloUnidadesStock - NEW.facturaCantidad +WHERE articuloId = NEW.articuloId; +RETURN NEW; +END;$$; + + +ALTER FUNCTION public."Calcular_factura_TOTAL"() OWNER TO postgres; + +-- +-- TOC entry 232 (class 1255 OID 26125) +-- Name: Cliente_ACCESO(); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION public."Cliente_ACCESO"() RETURNS trigger + LANGUAGE plpgsql + AS $$ BEGIN +UPDATE Cliente +SET clienteultimatransaccion = CURRENT_TIMESTAMP +WHERE ClienteId = NEW.ClienteId; +RETURN NEW; +END;$$; + + +ALTER FUNCTION public."Cliente_ACCESO"() OWNER TO postgres; + +-- +-- TOC entry 208 (class 1255 OID 26022) +-- Name: Cliente_HISTORICO(); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION public."Cliente_HISTORICO"() RETURNS trigger + LANGUAGE plpgsql + AS $$ BEGIN +INSERT INTO clienteHis(clienteId, +clienteNombre, clienteDireccion, +clienteCiudad, +clienteEmail, +clienteTelefono, +clienteCodigoPostal, +clientePais, clienteEstatus) + +VALUES (OLD.clienteId, +OLD.clienteNombre, OLD.clienteDireccion, OLD.clienteCiudad, OLD.clienteEmail, OLD.clienteTelefono, +OLD.clienteCodigoPostal, OLD.clientePais, OLD.clienteEstatus); +RETURN OLD; +END;$$; + + +ALTER FUNCTION public."Cliente_HISTORICO"() OWNER TO postgres; + +-- +-- TOC entry 209 (class 1255 OID 26024) +-- Name: Cliente_LOG(); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION public."Cliente_LOG"() RETURNS trigger + LANGUAGE plpgsql + AS $$ BEGIN + +INSERT INTO clienteLog(clienteId, +clienteNombre, clienteDireccion, +clienteCiudad, +clienteEmail, +clienteTelefono, +clienteCodigoPostal, +clientePais, clienteEstatus, clienteLogUsuario) + +VALUES (NEW.clienteId, +NEW.clienteNombre, NEW.clienteDireccion, NEW.clienteCiudad, NEW.clienteEmail, NEW.clienteTelefono, +NEW.clienteCodigoPostal, NEW.clientePais, NEW.clienteEstatus, current_user); +RETURN NEW; +END;$$; + + +ALTER FUNCTION public."Cliente_LOG"() OWNER TO postgres; + +-- +-- TOC entry 210 (class 1255 OID 26026) +-- Name: Cliente_PURGAR(); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION public."Cliente_PURGAR"() RETURNS trigger + LANGUAGE plpgsql + AS $$ BEGIN +DELETE FROM ONLY Cliente +WHERE clienteultimatransaccion < CURRENT_TIMESTAMP - INTERVAL '5 years'; +RETURN NULL; +END;$$; + + +ALTER FUNCTION public."Cliente_PURGAR"() OWNER TO postgres; + +-- +-- TOC entry 234 (class 1255 OID 26136) +-- Name: Sumar_Cargo(); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION public."Sumar_Cargo"() RETURNS trigger + LANGUAGE plpgsql + AS $$BEGIN +UPDATE Factura +SET FacturaTotalNeto = FacturaTotalCargo +WHERE FacturaId = NEW.FacturaId; +RETURN NEW; +END;$$; + + +ALTER FUNCTION public."Sumar_Cargo"() OWNER TO postgres; + +-- +-- TOC entry 229 (class 1255 OID 26077) +-- Name: articulo_buscar(character varying); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION public.articulo_buscar(nom character varying) RETURNS TABLE(id integer, codigo character, nombre character varying, descripcion character varying, unidades_stock integer, precio numeric, estatus character) + LANGUAGE plpgsql + AS $$BEGIN +RETURN QUERY +SELECT articuloId ID, +articuloCodigo Codigo, +articuloNombre Nombre, +articuloDescripcion Descripcion, +articuloUnidadesStock Unidades_Stock, +articuloPrecio Precio, +articuloEstatus Estatus +FROM ONLY articulo +WHERE articuloNombre LIKE CONCAT(nom, '%') +ORDER BY articuloid DESC; +END;$$; + + +ALTER FUNCTION public.articulo_buscar(nom character varying) OWNER TO postgres; + +-- +-- TOC entry 230 (class 1255 OID 26078) +-- Name: articulo_mostrar(); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION public.articulo_mostrar() RETURNS TABLE(id integer, codigo character, nombre character varying, descripcion character varying, unidades_stock integer, precio numeric, estatus character) + LANGUAGE plpgsql + AS $$ BEGIN +RETURN QUERY +SELECT articuloId, +articuloCodigo, +articuloNombre, +articuloDescripcion, +articuloUnidadesStock, +articuloPrecio, +articuloEstatus +FROM ONLY articulo +ORDER BY articuloId +LIMIT 200; +END;$$; + + +ALTER FUNCTION public.articulo_mostrar() OWNER TO postgres; + +-- +-- TOC entry 231 (class 1255 OID 26079) +-- Name: articulo_mostraractivos(); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION public.articulo_mostraractivos() RETURNS TABLE(id integer, codigo character, nombre character varying, descripcion character varying, unidades_stock integer, precio numeric, estatus character) + LANGUAGE plpgsql + AS $$ BEGIN +RETURN QUERY +SELECT articuloId ID, +articuloCodigo Codigo, +articuloNombre Nombre, +articuloDescripcion Descripcion, +articuloUnidadesStock Unidades_Stock, +articuloPrecio Precio, +articuloEstatus Estatus +FROM ONLY articulo +WHERE articuloEstatus = 'A' +ORDER BY articuloId +LIMIT 200; +END;$$; + + +ALTER FUNCTION public.articulo_mostraractivos() OWNER TO postgres; + +-- +-- TOC entry 211 (class 1255 OID 26030) +-- Name: cliente_buscar(character varying); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION public.cliente_buscar(nom character varying) RETURNS TABLE(id integer, nombre character varying, email character varying, telefono character varying, direccion character varying, codigopostal character varying, ciudad character varying, pais character varying, estatus character) + LANGUAGE plpgsql + AS $$ BEGIN +RETURN QUERY +SELECT clienteid id, +clientenombre nombre, +clienteemail email, +clientetelefono telefono, +clientedireccion direccion, +clientecodigopostal codigopostal, +clienteciudad ciudad, +clientepais pais, +clienteestatus estatus +FROM ONLY cliente +WHERE clienteNombre LIKE CONCAT(nom, '%') +ORDER BY clienteid DESC +LIMIT 200; +END;$$; + + +ALTER FUNCTION public.cliente_buscar(nom character varying) OWNER TO postgres; + +-- +-- TOC entry 224 (class 1255 OID 26031) +-- Name: cliente_buscaractivos(character varying); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION public.cliente_buscaractivos(nom character varying) RETURNS TABLE(id integer, nombre character varying, email character varying, telefono character varying, direccion character varying, codigopostal character varying, ciudad character varying, pais character varying, estatus character) + LANGUAGE plpgsql + AS $$BEGIN +RETURN QUERY +SELECT clienteId AS Id, +clienteNombre AS Nombre, +clienteEmail AS Email, +clienteTelefono AS Telefono, +clienteDireccion AS Direccion, +clienteCodigoPostal AS CodigoPostal, +clienteCiudad AS Ciudad, +clientePais AS Pais, +clienteEstatus AS Estatus +FROM ONLY cliente +WHERE clienteNombre LIKE CONCAT(nombre, '%') +AND clienteEstatus = 'A' +ORDER BY clienteultimatransaccion DESC, clienteid; +END;$$; + + +ALTER FUNCTION public.cliente_buscaractivos(nom character varying) OWNER TO postgres; + +-- +-- TOC entry 225 (class 1255 OID 26032) +-- Name: cliente_mostrar(); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION public.cliente_mostrar() RETURNS TABLE(id integer, nombre character varying, email character varying, telefono character varying, direccion character varying, codigopostal character varying, ciudad character varying, pais character varying, estatus character) + LANGUAGE plpgsql + AS $$ BEGIN +RETURN QUERY +SELECT clienteid, +clientenombre, +clienteemail, +clientetelefono, +clientedireccion, +clientecodigopostal, +clienteciudad, +clientepais, +clienteestatus +FROM ONLY cliente +ORDER BY clienteid +LIMIT 200; +END;$$; + + +ALTER FUNCTION public.cliente_mostrar() OWNER TO postgres; + +-- +-- TOC entry 226 (class 1255 OID 26033) +-- Name: cliente_mostraractivos(); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION public.cliente_mostraractivos() RETURNS TABLE(id integer, nombre character varying, email character varying, telefono character varying, direccion character varying, codigopostal character varying, ciudad character varying, pais character varying, estatus character) + LANGUAGE plpgsql + AS $$ BEGIN +RETURN QUERY +SELECT clienteid, +clientenombre, +clienteemail, +clientetelefono, +clientedireccion, +clientecodigopostal, +clienteciudad, +clientepais, +clienteestatus +FROM ONLY cliente +WHERE clienteEstatus = 'A' +ORDER BY clienteultimatransaccion DESC, clienteid +LIMIT 200; +END;$$; + + +ALTER FUNCTION public.cliente_mostraractivos() OWNER TO postgres; + +-- +-- TOC entry 236 (class 1255 OID 26133) +-- Name: factura_mostrar(); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION public.factura_mostrar() RETURNS TABLE(no integer, nombre character varying, id integer, numero integer, fecha date, hora time without time zone, total_bruto numeric, total_descuento numeric, total_impuesto numeric, total_cargo numeric, total_neto numeric) + LANGUAGE plpgsql + AS $$BEGIN +RETURN QUERY +SELECT s.clienteId N, +s.clienteNombre Nombre, +facturaId Id, facturaNumero Numero, +cast(facturaFecha AS DATE) AS Fecha, cast(facturaFecha AS TIME) AS Hora, +facturaTotalBruto AS Total_Bruto, +facturaTotalDescto AS Total_Descuento, +facturaTotalImpuesto AS Total_Impuesto, +facturaTotalCargo AS Total_Cargo, +facturaTotalNeto AS Total_Neto +FROM factura o +INNER JOIN ONLY cliente s +ON o.clienteId = s.clienteId +WHERE facturaEstatus = 'P' +ORDER BY facturaId DESC +LIMIT 200; +END;$$; + + +ALTER FUNCTION public.factura_mostrar() OWNER TO postgres; + +-- +-- TOC entry 237 (class 1255 OID 26129) +-- Name: factura_mostrar(integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION public.factura_mostrar(numero integer) RETURNS TABLE(linea smallint, codigo_articulo character, articulo character varying, descripcion character varying, cantidad integer, precio numeric, descuento numeric, impuesto numeric, neto numeric) + LANGUAGE plpgsql + AS $$ BEGIN +RETURN QUERY +SELECT facturaLinea AS Linea, +articuloCodigo AS Codigo_articulo, +articuloNombre AS articulo, +articuloDescripcion AS Descripcion, +facturaCantidad AS Cantidad, +facturaPrecio AS Precio, +facturaDescuento AS Descuento, +facturaImpuesto AS Impuesto, +facturaNeto AS Neto +FROM facturaDetalle d +INNER JOIN ONLY articulo p +ON d.articuloId = p.articuloId +INNER JOIN factura o +ON o.facturaId = d.facturaId +WHERE o.facturaNumero = numero +ORDER BY facturaLinea ASC +LIMIT 15; +END;$$; + + +ALTER FUNCTION public.factura_mostrar(numero integer) OWNER TO postgres; + +-- +-- TOC entry 235 (class 1255 OID 26132) +-- Name: facturadetalle_insertar(integer, integer, numeric, integer, numeric, numeric); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION public.facturadetalle_insertar(id integer, articuloid integer, precio numeric, cantidad integer, descuento numeric, impuesto numeric) RETURNS void + LANGUAGE plpgsql + AS $$ +DECLARE rprecio NUMERIC; +BEGIN +SELECT articuloprecio INTO rprecio FROM articulo; +INSERT INTO facturadetalle(facturaid, articuloid, + facturaPrecio, facturaCantidad, facturaDescuento, + facturaImpuesto, facturaNeto) + VALUES + ( + id, articuloid, rprecio, cantidad, descuento, impuesto , + rprecio + impuesto - descuento); +END; $$; + + +ALTER FUNCTION public.facturadetalle_insertar(id integer, articuloid integer, precio numeric, cantidad integer, descuento numeric, impuesto numeric) OWNER TO postgres; + +-- +-- TOC entry 200 (class 1259 OID 26028) +-- Name: articulo_articuloid_seq; Type: SEQUENCE; Schema: public; Owner: postgres +-- + +CREATE SEQUENCE public.articulo_articuloid_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE public.articulo_articuloid_seq OWNER TO postgres; + +SET default_tablespace = ''; + +SET default_with_oids = false; + +-- +-- TOC entry 201 (class 1259 OID 26034) +-- Name: articulo; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.articulo ( + articuloid integer DEFAULT nextval('public.articulo_articuloid_seq'::regclass) NOT NULL, + articulocodigo character(24), + articulonombre character varying(40) NOT NULL, + articulodescripcion character varying(512), + articulounidadesstock integer, + articuloprecio numeric(10,2), + articuloestatus character(1) DEFAULT 'A'::bpchar, + CONSTRAINT articulo_articulonombre_check CHECK (((articulonombre)::text <> ''::text)), + CONSTRAINT natural_unidadesstock CHECK ((articulounidadesstock >= 0)), + CONSTRAINT positivo_precio CHECK ((articuloprecio > (0)::numeric)) +); + + +ALTER TABLE public.articulo OWNER TO postgres; + +-- +-- TOC entry 203 (class 1259 OID 26065) +-- Name: articulohis; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.articulohis ( + articulohisfecha timestamp with time zone DEFAULT CURRENT_TIMESTAMP(0) +) +INHERITS (public.articulo); + + +ALTER TABLE public.articulohis OWNER TO postgres; + +-- +-- TOC entry 2952 (class 0 OID 0) +-- Dependencies: 203 +-- Name: TABLE articulohis; Type: COMMENT; Schema: public; Owner: postgres +-- + +COMMENT ON TABLE public.articulohis IS 'Registra las purgaciones hechas en la tabla articulo.'; + + +-- +-- TOC entry 202 (class 1259 OID 26053) +-- Name: articulolog; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.articulolog ( + articulologusuario character varying(45), + articulologfecha timestamp with time zone DEFAULT CURRENT_TIMESTAMP(0) +) +INHERITS (public.articulo); + + +ALTER TABLE public.articulolog OWNER TO postgres; + +-- +-- TOC entry 2954 (class 0 OID 0) +-- Dependencies: 202 +-- Name: TABLE articulolog; Type: COMMENT; Schema: public; Owner: postgres +-- + +COMMENT ON TABLE public.articulolog IS 'Registra las inserciones hechas en la tabla articulo.'; + + +-- +-- TOC entry 196 (class 1259 OID 25980) +-- Name: cliente_clienteid_seq; Type: SEQUENCE; Schema: public; Owner: postgres +-- + +CREATE SEQUENCE public.cliente_clienteid_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE public.cliente_clienteid_seq OWNER TO postgres; + +-- +-- TOC entry 197 (class 1259 OID 25982) +-- Name: cliente; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.cliente ( + clienteid integer DEFAULT nextval('public.cliente_clienteid_seq'::regclass) NOT NULL, + clientenombre character varying(100) NOT NULL, + clienteemail character varying(254), + clientetelefono character varying(15), + clientedireccion character varying(95), + clientecodigopostal character varying(10), + clienteciudad character varying(35), + clientepais character varying(70), + clienteultimatransaccion timestamp with time zone DEFAULT CURRENT_TIMESTAMP(0), + clienteestatus character(1) DEFAULT 'A'::bpchar, + CONSTRAINT cliente_clientenombre_check CHECK (((clientenombre)::text <> ''::text)) +); + + +ALTER TABLE public.cliente OWNER TO postgres; + +-- +-- TOC entry 198 (class 1259 OID 26000) +-- Name: clientehis; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.clientehis ( + clientehisfecha timestamp with time zone DEFAULT CURRENT_TIMESTAMP(0) +) +INHERITS (public.cliente); + + +ALTER TABLE public.clientehis OWNER TO postgres; + +-- +-- TOC entry 2958 (class 0 OID 0) +-- Dependencies: 198 +-- Name: TABLE clientehis; Type: COMMENT; Schema: public; Owner: postgres +-- + +COMMENT ON TABLE public.clientehis IS 'Registra las purgaciones hechas en la tabla cliente.'; + + +-- +-- TOC entry 199 (class 1259 OID 26011) +-- Name: clientelog; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.clientelog ( + clientelogusuario character varying(45), + clientelogfecha timestamp with time zone DEFAULT CURRENT_TIMESTAMP(0) +) +INHERITS (public.cliente); + + +ALTER TABLE public.clientelog OWNER TO postgres; + +-- +-- TOC entry 2960 (class 0 OID 0) +-- Dependencies: 199 +-- Name: TABLE clientelog; Type: COMMENT; Schema: public; Owner: postgres +-- + +COMMENT ON TABLE public.clientelog IS 'Registra las inserciones hechas en la tabla cliente.'; + + +-- +-- TOC entry 204 (class 1259 OID 26080) +-- Name: factura_facturaid_seq; Type: SEQUENCE; Schema: public; Owner: postgres +-- + +CREATE SEQUENCE public.factura_facturaid_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE public.factura_facturaid_seq OWNER TO postgres; + +-- +-- TOC entry 205 (class 1259 OID 26082) +-- Name: factura; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.factura ( + facturaid integer DEFAULT nextval('public.factura_facturaid_seq'::regclass) NOT NULL, + facturanumero integer DEFAULT currval('public.factura_facturaid_seq'::regclass) NOT NULL, + clienteid integer, + facturafecha timestamp with time zone DEFAULT CURRENT_TIMESTAMP(0) NOT NULL, + facturaestatus character(1) DEFAULT 'P'::bpchar, + facturatotalbruto numeric(12,2) DEFAULT 0.00, + facturatotaldescto numeric(8,2) DEFAULT 0.00, + facturatotalimpuesto numeric(8,2) DEFAULT 0.00, + facturatotalcargo numeric(8,2) DEFAULT 200.00, + facturatotalneto numeric(12,2) DEFAULT 0.00 +); + + +ALTER TABLE public.factura OWNER TO postgres; + +-- +-- TOC entry 206 (class 1259 OID 26101) +-- Name: facturadetalle_facturalinea_seq; Type: SEQUENCE; Schema: public; Owner: postgres +-- + +CREATE SEQUENCE public.facturadetalle_facturalinea_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE public.facturadetalle_facturalinea_seq OWNER TO postgres; + +-- +-- TOC entry 207 (class 1259 OID 26103) +-- Name: facturadetalle; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.facturadetalle ( + facturalinea smallint DEFAULT nextval('public.facturadetalle_facturalinea_seq'::regclass) NOT NULL, + facturaid integer NOT NULL, + articuloid integer, + facturacantidad integer, + facturaprecio numeric(10,2), + facturadescuento numeric(8,2) DEFAULT 0.00, + facturaimpuesto numeric(8,2) DEFAULT 0.00, + facturaneto numeric(10,2) DEFAULT 0.00, + CONSTRAINT natural_cantidad CHECK ((facturacantidad > 0)) +); + + +ALTER TABLE public.facturadetalle OWNER TO postgres; + +-- +-- TOC entry 2756 (class 2604 OID 26068) +-- Name: articulohis articuloid; Type: DEFAULT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.articulohis ALTER COLUMN articuloid SET DEFAULT nextval('public.articulo_articuloid_seq'::regclass); + + +-- +-- TOC entry 2757 (class 2604 OID 26069) +-- Name: articulohis articuloestatus; Type: DEFAULT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.articulohis ALTER COLUMN articuloestatus SET DEFAULT 'A'::bpchar; + + +-- +-- TOC entry 2750 (class 2604 OID 26056) +-- Name: articulolog articuloid; Type: DEFAULT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.articulolog ALTER COLUMN articuloid SET DEFAULT nextval('public.articulo_articuloid_seq'::regclass); + + +-- +-- TOC entry 2751 (class 2604 OID 26057) +-- Name: articulolog articuloestatus; Type: DEFAULT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.articulolog ALTER COLUMN articuloestatus SET DEFAULT 'A'::bpchar; + + +-- +-- TOC entry 2735 (class 2604 OID 26003) +-- Name: clientehis clienteid; Type: DEFAULT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.clientehis ALTER COLUMN clienteid SET DEFAULT nextval('public.cliente_clienteid_seq'::regclass); + + +-- +-- TOC entry 2736 (class 2604 OID 26004) +-- Name: clientehis clienteultimatransaccion; Type: DEFAULT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.clientehis ALTER COLUMN clienteultimatransaccion SET DEFAULT CURRENT_TIMESTAMP(0); + + +-- +-- TOC entry 2737 (class 2604 OID 26005) +-- Name: clientehis clienteestatus; Type: DEFAULT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.clientehis ALTER COLUMN clienteestatus SET DEFAULT 'A'::bpchar; + + +-- +-- TOC entry 2740 (class 2604 OID 26014) +-- Name: clientelog clienteid; Type: DEFAULT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.clientelog ALTER COLUMN clienteid SET DEFAULT nextval('public.cliente_clienteid_seq'::regclass); + + +-- +-- TOC entry 2741 (class 2604 OID 26015) +-- Name: clientelog clienteultimatransaccion; Type: DEFAULT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.clientelog ALTER COLUMN clienteultimatransaccion SET DEFAULT CURRENT_TIMESTAMP(0); + + +-- +-- TOC entry 2742 (class 2604 OID 26016) +-- Name: clientelog clienteestatus; Type: DEFAULT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.clientelog ALTER COLUMN clienteestatus SET DEFAULT 'A'::bpchar; + + +-- +-- TOC entry 2785 (class 2606 OID 26046) +-- Name: articulo pk_articulo; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.articulo + ADD CONSTRAINT pk_articulo PRIMARY KEY (articuloid); + + +-- +-- TOC entry 2777 (class 2606 OID 25993) +-- Name: cliente pk_cliente; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.cliente + ADD CONSTRAINT pk_cliente PRIMARY KEY (clienteid); + + +-- +-- TOC entry 2789 (class 2606 OID 26095) +-- Name: factura pk_factura; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.factura + ADD CONSTRAINT pk_factura PRIMARY KEY (facturaid); + + +-- +-- TOC entry 2791 (class 2606 OID 26112) +-- Name: facturadetalle pk_facturadetalle; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.facturadetalle + ADD CONSTRAINT pk_facturadetalle PRIMARY KEY (facturalinea, facturaid); + + +-- +-- TOC entry 2787 (class 2606 OID 26048) +-- Name: articulo un_articulocodigo; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.articulo + ADD CONSTRAINT un_articulocodigo UNIQUE (articulocodigo); + + +-- +-- TOC entry 2779 (class 2606 OID 25995) +-- Name: cliente un_clientedireccion; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.cliente + ADD CONSTRAINT un_clientedireccion UNIQUE (clientedireccion); + + +-- +-- TOC entry 2781 (class 2606 OID 25997) +-- Name: cliente un_clienteemail; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.cliente + ADD CONSTRAINT un_clienteemail UNIQUE (clienteemail); + + +-- +-- TOC entry 2783 (class 2606 OID 25999) +-- Name: cliente un_clientetelefono; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.cliente + ADD CONSTRAINT un_clientetelefono UNIQUE (clientetelefono); + + +-- +-- TOC entry 2802 (class 2620 OID 26124) +-- Name: facturadetalle Factura_TOTAL; Type: TRIGGER; Schema: public; Owner: postgres +-- + +CREATE TRIGGER "Factura_TOTAL" AFTER INSERT ON public.facturadetalle FOR EACH ROW EXECUTE PROCEDURE public."Calcular_factura_TOTAL"(); + + +-- +-- TOC entry 2795 (class 2620 OID 26023) +-- Name: cliente HISTORICO; Type: TRIGGER; Schema: public; Owner: postgres +-- + +CREATE TRIGGER "HISTORICO" AFTER DELETE ON public.cliente FOR EACH ROW EXECUTE PROCEDURE public."Cliente_HISTORICO"(); + + +-- +-- TOC entry 2798 (class 2620 OID 26050) +-- Name: articulo HISTORICO; Type: TRIGGER; Schema: public; Owner: postgres +-- + +CREATE TRIGGER "HISTORICO" AFTER DELETE ON public.articulo FOR EACH ROW EXECUTE PROCEDURE public."Articulo_HISTORICO"(); + + +-- +-- TOC entry 2796 (class 2620 OID 26025) +-- Name: cliente LOG; Type: TRIGGER; Schema: public; Owner: postgres +-- + +CREATE TRIGGER "LOG" AFTER INSERT OR UPDATE ON public.cliente FOR EACH ROW EXECUTE PROCEDURE public."Cliente_LOG"(); + + +-- +-- TOC entry 2799 (class 2620 OID 26052) +-- Name: articulo LOG; Type: TRIGGER; Schema: public; Owner: postgres +-- + +CREATE TRIGGER "LOG" AFTER INSERT OR UPDATE ON public.articulo FOR EACH ROW EXECUTE PROCEDURE public."Articulo_LOG"(); + + +-- +-- TOC entry 2797 (class 2620 OID 26027) +-- Name: cliente PURGACION; Type: TRIGGER; Schema: public; Owner: postgres +-- + +CREATE TRIGGER "PURGACION" AFTER INSERT OR UPDATE ON public.cliente FOR EACH ROW EXECUTE PROCEDURE public."Cliente_PURGAR"(); + + +-- +-- TOC entry 2800 (class 2620 OID 26137) +-- Name: factura SUMACARGO; Type: TRIGGER; Schema: public; Owner: postgres +-- + +CREATE TRIGGER "SUMACARGO" AFTER INSERT ON public.factura FOR EACH ROW EXECUTE PROCEDURE public."Sumar_Cargo"(); + + +-- +-- TOC entry 2801 (class 2620 OID 26126) +-- Name: factura ULTIMO_ACCESO; Type: TRIGGER; Schema: public; Owner: postgres +-- + +CREATE TRIGGER "ULTIMO_ACCESO" AFTER INSERT ON public.factura FOR EACH ROW EXECUTE PROCEDURE public."Cliente_ACCESO"(); + + +-- +-- TOC entry 2792 (class 2606 OID 26096) +-- Name: factura FK_clienteId; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.factura + ADD CONSTRAINT "FK_clienteId" FOREIGN KEY (clienteid) REFERENCES public.cliente(clienteid); + + +-- +-- TOC entry 2794 (class 2606 OID 26118) +-- Name: facturadetalle fk_articuloid; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.facturadetalle + ADD CONSTRAINT fk_articuloid FOREIGN KEY (articuloid) REFERENCES public.articulo(articuloid); + + +-- +-- TOC entry 2793 (class 2606 OID 26113) +-- Name: facturadetalle fk_facturaid; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.facturadetalle + ADD CONSTRAINT fk_facturaid FOREIGN KEY (facturaid) REFERENCES public.factura(facturaid) ON UPDATE CASCADE ON DELETE CASCADE; + + +-- +-- TOC entry 2932 (class 0 OID 0) +-- Dependencies: 227 +-- Name: FUNCTION "Articulo_HISTORICO"(); Type: ACL; Schema: public; Owner: postgres +-- + +GRANT ALL ON FUNCTION public."Articulo_HISTORICO"() TO usuario; + + +-- +-- TOC entry 2933 (class 0 OID 0) +-- Dependencies: 228 +-- Name: FUNCTION "Articulo_LOG"(); Type: ACL; Schema: public; Owner: postgres +-- + +GRANT ALL ON FUNCTION public."Articulo_LOG"() TO usuario; + + +-- +-- TOC entry 2934 (class 0 OID 0) +-- Dependencies: 233 +-- Name: FUNCTION "Calcular_factura_TOTAL"(); Type: ACL; Schema: public; Owner: postgres +-- + +GRANT ALL ON FUNCTION public."Calcular_factura_TOTAL"() TO usuario; + + +-- +-- TOC entry 2935 (class 0 OID 0) +-- Dependencies: 232 +-- Name: FUNCTION "Cliente_ACCESO"(); Type: ACL; Schema: public; Owner: postgres +-- + +GRANT ALL ON FUNCTION public."Cliente_ACCESO"() TO usuario; + + +-- +-- TOC entry 2936 (class 0 OID 0) +-- Dependencies: 208 +-- Name: FUNCTION "Cliente_HISTORICO"(); Type: ACL; Schema: public; Owner: postgres +-- + +GRANT ALL ON FUNCTION public."Cliente_HISTORICO"() TO usuario; + + +-- +-- TOC entry 2937 (class 0 OID 0) +-- Dependencies: 209 +-- Name: FUNCTION "Cliente_LOG"(); Type: ACL; Schema: public; Owner: postgres +-- + +GRANT ALL ON FUNCTION public."Cliente_LOG"() TO usuario; + + +-- +-- TOC entry 2938 (class 0 OID 0) +-- Dependencies: 210 +-- Name: FUNCTION "Cliente_PURGAR"(); Type: ACL; Schema: public; Owner: postgres +-- + +GRANT ALL ON FUNCTION public."Cliente_PURGAR"() TO usuario; + + +-- +-- TOC entry 2939 (class 0 OID 0) +-- Dependencies: 234 +-- Name: FUNCTION "Sumar_Cargo"(); Type: ACL; Schema: public; Owner: postgres +-- + +GRANT ALL ON FUNCTION public."Sumar_Cargo"() TO usuario; + + +-- +-- TOC entry 2940 (class 0 OID 0) +-- Dependencies: 229 +-- Name: FUNCTION articulo_buscar(nom character varying); Type: ACL; Schema: public; Owner: postgres +-- + +GRANT ALL ON FUNCTION public.articulo_buscar(nom character varying) TO usuario; + + +-- +-- TOC entry 2941 (class 0 OID 0) +-- Dependencies: 230 +-- Name: FUNCTION articulo_mostrar(); Type: ACL; Schema: public; Owner: postgres +-- + +GRANT ALL ON FUNCTION public.articulo_mostrar() TO usuario; + + +-- +-- TOC entry 2942 (class 0 OID 0) +-- Dependencies: 231 +-- Name: FUNCTION articulo_mostraractivos(); Type: ACL; Schema: public; Owner: postgres +-- + +GRANT ALL ON FUNCTION public.articulo_mostraractivos() TO usuario; + + +-- +-- TOC entry 2943 (class 0 OID 0) +-- Dependencies: 211 +-- Name: FUNCTION cliente_buscar(nom character varying); Type: ACL; Schema: public; Owner: postgres +-- + +GRANT ALL ON FUNCTION public.cliente_buscar(nom character varying) TO usuario; + + +-- +-- TOC entry 2944 (class 0 OID 0) +-- Dependencies: 224 +-- Name: FUNCTION cliente_buscaractivos(nom character varying); Type: ACL; Schema: public; Owner: postgres +-- + +GRANT ALL ON FUNCTION public.cliente_buscaractivos(nom character varying) TO usuario; + + +-- +-- TOC entry 2945 (class 0 OID 0) +-- Dependencies: 225 +-- Name: FUNCTION cliente_mostrar(); Type: ACL; Schema: public; Owner: postgres +-- + +GRANT ALL ON FUNCTION public.cliente_mostrar() TO usuario; + + +-- +-- TOC entry 2946 (class 0 OID 0) +-- Dependencies: 226 +-- Name: FUNCTION cliente_mostraractivos(); Type: ACL; Schema: public; Owner: postgres +-- + +GRANT ALL ON FUNCTION public.cliente_mostraractivos() TO usuario; + + +-- +-- TOC entry 2947 (class 0 OID 0) +-- Dependencies: 236 +-- Name: FUNCTION factura_mostrar(); Type: ACL; Schema: public; Owner: postgres +-- + +GRANT ALL ON FUNCTION public.factura_mostrar() TO usuario; + + +-- +-- TOC entry 2948 (class 0 OID 0) +-- Dependencies: 237 +-- Name: FUNCTION factura_mostrar(numero integer); Type: ACL; Schema: public; Owner: postgres +-- + +GRANT ALL ON FUNCTION public.factura_mostrar(numero integer) TO usuario; + + +-- +-- TOC entry 2949 (class 0 OID 0) +-- Dependencies: 235 +-- Name: FUNCTION facturadetalle_insertar(id integer, articuloid integer, precio numeric, cantidad integer, descuento numeric, impuesto numeric); Type: ACL; Schema: public; Owner: postgres +-- + +GRANT ALL ON FUNCTION public.facturadetalle_insertar(id integer, articuloid integer, precio numeric, cantidad integer, descuento numeric, impuesto numeric) TO usuario; + + +-- +-- TOC entry 2950 (class 0 OID 0) +-- Dependencies: 200 +-- Name: SEQUENCE articulo_articuloid_seq; Type: ACL; Schema: public; Owner: postgres +-- + +GRANT SELECT,USAGE ON SEQUENCE public.articulo_articuloid_seq TO usuario; + + +-- +-- TOC entry 2951 (class 0 OID 0) +-- Dependencies: 201 +-- Name: TABLE articulo; Type: ACL; Schema: public; Owner: postgres +-- + +GRANT ALL ON TABLE public.articulo TO usuario; + + +-- +-- TOC entry 2953 (class 0 OID 0) +-- Dependencies: 203 +-- Name: TABLE articulohis; Type: ACL; Schema: public; Owner: postgres +-- + +GRANT ALL ON TABLE public.articulohis TO usuario; + + +-- +-- TOC entry 2955 (class 0 OID 0) +-- Dependencies: 202 +-- Name: TABLE articulolog; Type: ACL; Schema: public; Owner: postgres +-- + +GRANT ALL ON TABLE public.articulolog TO usuario; + + +-- +-- TOC entry 2956 (class 0 OID 0) +-- Dependencies: 196 +-- Name: SEQUENCE cliente_clienteid_seq; Type: ACL; Schema: public; Owner: postgres +-- + +GRANT SELECT,USAGE ON SEQUENCE public.cliente_clienteid_seq TO usuario; + + +-- +-- TOC entry 2957 (class 0 OID 0) +-- Dependencies: 197 +-- Name: TABLE cliente; Type: ACL; Schema: public; Owner: postgres +-- + +GRANT ALL ON TABLE public.cliente TO usuario; + + +-- +-- TOC entry 2959 (class 0 OID 0) +-- Dependencies: 198 +-- Name: TABLE clientehis; Type: ACL; Schema: public; Owner: postgres +-- + +GRANT ALL ON TABLE public.clientehis TO usuario; + + +-- +-- TOC entry 2961 (class 0 OID 0) +-- Dependencies: 199 +-- Name: TABLE clientelog; Type: ACL; Schema: public; Owner: postgres +-- + +GRANT ALL ON TABLE public.clientelog TO usuario; + + +-- +-- TOC entry 2962 (class 0 OID 0) +-- Dependencies: 204 +-- Name: SEQUENCE factura_facturaid_seq; Type: ACL; Schema: public; Owner: postgres +-- + +GRANT SELECT,USAGE ON SEQUENCE public.factura_facturaid_seq TO usuario; + + +-- +-- TOC entry 2963 (class 0 OID 0) +-- Dependencies: 205 +-- Name: TABLE factura; Type: ACL; Schema: public; Owner: postgres +-- + +GRANT ALL ON TABLE public.factura TO usuario; + + +-- +-- TOC entry 2964 (class 0 OID 0) +-- Dependencies: 206 +-- Name: SEQUENCE facturadetalle_facturalinea_seq; Type: ACL; Schema: public; Owner: postgres +-- + +GRANT SELECT,USAGE ON SEQUENCE public.facturadetalle_facturalinea_seq TO usuario; + + +-- +-- TOC entry 2965 (class 0 OID 0) +-- Dependencies: 207 +-- Name: TABLE facturadetalle; Type: ACL; Schema: public; Owner: postgres +-- + +GRANT ALL ON TABLE public.facturadetalle TO usuario; + + +-- +-- TOC entry 1728 (class 826 OID 25978) +-- Name: DEFAULT PRIVILEGES FOR SEQUENCES; Type: DEFAULT ACL; Schema: -; Owner: postgres +-- + +ALTER DEFAULT PRIVILEGES FOR ROLE postgres GRANT SELECT,USAGE ON SEQUENCES TO usuario; + + +-- +-- TOC entry 1729 (class 826 OID 25979) +-- Name: DEFAULT PRIVILEGES FOR FUNCTIONS; Type: DEFAULT ACL; Schema: -; Owner: postgres +-- + +ALTER DEFAULT PRIVILEGES FOR ROLE postgres GRANT ALL ON FUNCTIONS TO usuario; + + +-- +-- TOC entry 1727 (class 826 OID 25977) +-- Name: DEFAULT PRIVILEGES FOR TABLES; Type: DEFAULT ACL; Schema: -; Owner: postgres +-- + +ALTER DEFAULT PRIVILEGES FOR ROLE postgres GRANT ALL ON TABLES TO usuario; + + +-- Completed on 2019-04-24 11:56:12 + +-- +-- PostgreSQL database dump complete +-- + diff --git a/factura-ventas.iml b/factura-ventas.iml new file mode 100644 index 0000000..ec07972 --- /dev/null +++ b/factura-ventas.iml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/META-INF/MANIFEST.MF b/src/META-INF/MANIFEST.MF new file mode 100644 index 0000000..4f412c9 --- /dev/null +++ b/src/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Main-Class: view.Main + diff --git a/src/business/Articulo.java b/src/business/Articulo.java new file mode 100644 index 0000000..9eaa16b --- /dev/null +++ b/src/business/Articulo.java @@ -0,0 +1,39 @@ +package business; + +import data.Estatus; +import javafx.collections.ObservableList; + +import java.math.BigDecimal; + +public class Articulo { + + private Articulo() { + + } + + public static String insertar(String codigo, String nombre, String descripcion, BigDecimal precio, + int unidadesStock) { + data.Articulo articulo = new data.Articulo(codigo, nombre, descripcion, precio, unidadesStock); + return articulo.insertar(articulo); + } + + public static String actualizar(int id, String codigo, String nombre, String descripcion, BigDecimal precio, + int unidadesStock, Estatus estatus) { + data.Articulo articulo = new data.Articulo(id, codigo, nombre, descripcion, precio, unidadesStock, estatus); + return articulo.actualizar(articulo); + } + + public static ObservableList buscar(String textoABuscar) { + data.Articulo articulo = new data.Articulo(textoABuscar); + return articulo.buscar(articulo); + } + + public static ObservableList mostrar() { + return new data.Articulo().mostrar(); + } + + public static ObservableList mostrarActivos() { + return new data.Articulo().mostrarActivos(); + } + +} diff --git a/src/business/Cliente.java b/src/business/Cliente.java new file mode 100644 index 0000000..98ec067 --- /dev/null +++ b/src/business/Cliente.java @@ -0,0 +1,45 @@ +package business; + +import data.Estatus; +import javafx.collections.ObservableList; + +public class Cliente { + + private Cliente(){ + + } + + public static String insertar(String nombre, String direccion, String ciudad, String email, + String telefono, String codigoPostal, String pais) { + data.Cliente cliente = new data.Cliente(nombre, direccion, ciudad, email, + telefono, codigoPostal, pais); + + return new data.Cliente().insertar(cliente); + } + + public static String actualizar(int id, String nombre, String direccion, String ciudad, String email, + String telefono, String codigoPostal, String pais, Estatus estatus) { + data.Cliente cliente = new data.Cliente(id, nombre, direccion, ciudad, email, + telefono, codigoPostal, pais, estatus); + return new data.Cliente().actualizar(cliente); + } + + public static ObservableList buscar(String textoABuscar) { + //data.Cliente cliente = new data.Cliente(textoABuscar); + return new data.Cliente().buscar(textoABuscar); + } + + public static ObservableList buscarActivos(String textoABuscar) { + //data.Cliente cliente = new data.Cliente(textoABuscar); + return new data.Cliente().buscarActivos(textoABuscar); + } + + public static ObservableList mostrar() { + return new data.Cliente().mostrar(); + } + + public static ObservableList mostrarActivos() { + return new data.Cliente().mostrarActivos(); + } + +} diff --git a/src/business/Factura.java b/src/business/Factura.java new file mode 100644 index 0000000..b1fcc6b --- /dev/null +++ b/src/business/Factura.java @@ -0,0 +1,30 @@ +package business; + +import data.FacturaDetalle; +import javafx.collections.ObservableList; + +public class Factura { + + private Factura() { + + } + + + // Listo. + public static String eliminar(int id) { + data.Factura factura = new data.Factura(id); + return new data.Factura().eliminar(factura); + } + + // Listo. + public static ObservableList mostrar() { + return new data.Factura().mostrar(); + } + + // Listo. + public static ObservableList mostrarDetalles(int numero) { + data.Factura factura = new data.Factura(); + return factura.mostrarDetalles(numero); + } + +} \ No newline at end of file diff --git a/src/data/Articulo.java b/src/data/Articulo.java new file mode 100644 index 0000000..43c3f5a --- /dev/null +++ b/src/data/Articulo.java @@ -0,0 +1,276 @@ +package data; + +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; + +import java.math.BigDecimal; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.text.DecimalFormat; +import java.util.HashMap; +import java.util.Objects; +import java.util.logging.Level; +import java.util.logging.Logger; + +public class Articulo { + + private int id_; + private String nombre_; + private String descripcion_; + private BigDecimal precio_; + private int unidadesStock_; + private String codigo_; + private Estatus estatus_; + + private String textoABuscar_; + + // Para realizar consultas a la base de datos. + public Articulo() { + + } + + // Para actualizar. + public Articulo(int id, String codigo, String nombre, String descripcion, + BigDecimal precio, int unidadesStock, Estatus estatus) { + this(codigo, nombre, descripcion, precio, unidadesStock); + setEstatus(estatus); + setId(id); + } + + // Para insertar + public Articulo(String codigo, String nombre, String descripcion, + BigDecimal precio, int unidadesStock) { + setCodigo(codigo); + setNombre(nombre); + setDescripcion(descripcion); + setPrecio(precio); + setUnidadesStock(unidadesStock); + } + + // Para buscar + public Articulo(String textoABuscar) { + setTextoABuscar(textoABuscar); + } + + // Para eliminar + public Articulo(int id){ + setId(id); + } + + public String insertar(Articulo articulo) { + String mensaje; + try (Connection conn = Conexion.conectar()) { + try (PreparedStatement query = conn.prepareStatement("INSERT INTO Articulo(ArticuloCodigo, ArticuloNombre, " + + "ArticuloDescripcion, ArticuloPrecio, ArticuloUnidadesStock) VALUES (?, ?, ?, ?, ?);")) { + query.setString(1, articulo.codigo_); + query.setString(2, articulo.nombre_); + query.setString(3, articulo.descripcion_); + query.setBigDecimal(4, articulo.precio_); + query.setInt(5, articulo.unidadesStock_); + + boolean esEjecutado = (query.executeUpdate() > 0); + if (esEjecutado) { + mensaje = "El registro ha sido agregado exitosamente."; + } else { + throw new SQLException("El registro no pudo ser agregado correctamente."); + } + } catch (SQLException ex) { + mensaje = ex.getMessage(); + Logger.getLogger(Articulo.class.getName()).log(Level.SEVERE, null, ex); + } + + } catch (SQLException ex) { + mensaje = "La conexion a la base de datos no pudo ser realizada exitosamente."; + Logger.getLogger(Articulo.class.getName()).log(Level.SEVERE, null, ex); + } + + return mensaje; + } + + public String actualizar(Articulo articulo) { + String mensaje; + try (Connection conn = Conexion.conectar()) { + try (PreparedStatement query = conn.prepareStatement("UPDATE ONLY Articulo SET ArticuloCodigo = ?, " + + "ArticuloNombre = ?, ArticuloDescripcion = ?, ArticuloPrecio = ?, ArticuloUnidadesStock = ?," + + "ArticuloEstatus = ? WHERE ArticuloId = ?;")) { + query.setString(1, articulo.codigo_); + query.setString(2, articulo.nombre_); + query.setString(3, articulo.descripcion_); + query.setBigDecimal(4, articulo.precio_); + query.setInt(5, articulo.unidadesStock_); + query.setString(6, articulo.getEstatus().getChar()); + query.setInt(7, articulo.id_); // Modificar + + boolean esEjecutado = (query.executeUpdate() > 0); + if (esEjecutado) { + mensaje = "El registro ha sido actualizado exitosamente."; + } else { + throw new SQLException("El registro no pudo ser actualizado correctamente."); + } + } catch (SQLException ex) { + mensaje = ex.getMessage(); + Logger.getLogger(Articulo.class.getName()).log(Level.SEVERE, null, ex); + + } + } catch (SQLException ex) { + mensaje = "La conexion a la base de datos no pudo ser realizada exitosamente."; + Logger.getLogger(Articulo.class.getName()).log(Level.SEVERE, null, ex); + } + + return mensaje; + + } + + public ObservableList buscar(Articulo articulo) { + ObservableList data = FXCollections.observableArrayList(); + try (Connection conn = Conexion.conectar()) { + PreparedStatement query = conn.prepareStatement("SELECT * from articulo_buscar(?)"); + query.setString(1, articulo.textoABuscar_); + data = leer(query.executeQuery()); + } catch (SQLException ex) { + Logger.getLogger(Articulo.class.getName()).log(Level.SEVERE, null, ex); + } + + return data; + } + + public ObservableList mostrar() { + ObservableList data = FXCollections.observableArrayList(); + try (Connection conn = Conexion.conectar()) { + PreparedStatement query = conn.prepareStatement("SELECT * from articulo_mostrar()"); + data = leer(query.executeQuery()); + } catch (SQLException ex) { + Logger.getLogger(Articulo.class.getName()).log(Level.SEVERE, null, ex); + } + + return data; + } + + public ObservableList mostrarActivos() { + ObservableList data = FXCollections.observableArrayList(); + try (Connection conn = Conexion.conectar()) { + PreparedStatement query = conn.prepareStatement("SELECT * from articulo_mostraractivos()"); + data = leer(query.executeQuery()); + } catch (SQLException ex) { + Logger.getLogger(Articulo.class.getName()).log(Level.SEVERE, null, ex); + } + return data; + } + + private ObservableList leer(ResultSet resultSet) throws SQLException { + ObservableList data = FXCollections.observableArrayList(); + while (resultSet.next()) { + data.add(crear(resultSet)); + } + return data; + } + + private Articulo crear(ResultSet resultSet) throws SQLException { + int no = resultSet.getInt("Id"); + final String nombre = resultSet.getString("Nombre"); + final String descripcion = resultSet.getString("Descripcion"); + final BigDecimal precio = resultSet.getBigDecimal("Precio"); + final int unidadesStock = resultSet.getInt("Unidades_Stock"); + final String codigo = resultSet.getString("Codigo"); + Articulo articulo = new Articulo(codigo, nombre, descripcion, precio, unidadesStock); + articulo.setId(no); + + // Set Estatus. + HashMap opciones = new HashMap<>(); + opciones.put(Estatus.ACTIVO.getChar(), Estatus.ACTIVO); + opciones.put(Estatus.INACTIVO.getChar(), Estatus.INACTIVO); + final Estatus estatus = opciones.get(resultSet.getString("Estatus")); + articulo.setEstatus(estatus); + + return articulo; + } + + public int getId() { + return id_; + } + + public String getNombre() { + return nombre_; + } + + public String getDescripcion() { + return descripcion_; + } + + public BigDecimal getPrecio() { + return precio_; + } + + public int getUnidadesStock() { + return unidadesStock_; + } + + public String getCodigo() { + return codigo_; + } + + public Estatus getEstatus() { + return estatus_; + } + + private void setId(int id) { + id_ = id; + } + + public void setNombre(String nombre) { + nombre_ = nombre; + } + + public void setDescripcion(String descripcion) { + descripcion_ = descripcion; + } + + public void setPrecio(BigDecimal precio) { + precio_ = precio; + } + + public void setUnidadesStock(int unidadesStock) { + unidadesStock_ = unidadesStock; + } + + public void setCodigo(String codigo) { + codigo_ = codigo; + } + + public void setEstatus(Estatus estatus) { + estatus_ = estatus; + } + + private void setTextoABuscar(String textoABuscar) { + textoABuscar_ = textoABuscar; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof Articulo)) return false; + Articulo articulo = (Articulo) o; + return Objects.equals(codigo_, articulo.codigo_); + } + + @Override + public int hashCode() { + + return Objects.hash(codigo_); + } + + @Override + public String toString() { + DecimalFormat f = new DecimalFormat("###,##0.00"); + return "Articulo{" + + "id_=" + id_ + + ", codigo_='" + codigo_ + '\'' + + ", nombre_='" + nombre_ + '\'' + + ", descripcion_='" + descripcion_ + '\'' + + ", unidadesStock_=" + unidadesStock_ + + ", precio_=" + f.format(precio_) + + ", estatus_=" + estatus_ + '}'; + } +} diff --git a/src/data/Cliente.java b/src/data/Cliente.java new file mode 100644 index 0000000..9cb2cbd --- /dev/null +++ b/src/data/Cliente.java @@ -0,0 +1,302 @@ +package data; + +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.HashMap; +import java.util.Objects; +import java.util.logging.Level; +import java.util.logging.Logger; + +public class Cliente { + + private int id_; + private String nombre_; + private String direccion_; + private String ciudad_; + private String email_; + private String telefono_; + private String codigoPostal_; + private String pais_; + private Estatus estatus_; + + public Cliente() { + } + + public Cliente(int id) { + setId(id); + } + + // Para actualizar + public Cliente(int id, String nombre, String direccion, String ciudad, String email, + String telefono, String codigoPostal, String pais, Estatus estatus) { + this(nombre, direccion, ciudad, email, telefono, codigoPostal, pais); // Constructor de insertar + setEstatus(estatus); + setId(id); + } + + // Para insertar + public Cliente(String nombre, String direccion, String ciudad, String email, + String telefono, String codigoPostal, String pais) { + setNombre(nombre); + setDireccion(direccion); + setCiudad(ciudad); + setEmail(email); + setTelefono(telefono); + setCodigoPostal(codigoPostal); + setPais(pais); + } + + public String insertar(Cliente cliente) { + String mensaje; + try (Connection conn = Conexion.conectar()) { + try (PreparedStatement query = conn.prepareStatement("INSERT INTO cliente(ClienteNombre, " + + "ClienteDireccion, ClienteCiudad, ClienteEmail, ClienteTelefono, ClienteCodigoPostal, " + + "ClientePais) VALUES (?, ?, ?, ?, ?, ?, ?);")) { + query.setString(1, cliente.nombre_); + query.setString(2, cliente.direccion_); + query.setString(3, cliente.ciudad_); + query.setString(4, cliente.email_); + query.setString(5, cliente.telefono_); + query.setString(6, cliente.codigoPostal_); + query.setString(7, cliente.pais_); + + int tuplas = query.executeUpdate(); + if (tuplas > 0) { + mensaje = "El registro ha sido agregado exitosamente."; + } else { + throw new SQLException("El registro no pudo ser agregado correctamente.\n"); + } + + } catch (SQLException ex) { + mensaje = ex.getMessage(); + Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, null, ex); + + } + + } catch (SQLException ex) { + mensaje = "La conexion a la base de datos no pudo ser realizada exitosamente."; + Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, null, ex); + } + + return mensaje; + } + + public String actualizar(Cliente cliente) { + String mensaje; + try (Connection conn = Conexion.conectar()) { + try (PreparedStatement query = conn.prepareStatement("UPDATE Cliente SET ClienteNombre = ?," + + "ClienteDireccion = ?, ClienteCiudad = ?, ClienteEmail = ?, ClienteTelefono = ?," + + "ClienteCodigoPostal = ?, ClientePais = ?, ClienteEstatus = ? WHERE ClienteId = ? ;\n")) { + query.setString(1, cliente.nombre_); + query.setString(2, cliente.direccion_); + query.setString(3, cliente.ciudad_); + query.setString(4, cliente.email_); + query.setString(5, cliente.telefono_); + query.setString(6, cliente.codigoPostal_); + query.setString(7, cliente.pais_); + query.setString(8, cliente.estatus_.getChar()); + query.setInt(9, cliente.id_); // Modificar + + boolean esEjecutado = (query.executeUpdate() > 0); + if (esEjecutado) { + mensaje = "El registro ha sido actualizado exitosamente."; + } else { + throw new SQLException("El registro no pudo ser actualizado correctamente."); + } + + } catch (SQLException ex) { + mensaje = ex.getMessage(); + Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, null, ex); + } + + } catch (SQLException ex) { + mensaje = "La conexion a la base de datos no pudo ser realizada exitosamente."; + Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, null, ex); + } + + return mensaje; + + } + + public ObservableList buscar(String textoABuscar) { + ObservableList data = FXCollections.observableArrayList(); + try (Connection conn = Conexion.conectar()) { + PreparedStatement query = conn.prepareStatement("SELECT * from cliente_buscar(?)"); + query.setString(1, textoABuscar); + data = leer(query.executeQuery()); + } catch (SQLException ex) { + Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, null, ex); + } + + return data; + } + + public ObservableList buscarActivos(String textoABuscar) { + ObservableList data = FXCollections.observableArrayList(); + try (Connection conn = Conexion.conectar()) { + PreparedStatement query = conn.prepareStatement("SELECT * from cliente_buscaractivos(?)"); + query.setString(1, textoABuscar); + data = leer(query.executeQuery()); + } catch (SQLException ex) { + Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, null, ex); + } + + return data; + } + + public ObservableList mostrar() { + ObservableList data = FXCollections.observableArrayList(); + try (Connection conn = Conexion.conectar()) { + PreparedStatement query = conn.prepareStatement("SELECT * from cliente_mostrar()"); + data = leer(query.executeQuery()); + } catch (SQLException ex) { + Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, null, ex); + } + return data; + } + + public ObservableList mostrarActivos() { + ObservableList data = FXCollections.observableArrayList(); + try (Connection conn = Conexion.conectar()) { + PreparedStatement query = conn.prepareStatement("SELECT * from cliente_mostraractivos()"); + data = leer(query.executeQuery()); + } catch (SQLException ex) { + Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, null, ex); + } + return data; + } + + private ObservableList leer(ResultSet resultSet) throws SQLException { + ObservableList data = FXCollections.observableArrayList(); + while (resultSet.next()) { + data.add(crear(resultSet)); + } + return data; + } + + private Cliente crear(ResultSet resultSet) throws SQLException { + int no = resultSet.getInt("Id"); + final String nombre = resultSet.getString("Nombre"); + final String email = resultSet.getString("Email"); + final String telefono = resultSet.getString("Telefono"); + final String direccion = resultSet.getString("Direccion"); + final String pais = resultSet.getString("Pais"); + final String ciudad = resultSet.getString("Ciudad"); + final String codigoPostal = resultSet.getString("CodigoPostal"); + Cliente cliente = new Cliente(nombre, direccion, ciudad, email, telefono, codigoPostal, pais); + cliente.setId(no); + + HashMap opciones = new HashMap<>(); + opciones.put("A", Estatus.ACTIVO); + opciones.put("I", Estatus.INACTIVO); + final String estatus = resultSet.getString("Estatus"); + cliente.setEstatus(opciones.get(estatus)); + + return cliente; + } + + public int getId() { + return id_; + } + + public String getNombre() { + return nombre_; + } + + public String getDireccion() { + return direccion_; + } + + public String getCiudad() { + return ciudad_; + } + + public String getEmail() { + return email_; + } + + public String getTelefono() { + return telefono_; + } + + public String getCodigoPostal() { + return codigoPostal_; + } + + public String getPais() { + return pais_; + } + + public Estatus getEstatus() { + return estatus_; + } + + public void setId(int id) { + id_ = id; + } + + public void setNombre(String nombre) { + nombre_ = nombre; + } + + public void setDireccion(String direccion) { + direccion_ = direccion; + } + + public void setCiudad(String ciudad) { + ciudad_ = ciudad; + } + + public void setEmail(String email) { + email_ = email; + } + + public void setTelefono(String telefono) { + telefono_ = telefono; + } + + public void setCodigoPostal(String codigoPostal) { + codigoPostal_ = codigoPostal; + } + + public void setPais(String pais) { + pais_ = pais; + } + + public void setEstatus(Estatus estatus) { + estatus_ = estatus; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Cliente cliente = (Cliente) o; + return id_ == cliente.id_; + } + + @Override + public int hashCode() { + return Objects.hash(id_); + } + + @Override + public String toString() { + return "Cliente{" + + "id_=" + id_ + + ", nombre_='" + nombre_ + '\'' + + ", direccion_='" + direccion_ + '\'' + + ", ciudad_='" + ciudad_ + '\'' + + ", email_='" + email_ + '\'' + + ", telefono_='" + telefono_ + '\'' + + ", codigoPostal_='" + codigoPostal_ + '\'' + + ", pais_='" + pais_ + '\'' + + ", estatus_=" + estatus_ + + '}'; + } +} diff --git a/src/data/Conexion.java b/src/data/Conexion.java new file mode 100644 index 0000000..34035a3 --- /dev/null +++ b/src/data/Conexion.java @@ -0,0 +1,20 @@ +package data; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; + +class Conexion { + + private Conexion(){ + + } + + static Connection conectar() throws SQLException { + final String dbUrl = "jdbc:postgresql://localhost/venta"; + final String user = "usuario"; + final String password = "1234"; + return DriverManager.getConnection(dbUrl, user, password); + } + +} diff --git a/src/data/Estatus.java b/src/data/Estatus.java new file mode 100644 index 0000000..c6d9ee3 --- /dev/null +++ b/src/data/Estatus.java @@ -0,0 +1,18 @@ +package data; + +public enum Estatus { + ACTIVO('A'), INACTIVO('I'); + + private final char estatus_; + Estatus(char estatus){ + estatus_ = estatus; + } + public String getChar(){ + return String.valueOf(estatus_); + } + + @Override + public String toString() { + return super.toString().toUpperCase().charAt(0) + super.toString().substring(1).toLowerCase(); + } +} diff --git a/src/data/Factura.java b/src/data/Factura.java new file mode 100644 index 0000000..ac8cdab --- /dev/null +++ b/src/data/Factura.java @@ -0,0 +1,350 @@ +package data; + +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; + +import java.math.BigDecimal; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.text.DecimalFormat; +import java.time.LocalDate; +import java.time.LocalTime; +import java.util.HashSet; +import java.util.Objects; +import java.util.Set; +import java.util.concurrent.atomic.AtomicReference; +import java.util.logging.Level; +import java.util.logging.Logger; + +public class Factura { + + private int id_; + private int numero_; + + private Cliente cliente_ = new Cliente(); + private LocalDate fecha_; + private LocalTime hora_; + private BigDecimal totalBruto_; + private BigDecimal totalDescuento_; + private BigDecimal totalImpuesto_; + private BigDecimal totalCargo_; + private BigDecimal totalNeto_; + private Set detalles_ = new HashSet<>(); + + // Para realizar consultas a la base de datos. + public Factura() { + + } + + // Para insertar + public Factura(Cliente cliente) { + cliente_ = cliente; + } + + // Para Mostrar + private Factura(Cliente cliente, int id, int numero, LocalDate fecha, LocalTime hora, + BigDecimal totalBruto, BigDecimal totalDescuento, BigDecimal totalImpuesto, BigDecimal totalCargo, + BigDecimal totalNeto){ + cliente_ = cliente; + setId(id); + setNumero(numero); + setFecha(fecha); + setHora(hora); + setTotalBruto(totalBruto); + setTotalDescuento(totalDescuento); + setTotalImpuesto(totalImpuesto); + setTotalCargo(totalCargo); + setTotalNeto(totalNeto); + + } + + // Para eliminar. + public Factura(int id) { + setId(id); + } + + private void insertarDetalles(Connection conn) + throws SQLException { + + for (FacturaDetalle detalle : getDetalles()) { + PreparedStatement statement = new AtomicReference<>(conn.prepareStatement( + "SELECT * FROM FacturaDetalle_Insertar(" + + "id := ?, articuloid := ?, precio := ?, cantidad := ?, descuento := ?, impuesto := ?)")).get(); + statement.setInt(1, getId()); + statement.setInt(2, detalle.getArticuloId()); + statement.setBigDecimal(3, detalle.getPrecio()); + statement.setInt(4, detalle.getCantidad()); + statement.setBigDecimal(5, detalle.getDescuento()); + statement.setBigDecimal(6, detalle.getImpuesto()); + + boolean esEjecutado = statement.execute(); + if (!esEjecutado) { + throw new SQLException(); + } + } + } + + // Listo. + public String insertar() { + String mensaje; + try (Connection conn = Conexion.conectar()) { + try { + // Deshabilita auto transaccion. + conn.setAutoCommit(false); + PreparedStatement query = new AtomicReference<>(conn.prepareStatement("INSERT INTO " + + "Factura(ClienteId, FacturaTotalCargo) " + + "VALUES ( ?, ?) RETURNING facturaid;")).get(); + query.setInt(1, getClienteId()); + query.setObject(2, getTotalCargo()); + boolean esEjecutado = query.execute(); + if (esEjecutado) { + ResultSet rs = query.getResultSet(); + rs.next(); + setId(rs.getInt(1)); + insertarDetalles(conn); + conn.commit(); // Confirma la transaccion. + mensaje = "El registro ha sido agregado exitosamente."; + + } else { + throw new SQLException(); + } + + } catch (SQLException ex) { + conn.rollback(); // Cancela la transaccion + mensaje = "El registro no pudo ser agregado correctamente."; + Logger.getLogger(Articulo.class.getName()).log(Level.SEVERE, null, ex); + } + + } catch (SQLException ex) { + mensaje = "La conexion a la base de datos no pudo ser realizada exitosamente."; + Logger.getLogger(Articulo.class.getName()).log(Level.SEVERE, null, ex); + } + + return mensaje; + } + + public String eliminar(Factura factura) { + String mensaje; + try (Connection conn = Conexion.conectar()) { + try (PreparedStatement query = conn.prepareStatement("UPDATE Factura SET FacturaEstatus = 'C'" + + " WHERE FacturaId = ?;")) { + + query.setInt(1, factura.id_); + boolean esEjecutado = (query.executeUpdate() > 0); + if (esEjecutado) { + mensaje = "La factura ha sido cancelada exitosamente."; + } else { + throw new SQLException( "La factura no pudo ser cancelada."); + } + } catch (SQLException ex) { + mensaje = ex.getMessage(); + Logger.getLogger(Articulo.class.getName()).log(Level.SEVERE, null, ex); + } + } catch (SQLException ex) { + mensaje = "La conexion a la base de datos no pudo ser realizada exitosamente."; + Logger.getLogger(Articulo.class.getName()).log(Level.SEVERE, null, ex); + } + + return mensaje; + + } + + // Listo + public ObservableList mostrar() { + ObservableList data = FXCollections.observableArrayList(); + try (Connection conn = Conexion.conectar(); + PreparedStatement query = conn.prepareStatement("SELECT * FROM Factura_mostrar()")) { + ResultSet resultSet = query.executeQuery(); + while (resultSet.next()) { + + Cliente cliente = new Cliente(); + int clienteId = resultSet.getInt("No"); + String clienteNombre = resultSet.getString("Nombre"); + cliente.setNombre(clienteNombre); + cliente.setId(clienteId); + + final int id = resultSet.getInt("Id"); + final int numero = resultSet.getInt("Numero"); + final LocalDate fecha = resultSet.getDate("Fecha").toLocalDate(); + final LocalTime hora = resultSet.getTime("Hora").toLocalTime(); + BigDecimal totalBruto = resultSet.getBigDecimal("Total_Bruto"); + BigDecimal totalDescuento = resultSet.getBigDecimal("Total_Descuento"); + BigDecimal totalImpuesto = resultSet.getBigDecimal("Total_Impuesto"); + BigDecimal totalCargo = resultSet.getBigDecimal("Total_Cargo"); + BigDecimal totalNeto = resultSet.getBigDecimal("Total_Neto"); + Factura obj = new Factura(cliente, id, numero, fecha, hora, + totalBruto, totalDescuento, totalImpuesto, totalCargo, totalNeto); + + data.add(obj); + } + + + } catch (SQLException ex) { + Logger.getLogger(Articulo.class.getName()).log(Level.SEVERE, null, ex); + } + + return data; + } + + // Listo + public ObservableList mostrarDetalles(int numero) { + // Texto + ObservableList detalles_ = FXCollections.observableArrayList(); + try (Connection conn = Conexion.conectar()) { + PreparedStatement query = conn.prepareStatement("SELECT * FROM Factura_Mostrar(?)"); + query.setInt(1, numero); + ResultSet resultSet = query.executeQuery(); + while (resultSet.next()) { + + final short linea = resultSet.getShort("Linea"); + + Articulo articulo = new Articulo(); + final String articuloCodigo = resultSet.getString("Codigo_Articulo"); + articulo.setCodigo(articuloCodigo); + final String articuloNombre = resultSet.getString("articulo"); + articulo.setNombre(articuloNombre); + final String articuloDescripcion = resultSet.getString("descripcion"); + articulo.setDescripcion(articuloDescripcion); + BigDecimal precio = resultSet.getBigDecimal("Precio"); + articulo.setPrecio(precio); + + final int cantidad = resultSet.getInt("cantidad"); + BigDecimal descuento = resultSet.getBigDecimal("Descuento"); + BigDecimal impuesto = resultSet.getBigDecimal("Impuesto"); + BigDecimal neto = resultSet.getBigDecimal("Neto"); + FacturaDetalle obj = new FacturaDetalle(id_, articulo, cantidad, + descuento, impuesto, neto); + obj.setLinea(linea); + detalles_.add(obj); + } + + } catch (SQLException ex) { + Logger.getLogger(Factura.class.getName()).log(Level.SEVERE, null, ex); + } + + return detalles_; + + } + + public int getId() { + return id_; + } + + public int getNumero() { + return numero_; + } + + public Cliente getCliente() { + return cliente_; + } + + public int getClienteId() { + return cliente_.getId(); + } + + public String getClienteNombre(){ + return cliente_.getNombre(); + } + + public LocalDate getFecha() { + return fecha_; + } + + public LocalTime getHora(){ + return hora_; + } + + public Set getDetalles() { + return detalles_; + } + + public BigDecimal getTotalBruto() { + return totalBruto_; + } + + public BigDecimal getTotalDescuento() { + return totalDescuento_; + } + + public BigDecimal getTotalImpuesto() { + return totalImpuesto_; + } + + public BigDecimal getTotalCargo() { + return totalCargo_; + } + + public BigDecimal getTotalNeto() { + return totalNeto_; + } + + private void setId(int id) { + id_ = id; + } + + private void setNumero(int numero) { + numero_ = numero; + } + + public void setCliente(Cliente cliente) { + cliente_ = cliente; + } + + private void setFecha(LocalDate fecha) { + fecha_ = fecha; + } + + private void setHora(LocalTime hora) { + hora_ = hora; + } + + public void setDetalles(Set detalles) { + detalles_ = detalles; + } + + public void setTotalBruto(BigDecimal totalBruto) { + totalBruto_ = totalBruto; + } + + public void setTotalDescuento(BigDecimal totalDescuento) { + totalDescuento_ = totalDescuento; + } + + public void setTotalImpuesto(BigDecimal totalImpuesto) { + totalImpuesto_ = totalImpuesto; + } + + public void setTotalCargo(BigDecimal totalCargo) { + totalCargo_ = totalCargo; + } + + public void setTotalNeto(BigDecimal totalNeto) { + totalNeto_ = totalNeto; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Factura factura = (Factura) o; + return id_ == factura.id_; + } + + @Override + public int hashCode() { + return Objects.hash(id_); + } + + @Override + public String toString(){ + DecimalFormat f = new DecimalFormat("###,##0.00"); + + return "Factura[No = " + getClienteId() + ", cliente = " + getClienteNombre() + + ", numero de factura = " + getNumero() + ", fecha = " + getFecha() + + ", totalBruto = " + f.format(getTotalBruto()) + ", totalImpuesto = " + f.format(getTotalImpuesto()) + + ", totalCargo = " + f.format(getTotalCargo()) + ", totalDescuento = " + f.format(getTotalDescuento()) + + ", totalNeto = " + f.format(getTotalNeto()) + "]\n"; + } +} diff --git a/src/data/FacturaDetalle.java b/src/data/FacturaDetalle.java new file mode 100644 index 0000000..195b58f --- /dev/null +++ b/src/data/FacturaDetalle.java @@ -0,0 +1,140 @@ +package data; + +import java.math.BigDecimal; +import java.text.DecimalFormat; +import java.util.Objects; + +public class FacturaDetalle { + + private int idFactura_; // Factura + private short linea; + + private Articulo articulo_; + + static { + new Articulo(); + } + + private int cantidad_; + private BigDecimal descuento_; + private BigDecimal impuesto_; + private BigDecimal neto_; + + // Para insertar. + + public FacturaDetalle(int idFactura, Articulo articulo, int cantidad) { + idFactura_ = idFactura; + articulo_ = articulo; + setPrecio(articulo.getPrecio()); + setCantidad(cantidad); + } + + // Para mostrar. + FacturaDetalle(int idFactura, Articulo articulo, int cantidad, + BigDecimal descuento, BigDecimal impuesto, BigDecimal neto) { + idFactura_ = idFactura; + articulo_ = articulo; + setCantidad(cantidad); + setDescuento(descuento); + setImpuesto(impuesto); + setNeto(neto); + } + + + int getIdFactura() { + return idFactura_; + } + + int getArticuloId(){ + return articulo_.getId(); + } + + public String getArticuloCodigo(){ + return articulo_.getCodigo(); + } + + public String getArticuloNombre(){ + return articulo_.getNombre(); + } + + public String getArticuloDescripcion(){ + return articulo_.getDescripcion(); + } + + public BigDecimal getPrecio() { + return articulo_.getPrecio(); + } + + public int getCantidad() { + return cantidad_; + } + + public BigDecimal getDescuento() { + return descuento_; + } + + public BigDecimal getImpuesto() { + return impuesto_; + } + + public BigDecimal getNeto() { + return neto_; + } + + void setIdFactura(int idFactura) { + idFactura_ = idFactura; + } + + public void setLinea(short linea) { + this.linea = linea; + } + + private void setPrecio(BigDecimal precio) { + articulo_.setPrecio(precio); + } + + public void setCantidad(int cantidad) { + cantidad_ = cantidad; + } + + public void setDescuento(BigDecimal descuento) { + descuento_ = descuento; + } + + public void setImpuesto(BigDecimal impuesto) { + impuesto_ = impuesto; + } + + public void setNeto(BigDecimal neto) { + neto_ = neto; + } + + public short getLinea() { + return linea; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + FacturaDetalle that = (FacturaDetalle) o; + return idFactura_ == that.idFactura_ && + linea == that.linea; + } + + @Override + public int hashCode() { + return Objects.hash(idFactura_, linea); + } + + @Override + public String toString(){ + DecimalFormat f = new DecimalFormat("###,##0.00"); + + return "FacturaDetalle[línea = " + getLinea() + ", código = " + getArticuloCodigo() + + ", artículo = " + getArticuloNombre() + ", descripción = " + getArticuloDescripcion() + + ", cantidad = " + getCantidad() + ", precio = " + f.format(getPrecio()) + + ", impuesto = " + f.format(getImpuesto()) + ", descuento = " + f.format(getDescuento()) + + ", neto = " + f.format(getNeto()) + "]\n"; + } +} diff --git a/src/view/Main.java b/src/view/Main.java new file mode 100644 index 0000000..a763083 --- /dev/null +++ b/src/view/Main.java @@ -0,0 +1,105 @@ +package view; + +import javafx.application.Application; +import javafx.scene.control.TreeItem; +import javafx.scene.image.Image; +import javafx.scene.image.ImageView; +import javafx.stage.Stage; +import javafx.stage.WindowEvent; +import view.articulo.ArticuloController; +import view.cliente.ClienteActivoController; +import view.cliente.ClienteController; +import view.factura.FacturaController; + +import java.io.IOException; + +import static javafx.application.Platform.exit; + + +public class Main extends Application { + + + public static void main(String[] args) { + launch(args); + } + + @Override + public void start(Stage primaryStage) throws IOException { + primaryStage.getIcons().add(new Image("view/resources/main.png")); + primaryStage.setOnCloseRequest((WindowEvent e) -> + exit() + ); + ClienteController.start(primaryStage); + primaryStage.show(); + } + + public static TreeItem iniciarItems() { + ImageView iconCliente = new ImageView( + new Image(Main.class.getResourceAsStream("/view/resources/clientes.png")) + ); + iconCliente.setFitWidth(15); + iconCliente.setFitHeight(12); + TreeItem nodoClientes = new TreeItem<>("Ver clientes", iconCliente); + TreeItem rootCliente = new TreeItem<>("Cliente"); + rootCliente.getChildren().add(nodoClientes); + + ImageView iconArticulo = new ImageView( + new Image(Main.class.getResourceAsStream("/view/resources/articulos.png")) + ); + iconArticulo.setFitWidth(15); + iconArticulo.setFitHeight(12); + TreeItem nodoArticulos = new TreeItem<>("Ver articulos", iconArticulo); + TreeItem rootArticulo = new TreeItem<>("Articulo"); + rootArticulo.getChildren().add(nodoArticulos); + + + ImageView iconFactura = new ImageView( + new Image(Main.class.getResourceAsStream("/view/resources/facturas.png")) + ); + iconFactura.setFitWidth(15); + iconFactura.setFitHeight(12); + TreeItem nodoFacturas = new TreeItem<>("Ver facturas", iconFactura); + ImageView iconComprar = new ImageView( + new Image(Main.class.getResourceAsStream("/view/resources/comprar.png")) + ); + iconComprar.setFitWidth(15); + iconComprar.setFitHeight(12); + TreeItem nodoCompras = new TreeItem<>("Efectuar una compra", iconComprar); + TreeItem rootFactura = new TreeItem<>("Factura"); + rootFactura.getChildren().add(nodoFacturas); + rootFactura.getChildren().add(nodoCompras); + + + TreeItem root = new TreeItem<>("NULL"); + root.getChildren().addAll(rootCliente, rootArticulo, rootFactura); + + return root; + + } + + public static void cambiarScene(Stage primaryStage, TreeItem item) { + if (item == null) + return; + try { + switch (item.getValue()) { + case "Ver clientes": + ClienteController.start(primaryStage); + break; + case "Ver facturas": + FacturaController.start(primaryStage); + break; + case "Ver articulos": + ArticuloController.start(primaryStage); + break; + case "Efectuar una compra": + ClienteActivoController.start(primaryStage); + break; + } + + } catch (IOException e) { + e.printStackTrace(); + } + + } + +} \ No newline at end of file diff --git a/src/view/RadioButtonCell.java b/src/view/RadioButtonCell.java new file mode 100644 index 0000000..d4583dc --- /dev/null +++ b/src/view/RadioButtonCell.java @@ -0,0 +1,54 @@ +package view; + +import com.jfoenix.controls.JFXRadioButton; +import javafx.beans.value.ObservableValue; +import javafx.geometry.Pos; +import javafx.scene.control.TableCell; +import javafx.scene.control.Toggle; +import javafx.scene.control.ToggleGroup; +import javafx.scene.layout.HBox; + +import java.util.EnumSet; + +public class RadioButtonCell> extends TableCell { + + private final EnumSet enumeration; + + public RadioButtonCell(EnumSet enumeration) { + this.enumeration = enumeration; + } + + @Override + protected void updateItem(T item, boolean empty) + { + super.updateItem(item, empty); + setGraphic(null); + if (!empty) + { + // gui setup + HBox hb = new HBox(7); + hb.setAlignment(Pos.CENTER); + final ToggleGroup group = new ToggleGroup(); + + // create a radio button for each 'element' of the enumeration + for (Enum enumElement : enumeration) { + JFXRadioButton radioButton = new JFXRadioButton(enumElement.toString()); + radioButton.setUserData(enumElement); + radioButton.setToggleGroup(group); + hb.getChildren().add(radioButton); + if (enumElement.equals(item)) { + radioButton.setSelected(true); + } + } + + // issue events on change of the selected radio button + group.selectedToggleProperty().addListener((ObservableValue observable, Toggle oldValue, + Toggle newValue) -> { + getTableView().edit(getIndex(), getTableColumn()); + //noinspection unchecked + RadioButtonCell.this.commitEdit((T) newValue.getUserData()); + }); + setGraphic(hb); + } + } +} \ No newline at end of file diff --git a/src/view/articulo/Articulo.fxml b/src/view/articulo/Articulo.fxml new file mode 100644 index 0000000..f482f1d --- /dev/null +++ b/src/view/articulo/Articulo.fxml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/view/articulo/ArticuloActivo.fxml b/src/view/articulo/ArticuloActivo.fxml new file mode 100644 index 0000000..5380082 --- /dev/null +++ b/src/view/articulo/ArticuloActivo.fxml @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/view/articulo/ArticuloActivoController.java b/src/view/articulo/ArticuloActivoController.java new file mode 100644 index 0000000..2112867 --- /dev/null +++ b/src/view/articulo/ArticuloActivoController.java @@ -0,0 +1,149 @@ +package view.articulo; + +import com.jfoenix.controls.JFXButton; +import com.jfoenix.controls.JFXTextField; +import data.Articulo; +import data.Cliente; +import javafx.fxml.FXML; +import javafx.fxml.FXMLLoader; +import javafx.fxml.Initializable; +import javafx.scene.Parent; +import javafx.scene.Scene; +import javafx.scene.control.*; +import javafx.scene.control.cell.PropertyValueFactory; +import javafx.stage.Stage; +import view.Main; +import view.cliente.ClienteActivoController; +import view.factura.FacturaActivaController; + +import java.io.IOException; +import java.net.URL; +import java.util.HashMap; +import java.util.ResourceBundle; + +public class ArticuloActivoController implements Initializable { + @FXML + private Label id_; + @FXML + private Label nombre_; + @FXML + private Label email_; + + private static Stage primaryStage; + private static Cliente cliente_; + + public static void start(Stage stage, Cliente cliente) throws IOException { + primaryStage = stage; + cliente_ = cliente; + Parent root = FXMLLoader.load(ArticuloActivoController.class.getResource("ArticuloActivo.fxml")); + Scene scene = new Scene(root); + primaryStage.setScene(scene); + primaryStage.setTitle("Seleccione articulos"); + + } + + @FXML + private TableView tableView; + @FXML + private TableColumn columnaNo; + @FXML + private TableColumn columnaNombre; + @FXML + private TableColumn columnaDescripcion; + @FXML + private TableColumn columnaPrecio; + @FXML + private TableColumn columnaUnidadesStock; + @FXML + private TableColumn columnaCodigo; + + private void initTabla() { + columnaNo.setCellValueFactory(new PropertyValueFactory<>("id")); + columnaNombre.setCellValueFactory(new PropertyValueFactory<>("nombre")); + columnaDescripcion.setCellValueFactory(new PropertyValueFactory<>("descripcion")); + columnaPrecio.setCellValueFactory(new PropertyValueFactory<>("precio")); + columnaUnidadesStock.setCellValueFactory(new PropertyValueFactory<>("unidadesStock")); + columnaCodigo.setCellValueFactory(new PropertyValueFactory<>("codigo")); + } + + + @FXML + private TreeView treeView; + + private final HashMap articulos = new HashMap<>(); + private Articulo articulo = new Articulo(); + + @Override + public void initialize(URL location, ResourceBundle resources) { + // Inicializa labels + id_.setText(String.valueOf(cliente_.getId())); + nombre_.setText(cliente_.getNombre()); + email_.setText(cliente_.getEmail()); + //--------------------- + + initTabla(); + tableView.getSelectionModel().selectedItemProperty().addListener( + (v, oldValue, newValue) -> { + if (newValue == null) + return; + articulo = newValue; + cantidad.setDisable(false); + botonAgregar.setDisable(false); + } + ); + tableView.getSelectionModel().selectedItemProperty().removeListener( + (v, oldValue, newValue) -> { + cantidad.setDisable(true); + botonAgregar.setDisable(true); + } + ); + tableView.setItems(business.Articulo.mostrarActivos()); + treeView.setRoot(Main.iniciarItems()); + treeView.getSelectionModel().selectedItemProperty().addListener((v, oldValue, newValue) -> + Main.cambiarScene(primaryStage, newValue)); + } + + @FXML + private void volver() throws IOException { + ClienteActivoController.start(primaryStage); + } + + @FXML + private void continuar() throws IOException { + + FacturaActivaController.start(primaryStage, cliente_, articulos); + } + + + @FXML + private void seleccionar() { + tableView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE); + } + + + @FXML + private JFXButton botonContinuar; + @FXML + private JFXButton botonAgregar; + @FXML + private JFXButton botonRemover; + @FXML + private JFXTextField cantidad; + + @FXML + private void agregar() { + articulos.put(articulo, Integer.parseUnsignedInt(cantidad.getText())); + botonRemover.setDisable(false); + botonContinuar.setDisable(false); + } + + @FXML + private void remover() { + articulos.remove(articulo); + articulos.remove(articulo); + if (articulos.isEmpty()) { + botonRemover.setDisable(true); + botonContinuar.setDisable(true); + } + } +} diff --git a/src/view/articulo/ArticuloController.java b/src/view/articulo/ArticuloController.java new file mode 100644 index 0000000..4f16c22 --- /dev/null +++ b/src/view/articulo/ArticuloController.java @@ -0,0 +1,202 @@ +package view.articulo; + +import com.jfoenix.controls.JFXTextArea; +import com.jfoenix.controls.JFXTextField; +import com.jfoenix.validation.DoubleValidator; +import com.jfoenix.validation.IntegerValidator; +import data.Articulo; +import data.Estatus; +import javafx.fxml.FXML; +import javafx.fxml.Initializable; +import javafx.scene.Parent; +import javafx.scene.Scene; +import javafx.scene.control.Alert; +import javafx.scene.control.TableColumn; +import javafx.scene.control.TableView; +import javafx.scene.control.TreeView; +import javafx.scene.control.cell.PropertyValueFactory; +import javafx.scene.control.cell.TextFieldTableCell; +import javafx.stage.Stage; +import javafx.util.converter.BigDecimalStringConverter; +import javafx.util.converter.IntegerStringConverter; +import view.Main; +import view.RadioButtonCell; + +import java.io.IOException; +import java.math.BigDecimal; +import java.net.URL; +import java.util.EnumSet; +import java.util.ResourceBundle; + +import static javafx.fxml.FXMLLoader.load; + +public class ArticuloController implements Initializable { + + private static Stage primaryStage; + + public static void start(Stage stage) throws IOException { + primaryStage = stage; + Parent root = load(ArticuloController.class.getResource("Articulo.fxml")); + Scene scene = new Scene(root); + primaryStage.setScene(scene); + primaryStage.setTitle("Ver Articulos"); + } + + @FXML + private TableView tableView; + @FXML + private TableColumn columnaNo; + @FXML + private TableColumn columnaNombre; + @FXML + private TableColumn columnaDescripcion; + @FXML + private TableColumn columnaPrecio; + @FXML + private TableColumn columnaUnidadesStock; + @FXML + private TableColumn columnaCodigo; + @FXML + private TableColumn columnaEstatus; + + private void initTabla() { + columnaNo.setCellValueFactory(new PropertyValueFactory<>("id")); + columnaNombre.setCellValueFactory(new PropertyValueFactory<>("nombre")); + columnaDescripcion.setCellValueFactory(new PropertyValueFactory<>("descripcion")); + columnaPrecio.setCellValueFactory(new PropertyValueFactory<>("precio")); + columnaUnidadesStock.setCellValueFactory(new PropertyValueFactory<>("unidadesStock")); + columnaCodigo.setCellValueFactory(new PropertyValueFactory<>("codigo")); + columnaEstatus.setCellValueFactory(new PropertyValueFactory<>("estatus")); + + columnaCodigo.setCellFactory(TextFieldTableCell.forTableColumn()); + columnaNombre.setCellFactory(TextFieldTableCell.forTableColumn()); + columnaDescripcion.setCellFactory(TextFieldTableCell.forTableColumn()); + columnaUnidadesStock.setCellFactory(TextFieldTableCell.forTableColumn( + new IntegerStringConverter() + )); + columnaPrecio.setCellFactory(TextFieldTableCell.forTableColumn( + new BigDecimalStringConverter() + )); + + columnaEstatus.setCellFactory((param) -> new RadioButtonCell<>(EnumSet.allOf(Estatus.class))); + } + + @FXML + private TreeView treeView; + + @FXML + private JFXTextField nombre; + @FXML + private JFXTextArea descripcion; + @FXML + private JFXTextField unidadesStock; + @FXML + private JFXTextField precio; + @FXML + private JFXTextField codigo; + + @Override + public void initialize(URL location, ResourceBundle resources) { + initTabla(); + tableView.setItems(business.Articulo.mostrar()); + + treeView.setRoot(Main.iniciarItems()); + treeView.getSelectionModel().selectedItemProperty().addListener((v, oldValue, newValue) -> + Main.cambiarScene(primaryStage, newValue)); + tableView.getSelectionModel().selectedItemProperty().addListener( (v, oldValue, newValue) -> + articulo = newValue + ); + + unidadesStock.getValidators().add(new IntegerValidator("Solo numeros naturales")); + unidadesStock.focusedProperty().addListener((o, oldValue, newValue) -> { + if (!newValue) + unidadesStock.validate(); + }); + + precio.getValidators().add(new DoubleValidator("Solo numeros reales no negativos")); + + precio.focusedProperty().addListener((o, oldValue, newValue) -> { + if (!newValue) + precio.validate(); + }); + } + + @FXML + private void buscar() { + tableView.setItems(business.Articulo.buscar(nombre.getText())); + } + + + private boolean haConfirmado() { + String mensaje = ("Codigo: " + codigo.getText() + "\n") + + "Nombre: " + nombre.getText() + "\n" + + "Descripcion: " + descripcion.getText() + "\n" + + "Unidades en Stock: " + unidadesStock.getText() + "\n" + + "Precio: " + precio.getText() + "\n"; + + Alert alerta = new Alert(Alert.AlertType.CONFIRMATION); + alerta.setTitle("\"¿Desea continuar?\""); + alerta.setHeaderText(mensaje); + return alerta.showAndWait().isPresent(); + } + + private void clear() { + codigo.setText(""); + nombre.setText(""); + descripcion.setText(""); + unidadesStock.setText(""); + precio.setText(""); + } + + @FXML + private void agregar() { + if (haConfirmado()) { + String context = business.Articulo.insertar(codigo.getText(), nombre.getText(), descripcion.getText(), + new BigDecimal(precio.getText()), Integer.parseInt(unidadesStock.getText())); + Alert insercion = new Alert(Alert.AlertType.INFORMATION, context); + insercion.show(); + tableView.setItems(business.Articulo.mostrar()); + clear(); + } + } + + private Articulo articulo = new Articulo(); + + @FXML + private void actualizar(TableColumn.CellEditEvent newValue){ + + Articulo articulo = (Articulo) newValue.getTableView().getItems().get( + newValue.getTablePosition().getRow() + ); + if (articulo == null) + return; + if (newValue.getNewValue().equals(newValue.getOldValue())) + return; + + TableColumn col = newValue.getTableColumn(); + String value = newValue.getNewValue().toString(); + if(col.equals(columnaNombre)){ + articulo.setNombre(value); + } else if (col.equals(columnaCodigo)){ + articulo.setCodigo(value); + } else if (col.equals(columnaDescripcion)){ + articulo.setDescripcion(value); + } else if(col.equals(columnaPrecio)){ + articulo.setPrecio(new BigDecimal(value)); + } else if (col.equals(columnaEstatus)){ + articulo.setEstatus(Estatus.valueOf(newValue.getNewValue().toString().toUpperCase())); + } else if (col.equals(columnaUnidadesStock)){ + articulo.setUnidadesStock(Integer.parseInt(value)); + } + + String context = business.Articulo.actualizar(articulo.getId(), articulo.getCodigo(), + articulo.getNombre(), articulo.getDescripcion(), articulo.getPrecio(), + articulo.getUnidadesStock(), articulo.getEstatus()); + Alert insercion = new Alert(Alert.AlertType.INFORMATION, context); + insercion.show(); + tableView.setItems(business.Articulo.mostrar()); + + } + + +} diff --git a/src/view/cliente/Cliente.fxml b/src/view/cliente/Cliente.fxml new file mode 100644 index 0000000..70fb4a3 --- /dev/null +++ b/src/view/cliente/Cliente.fxml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/view/cliente/ClienteActivo.fxml b/src/view/cliente/ClienteActivo.fxml new file mode 100644 index 0000000..7c3e00b --- /dev/null +++ b/src/view/cliente/ClienteActivo.fxml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/view/cliente/ClienteActivoController.java b/src/view/cliente/ClienteActivoController.java new file mode 100644 index 0000000..832f969 --- /dev/null +++ b/src/view/cliente/ClienteActivoController.java @@ -0,0 +1,105 @@ +package view.cliente; + +import com.jfoenix.controls.JFXButton; +import com.jfoenix.controls.JFXTextField; +import data.Cliente; +import javafx.fxml.FXML; +import javafx.fxml.FXMLLoader; +import javafx.fxml.Initializable; +import javafx.scene.Parent; +import javafx.scene.Scene; +import javafx.scene.control.TableColumn; +import javafx.scene.control.TableView; +import javafx.scene.control.TreeView; +import javafx.scene.control.cell.PropertyValueFactory; +import javafx.stage.Stage; +import view.Main; +import view.articulo.ArticuloActivoController; + +import java.io.IOException; +import java.net.URL; +import java.util.ResourceBundle; + +public class ClienteActivoController implements Initializable { + + private static Stage primaryStage; + + public static void start(Stage stage) throws IOException { + primaryStage = stage; + Parent root = FXMLLoader.load(ClienteActivoController.class.getResource("ClienteActivo.fxml")); + Scene scene = new Scene(root); + primaryStage.setScene(scene); + primaryStage.setTitle("Seleccione cliente"); + + } + + @FXML + private TreeView treeView; + + @FXML + private TableView tableView; + @FXML + private TableColumn columnaNo; + @FXML + private TableColumn columnaNombre; + @FXML + private TableColumn columnaEmail; + @FXML + private TableColumn columnaTelefono; + @FXML + private TableColumn columnaDireccion; + @FXML + private TableColumn columnaPais; + @FXML + private TableColumn columnaCiudad; + @FXML + private TableColumn columnaCodigoPostal; + + private void initTabla() { + columnaNo.setCellValueFactory(new PropertyValueFactory<>("id")); + columnaNombre.setCellValueFactory(new PropertyValueFactory<>("nombre")); + columnaEmail.setCellValueFactory(new PropertyValueFactory<>("email")); + columnaTelefono.setCellValueFactory(new PropertyValueFactory<>("telefono")); + columnaDireccion.setCellValueFactory(new PropertyValueFactory<>("direccion")); + columnaPais.setCellValueFactory(new PropertyValueFactory<>("pais")); + columnaCiudad.setCellValueFactory(new PropertyValueFactory<>("ciudad")); + columnaCodigoPostal.setCellValueFactory(new PropertyValueFactory<>("codigoPostal")); + } + + @FXML + private JFXTextField nombre; + @FXML + private JFXButton botonSiguiente; + + + @Override + public void initialize(URL location, ResourceBundle resources) { + initTabla(); + tableView.setItems(business.Cliente.mostrarActivos()); + tableView.getSelectionModel().selectedItemProperty().addListener((v, oldValue, newValue) -> + { + cliente = newValue; + botonSiguiente.setDisable(cliente == null); + } + ); + treeView.setRoot(Main.iniciarItems()); + treeView.getSelectionModel().selectedItemProperty().addListener((v, oldValue, newValue) -> + Main.cambiarScene(primaryStage, newValue)); + + } + + @FXML + private void completarNombre() { + tableView.setItems(business.Cliente.buscarActivos(nombre.getText())); + } + + private Cliente cliente; + + @FXML + private void continuar() throws IOException { + if (cliente == null) + return; + ArticuloActivoController.start(primaryStage, cliente); + } + +} diff --git a/src/view/cliente/ClienteController.java b/src/view/cliente/ClienteController.java new file mode 100644 index 0000000..88e4e10 --- /dev/null +++ b/src/view/cliente/ClienteController.java @@ -0,0 +1,224 @@ +package view.cliente; + +import com.jfoenix.controls.JFXComboBox; +import com.jfoenix.controls.JFXTextField; +import data.Cliente; +import data.Estatus; +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; +import javafx.fxml.FXML; +import javafx.fxml.FXMLLoader; +import javafx.fxml.Initializable; +import javafx.scene.Parent; +import javafx.scene.Scene; +import javafx.scene.control.Alert; +import javafx.scene.control.TableColumn; +import javafx.scene.control.TableView; +import javafx.scene.control.TreeView; +import javafx.scene.control.cell.ChoiceBoxTableCell; +import javafx.scene.control.cell.PropertyValueFactory; +import javafx.scene.control.cell.TextFieldTableCell; +import javafx.stage.Stage; +import view.Main; +import view.RadioButtonCell; + +import java.io.IOException; +import java.net.URL; +import java.util.Collections; +import java.util.EnumSet; +import java.util.Locale; +import java.util.ResourceBundle; + +public class ClienteController implements Initializable { + + private static Stage primaryStage; + + public static void start(Stage stage) throws IOException { + primaryStage = stage; + Parent root = FXMLLoader.load(ClienteController.class.getResource("Cliente.fxml")); + Scene scene = new Scene(root); + primaryStage.setScene(scene); + primaryStage.setTitle("Ver Clientes"); + } + + @FXML + private JFXTextField nombre; + @FXML + private JFXTextField email; + @FXML + private JFXTextField telefono; + @FXML + private JFXTextField direccion; + @FXML + private JFXTextField ciudad; + @FXML + private JFXTextField codigoPostal; + + @FXML + private JFXComboBox paises; + + @FXML + private TableView tableView; + @FXML + private TableColumn columnaNo; + @FXML + private TableColumn columnaNombre; + @FXML + private TableColumn columnaEmail; + @FXML + private TableColumn columnaTelefono; + @FXML + private TableColumn columnaDireccion; + @FXML + private TableColumn columnaPais; + @FXML + private TableColumn columnaCiudad; + @FXML + private TableColumn columnaCodigoPostal; + @FXML + private TableColumn columnaEstatus; + + @FXML + private TreeView treeView; + + + private void initTabla() { + columnaNo.setCellValueFactory(new PropertyValueFactory<>("id")); + columnaNombre.setCellValueFactory(new PropertyValueFactory<>("nombre")); + columnaEmail.setCellValueFactory(new PropertyValueFactory<>("email")); + columnaTelefono.setCellValueFactory(new PropertyValueFactory<>("telefono")); + columnaDireccion.setCellValueFactory(new PropertyValueFactory<>("direccion")); + columnaPais.setCellValueFactory(new PropertyValueFactory<>("pais")); + columnaCiudad.setCellValueFactory(new PropertyValueFactory<>("ciudad")); + columnaCodigoPostal.setCellValueFactory(new PropertyValueFactory<>("codigoPostal")); + columnaEstatus.setCellValueFactory(new PropertyValueFactory<>("estatus")); + + columnaNombre.setCellFactory(TextFieldTableCell.forTableColumn()); + columnaEmail.setCellFactory(TextFieldTableCell.forTableColumn()); + columnaTelefono.setCellFactory(TextFieldTableCell.forTableColumn()); + columnaDireccion.setCellFactory(TextFieldTableCell.forTableColumn()); + columnaPais.setCellFactory(ChoiceBoxTableCell.forTableColumn(data)); + columnaCiudad.setCellFactory(TextFieldTableCell.forTableColumn()); + columnaCodigoPostal.setCellFactory(TextFieldTableCell.forTableColumn()); + columnaEstatus.setCellFactory((param) -> new RadioButtonCell<>(EnumSet.allOf(Estatus.class))); + } + + + @Override + public void initialize(URL location, ResourceBundle resources) { + llenarPaises(); + initTabla(); + tableView.setItems(business.Cliente.mostrar()); + tableView.getSelectionModel().selectedItemProperty().addListener((v, oldValue, newValue) -> + cliente = newValue + ); + treeView.setRoot(Main.iniciarItems()); + treeView.getSelectionModel().selectedItemProperty().addListener((v, oldValue, newValue) -> + Main.cambiarScene(primaryStage, newValue)); + } + + private final ObservableList data = FXCollections.observableArrayList(); + private void llenarPaises() { + data.add(""); + for (String countrylist : Locale.getISOCountries()) { + Locale pais = new Locale("", countrylist); + data.add(pais.getDisplayCountry()); + } + Collections.sort(data); + paises.setItems(data); + } + + private void clear() { + nombre.setText(""); + email.setText(""); + telefono.setText(""); + direccion.setText(""); + codigoPostal.setText(""); + ciudad.setText(""); + paises.getSelectionModel().select(null); + } + + @FXML + private void buscar() { + tableView.setItems(business.Cliente.buscar(nombre.getText())); + } + + private boolean haConfirmado() { + String mensaje = ("Nombre: " + nombre.getText() + "\n") + + "Email: " + email.getText() + "\n" + + "Telefono: " + telefono.getText() + "\n" + + "Direccion: " + direccion.getText() + "\n" + + "Pais: " + paises.getSelectionModel().getSelectedItem() + "\n" + + "Ciudad: " + ciudad.getText() + "\n" + + "Codigo Postal: " + codigoPostal.getText() + "\n"; + + Alert alerta = new Alert(Alert.AlertType.CONFIRMATION); + alerta.setTitle("\"¿Desea continuar?\""); + alerta.setHeaderText(mensaje); + return alerta.showAndWait().isPresent(); + } + + + @FXML + private void agregar() { + if (haConfirmado()) { + String context = business.Cliente.insertar( + nombre.getText(), direccion.getText(), ciudad.getText(), email.getText(), telefono.getText(), + codigoPostal.getText(), paises.getValue()); + Alert insercion = new Alert(Alert.AlertType.INFORMATION, context); + insercion.show(); + tableView.setItems(business.Cliente.mostrar()); + clear(); + } + + } + + private Cliente cliente = new Cliente(); + + @FXML + private void actualizar(TableColumn.CellEditEvent newValue) { + Cliente cliente = (Cliente) newValue.getTableView().getItems().get( + newValue.getTablePosition().getRow() + ); + if (cliente == null) + return; + if (newValue.getNewValue().equals(newValue.getOldValue())) + return; + + TableColumn col = newValue.getTableColumn(); + String value = newValue.getNewValue().toString(); + + if (col.equals(columnaNombre)){ + cliente.setNombre(value); + } else if(col.equals(columnaEmail)){ + if (value.toLowerCase().equals(newValue.getOldValue())) { + cliente.setEmail(newValue.getOldValue().toString()); + initTabla(); + return; + } else{ + cliente.setEmail(value.toLowerCase()); + } + } else if (col.equals(columnaTelefono)){ + cliente.setTelefono(value); + } else if (col.equals(columnaDireccion)){ + cliente.setDireccion(value); + } else if (col.equals(columnaCodigoPostal)){ + cliente.setCodigoPostal(value); + } else if (col.equals(columnaCiudad)){ + cliente.setCiudad(value); + } else if (col.equals(columnaPais)){ + cliente.setPais(value); + } else { + cliente.setEstatus(Estatus.valueOf(newValue.getNewValue().toString().toUpperCase())); + } + + String context = business.Cliente.actualizar( + cliente.getId(), cliente.getNombre(), cliente.getDireccion(), cliente.getCiudad(), cliente.getEmail(), + cliente.getTelefono(), cliente.getCodigoPostal(), cliente.getPais(), cliente.getEstatus() + ); + Alert insercion = new Alert(Alert.AlertType.INFORMATION, context); + insercion.show(); + tableView.setItems(business.Cliente.mostrar()); + + } +} diff --git a/src/view/factura/Factura.fxml b/src/view/factura/Factura.fxml new file mode 100644 index 0000000..f0549fe --- /dev/null +++ b/src/view/factura/Factura.fxml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/view/factura/FacturaActiva.fxml b/src/view/factura/FacturaActiva.fxml new file mode 100644 index 0000000..06cd7fa --- /dev/null +++ b/src/view/factura/FacturaActiva.fxml @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/view/factura/FacturaActivaController.java b/src/view/factura/FacturaActivaController.java new file mode 100644 index 0000000..ecc4865 --- /dev/null +++ b/src/view/factura/FacturaActivaController.java @@ -0,0 +1,200 @@ +package view.factura; + +import data.Articulo; +import data.Cliente; +import data.FacturaDetalle; +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; +import javafx.fxml.FXML; +import javafx.fxml.Initializable; +import javafx.scene.Parent; +import javafx.scene.Scene; +import javafx.scene.control.*; +import javafx.scene.control.cell.PropertyValueFactory; +import javafx.scene.control.cell.TextFieldTableCell; +import javafx.stage.Stage; +import javafx.util.converter.IntegerStringConverter; +import view.Main; +import view.articulo.ArticuloActivoController; + +import java.io.IOException; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.net.URL; +import java.text.DecimalFormat; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.util.Map; +import java.util.ResourceBundle; + +import static javafx.fxml.FXMLLoader.load; + +public class FacturaActivaController implements Initializable { + + private static data.Factura factura_ = new data.Factura(); + private static Stage primaryStage = new Stage(); + private static final ObservableList detalles_ = FXCollections.observableArrayList(); + + public static void start(Stage stage, Cliente cliente, + Map articulos) throws IOException { + primaryStage = stage; + factura_ = new data.Factura(cliente); + cargarDetalles(articulos); + Parent root = load(FacturaActivaController.class.getResource("FacturaActiva.fxml")); + Scene scene = new Scene(root); + primaryStage.setScene(scene); + primaryStage.setTitle("Confirmar factura"); + } + + + @FXML + private Label id; + @FXML + private Label nombre; + @FXML + private Label fecha; + @FXML + private Label hora; + @FXML + private Label totalBruto; + @FXML + private Label totalDescuento; + @FXML + private Label totalImpuesto; + @FXML + private Label totalCargo; + @FXML + private Label totalNeto; + + + @FXML + private TableView tableView; + @FXML + private TableColumn columnaNo; + @FXML + private TableColumn columnaCodigo; + @FXML + private TableColumn columnaNombre; + @FXML + private TableColumn columnaDescripcion; + @FXML + private TableColumn columnaCantidad; + @FXML + private TableColumn columnaPrecio; + @FXML + private TableColumn columnaDescuento; + @FXML + private TableColumn columnaImpuesto; + @FXML + private TableColumn columnaNeto; + + private void initTabla() { + columnaNo.setCellValueFactory(new PropertyValueFactory<>("linea")); + columnaCodigo.setCellValueFactory(new PropertyValueFactory<>("articuloCodigo")); + columnaNombre.setCellValueFactory(new PropertyValueFactory<>("articuloNombre")); + columnaDescripcion.setCellValueFactory(new PropertyValueFactory<>("articuloDescripcion")); + columnaCantidad.setCellValueFactory(new PropertyValueFactory<>("cantidad")); + columnaPrecio.setCellValueFactory(new PropertyValueFactory<>("precio")); + columnaDescuento.setCellValueFactory(new PropertyValueFactory<>("descuento")); + columnaImpuesto.setCellValueFactory(new PropertyValueFactory<>("impuesto")); + columnaNeto.setCellValueFactory(new PropertyValueFactory<>("neto")); + columnaCantidad.setCellFactory(TextFieldTableCell.forTableColumn(new IntegerStringConverter())); + calcularTotal(); + } + + private void calcularTotal() { + + BigDecimal bruto = new BigDecimal("0.00"); + BigDecimal descuento = new BigDecimal("0.00"); + BigDecimal impuesto = new BigDecimal("0.00"); + BigDecimal cargo = new BigDecimal(Math.random() * 300); + BigDecimal neto = new BigDecimal(cargo.doubleValue()); + for (FacturaDetalle detalle : detalles_) { + bruto = bruto.add(detalle.getPrecio().multiply(BigDecimal.valueOf(detalle.getCantidad()))); + descuento = descuento.add(detalle.getDescuento().multiply(BigDecimal.valueOf(detalle.getCantidad()))); + impuesto = impuesto.add(detalle.getImpuesto().multiply(BigDecimal.valueOf(detalle.getCantidad()))); + neto = neto.add(detalle.getNeto().multiply(BigDecimal.valueOf(detalle.getCantidad()))); + } + DecimalFormat format = new DecimalFormat("###,##0.00"); + factura_.setTotalBruto(bruto); + factura_.setTotalImpuesto(impuesto); + factura_.setTotalCargo(cargo); + factura_.setTotalDescuento(descuento); + factura_.setTotalNeto(neto); + + totalBruto.setText(format.format(factura_.getTotalBruto())); + totalDescuento.setText(format.format(factura_.getTotalDescuento())); + totalImpuesto.setText(format.format(factura_.getTotalImpuesto() )); + totalCargo.setText(format.format(factura_.getTotalCargo())); + totalNeto.setText(format.format(factura_.getTotalNeto())); + } + + @FXML + private TreeView treeView; + + @Override + public void initialize(URL location, ResourceBundle resources) { + initTabla(); + tableView.setItems(detalles_); + id.setText(String.valueOf(factura_.getClienteId())); + nombre.setText(factura_.getClienteNombre()); + fecha.setText(LocalDate.now().toString()); + hora.setText(LocalTime.now().format(DateTimeFormatter.ofPattern("HH:mm:ss"))); + treeView.setRoot(Main.iniciarItems()); + treeView.getSelectionModel().selectedItemProperty().addListener((v, oldValue, newValue) -> + Main.cambiarScene(primaryStage, newValue)); + } + + private static void cargarDetalles(Map articulos) { + factura_.getDetalles().clear(); + short linea = 0; + final double ITBIS = 0.18; + for (Map.Entry entry : articulos.entrySet()) { + FacturaDetalle detalle = new FacturaDetalle(factura_.getId(), entry.getKey(), entry.getValue()); + detalle.setLinea(++linea); + detalle.setImpuesto(new BigDecimal(ITBIS * detalle.getPrecio().doubleValue()) + .setScale(2, RoundingMode.CEILING)); + final double DESCT = 0.08 * Math.random(); + detalle.setDescuento(new BigDecimal( DESCT * detalle.getPrecio().doubleValue()) + .setScale(2, RoundingMode.CEILING)); + detalle.setNeto(detalle.getPrecio().add(detalle.getImpuesto()).subtract(detalle.getDescuento())); + factura_.getDetalles().add(detalle); + detalles_.add(detalle); + } + + } + + + @FXML + private void cambiarCantidad(TableColumn.CellEditEvent newValue){ + FacturaDetalle detalle = tableView.getSelectionModel().getSelectedItem(); + + if (detalle == null || newValue == null) + return; + if (newValue.getNewValue().equals(newValue.getOldValue())) + return; + + detalle.setCantidad((int)newValue.getNewValue()); + } + + @FXML + private void confirmar() throws IOException { + Alert alerta = new Alert(Alert.AlertType.CONFIRMATION); + alerta.setTitle("¿Desea continuar?"); + alerta.setHeaderText("Presione ok para confirmar la factura"); + if (alerta.showAndWait().isPresent()) { + Alert insercion = new Alert(Alert.AlertType.INFORMATION, + factura_.insertar()); + insercion.show(); + FacturaController.start(primaryStage); + } + } + + @FXML + private void cancelar() throws IOException { + detalles_.clear(); + ArticuloActivoController.start(primaryStage, factura_.getCliente()); + } + +} diff --git a/src/view/factura/FacturaController.java b/src/view/factura/FacturaController.java new file mode 100644 index 0000000..6ce9493 --- /dev/null +++ b/src/view/factura/FacturaController.java @@ -0,0 +1,109 @@ +package view.factura; + +import com.jfoenix.controls.JFXTextField; +import data.Factura; +import javafx.fxml.FXML; +import javafx.fxml.FXMLLoader; +import javafx.fxml.Initializable; +import javafx.scene.Parent; +import javafx.scene.Scene; +import javafx.scene.control.Button; +import javafx.scene.control.TableColumn; +import javafx.scene.control.TableView; +import javafx.scene.control.TreeView; +import javafx.scene.control.cell.PropertyValueFactory; +import javafx.stage.Stage; +import view.Main; + +import java.io.IOException; +import java.net.URL; +import java.util.ResourceBundle; + +public class FacturaController implements Initializable { + + private static Stage primaryStage; + + public static void start(Stage stage) throws IOException { + primaryStage = stage; + Parent root = FXMLLoader.load(FacturaController.class.getResource("Factura.fxml")); + Scene scene = new Scene(root); + primaryStage.setScene(scene); + primaryStage.setTitle("Ver Facturas"); + } + + @FXML + TableView tableView; + @FXML + private TableColumn columnaClienteNo; + @FXML + private TableColumn columnaClienteNombre; + @FXML + private TableColumn columnaNo; + @FXML + private TableColumn columnaFecha; + @FXML + private TableColumn columnaHora; + @FXML + private TableColumn columnaTotalBruto; + @FXML + private TableColumn columnaTotalDescuento; + @FXML + private TableColumn columnaTotalImpuesto; + @FXML + private TableColumn columnaTotalCargo; + @FXML + private TableColumn columnaTotalNeto; + + private void initTabla() { + columnaClienteNo.setCellValueFactory(new PropertyValueFactory<>("clienteId")); + columnaClienteNombre.setCellValueFactory(new PropertyValueFactory<>("clienteNombre")); + columnaNo.setCellValueFactory(new PropertyValueFactory<>("numero")); + columnaFecha.setCellValueFactory(new PropertyValueFactory<>("fecha")); + columnaHora.setCellValueFactory(new PropertyValueFactory<>("hora")); + columnaTotalBruto.setCellValueFactory(new PropertyValueFactory<>("totalBruto")); + columnaTotalDescuento.setCellValueFactory(new PropertyValueFactory<>("totalDescuento")); + columnaTotalImpuesto.setCellValueFactory(new PropertyValueFactory<>("totalImpuesto")); + columnaTotalCargo.setCellValueFactory(new PropertyValueFactory<>("totalCargo")); + columnaTotalNeto.setCellValueFactory(new PropertyValueFactory<>("totalNeto")); + } + + @FXML + private TreeView treeView; + + @Override + public void initialize(URL location, ResourceBundle resources) { + initTabla(); + tableView.setItems(business.Factura.mostrar()); + tableView.getSelectionModel().selectedItemProperty().addListener( + (v, oldValue, newValue) -> { + if (newValue == null) + return; + factura = newValue; + numero.setText(String.valueOf(factura.getNumero())); + botonVerDetalles.setDisable(false); + } + ); + treeView.setRoot(Main.iniciarItems()); + treeView.getSelectionModel().selectedItemProperty().addListener((v, oldValue, newValue) -> + Main.cambiarScene(primaryStage, newValue)); + } + + + @FXML + private JFXTextField numero; + @FXML + private Button botonVerDetalles; + private Factura factura = new Factura(); + + @FXML + private void verDetalles() throws IOException { + // Cargame un stage con los detalles, envia cliente No y ClienteNombre + numero.clear(); + botonVerDetalles.setDisable(true); + Stage primaryStage = new Stage(); + FacturaDetallesController.start(primaryStage, factura); + tableView.setItems(business.Factura.mostrar()); + } + + +} diff --git a/src/view/factura/FacturaDetalles.fxml b/src/view/factura/FacturaDetalles.fxml new file mode 100644 index 0000000..6b3d655 --- /dev/null +++ b/src/view/factura/FacturaDetalles.fxml @@ -0,0 +1,145 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/view/factura/FacturaDetallesController.java b/src/view/factura/FacturaDetallesController.java new file mode 100644 index 0000000..d0389a3 --- /dev/null +++ b/src/view/factura/FacturaDetallesController.java @@ -0,0 +1,127 @@ +package view.factura; + +import data.Factura; +import data.FacturaDetalle; +import javafx.fxml.FXML; +import javafx.fxml.FXMLLoader; +import javafx.fxml.Initializable; +import javafx.scene.Parent; +import javafx.scene.Scene; +import javafx.scene.control.Alert; +import javafx.scene.control.Label; +import javafx.scene.control.TableColumn; +import javafx.scene.control.TableView; +import javafx.scene.control.cell.PropertyValueFactory; +import javafx.stage.Stage; + +import java.io.IOException; +import java.net.URL; +import java.text.DecimalFormat; +import java.time.format.DateTimeFormatter; +import java.util.ResourceBundle; + +public class FacturaDetallesController implements Initializable { + private static Stage primaryStage; + private static Factura factura_; + + static void start(Stage stage, Factura factura) throws IOException { + primaryStage = stage; + factura_ = factura; + Parent root = FXMLLoader.load(FacturaDetallesController.class.getResource("FacturaDetalles.fxml")); + Scene scene = new Scene(root); + primaryStage.setScene(scene); + primaryStage.setTitle("Ver Facturas"); + primaryStage.showAndWait(); + } + + + @FXML + private TableView tableView; + @FXML + private TableColumn columnaNo; + @FXML + private TableColumn columnaCodigo; + @FXML + private TableColumn columnaNombre; + @FXML + private TableColumn columnaDescripcion; + @FXML + private TableColumn columnaCantidad; + @FXML + private TableColumn columnaPrecio; + @FXML + private TableColumn columnaDescuento; + @FXML + private TableColumn columnaImpuesto; + @FXML + private TableColumn columnaNeto; + + private void initTabla() { + columnaNo.setCellValueFactory(new PropertyValueFactory<>("linea")); + columnaCodigo.setCellValueFactory(new PropertyValueFactory<>("articuloCodigo")); + columnaNombre.setCellValueFactory(new PropertyValueFactory<>("articuloNombre")); + columnaDescripcion.setCellValueFactory(new PropertyValueFactory<>("articuloDescripcion")); + columnaCantidad.setCellValueFactory(new PropertyValueFactory<>("cantidad")); + columnaPrecio.setCellValueFactory(new PropertyValueFactory<>("precio")); + columnaDescuento.setCellValueFactory(new PropertyValueFactory<>("descuento")); + columnaImpuesto.setCellValueFactory(new PropertyValueFactory<>("impuesto")); + columnaNeto.setCellValueFactory(new PropertyValueFactory<>("neto")); + } + + @FXML + private Label id; + @FXML + private Label nombre; + @FXML + private Label numero; + @FXML + private Label fecha; + @FXML + private Label hora; + @FXML + private Label totalBruto; + @FXML + private Label totalDescuento; + @FXML + private Label totalImpuesto; + @FXML + private Label totalCargo; + @FXML + private Label totalNeto; + + @Override + public void initialize(URL location, ResourceBundle resources) { + initTabla(); + initLabels(); + tableView.setItems(business.Factura.mostrarDetalles(factura_.getId())); + } + + private void initLabels() { + id.setText(String.valueOf(factura_.getClienteId())); + nombre.setText(factura_.getClienteNombre()); + numero.setText(String.valueOf(factura_.getNumero())); + fecha.setText(factura_.getFecha().toString()); + hora.setText(factura_.getHora().format(DateTimeFormatter.ofPattern("HH:mm:ss"))); + DecimalFormat f = new DecimalFormat("###,##0.00"); + totalBruto.setText(f.format(factura_.getTotalBruto()));//.setScale(2, RoundingMode.CEILING).toPlainString() + totalDescuento.setText(f.format(factura_.getTotalDescuento())); + totalImpuesto.setText(f.format(factura_.getTotalImpuesto())); + totalCargo.setText(f.format(factura_.getTotalCargo())); + totalNeto.setText(f.format(factura_.getTotalNeto())); + } + + @FXML + private void cancelarOrden() { + Alert alerta = new Alert(Alert.AlertType.CONFIRMATION); + alerta.setTitle("¿Desea cancelar la factura?"); + alerta.setHeaderText("La factura va a ser cancelada."); + if (alerta.showAndWait().isPresent()) { + Alert insercion = new Alert(Alert.AlertType.INFORMATION, + business.Factura.eliminar(factura_.getId())); + insercion.show(); + primaryStage.close(); + } + + } + +} diff --git a/src/view/resources/aceptar.png b/src/view/resources/aceptar.png new file mode 100644 index 0000000000000000000000000000000000000000..2024f1da3c8485c8a371f63e707474cca937c69f GIT binary patch literal 2540 zcmVFapacoXEJy(v3L+G69uOHs?eL!9fG8?X6tQSUIxVMF72oqA zDo#njuSWvL5`R?^ud!Kdw`F?-Dz3!X3>D#_9?~Z?aO1Ey^RxyJDQlxXC^)MH8Yu|0z zf>8^)wf46rY=i-jDI;dZ$noVcw$tc>uNrn$b*!ZVKyV@T5M6r~_5ASJks z+s3dIDQmTrR1nj)n73vwmGyh`aPmC>2Nyy!8F)qK0n26&eK^ahxrmryG<1-nsoENv zLRFrCD?q|BdFbP5tlPDUpc^6@$kRRpGw93^#xR&F))G3)$`8M?`_QEi48A8jX^?~! zPucS}5|C12A0N`j@A4BdVm$ECJ(TWWOP(KMK-lC%K4-n-6jjP|rg3%0+}ugM+H~)m z74W!UTD^Rcg`9d8=Eq*uW7s?Q4*0RpmKJf#05pWOP;(Nn5K==*L54Sj>TnISSIwln z`YZAR5V4@z;P*s%^Tb0uoiu_B&&~*r@6*2c%6^3t3LPZV10fU2qb#+< z+|B~R%>j6fu0fA)dY88C#$Mi`xa}o*?MU|qK!Ro4NJR44%Z7bhd2ZSA$C%GN&P0ze z@%r8)-?+2i&5pQfVcRIv@}JGC%0renhy8Ws%=u&%(mYC<8yXT&7UnJaIa67KNs}A^ zUO!L%_lV1H>fEXe5=)tmnIZKvra&WVN_rI)k(-q^p>j&Y0^TIX>F80WP3}ML7dQ1B zrN_(&mITn6IMIBzHVlAT(&IKBTOrNSbfW zntf||`OgcY?H&WT)@IX+ggGQV=$puvCRqClE+9|cFJByAk~M;fm3txe_KCb&DS4MkPf;A$#g}c!h6~4!{s}x6K4oz@^0y zmQ_eCLeSX?r{)07LL3jHsSgafX@0(`K2Q)J7JnnMf&@y4K8u|%PVP7A?jG%mi5fA$ zKJg=k4S)b_EZ*JnF@M_o356M;>&m=w_!yIz$D07B7oY=Wu1v0vhsi1G067^Dk#)qx z5j+kb9^H?wON3@4goW4T!XlnsR$IBd=J%9#c^6m7MAuulT{dd!C9R8yn=#crkbtc~ zs5L?eYzz!L#@m}drL=54g_$5!Z0{+T;BLC*L5F0G(SB@-D^a%c?nH3Dv(CRs!kG0?)R&=7H0l3?u`swdBn;IFGyw>Z&8eMuMHUSq4Y$muZJ-Ftbb)j# zY)c@ez_zs{0%_|UGb%AH!TQ}h*>T`&0y@~JZL_aF#0|$DVGF=n1xSC2`#tbNK{5Pj zJV>d`t9`2mG#^A8P|p%<(}A#k=rVwAr=i(?6w(iti?CS-(#K!+?q=IJd+=yrNmcpX z)lsev&15IQSqDg)&BZNl^Q>=d;D)0QafGv!c0wY-Vg&3zU=z23 zxJk#Q$iS7dPJMQghC;Y;>H^&XL1#Lh{6pAwxRft;l;H$y0Tp3Z*F+hUYW|#dfCmZY zWKf!$$wiZ|=|K1VTnseTh13q%ssjmyMI4g|7E$8V;v}7R3}Vf`b*$c4iw+o4T@QX& zA7|3hX@qFfIqv{Jr_qA<<1yHEAcTW7++^TX6;~*O&D~Jd4W4815g-qb-H!kL>uaptvk{*Qq88Ldd1l9CX7ewU#>r%|qA^Cz{>lmth3iR}I;I66 zaN@v61{ri9m)^u;US8VpOV%aL``yYswNYlJnm_*?05ayYq)Qua@dv==0EZKtj^hX% z!i`h-lCy`Z#yT1zQ9LdP8Q66Rrf(?AFX2oUO7g;F#o zFdO3hq;w*$ah~M(mba@z1{K)>+N1{1{$W1lqSs&$Pjc(liG09$l;B&G|10Ka`?=4d z6VZeUfv%|;O;-UN3CV$&$&Atotl~dPEws==i~bHdJSt6MTLu>Z0000ftc#P}dF-5LlpEV|kuBS@A{SMPy@(Pi_6CCJ1c=_Z z+*>S3Q&h1ildcl| zA3AdOeD9K9`Gx}~N$PZC>+`?)50US8D?_V@k-tY$Q%iV#^oEMk14E;q9zEuAd*C=b zGxbnSuZsK>LD`7rhe-A>5KQ&$KjKCK_IQ1teSW;BZxD{zZ1$F#wY#?0^0-_iVL`0V zBkluBg?&Q+Cz8n*_rDejh2glgr117zZ^~54FSb}R>>C0YJo%4*dKbeuk34Xfskq>Z zc1wZ%-3P59+w^B$6NF5!&dR$8+?*N!V{kUm}!(rdHzEG={zIArks8+7x z;npzvS=)$4F1}}rX_>J9s=y5DC(XkNf~+pfex%j}CtC;2Uzoi{jq={IEC|c-6#mB( zy?w(@y;6MVrjpX!%x}K#EOw8p?6bkWKmNhPnd-bN*>aYU=PGRumCa`Dttob)h+4#F zy6g@YGYmQjAqXGilox61Dh<|2?;j3#>J-<2&C7L3p8xRp+R+KP6msNP=l37@?to_; zxOq65A|BdWT2qz{ClB>o=M3ylHzLnk@GdTgy?brJwkpHnw$a~y(vg!Xxe|6fo;dR5 z$(HuBP@=)h>dNw4ZrXm8@hl_od{y^sD6IE{7~1)*W605CPZCp8ZnH1x3~aA5&O=;q40)dy-u@t&&_#;oU4y&S%4YTj~a(46uEm-32-KG zqP}5ZzRifmbM$0yIGW&)31yC6Et3clBv%w z@7`! z{^;-S<@0&hIKm|ZW>7zD9K<+m2uq;qi7{6kCl{bX)=8v@JcDXYNmi{QtbdJr5o zV<6yh;JpH+7$VjyAGLzob=Ag;hRb2qt~BgjU--`H{+@;wI8(K|qVs!%O^ zd{@O>1fFYcgZ9Zj+lM2rTh|qCF3&zZWM{EZI6pdWL3l#gEzCFOV(i)~e>?B{^p_iw9rm;4hE!!BwHAD27GAn@$(aF zi*;Z;--gfSloV;7{F|yzT83YGznLINtwQwd{hJQ_`9mN!i&Q)PB)1_R@RJ zYL#S1bzVuPgfUJg@lTqEPMn`uVNeZ>n7z~Zd-eU1AgyrzBK>)Bz;mj`aAJFP-W_Qv zF1P~oZ35oV{`Xrz2M`Jua+4&rK-I2M7mVKFkFGA$yE=RQ@qi&~Lw`E7$;JHp>dJ0i zU-;UW-EV(>zI)KVz0%k;Xlw4Zt}4)gs<~?EldoEC-c%Nfrkq_-cuSsf*?^}4(N{li z$4LrQ?TI8R@)xcgMpbtx4*P-K)p@`PQ5qq?F4QCb=yPwK@rC1i)))CPRtClzJWfxR zPN(j-h33p80`8iMoXsn8zHABUf{4SR(@a&&XL$U!?TLY2xW%^51g}u>~FMNM(>6VHd7%`NV(>_0J zU05>B!G=+XCj`kXFzMa3%BWXL+Pf{o=Bdhj^}SomzUUmeFk<=rryVd&MvV;KlEjIl z4LxvK7EiPwye}oN$&mR)=h&04AFErLn-XxDlc4IsrlD{mb>C(aBpcvtyEsbQo&M+A zMnF}l8QKETovVz@dDx;2nx}%Q3Kqr%r`Hx~DH0j;gQm# zMkXC9sSwt7NsclWPaQhluShzfOC*slmUa=qu)yH?#eH=jH4L8Zu>@_?P!*#Jc6)j*m_Ts6ejr7X%3O^!Q;JXsffLgXpMNSSlnO8& z772uU$6W(fFS8{^QFPCSBG|*->T0%^`GGX;dn`*Hb<}6S*nMVbd;u$hTh2!8V3_NDc31vv#4Ijw9oBl zVQfQb4o^tuVTTzfNo4;=?NBzC8x*M&@w5LrUZ|5leb2@}ynkHE!KZPYo(G+BOq5fS?QnSnA_4O$D2j+OMCxp{W8C$Z))5v(KCs=iqtck}LRA8a zPJ>+Ggdbl<;PVi25p?IOJXotwzS{)p9`-BGJyiSJ$-b^W>r-zWhXoAbBts>AY-fdD zHnZ1(wF;^pY#fZ^lrk$*o(WM0!Bd3C;qkhBJP|*?+{hR5aZrq+V9I7bj6%Y`u*>Wb zNCetkjc3yO-syoe7p(VfErl-cl$$2!UyrIz!M8IMGI4rKj3V@0aM&D`RtfU@e0GYYi#Cm1im?}0R4xvf4J9i@ zN9n_@Be7`W<5T?@MSgE%@ie3&o1dHB-`%_>|I_KXWz;ren-+?NS;j03!@_}xe>yPj z_DM4&9JwgBAP3{nABxhGHmj=L15~j{Jip8+k_ab;$5E&%()Y~Mz{r%{>$Xqv1w0-r zg{1v?#2%E3ms4T7QIypavbX~_{_1Q6)YYduMmciv z6R#gnQHV~jbyAc*>y*~To6N*00LUo>jSoypP^NuuF@2MC1sqHq$k&9bHjtnWpg;}l8Pec3M`zyeHABpfjD{3uGPy3+|p+U5g;r>1#;-z z1cgvaslb$@=(J8l)P?C#X_T@IiNo(>#7Xl(o+ZI`(=XH7fiDn*-R^NY+&nQaLoUlV z8W4Ivl!Uop%wXe@h{uDzFkdVwEGqKYC&v(5KZ<4}U2GStdAO63_1lM}Xc9T&I;bt;h(Vz9a>6k;3w01}`^VXeY( z-}ym_L~L4791I8H43moJXA+Ppm)-5KI@u_$)@A18)AyFcem_hcSURoFz<58Dds3xv;j%l63XJz`DTS@lFJEqk-U8#ox_w!I&-6~h=rq~c8m+p$tt&6j0F2|K z6G?)=g!~x>pukB!k5^J!oL^`ho|ufqVi*^zs;uJi=oA7elv&{veN06{;f~fWp-@m% zl0V$vE0@pQf(PfG_WC9!oMi^pkM7@`-W4J~e-IwXb#3|=4Ggt>lB5I@aYlv=hD%F| zph~48Q>h#p9&=7jb+(@?D9n>9G7ua`(`%B)<%tABB9+2eh=4zP6B9ffMImz8tPY3O zfnn_O6{T=Zh*IgL&Pt|IR*Nkdh?)$VyZ&}HgUYnA@dWWXF2>-%+O0ygV->sg&vP2xnFidHp4CXGa*s!T;+?|@h=hAxvQO8M?|1svka7Hy@R0uY2D( zbo0TaARhC^=1#hCx~?8h41XE;GJ_+3NcrIN`d?n1D5Q;t8A8 z9*f24luFSUhTNP@n>K(}L_9GvJRXlH(hRT=2_`au16wAnU>WfFD=Ny@tX>6G6CJxD zC#P_WWfDO-3XFK>zM3a)U$cO=CwgJUg^G72ZwExa7%O(!;l-%9Bjxy=>-V|c#`;kG zRY0!i`{AiT6bj77UTc<4Bj5|&Zuh$NYtuc{iBt7TrE+S@lcm$*1QCsdIVd4hYOGef zNF)sVoEvMm@zWkYIy{(2Bru-HX0wB;w{I-ER8?qidEb7<_KYLty!PQq+0v&p|L}9& z)0geNp8L`&nQ-4tEBCA~q_KO(z~N)j81R5#5VQ*N@`?)!$IWK9(?#MqhYkB@X;o!~ zLY{H#=wTKuDl3^x`5^=a!%$^Ca$n75QK7vv{pY8xKWF@Qe*2~V-xM4Lb37U!eZ{qZ zes7Qn{@VF6ju8K%d*;$>e%oIFFlxj8K1-`H8jTJ04KsDZu#|FoCKMOUq> zLDFgHtIs~#uw{qcVYgbXrF!a)EnBaI3hiw4?42Wb+fuemyGHawx!RfJ)X>qe9o>nf zw;3}JiVhhfw&>l0cXmj3EO_s?{S^vTB!-{`1qNL~ zuwbpi?6x(XVFgeBWc4q8vdwlCT4;}q@4GDRr42(cF2%(tjCpV<4m>AQ$w$WaU242E z-yT9;4cL2Yia)3yXzlLSdvy8v1qdCbNrZ&3lo}ZuwwTS5n3Wa5b<#lv&&B2!UFCxN zUHg56Z|)_Uj{I{P&bNe@fXApx|D_MWo#0<28F^yz$=~Mu`$hIk{-YLOIDV*U2tpbw zop8i-+{C?210t+vd+^3wkT0Jc-0_WfJS8oEc$oID(e^M%n#7Kw}ak#!Yk zh1~F&3!8#b>9JF-O|9KGZQoq8e)WR;>8C^WNixYt`LnvsEl!3RS#YO=Lvk2AYL;`B znTjT&M*~N9%XTj#Ftl(adhAqVOZ(YW3g;k62|u*K)Veai2jk!gk90jx=m~IA~EX|1k1;gmI+jkawU6^^sjG@ zooZ-k>0m7NI?Zjj>@3VT!g1}uR!ek(VS6d_g>rHEf=@9?OOG34J z+Wyt?9IZ4(%9Zkgs{Ta+183lF1nom03`JN(B8x5mN4EN>^G$-`$frlXy3jv3A9ekj zs;htf1IhTSlV@5x&drb%7u<5wwmW^ddt%=7;L!i(9@w~Y<2R4+f7&O_8ftRHa7d zpvulNyu9wYC6!MfJ88Ys-Nkjs80o=b z5Na>J@OVH2K?WLbLmJka1;Xu^aklJCo3Sja~-QOR9ZOMdgbo?8!dBH(g6e3SVP9!^>B5@*Yx10AY!804AI8|pomp=Bk z{Hx2^RT`8fe2$^i*Q zHApxKOKMfF24<2ZK}D666Q~?7Of-KcSYkFkdnCZwO95G-3tmPT8AU;D`N!?uh0{#; zbUHy_un$4?!@PYY*cxi5Q)ve0HZJ*SO4`htOf1GkSurdEv{Ecy zZ-H=DWcQR^Nf)Ov568NJ{X@U+(=dZUBcrORsoeE!!NGKBlQd{-_eVuhq`b_sd}-y% zjun)f1S0IXBu%0$Y6m|pI8{{8S4;nT;g!49Dj^bgX7w1_8cavp=HDMVur@;P?SNxT z6luq}5<0JzFuX7d+Ei?cBq*BltILrIR8yYvO^3GVgQYjBa@=`+yb7>NEdIQxu0L?K z{ndC(_p>lREnuB@dJg?m(yi0YoCr6IEvp|3B#7C8%mc&-@afRWA)DLd^ZL5Nk!TXC zrXr&7aLM5f!p3YTbZjL?6Tr9Zw_F|ZWsoLE6Dnyf;X@1en)$sm_NLN;aeC%KYzO`t zAX{N&Do2n&_muOutLkpd04Y{Y)tTNiHH{m%R#p~Zb1lHK3BH2Yf}&s4@K6?I%JuOk z8P43O%ohjtl++I+l1eI;K>|+&cz7I~5F#cKU(Ecxl6_?Poq6ES8Xz74df<6r2zp4ZEY&h!-t2mu zv7|Z7*InPd<9L_%^SBeoLs}%p!&St^;KUG_O}=Ta{b17jLywbTV8I8POn?ysVan6V z!Me7=xlELG%ch-xz})2b^!YnSG@dQoc*u3A-g_42ZePsDVjPa+Gr1?X=fAy}eSA9) zqgPKoh>0Kqdb~8WYF*pfc@=w)p1oP*Z+>DzBanMWI$kL?^N{%<7{hj2hJm9#Sec3v zDhSFPe%-ZDu(fsv!XzF+F&QI^Gkf>Jl;MXhsZt0m1ra55Q8}CTG}!J>Vy;ZhaUd8@ z7@i$|gvYJSC#}ns5`Vdq$$`ufiRp^w6lL9q$BbzQW7?D1TMwqp14FO2?e6ONGQ!|m z2Lhd$G_K+bKLf~UzIQZ6jnl)Hvj1wYV{;63V{9>%x1P#=12(PWaNkt@Bc2c+PyPK* jh>x@W2mZI~KL`95LpajcC@03800000NkvXXu0mjfyCFK1 literal 0 HcmV?d00001 diff --git a/src/view/resources/articulos.png b/src/view/resources/articulos.png new file mode 100644 index 0000000000000000000000000000000000000000..12e96fc50019b3cd4c3728d8c4646220230ecb95 GIT binary patch literal 2156 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 DI%6&; literal 0 HcmV?d00001 diff --git a/src/view/resources/botonBuscar.png b/src/view/resources/botonBuscar.png new file mode 100644 index 0000000000000000000000000000000000000000..e69f2971b9fd2d78644feb63b64fa83b02d1c493 GIT binary patch literal 5226 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 literal 0 HcmV?d00001 diff --git a/src/view/resources/botonEliminar.png b/src/view/resources/botonEliminar.png new file mode 100644 index 0000000000000000000000000000000000000000..1bcf2e922438eddd71a5d08106ef9d9884a8311f GIT binary patch literal 6064 zcmV;h7fe0lnr*f~fJskJcTG=M^-Oj3zxmZa(o<8@)m@}%v_OF1Sn@8*fH7t2hMO57i1oP?Y zo%8N;?z!Lhlb?8hd4DF^(_?MFf; zj44e3wnYIZfFtsxC>};&;Obw5DJ0876|%QNm9kT6rRr*=rjW(tmSv@D~$GA>cco?T6+O^Ml)g zuU4-54+N?j0sW0yA!$HhQfw{M06GCaW$tImrt*{3h5AX)s}(X;h>zso-3WZVj>7~n z#g`z!e0Kt0rCjk}p-Sm)l|quw1w<3@{p3`bznl{R7)_^ANb`bySG=QGEBkK|gHI}j zFPk0N2?B^7{AJ6Q%@6aJy{T46?*S0zKw2OCx;Fk`bmg^6XS0fnk~8Y+9u>5AmDlw4 z)pqpu*S+X})-W|T-bsy5c2Q&F9h0M4&Cr-u)BbF*u~MTc$tx*LPQQ|PHY@IfsH%;@ z@^N!y3ig#uhxkhG2P&iiYuBz`AhPH83PFHH7KI-NtCuYj$@9YmSj^`sA+O-CTq*rIntOL3@Sie4N5i-7^j{AYqPII6y}{2- zfpZ*uws;MVg~RC?H(Jk}Jlq7+h$$hZ8nhOPjEH!3fxyr26}}IOctzbT7Q`AUY!2e@Uu&tOSOY6i^3j)3KC@X4R+?5d

P>`?@X|q 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 literal 0 HcmV?d00001 diff --git a/src/view/resources/buscarTexto.png b/src/view/resources/buscarTexto.png new file mode 100644 index 0000000000000000000000000000000000000000..2253a52ebb64b4feb53ebe58420c58572d0560a9 GIT binary patch literal 1201 zcmV;i1Wx;jP)8s$NLKC?(RMc;K!Wzz@fRuw~()HgNMnWlz?*q%W=V$r_rE&2jA+67@H>u1tfUA4$?**Or}_9 z`2Z#PWGI+^cn!eo#Q>!Bi&!jH=Qz$6kB+`ieAN;3pA4cotYC0T!lM*H!T=~GP?&@g zMTQW7!vz-ELDVk(d^i$`+|)Gf$!-C3{ep9T!SPkoe03Wl;SyYGQSkW`Em*{43FW08 z_`M2H(SWqS5#an{F&)_Wf)L_Fsx$%*lkxU(AFltl?S#VTVJJ~#c$kEgzX=ecy%@m8 z86boNZP^b>3A_y8^7a5i2qa1&Q3^-)Lr_{#3}B-JM2HM?4R9{NxquMjAB(vVa5;zM z8X!Qr7{Epc1R)Q~vl{+zTzoxcqM}R!z_u*R&&rENDU%j1&Xd7(-3dRwDKFZC+#H*q`B7Kq!R} zYoo^`3PRS-L@saRscs^f$swudP^S*Un|pFQ9*=*tCjbB(K5}G|W)ttq#*!~lejLuT z)tj>%7^aQ1kw;25kzj#*31?4$+1c52b8~aNBs2eJ z>CvuJ4Vl`_bxBM7&>L6;CCi4TAFDudL=|)YP?-IhT?da&Zr>bh< ze^(#{XRW)tyPgVhO;G84+TVzjzX^`)hvXUv=o*6h3HuptR!IsNLs6jKt&dyF)`m9$nXen7nhR z%d&07v29qkjol!&-!?l)Pft%jrSubpF)&5JZV`o-{Voy+1U|Jb>nqE)VOtht#-K0; zMN!^JCX?Ux_4O&+)l1tw+(}eb6`h@(H?z9l2twKj0H!EwttI3IUDsPXJ3B|VI+%L~ z>=m&ufW0904Nxp%Uje&7+)!0jJQu)D5SdJ7O4BqI*oQIPD#OFWZm6>Iy+R}E@px+1 z-+OL=%?Qh~zTAXJ5JGOOzq98}xWkY$XU?2sjMWfAz8@PKTl$y2`ya?(+@UpfwX$Cm P00000NkvXXu0mjfr-m%P literal 0 HcmV?d00001 diff --git a/src/view/resources/clientes.png b/src/view/resources/clientes.png new file mode 100644 index 0000000000000000000000000000000000000000..2ec5ab98314d12f91cfe77294aede86126561934 GIT binary patch literal 2462 zcmV;P31Rk$P)7b}3(oTccb~+7z6#pslAF_M;eP{34oV$DPK5)~{n3-?R z-gCZt&hI?162^8sN1J;O4ruHczQ<)Jbf8XBPoD66ZozH8U-}QX|M4Cbya+lX3nAlz?v=r zcC-`3Rvs~`JWmoOQtG3nqGn$XENU4L09trX2&#Q~`gHrc!32-b6Qj`*T+4;w@F5~C zY)(j;-4}^8lzM?5=IB(3pxEtnx98p)53G5Vw)7eL2OE6K4i)=39)r}hC@!I9sMc;z zHADd_Dq~{;ig}Q?e4g<5LaKRmc8w_w7WlB-_|0?-xGsXnHo1}JLFCI2ARt?Zz{=wR zFkq>(b3p(*Q$B)GnnNIHzmR@Y$dybHtLy(IL;>m+<&KW*_D`{_9Fxn1XMOQzD{ zi=5$5@Z2PH0^AwkFS^?B7}D0|9f~K0GR0htof$iyJ_+ms4JyE2Oz4rLr+bRLstFFA`SG z15zaREx!{AX;!nOSn(|DrsfkVpS{#C7a5t4I)pT{lV5Bg9WgtDnib#qkV!t@ZII7) z8KixUNw80pt-YMeq~3+GUlyQ-BYh*WlVgm?N0(t&Pdfmv2&(yPN^PJI!S}slkjpO{ zv`usvWEb>NI|Cjn0K9|mipc==ZUHtlB5Nehl5n|n9u_|dy7+G@fMTBxd^wG`pgPqM zC0lSuQEhneE&&vCrKFg10QBYYy15wieh*w&c7B!M$OK4%56e-ZkV%lACSnnz8Vwe8 zo(GSVQX$ATah@5~(aD9nULKe4AHSnlHF5+iT}>40-T5StPJG6$^YS5<{YNH*=%; z7#PcB5g-%53p_6X`wjWj)A>4zuxhoU0H7%qIU{j;z{q|9cME{}=>8iJ16j!3Is!P6j^gl5|E8K0PHRF z9+GPQ19z5zKi8flUI65Ayv;jMJg)!0g2z8RR>p@r%G3!7PX&p2rF6CN%54hpN<)3C z+_@&fK<1>=6=+y!V91BpLN5WBSK`%%&uzSdV;9{Vz&#m>UL zcD|S1BX}fqaTFA1(7XW5D>(sZOL|(6ELd4vc<}JNAgJATR@7pB*fI=RtJ63L`uPa% z)J+S1kf_@B1evyINj$xj!Y<%Wx$j`OGBzpQBQXKcV3}9qD;ikqhu`~HqQ|>bh(l|z zuXg^5#DklkA+_IcjyrdW2b>$3cXfJtZS^RqzV*#qbw6qO*PEo};tA5y`#W;W1FH#~ zL?3=7p%-x7SPtM519#$BG+h8x8w8KUyb><}zQbMA6XSGi6@o9-wQu0A&%6Io($mvJ zE?l@kTYN^1m{m8Y)b~z2A!5<;dQ;b)BzT9K4!`K6!}iR4Tq@IfCIBCanE-ya2G#Lf zknb1!4pHz-fR|p|M^C)G(u(-riN{yj^y7l@v+XVc@R@#GsJZpVe2P;{=Mg;fLg@nd z8SM4?ZR3z{+wPyIz;}0dldbK0k~UOTKQ3z|4(PGB!_lVxyN^WU5s&%zZ6-MlS!Z3$qJ$YJl9#v1P(uzwMv)EsVcb&)7;FSrb!Dvi-F|K3 zdQ#iIIY~c#lIV{=LdF|&`*9rkvL#%(Dr<20+2jk}!7$C3*S~DtCbIs=&jLM1Hf(=^ zEPre(ncDC@Zw#P!qXj+o#k7S>;`e=eEaiQgKR-^IKRZU-Wj#m9)CG&0#UyP-3@Eh?p@gS{w8Nj~KwyeSt3Xk7v%1bLY-c-DjQ%>BEozL~7=* zh=ZYD5~~|Wr{VzQ<@ez3+|FSCzwZEFd%?p zwPI)UKi~8PkA&mSXPzgD{k0PAAsbQs&VKljFLsYyy_-Chocfj+zq$vF{ELcWj^yP=r>8$pAp-f*LHzxH0&!A9``pQIX-2lc;A c{#She1^=r+ZLQ@pn*aa+07*qoM6N<$f{ZJlNB{r; literal 0 HcmV?d00001 diff --git a/src/view/resources/clientesTabla.png b/src/view/resources/clientesTabla.png new file mode 100644 index 0000000000000000000000000000000000000000..245a1c90565f8e6520ca2c1343d940518f601c83 GIT binary patch literal 15722 zcmY*=1yoy4^yUi$X|V(f#a)UOC=}Ncpg^$}r$~`vMT1kEBE^bZ@Zwh7trRE(*W&K( z4*&di_w3m{CwVV*VBPsyJG0Dvd|7WN(hK&YP}02>o^`{-Ek z8FhPN|5gVM060YdeL+A9f)oH~0eP5|x*K9Y&DD)UW3qb@E;k>uPTeEcwcWKXro6?} z&g`U3k^nT}1R5mfa!{c$ap&<{R%vE=a2dR3G!XvL zRAcucy=N#EksKZQ`M_&40X~EQM)Q-Tg<$``w=M8-ctu@^1sBu{&&aW!iVz!2=g)KT z6zb5mNB}(T+)tIH#eM}lD-Hte=~u!lE`gulX65`OA&engzFZ)S2a%^s-|cT%A=qe9 z=^>Q+*pkS_L||{(MVl4^j{G2^eXaN4jWH}Sr;G#kFUw)bj_*?tcitH<6%rCMvk7VE z0rG=q-TfqoF-T3gEHsY9JTFShi;9YxA8vLN>*&yI0fE3<0c^1Upovj zOJie7-Ce0p)n}de??-tI-vCA~^*-T}v|EB0uxhp9SE&OVLDIqa?oTA0onMz16ue00 zG3mynpMh+O4= ziCl&YanaEug#woaYB`R5NTgP|VVk(3!{0$t)A6~Ebu1=Vo7mdPgqK5q5|7DH43i=zD}ntW7v@oVMh3eD79B88 z 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 literal 0 HcmV?d00001 diff --git a/src/view/resources/main.png b/src/view/resources/main.png new file mode 100644 index 0000000000000000000000000000000000000000..902059563246ee951b163b64a66d63f031d643fd GIT binary patch literal 2838 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 literal 0 HcmV?d00001 diff --git a/src/view/resources/removerCarrito.png b/src/view/resources/removerCarrito.png new file mode 100644 index 0000000000000000000000000000000000000000..a21ab1db8ee984eb1422a316bb0b7ad3be94e294 GIT binary patch literal 6060 zcmV;d7gOkoP) zWm~ap$BApVGj8mOJMB!<)YEC=xNbago7Q8enXzZ=Ha=xtk!0(zBvL#?iV`Va;01!X zZx9D@?QY*bDsoVbp|8H-1 zDR69N=EMC*E?(|m^gG{mz$8hXY3=yMzx=x>@UP3l%ZbsyL@CcA-XFWGvhq?mDk@4ha<3GRZ;rA`*!3i<=0y*8uncQ44(YEcmIInoTv6Z zR9RkfOS{Fu{`QlW$>u-YGfBwwYF+;AXrb{6QOR4VaRjNJK+d;Ow*gH&ztEKSttm`W z)cFDHq4v>8Jc+n$oXrl0q9u8X2RBqy<}1Jc`a4zoTL5NIKRa*YaM<^+Db=c_?_C@* zs+G%mX=?;K+&QX|i}!AD-!H!|`akI~;Q9e?wgR~q^ zrGIy-e_+I^SBk&CzM`ry_v`O_4ZF`(eRz1!Ge3MHS6y@~Th1c#+@{T&jgi zQj7S^DZ9hPbc3FR5aQ#Unlf#3y}>%=`|Y9bJjFb)d4(>?FFrZBYHSj2g^rx)esbTp z2Yl6m+eTt3;_*#Y>#FnN;Qm4DtbyI>MsnSptGFEYu2m(Q8w`g!$9{95s~}f$E9`hY zapd#U?H4XWi3VRA>uc`avE?@XSwi4!Rd=r~J?jlKwAro8I9pYr zTK1Feb+Z|Gwsj8Mrv_}FjJobyUAmzr|B%VfVqtK6Y{G(gLRc+i8*_1XQ-kpbO;w=w z?~n9Iq=Nb!QMTHNBr!7SK&d#&D7>KFek0(kv3lOby{76vUmvLGnyT?+TBer1vS&2} z zPp&G@1LJHPK9^HbrhV}{4F}pse)VA+L6BO7=x2|uf9JnH0b)a;p7E6Vw*>>w&a0eE z2_aQVy6pZrHjJvlShBKI``nfqu!Jm~ZQyi;TE|DGr=z@Nu)bU#(-tZO+})+x<6Yyw z`k+m%l5A}(s>qcv#>r&*K%42*<;hxuYG~B#^QS*JI~bj&6)s+&KQ9b;R@Ip_v8A!- z!Hg7FT%l~6kT3lDhwY#P2$dFclO#1q)t)gI^xhGSt*F+!y8DCikU_V0Fq7KkV*aDe z)%UF_ee?6)_m5rf9ky?&H=ZB1we?$JG2sj~2Bl4?4JsOO?{NA}hB))r1SrBLC;H=@3 z^kC)XsRwQ0Su=@%yRxoeLv6w5Z6=tOMSPscNoZ^jb#Dp88_-Bb%y^caL5fwfx(`E*K`GMh2H8 z)5Ou1KDaH5Cz_Mq7ZbSBkbAs){KdCUG%qVm3AoHbQ1#>Urbr_7=!Qy|Y=E=#`YdgC z24C(R1y!MD=nTcSEjKd9VTm?u_DrklSU4A)UR$Q6NHiXZy!KH$_ymu~UQ?I<%+_UK z8BQifryMG&5MsNcKsggn?LRZ9NIKz^NFrS*?E-)yz+n5z)6Ji@3}5WCOxyfW6{gZ; zW2HVWz+n{T*n_G^z8r|oBp+H|0jh#$U&xFFlL$_p9ZHd;vQQ(|F-u|$!*;JNgH`Ow%VsK-&Xw~>8~yZ)E0ioDFx^;~CPxJMqs!_a zcLdm(e&pvXFS&x*Rs&|we}Ml-;uWRZ0=;5el^zb#S(-vE{Zk*c4kyy2JWnCJhU#

x(9ltU)MNto|EeBOwEMBIx%&2O!4cgut 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