/******************************************************************************
Welcome to GDB Online.
GDB online is an online compiler and debugger tool for C, C++, Python, Java, PHP, Ruby, Perl,
C#, OCaml, VB, Swift, Pascal, Fortran, Haskell, Objective-C, Assembly, HTML, CSS, JS, SQLite, Prolog.
Code, Compile, Run and Debug online from anywhere in world.
*******************************************************************************/
import java.util.Scanner;
import java.text.NumberFormat;
import java.util.ArrayList;
public class FacturasApp{
static ArrayList <Double> facturas = new ArrayList <>();
private static Scanner sc;
public static void main(String args[]){
System.out.println("Bienvenidos a la aplicación de Facturación");
getFacturas();
displayFacturas();
}
public static void getFacturas(){
sc = new Scanner(System.in);
int facturaNumero = 1 ;
String otraFactura = "s";
while (otraFactura.equalsIgnoreCase("s")){
System.out.println("\nIngrese productos para la factura " + facturaNumero);
getItems(); // Carga total de una factura
otraFactura = Validator.getString(sc,"Otra factura? (s/n): ");
System.out.println();
facturaNumero++;
}
}
public static void getItems(){
String otroItem = "s";
double totalFactura = 0;
while (otroItem.equalsIgnoreCase("s")){
String productoCodigo = Validator.getString(sc,"Ingrese el código de producto: ");
int cantidad = Validator.getInt(sc, "Ingrese la cantidad: ", 0, 1000);
Producto producto = ProductoDB.getProducto(productoCodigo);
totalFactura += producto.getPrecio()*cantidad;
otroItem = Validator.getString(sc,"Otro producto? (s/n): ");
System.out.println();
}
facturas.add(totalFactura);
}
public static void displayFacturas(){
NumberFormat moneda = NumberFormat.getCurrencyInstance();
System.out.println("Ud. ingresó las facturas :\n");
System.out.println("Número\tTotal");
System.out.println ( "--------------- \t") ;
double batchTotal = 0;
int facturaNumero = 1;
for(Double factura: facturas){
System.out.println(facturaNumero + "\t"+ moneda.format(factura));
facturaNumero++;
batchTotal += factura;
}
System.out.println("Total de todas las facturas: "+ moneda.format(batchTotal));
}
}
class Producto{
private String codigo;
private String descripcion;
private double precio;
public Producto(){ // un constructor de objetos: da valores a atributos no static
codigo = "";
descripcion = "";
precio = 0 ;
}
public void setCodigo(String codigo) {this.codigo = codigo;}
public String getCodigo(){return codigo;}
public void setDescripcion(String descripcion){ this.descripcion = descripcion;}
public String getDescripcion(){return descripcion;}
public void setPrecio(double precio){this.precio = precio;}
public double getPrecio(){return precio;}
public String getFormattedPrecio(){ // precio con formato
NumberFormat moneda = NumberFormat.getCurrencyInstance();
return moneda.format(precio);
}
}
class ProductoDB {
public static Producto getProducto(String productoCodigo){
Producto p = new Producto(); // crea un objeto
p.setCodigo(productoCodigo); // llena los atributos del objeto
if (productoCodigo.equalsIgnoreCase("java")){
p.setDescripcion("Java SE ");
p.setPrecio(49.50);
} else if (productoCodigo.equalsIgnoreCase("jsps")){
p.setDescripcion("Java Servlets y JSP ");
p.setPrecio(49.50);
} else if (productoCodigo.equalsIgnoreCase("fprg")){
p.setDescripcion("Fundamentos de Programación");
p.setPrecio(59.50);
} else p.setDescripcion("Desconocido ");
return p;
}
}
class Validator {
public static String getString(Scanner sc, String prompt){
System.out.print(prompt);
String s = sc.next();
sc.nextLine();
return s;
}
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. Intente de nuevo.");
sc.nextLine();
}
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 double getDouble(Scanner sc, String prompt){
double d = 0 ;
boolean isValid = false;
while (isValid == false){
System.out.print(prompt);
if (sc.hasNextDouble()){
d = sc.nextDouble();
isValid = true;
} else System.out.println("Error! Valor decimal no válido. Intente de nuevo.");
sc.nextLine();
}
return d;
}
public static double getDouble(Scanner sc, String prompt, double min, double max) {
double d = 0 ;
boolean isValid = false;
while (isValid == false){
d = getDouble(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;
}
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;
}
}