Files
listaSpesa/src/listaspesa/listaSpesa.java
2025-10-23 10:59:08 +02:00

608 lines
25 KiB
Java

/*
* Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
* Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Main.java to edit this template
*/
package listaspesa;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.InputMismatchException;
import java.util.Scanner;
/**
*
* @author Verde
*/
public class listaSpesa {
/**
* @param args the command line arguments
*/
static Scanner sc = new Scanner(System.in);
static Prodotto magazzino[] = null;
static Prodotto scontrino[] = null;
static int dimensioneMagazzino = 0, dimensioneScontrino = 0;
static String datePattern = "dd/MM/yyyy";
static SimpleDateFormat sdf = new SimpleDateFormat(datePattern);
public static void main(String[] args) {
int scelta = -1;
boolean error;
do {
System.out.println("Scegliere un'opzione:");
System.out.println("1. Modifica inventario");
System.out.println("2. Inserimento scontrino");
System.out.println("3. Stampa scontrino");
System.out.println("4. Rimuovi prodotti scaduti");
System.out.println("0. Esci");
System.out.print("Opzione: ");
try {
scelta = sc.nextInt();
sc.nextLine();
switch (scelta) {
case 0:
break;
case 1:
do {
try {
error = false;
System.out.print("Quanti prodotti inserire? ");
dimensioneMagazzino = sc.nextInt();
sc.nextLine();
if (dimensioneMagazzino <= 0) {
System.out.println("Errore: è necessario inserire almeno un prodotto.");
pausa();
error = true;
}
} catch (InputMismatchException e) {
System.out.println("Errore: numero non valido.");
pausa();
error = true;
}
} while (error);
if (magazzino == null) {
magazzino = new Prodotto[dimensioneMagazzino];
for (int i = 0; i < dimensioneMagazzino; i++) {
inserisciProdotto();
System.out.println("Prodotto inserito con successo.");
pausa();
}
} else {
magazzino = Arrays.copyOf(magazzino, magazzino.length + dimensioneMagazzino,
magazzino.getClass());
for (int i = magazzino.length - dimensioneMagazzino; i < magazzino.length; i++) {
inserisciProdotto();
System.out.println("Prodotto inserito con successo.");
pausa();
}
}
System.out.println("Tutti i prodotti sono stati inseriti con successo.");
pausa();
break;
case 2:
if (magazzino != null) {
do {
try {
error = false;
System.out.print("Quanti prodotti inserire? ");
dimensioneScontrino = sc.nextInt();
sc.nextLine();
if (dimensioneScontrino <= 0) {
System.out.println("Errore: è necessario inserire almeno un prodotto.");
pausa();
error = true;
}
} catch (InputMismatchException e) {
System.out.println("Errore: numero non valido.");
pausa();
error = true;
}
} while (error);
if (scontrino == null) {
scontrino = new Prodotto[dimensioneScontrino];
for (int i = 0; i < dimensioneScontrino; i++) {
inserisciDatiScontrino();
}
} else {
scontrino = Arrays.copyOf(scontrino, scontrino.length + dimensioneScontrino,
scontrino.getClass());
for (int i = scontrino.length - dimensioneScontrino; i < scontrino.length; i++) {
inserisciDatiScontrino();
}
}
System.out.println("Tutti i prodotti sono stati inseriti con successo.");
} else {
System.out.println(
"Errore: è necessario popolare il magazzino prima di poter creare lo scontrino.");
}
pausa();
break;
case 3:
if (scontrino != null) {
stampaScontrino();
} else {
System.out.println("Errore: è necessario inserire uno scontrino prima di mostrarlo.");
}
pausa();
break;
case 4:
if (magazzino != null) {
rimuoviScaduti();
} else {
System.out.println(
"Errore: è necessario inserire almeno un prodotto nel magazzino prima di rimuovere quelli scaduti.");
}
pausa();
break;
default:
System.out.println("Opzione non valida.");
pausa();
break;
}
} catch (InputMismatchException e) {
System.out.println("Errore: scelta non valida.");
pausa();
}
} while (scelta != 0);
}
public static void pausa() {
System.out.println("Premere un tasto per continuare. . .");
sc.nextLine();
}
public static void inserisciProdotto() {
String nome;
float prezzo = 0;
float qta = 0;
float scontoFidelityCard = 0;
Date dataScadenza = null;
String tipoMateriale = null;
boolean error = false, isAlimentare = true;
String scelta;
String descrizione;
Prodotto prodotto;
do {
System.out.print("Inserire il nome: ");
nome = sc.nextLine().trim();
System.out.print("Inserire la descrizione: ");
descrizione = sc.nextLine().trim();
do {
try {
error = false;
System.out.print("Inserire il prezzo: ");
prezzo = sc.nextFloat();
sc.nextLine();
if (prezzo <= 0) {
System.out.println("Errore: non è possibile inserire un prezzo minore o uguale a zero.");
pausa();
error = true;
}
} catch (InputMismatchException e) {
System.out.println("Errore: numero non valido.");
pausa();
error = true;
}
} while (error);
do {
try {
error = false;
System.out.print("Inserire lo sconto con carta fedeltà (in %): ");
scontoFidelityCard = sc.nextFloat() / 100;
sc.nextLine();
if (scontoFidelityCard < 0) {
System.out.println("Errore: non è possibile inserire uno sconto negativo.");
pausa();
error = true;
}
} catch (InputMismatchException e) {
System.out.println("Errore: numero non valido.");
}
} while (error);
do {
error = false;
System.out.print("Il prodotto è un genere alimentare? [S/n] ");
scelta = sc.nextLine().toLowerCase().trim();
if (scelta.equals("y") || scelta.equals("s") || scelta.equals("")) {
isAlimentare = true;
do {
error = false;
try {
System.out.print("Inserire la data di scadenza nel formato " + datePattern + ": ");
dataScadenza = sdf.parse(sc.nextLine().trim());
} catch (ParseException e) {
System.out.println("Errore nella lettura della data.");
pausa();
error = true;
}
} while (error);
} else if (scelta.equals("n")) {
isAlimentare = false;
System.out.print("Inserire il materiale del prodotto: ");
tipoMateriale = sc.nextLine().trim();
} else {
System.out.println("Errore: opzione non valida.");
pausa();
error = true;
}
} while (error);
do {
try {
error = false;
System.out.print("Inserire la quantità: ");
qta = isAlimentare ? sc.nextFloat() : (float) sc.nextInt();
sc.nextLine();
if (qta <= 0) {
System.out.println("Errore: non è possibile inserire meno di un prodotto.");
pausa();
error = true;
}
} catch (InputMismatchException e) {
System.out.println("Errore: numero non valido.");
}
} while (error);
if (isAlimentare) {
prodotto = new Alimentare(nome, prezzo, qta, scontoFidelityCard, dataScadenza, descrizione);
} else {
prodotto = new NonAlimentare(nome, prezzo, qta, scontoFidelityCard, tipoMateriale, descrizione);
}
if (trovaProdottoInMagazzino(prodotto) == -1) {
magazzino[trovaPosizioneLibera(magazzino)] = prodotto;
} else {
System.out.println("Errore: il prodotto esiste già nel magazzino.");
pausa();
error = true;
}
} while (error);
}
public static void inserisciDatiScontrino() {
boolean error, isAlimentare = false, useNomeProdotto = false, exit = false;
String scelta, nomeODescrizione;
float qta = 0;
Prodotto prodottoTrovato;
do {
do {
error = false;
System.out.print("Il prodotto è un genere alimentare? [S/n] ");
scelta = sc.nextLine().toLowerCase().trim();
if (scelta.equals("y") || scelta.equals("s") || scelta.equals("")) {
isAlimentare = true;
} else if (scelta.equals("n")) {
isAlimentare = false;
} else {
System.out.println("Errore: opzione non valida.");
pausa();
error = true;
}
} while (error);
do {
error = false;
System.out.println("Opzioni ammesse: nome, descrizione.");
System.out.print("Inserire il nome del prodotto o la sua descrizione? ");
scelta = sc.nextLine().toLowerCase().trim();
if (scelta.equals("nome")) {
useNomeProdotto = true;
} else if (scelta.equals("descrizione")) {
useNomeProdotto = false;
} else {
System.out.println("Opzioni ammesse: nome, descrizione.");
System.out.println("Errore: opzione non valida.");
pausa();
error = true;
}
} while (error);
System.out.print("Inserire " + (useNomeProdotto ? "il nome" : "la descrizione") + " del prodotto:"
+ (useNomeProdotto ? " " : "\n"));
nomeODescrizione = sc.nextLine().trim();
if (ricercaProdotto(nomeODescrizione, isAlimentare)) {
Prodotto prodottiTrovati[] = ricercaProdotto(nomeODescrizione);
if (prodottiTrovati.length == 1) {
prodottoTrovato = prodottiTrovati[0];
System.out.println("Prodotto trovato: ");
prodottoTrovato.stampaDati();
} else {
System.out.println("Sono stati trovati i seguenti prodotti: ");
for (int i = 0; i < prodottiTrovati.length; i++) {
System.out.println("Prodotto n. " + i);
prodottiTrovati[i].stampaDati();
System.out.println();
}
int indice = 0;
System.out.println();
do {
error = false;
try {
System.out.print("Inserire il numero di prodotto desiderato: ");
indice = sc.nextInt();
sc.nextLine();
if (indice < 0 || indice >= prodottiTrovati.length) {
System.out.println("Errore: numero di prodotto non valido.");
pausa();
error = true;
}
} catch (InputMismatchException e) {
System.out.println("Errore: numero non valido.");
pausa();
error = true;
}
} while (error);
prodottoTrovato = prodottiTrovati[indice];
}
do {
error = false;
System.out.print("È corretto? [S/n] ");
scelta = sc.nextLine().toLowerCase().trim();
if (scelta.equals("y") || scelta.equals("s") || scelta.equals("")) {
do {
error = false;
do {
try {
error = false;
System.out.print("Inserire la quantità: ");
qta = isAlimentare ? sc.nextFloat() : (float) sc.nextInt();
sc.nextLine();
if (qta <= 0) {
System.out.println("Errore: non è possibile inserire meno di un prodotto.");
pausa();
error = true;
}
} catch (InputMismatchException e) {
System.out.println("Errore: numero non valido.");
pausa();
error = true;
}
} while (error);
if (prodottoTrovato.checkQtaDisponibile(
useNomeProdotto ? nomeODescrizione : prodottoTrovato.getNome(), qta) != 0) {
if (qta <= prodottoTrovato.checkQtaDisponibile(
useNomeProdotto ? nomeODescrizione : prodottoTrovato.getNome(), qta)) {
if (trovaProdottoInScontrino(prodottoTrovato) == -1) {
if (prodottoTrovato.getQta() - qta == 0) {
System.out.println("Attenzione: il prodotto è stato finito.");
scontrino[trovaPosizioneLibera(scontrino)] = prodottoTrovato;
magazzino[trovaProdottoInMagazzino(prodottoTrovato)] = null;
} else {
int posizioneScontrino = trovaPosizioneLibera(scontrino);
prodottoTrovato.updQtaMagazzino(
useNomeProdotto ? nomeODescrizione : prodottoTrovato.getNome(),
prodottoTrovato.getQta() - qta);
scontrino[posizioneScontrino] = isAlimentare
? new Alimentare((Alimentare) prodottoTrovato)
: new NonAlimentare((NonAlimentare) prodottoTrovato);
scontrino[posizioneScontrino].updQtaMagazzino(
useNomeProdotto ? nomeODescrizione : prodottoTrovato.getNome(),
qta);
}
exit = true;
} else {
System.out.println("Errore: il prodotto esiste già nello scontrino.");
pausa();
error = true;
}
} else {
System.out.println("Errore: la quantità inserita supera quella disponibile, ovvero "
+ prodottoTrovato.getQta());
pausa();
error = true;
}
} else {
System.out.println("Errore: il nome non è corretto.");
pausa();
error = true;
}
} while (error);
} else if (scelta.equals("n")) {
System.out.println("Se il prodotto non è stato trovato, provare a scrivere un"
+ (useNomeProdotto ? " nome" : "a descrizione") + " più precis"
+ (useNomeProdotto ? "o" : "a") + " o a ricercare per "
+ (useNomeProdotto ? "descrizione" : "nome") + ".");
break;
} else {
System.out.println("Errore: opzione non valida.");
pausa();
error = true;
}
} while (error);
} else {
System.out.println("Errore: prodotto non trovato.");
System.out.println("Provare a scrivere un"
+ (useNomeProdotto ? " nome" : "a descrizione") + " più precis"
+ (useNomeProdotto ? "o" : "a") + " o a ricercare per "
+ (useNomeProdotto ? "descrizione" : "nome") + ".");
pausa();
}
} while (scelta.equals("n") || !exit);
}
public static void stampaScontrino() {
boolean error, fidelityCard = false;
String scelta;
do {
error = false;
System.out.print("Si ha la carta fedeltà? [S/n] ");
scelta = sc.nextLine().toLowerCase().trim();
if (scelta.equals("y") || scelta.equals("s") || scelta.equals("")) {
fidelityCard = true;
} else if (scelta.equals("n")) {
fidelityCard = false;
} else {
System.out.println("Errore: opzione non valida.");
pausa();
error = true;
}
} while (error);
for (Prodotto prodotto : scontrino) {
prodotto.stampaDati();
System.out.println();
}
System.out.println("Totale scontrino: " + totaleScontrino(fidelityCard));
}
public static boolean ricercaProdotto(String nome, boolean isAlimentare) { // prodottoExists
boolean ritorno = false;
for (int i = 0; i < magazzino.length && !ritorno; i++) {
if (isAlimentare) {
if (magazzino[i] != null && magazzino[i].getClass().getSimpleName().equals("Alimentare")) {
ritorno = magazzino[i].getNome().contains(nome) || magazzino[i].getDescrizione().contains(nome);
}
} else {
if (magazzino[i] != null && magazzino[i].getClass().getSimpleName().equals("NonAlimentare")) {
ritorno = magazzino[i].getNome().contains(nome) || magazzino[i].getDescrizione().contains(nome);
}
}
}
return ritorno;
}
static Prodotto[] ricercaProdotto(String p_nomeODescrizione) {
Prodotto ritorno[] = null;
int dimensione = 0;
for (Prodotto prodotto : magazzino) {
if (prodotto != null && (prodotto.getNome().contains(p_nomeODescrizione)
|| prodotto.getDescrizione().contains(p_nomeODescrizione))) {
ritorno = ritorno == null ? new Prodotto[1] : Arrays.copyOf(ritorno, dimensione + 1, ritorno.getClass());
ritorno[dimensione] = prodotto;
dimensione++;
}
}
return ritorno;
}
static int trovaProdottoInMagazzino(Prodotto p_prodotto) {
int ritorno = -1;
boolean exit = true;
for (int i = 0; i < magazzino.length && exit; i++) {
if (magazzino[i] != null) {
exit = false;
}
}
for (int i = 0; i < magazzino.length && !exit; i++) {
if (magazzino[i] != null) {
if (magazzino[i].isEqual(p_prodotto)) {
ritorno = i;
exit = true;
}
}
}
return ritorno;
}
static int trovaProdottoInScontrino(Prodotto p_prodotto) {
int ritorno = -1;
boolean exit = true;
for (int i = 0; i < scontrino.length && exit; i++) {
if (scontrino[i] != null) {
exit = false;
}
}
for (int i = 0; i < scontrino.length && !exit; i++) {
if (scontrino[i] != null) {
if (scontrino[i].isEqual(p_prodotto)) {
ritorno = i;
exit = true;
}
}
}
return ritorno;
}
static int trovaPosizioneLibera(Prodotto[] p_prodotti) {
int ritorno = -1;
boolean exit = false;
for (int i = 0; i < p_prodotti.length && !exit; i++) {
if (p_prodotti[i] == null) {
ritorno = i;
exit = true;
}
}
return ritorno;
}
static float totaleScontrino(boolean p_fidelityCard) {
float ritorno = 0;
for (Prodotto prodotto : scontrino) {
if (p_fidelityCard) {
prodotto.applicaSconto();
}
ritorno += prodotto.getPrezzo() * prodotto.getQta();
}
return ritorno;
}
static void rimuoviScaduti() {
int dimensione = 0;
Alimentare alimentari[] = null;
for (Prodotto prodotto : magazzino) {
if (prodotto.getClass().getSimpleName().equals("Alimentare")) {
alimentari = alimentari == null ? new Alimentare[1] : Arrays.copyOf(alimentari, dimensione + 1, alimentari.getClass());
alimentari[dimensione] = (Alimentare) prodotto;
dimensione++;
}
}
if (alimentari != null) {
for (Alimentare alimentare : alimentari) {
alimentare.rimuoviProdottoScaduto();
}
}
rimouviInvalidi();
}
static void rimouviInvalidi() {
for (int i = 0; i < magazzino.length; i++) {
if (magazzino[i].getQta() == -1) {
magazzino[i] = null;
}
}
}
}