package es.bancodehierro.banco.menu; import es.bancodehierro.banco.central.Banco; import es.bancodehierro.banco.tarjeta.Credito; import es.bancodehierro.banco.conexion.Conexion; import es.bancodehierro.banco.excepciones.TarjetaExistenteException; import es.bancodehierro.banco.tarjeta.Debito; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.logging.Level; import java.util.logging.Logger; /** * * @author tarjetas */ public class MenuTarjeta { /** * Este metodo sirve para recopilar los datos que necesitaremos para el * metodo de altaTarjeta. Ademas, ejecuta las comprobaciones necesarias * sobre estos datos. */ public static void altaTarjeta() throws SQLException { //Obtener el cliente. String codigoCliente = null; int clienteEncontrado = 0; while (clienteEncontrado == 0) { codigoCliente = GestionaMenu.llegirCadena("Introdueix el codi del client."); Statement st = Conexion.conectar().createStatement(); String selectCliente = "select count(*) from Cliente where DNI_CLIENTE='" + codigoCliente + "'"; ResultSet rs = st.executeQuery(selectCliente); rs.next(); clienteEncontrado = rs.getInt(1); st.close(); rs.close(); if (clienteEncontrado == 1) { System.out.println("Cliente encontrado."); } else { System.out.println("Cliente no encontrado, introduzca un codigo de cliente existente."); } } //Obtener cuenta corriente. int codigoSucursal = GestionaMenu.llegirSencer("Introduzca el código de sucursal"); String codigoCuenta = GestionaMenu.llegirCadena("Introduzca el código de cuenta corriente"); int cuentaEncontrada = 0; while (cuentaEncontrada == 0) { Statement st = Conexion.conectar().createStatement(); String selectCuenta = "select count(*) from Cuenta_Corriente where CODIGO_SCC=" + codigoSucursal + " and NUMERO_CC='" + codigoCuenta + "'"; ResultSet rs = st.executeQuery(selectCuenta); rs.next(); cuentaEncontrada = rs.getInt(1); st.close(); rs.close(); if (cuentaEncontrada == 1) { System.out.println("Cuenta encontrada."); } else { System.out.println("Cuenta no encontrada, introduzca un codigo sucursal y cuenta existente."); } } //pedir tipo String tipo; do { tipo = GestionaMenu.llegirCadena("Introduce el tipo de tarjeta (DEBITO/CREDITO)/"); } while (tipo.toUpperCase() == "CREDITO" || tipo.toUpperCase() == "DEBITO"); //pedir limite Double limite = 0.0; if (tipo.toUpperCase() == "CREDITO") { do { limite = GestionaMenu.llegirDouble("Introduce el límite de la tarjeta."); } while (limite < 0); } //llamar al metodo de GestionTarjetas String sentencia = "INSERT INTO v_tarjeta_debito VALUES (" + "null" + ",'" + codigoCliente + "'" + ",'" + codigoCuenta + "'," + codigoSucursal + ",null,null)"; Conexion.conectar().createStatement().executeUpdate(sentencia); Banco bancoTarjetas = new Banco(); bancoTarjetas.altaTarjeta(codigoCliente, codigoCuenta, codigoSucursal, limite, tipo.toUpperCase()); } /** * Metodo que sirve para recoger los datos que luego utilizaremos en el * metodo para eliminar una tarjeta de la base de datos. */ public static void eliminarTarjeta() throws SQLException, TarjetaExistenteException { String codigoTarjeta; boolean existe; do { codigoTarjeta = GestionaMenu.llegirCadena("Introduce la ID de la tarjeta: "); existe = comprobarTarjeta(codigoTarjeta); } while (existe); ResultSet rs; Banco bancoTarjetas = new Banco(); System.out.println(bancoTarjetas.eliminarTarjeta(codigoTarjeta)); } /** * Metodo que sirve para recoger los datos que luego utilizaremos en el * metodo para pagar con las tarjetas. */ public static void pagar() throws TarjetaExistenteException, SQLException { String codigoTarjeta; boolean existe; do { codigoTarjeta = GestionaMenu.llegirCadena("Introduce la ID de la tarjeta: "); existe = comprobarTarjeta(codigoTarjeta); } while (existe); Statement st = Conexion.conectar().createStatement(); String concepto = GestionaMenu.llegirCadena("Introduce el concepto (opcional): "); Double importe = GestionaMenu.llegirDouble("Introduce el importe a pagar: "); String resultat = comprobarTipoTarjeta(codigoTarjeta); ResultSet rs = null; /*Si resulta que es de credit. */ if (resultat == "CREDITO") { String selectMaxCredito = "SELECT MAX_CREDITO FROM TARJETA_CREDITO" + "WHERE CODIGO_TARJETA_CREDITO = '" + codigoTarjeta + "' "; rs = st.executeQuery(selectMaxCredito); rs.next(); int maxCredit = rs.getInt(1); rs.close(); st.close(); String selectSaldo = "SELECT SALDO FROM v_targeta_credit " + "WHERE CODIGO_TARJETA = '" + codigoTarjeta + "'"; rs = st.executeQuery(selectSaldo); rs.next(); int importeAcumulado = rs.getInt(1); rs.close(); st.close(); /*Sumamos el importe que llevamos acumulado mas el importe que se quiere pagar. */ Double importeActual = importeAcumulado + importe; if (importeActual > maxCredit) { System.out.println("No es pot fer, ja ha superat el credit maxim. "); } else { Credito tarjetaCredito = new Credito(codigoTarjeta); tarjetaCredito.pagar(importe, concepto); } } /*Si resulta que es de debit. */ else if (resultat == "DEBITO") { String selectSaldo = "SELECT SALDO FROM v_targeta_debit" + "WHERE CODIGO_TARJETA = '" + codigoTarjeta + "' "; rs = st.executeQuery(selectSaldo); rs.next(); int saldo = rs.getInt(1); rs.close(); st.close(); Double total = saldo - importe; if (total < 0) { System.out.println("No se puede realizar la operacion, falta saldo."); } else { Debito tarjetaDebito = new Debito(codigoTarjeta); tarjetaDebito.pagar(importe, concepto); } } } /** * Metodo que sirve para recoger los datos que luego utilitzaremos en el * metodo para ingresar en tarjetas de debito. */ public static void ingresarDebito() throws TarjetaExistenteException, SQLException { String codigoTarjeta; boolean existe; do { codigoTarjeta = GestionaMenu.llegirCadena("Introduce la ID de la tarjeta: "); existe = comprobarTarjeta(codigoTarjeta); } while (existe); double importe = GestionaMenu.llegirDouble("Introduce el importe a ingresar: "); String concepto = GestionaMenu.llegirCadena("Introduce el concepto (opcional): "); Debito tarjetaDebito = new Debito(codigoTarjeta); tarjetaDebito.ingresar(importe, concepto); } /** * Metodo que sirve para recoger los datos que luego utilizaremos en el * metodo para ver los movimientos de las tarjetas. */ public static void verMovimientos() throws TarjetaExistenteException, SQLException { String codigoTarjeta; boolean existe; do { codigoTarjeta = GestionaMenu.llegirCadena("Introduce la ID de la tarjeta: "); existe = comprobarTarjeta(codigoTarjeta); } while (existe); Statement st = Conexion.conectar().createStatement(); String resultat = comprobarTipoTarjeta(codigoTarjeta); if (resultat == "CREDITO") { Credito tarjetaCredito = new Credito(codigoTarjeta); tarjetaCredito.verMovimientosCredito(); } else if (resultat == "DEBITO") { Debito tarjetaDebito = new Debito(codigoTarjeta); tarjetaDebito.verMovimientosDebito(); } } /** * Este metodo sirve para comprovar si una tarjeta existe en la base de * datos. * * @param codigoTarjeta El codigo de la tarjeta. * @return Devuelve un boolean (false si la encuentra o true si no). */ public static Credito devolverTarjetaCredito(String codigoTarjeta) throws TarjetaExistenteException, SQLException { boolean existe; do { if (codigoTarjeta == null) { codigoTarjeta = GestionaMenu.llegirCadena("Introduce la ID de la tarjeta: "); } existe = comprobarTarjeta(codigoTarjeta); if (!existe) { System.out.println("ID de tarjeta erróneo, introduzca uno valido."); } } while (existe); Credito tarjetaCredito = new Credito(codigoTarjeta); System.out.println(tarjetaCredito); return tarjetaCredito; } /** * Muestra por pantalla la informacion sobre una tarjeta de debito y * devuelve el objeto debito. * * @param codigoTarjeta Codigo de la tarjeta. * @return Devuelve un objeto de tipo debito. */ public static Debito devolverTarjetaDebito(String codigoTarjeta) throws TarjetaExistenteException, SQLException { boolean existe; do { if (codigoTarjeta == null) { codigoTarjeta = GestionaMenu.llegirCadena("Introduce la ID de la tarjeta: "); } existe = comprobarTarjeta(codigoTarjeta); if (!existe) { System.out.println("ID de tarjeta erróneo, introduzca uno valido."); } } while (existe); Debito tarjetaDebito = new Debito(codigoTarjeta); System.out.println(tarjetaDebito); return tarjetaDebito; } /** * Muestra por pantalla la informacion sobre una tarjeta de credito y * devuelve el objeto credito. * * @param codigoTarjeta Codigo de la tarjeta. * @return Devuelve un objeto de tipo credito. */ public static boolean comprobarTarjeta(String codigoTarjeta) throws TarjetaExistenteException, SQLException { boolean flag = true; Statement st = Conexion.conectar().createStatement(); String selectTarjeta = "SELECT COUNT(*) FROM TARJETA WHERE CODIGO_TARJETA = '" + codigoTarjeta + "'"; ResultSet rs = st.executeQuery(selectTarjeta); rs.next(); int existeix = rs.getInt(1); if (existeix == 1) { System.out.println("Tarjeta encontrada!"); flag = false; } else { throw new TarjetaExistenteException("La tarjeta no existe."); } rs.close(); st.close(); return flag; } /** * Este metodo sirve para comprobar si una tarjeta es de debito o de credito * y devuelve un String con el tipo que es escrito en mayusculas. * * @param codigoTarjeta El codigo de la tarjeta a comprobar. * @return Devuelve un String con el tipo de tarjeta en mayusculas. */ public static String comprobarTipoTarjeta(String codigoTarjeta) throws TarjetaExistenteException, SQLException { int credit = 0; Statement st = Conexion.conectar().createStatement(); String selectTarjeta = "SELECT COUNT(TARJETA_CREDITO.CODIGO_TARJETA_CREDITO), " + "COUNT(TARJETA_DEBITO.CODIGO_TARJETA_DEBITO) FROM TARJETA " + "ALTER JOIN TARJETA_CREDITO ON TARJETA_CREDITO.CODIGO_TARJETA_CREDITO = TARJETA.CODIGO_TARJETA " + "ALTER JOIN TARJETA_DEBITO ON TARJETA_DEBITO.CODIGO_TARJETA_DEBITO = TARJETA.CODIGO_TARJETA" + "WHERE TARJETA.CODIGO_TARJETA = '" + codigoTarjeta + "' "; ResultSet rs; rs = st.executeQuery(selectTarjeta); rs.next(); credit = rs.getInt(1); int debit = rs.getInt(2); rs.close(); st.close(); if (credit == 1) { return "CREDITO"; } else if (debit == 1) { return "DEBITO"; } else { throw new TarjetaExistenteException("Tarjeta no existente."); } } /** * Metodo que sirve para ejecutar el menu de las tarjetas. */ public static void ejecutarMenu() { boolean flag = true; try { do { System.out.println("Opcion 1: Dar de alta una tarjeta."); System.out.println("Opcion 2: Eliminar una tarjeta."); System.out.println("Opcion 3: Realizar un pago."); System.out.println("Opcion 4: Ingresar (sólo débito)."); System.out.println("Opcion 5: Ver movimientos tarjeta."); System.out.println("Opcion 6: Ver tarjeta."); System.out.println("Opcion 7: Salir."); int opcion = GestionaMenu.llegirSencer("Introduce la opción: "); switch (opcion) { case 1: { altaTarjeta(); break; } case 2: { eliminarTarjeta(); break; } case 3: { pagar(); break; } case 4: { ingresarDebito(); break; } case 5: { verMovimientos(); break; } case 6: { String tipoTarjeta = GestionaMenu.llegirCadena("¿Qué tipo de tarjeta? (CREDITO/DEBITO): "); if (tipoTarjeta.toUpperCase() == "CREDITO") { devolverTarjetaCredito(null); } else { devolverTarjetaDebito(null); } } case 7: { flag = false; break; } } } while (flag); } catch (SQLException ex) { System.out.println("Error: " + ex.getMessage() + ". \n ErrorCode:" + ex.getErrorCode() + ", SQLState:" + ex.getSQLState()); } catch (TarjetaExistenteException ex) { System.out.println(ex.getMessage()); } } }