// Para la base de datos se usa la colección HashMap
import java.util.Scanner;
import java.util.HashMap;
import java.util.Calendar;
import java.util.GregorianCalendar;
public class Main{
//public class PagoAppA{
static TarjetaDAO td = new TarjetaDAO(); // Base de datos
static Pago pago = new Pago(); // Datos del pago
static Scanner sc = new Scanner(System.in);
static int pagoE, pagoT;
public static void main(String[] args){
System.out.println("Bienvenidos a la Casa del Pago");
for(int i=0; i<3; i++)
pagar();
System.out.println("\nTotal pago Efectivo : " + pagoE);
System.out.println("Total pago con tarjetas: " + pagoT);
System.out.println("Total pagos : " + (pagoE+ pagoT));
System.out.println("Muchas gracias por su visita.");
}
static void pagar(){
// monto
System.out.println("\nPago de teléfono");
pago.monto = Validator.getInt(sc, "Monto: ", 0);
// forma de pago
System.out.println("Formas de pago: ");
System.out.println(" Tarjeta : T");
System.out.println(" Efectivo: E");
pago.formaPago = Validator.getChar(sc, "Elija la forma de pago (T/E): ", "TE");
// tarjeta
if(pago.formaPago.equals("E")) {
pagoE += pago.monto;
pago.check=2;
}
if(pago.formaPago.equals("T")){
System.out.println("Tarjetas:");
System.out.println(" American Express: A");
System.out.println(" Visa: V");
System.out.println(" Master Card: M");
pago.tipoTarjeta = Validator.getChar(sc, "Elija la tarjeta (A/V/M): ", "AVM");
pago.numero = Validator.getInt(sc, "Número de tarjeta: ", 1);
td.validarTarjeta(pago);
if(pago.check==0)
System.out.println("Lo sentimos número de tarjeta no válido.");
if(pago.check==1)
System.out.println("Lo sentimos su tarjeta está vencida: " + pago.mes + ":" + pago.ano + ",");
if(pago.check==2) {
pagoT += pago.monto;
System.out.println("Tarjeta: " + pago.tipoTarjeta + " " + pago.numero + " " + pago.mes + " " + pago.ano);
}
}
if(pago.check==2)
System.out.println("Gracias por su pago.");
}
}
class Pago{ // datos del pago
int monto;
String formaPago;
String tipoTarjeta;
int numero;
int mes;
int ano;
int check;
}
class Tarjeta{ // tabla auxiliar
int ano;
int mes;
public Tarjeta (int ano, int mes){
this.ano = ano;
this.mes = mes;
}
}
class TarjetaDAO{ // base de datos
// HashMap no garantiza ningún orden en la clave;
// No garantiza que se mantenga el orden constante a lo largo del tiempo.
HashMap<String, String> tarjetas = new HashMap<>(); // Tabla de clases de tarjetas
HashMap<Integer, Tarjeta> vis = new HashMap<>(); // Tabla de Visa
HashMap<Integer, Tarjeta> mas = new HashMap<>(); // Tabla de Master card
HashMap<Integer, Tarjeta> aex = new HashMap<>(); // tabla de American express
public TarjetaDAO(){ // constructor
tarjetas.put("V", "Visa");
tarjetas.put("M", "Master Card");
tarjetas.put("A", "American Express");
vis.put(1, new Tarjeta(2019, 1));
vis.put(2, new Tarjeta(2019, 1));
vis.put(3, new Tarjeta(2019, 1));
mas.put(1, new Tarjeta(2023, 1));
mas.put(2, new Tarjeta(2023, 11));
mas.put(3, new Tarjeta(2023, 12));
aex.put(1, new Tarjeta(2024, 1));
aex.put(2, new Tarjeta(2024, 1));
aex.put(3, new Tarjeta(2024, 1));
}
void validarTarjeta(Pago pago){
Tarjeta tar = null;
pago.check = 0;
switch (pago.tipoTarjeta){
case "V": if(vis.containsKey(pago.numero))
{tar = (Tarjeta)vis.get(pago.numero); pago.check=1;} break;
case "M": if(mas.containsKey(pago.numero))
{tar = (Tarjeta)mas.get(pago.numero); pago.check=1;} break;
case "A": if(aex.containsKey(pago.numero))
{tar = (Tarjeta)aex.get(pago.numero); pago.check=1;}
}
if(pago.check==1){
GregorianCalendar gc = new GregorianCalendar();
int gAno = gc.get(Calendar.YEAR);
int gMes = gc.get(Calendar.MONTH) + 1;
if(gAno < tar.ano || gAno == tar.ano && gMes <= tar.mes) pago.check=2;
}
pago.ano = tar.ano;
pago.mes = tar.mes;
}
}
class Validator {
public static String getString(Scanner sc, String prompt){
System.out.print(prompt);
String s = sc.next();
sc.nextLine();
return s;
}
public static String getChar(Scanner sc, String prompt, String ch){
String st="";
boolean isValid = false;
while (isValid == false){
st = getString(sc, prompt).toUpperCase();
if (st.length()==1 && ch.indexOf(st)>-1) isValid = true;
}
return st;
}
public static int getInt(Scanner sc, String prompt){
int i = 0 ;
boolean isValid = false;
while (isValid == false){
System.out.print(prompt);
if (sc.hasNextInt()){
i = sc.nextInt();
isValid = true;
} else System.out.println("Error: Valor entero no válido. Repita la entrada.");
sc.nextLine();
}
return i;
}
public static int getInt(Scanner sc, String prompt, int min){
int i = 0;
boolean isValid = false;
while (isValid == false){
i = getInt(sc, prompt);
if (i < min) System.out.println("Error! El número debe ser mayor o igual que " + min + ".");
else isValid = true;
}
return i ;
}
public static int getInt(Scanner sc, String prompt, int min, int max){
int i = 0;
boolean isValid = false;
while (isValid == false){
i = getInt(sc, prompt);
if (i < min) System.out.println("Error! El número debe ser mayor o igual que " + min + ".");
else if (i > max) System.out.println("Error El número debe ser menor o igual que " + max + ".");
else isValid = true;
}
return i ;
}
public static float getFloat(Scanner sc, String prompt){
float d = 0 ;
boolean isValid = false;
while (isValid == false){
System.out.print(prompt) ;
if (sc.hasNextFloat()){
d = sc.nextFloat();
isValid = true;
} else System.out.println("Error! Valor decimal no válido. Intente de nuevo.");
sc.nextLine();
}
return d;
}
public static float getFloat(Scanner sc, String prompt, float min, float max) {
float d = 0 ;
boolean isValid = false;
while (isValid == false){
d = getFloat(sc, prompt);
if (d < min) System.out.println("Error! El número debe ser mayor o igual que " + min + ".");
else if (d > max) System.out.println("Error! El número debe ser menor o igual que " + max + ".");
else isValid = true;
}
return d;
}
}