608 lines
25 KiB
Java
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;
|
|
}
|
|
}
|
|
}
|
|
}
|