/// <summary> /// Permette di aggiungere gli optional ad una persona in una determinata escursione /// </summary> /// <returns>Se riesce a farlo ritorna una stringa con il prezzo aggioranto, altrimenti un errore</returns> // Possibile modifica degli optional da parte di un utente static public string AggiuntaOptional(string codiceFiscale, string optional, int codiceEsursione) { Escursione escursione = RicercaEscursione(codiceEsursione); foreach (Persona persona in escursione.PersoneIscritteEscursione) { if (persona.CodiceFiscale == codiceFiscale) // Cerco l'utente usando il suo codice fiscale { int indicePersona = escursione.PersoneIscritteEscursione.IndexOf(persona); escursione.OptionalPerPartecipante[indicePersona] += "," + escursione.VerificaOptional(optional); // Aggiungo gli optional verificandoli con il metodo VerificaOptional double costo = escursione.CalcoloCostoEscursione(escursione.OptionalPerPartecipante[indicePersona]); return($"Optional aggiunto prezzo aggiornato per `{codiceFiscale}`: {costo} €"); } } return($"`{codiceFiscale}` non trovato!".Pastel("#FF0000")); }
/// <summary> /// Permette di cancellare la prenotazione di una persona ad una data escursione /// </summary> /// <returns>Ritorna una stringa con l'esito della eliminazione</returns> //Metodo con il quale si annulla l'iscrizione di un utente ad una escursione static public string CancellazionePrenotazione(int numeroEscursione, string codiceFiscale) { Escursione escursione = RicercaEscursione(numeroEscursione); foreach (Persona persona in escursione.PersoneIscritteEscursione) { if (persona.CodiceFiscale == codiceFiscale) { int indicePersona = escursione.PersoneIscritteEscursione.IndexOf(persona); escursione.PersoneIscritteEscursione.RemoveAt(indicePersona); // Rimuovo la persona dalla lista di persone dell'escursione scelta escursione.OptionalPerPartecipante.RemoveAt(indicePersona); //Rimuovo gli optional scleti dal partecipante escursione.CostoPerPartecipante.RemoveAt(indicePersona); //Rimuovo il costo dell'escursione per il partecipante return($"La prenotazione di `{persona.Cognome} {persona.Nome}` all'escursione n°{escursione.Numero} è stata cancellata con successo!".Pastel("#00ff00")); } } return($"La prenotazione di `{codiceFiscale}` all'escursione n°{escursione.Numero} non è stata trovata!".Pastel("#FF0000")); }
/// <summary> /// Permette di modificare l'escursione in tutti i suoi aspetti /// </summary> /// <returns>Una string che riassume le modifiche fatte con l'esito (riuscita/non riuscita)</returns> //Metodo che consente di modificare alcune propietà di una escursione già presente static public string ModificaEscursione(int numeroEscursione, double?costo = null, string descrizione = "", string tipologia = "", string optional = "") { Escursione escursione = RicercaEscursione(numeroEscursione); //Ricerco l'escursione cercata StringBuilder sb = new StringBuilder(); sb.AppendLine($"Modifica escursione n°{numeroEscursione}"); // `intestazione` output //in caso i parametri opzionali siano diversi dai parametri di default richiamo i metodi appositi della classe Escursione if (costo != null) { sb.Append("Modifica costo:"); if (escursione.ModificaCosto((double)costo)) { sb.AppendLine(" riuscita!\n".Pastel("#00FF00")); } else { sb.AppendLine(" non riuscita!\n".Pastel("#FF0000")); } } if (descrizione != "") { sb.Append("Modifica descrizione:"); if (escursione.ModificaDescrizione(descrizione)) { sb.Append(" riuscita!\n".Pastel("#00FF00")); } else { sb.Append(" non riuscita!\n".Pastel("#FF0000")); } } if (tipologia != "") { sb.Append("Modifica tipologia:"); if (escursione.ModificaTipo(tipologia)) { sb.Append(" riuscita!\n".Pastel("#00FF00")); } else { sb.Append(" non riuscita!\n".Pastel("#FF0000")); } } if (optional != "") { sb.Append("Modifica optional:"); if (escursione.ModificaOptional(optional)) { sb.Append(" riuscita!\n".Pastel("#00FF00")); } else { sb.Append(" non riuscita!\n".Pastel("#FF0000")); } } return(sb.ToString()); }
/// <summary> /// Permette la rimozione degli optional di una persona che partecipa ad una determinata escursione /// </summary> /// <returns>Se tutto va bene, ritorna una stringa con il prezzo aggiornato, altrimenti stampa un errore</returns> //Metodo che consente ad un utente di rimuovere aventuali optional scelti durante l'iscrizione all'escursione //Una volta rimossi gli optional il metodo rieseguirà anche il calcolo del costo dell'escursione per il partecipante static public string RimozioneOptional(int numeroEscursione, string optional, string codiceFiscale) { Escursione escursione = RicercaEscursione(numeroEscursione); foreach (Persona persona in escursione.PersoneIscritteEscursione) { if (persona.CodiceFiscale == codiceFiscale) { int indicePersonaTrovata = escursione.PersoneIscritteEscursione.IndexOf(persona); string updatedOptional = ""; string[] splittedOptionalPartecipante = escursione.OptionalPerPartecipante[indicePersonaTrovata].Trim().Split(','); string[] splittedOptionalScelto = optional.Trim().Split(','); if (splittedOptionalScelto.Length == 1) // Se l'optional da cercare è solo uno { // Cerco se tra quelle stringhe c'è l'optional da rimuovere foreach (string s in splittedOptionalPartecipante) { if (s == optional) { splittedOptionalPartecipante[Array.IndexOf(splittedOptionalPartecipante, s)] = string.Empty; } } // Ricompongo la stringa for (int i = 0; i < splittedOptionalPartecipante.Length; i++) { if (i != splittedOptionalPartecipante.Length - 1 && i != 0) { updatedOptional += splittedOptionalPartecipante[i] + ","; } else { updatedOptional += splittedOptionalPartecipante[i]; } } } else { // Li cerco, se li trovo li sostituisco con una stringa vuota for (int i = 0; i < splittedOptionalScelto.Length; i++) { for (int j = 0; j < splittedOptionalPartecipante.Length; j++) { if (splittedOptionalScelto[i] == splittedOptionalPartecipante[j]) { splittedOptionalPartecipante[Array.IndexOf(splittedOptionalPartecipante, splittedOptionalPartecipante[j])] = string.Empty; } } } // Ricompongo la stringa for (int i = 0; i < splittedOptionalPartecipante.Length; i++) { if (splittedOptionalPartecipante[i] != "" && i != splittedOptionalPartecipante.Length - 1 && i != 0) { updatedOptional += splittedOptionalPartecipante[i] + ","; } else { updatedOptional += splittedOptionalPartecipante[i]; } } } // Assegno gli optional aggiornati alla persona escursione.OptionalPerPartecipante[indicePersonaTrovata] = updatedOptional; // Ricalcolo del prezzo double newPrezzo = escursione.CalcoloCostoEscursione(updatedOptional); escursione.CostoPerPartecipante[indicePersonaTrovata] = newPrezzo; return($"Optional rimosso prezzo aggiornato per `{codiceFiscale}`: {newPrezzo} €"); } else { return($"`{codiceFiscale}` non trovato!".Pastel("#FF0000")); } } return($"Escursione n° {numeroEscursione} non trovata!".Pastel("#FF0000")); }
/// <summary> /// Permette di aggiungere dei partecipanti ad una data escursione con i loro optional /// </summary> /// <returns>Ritorna una stringa con il prezzo da pagare per ogni persona aggiunta, ed eventualmente un messaggio di attenzione in caso venga superato il numero massimo di partecipanti</returns> static public string RegistrazionePartecipanti(int numeroEscursione, List <Persona> personeIscritte, List <string> optionalPersoneIscritte) { /* * Moltiplicatore per il prezzo del biglietto in base al numero di persone che si iscrivono contemporaneamente alla gita */ Escursione escursione = RicercaEscursione(numeroEscursione); int numMax = escursione.NumeroMassimoPartecipanti; int numeroIscritti = personeIscritte.Count; double incrementoCostoBiglietto = 0.2; // di default se l'incremento è impostate a 0.2 if (numeroIscritti > 0 && numeroIscritti <= numMax / 2) { incrementoCostoBiglietto = (double)numeroIscritti / (double)10; } else if (numeroIscritti > numMax / 2 && numeroIscritti < numMax) { incrementoCostoBiglietto = (double)numeroIscritti / (double)10; } bool isValid = false; int index = -1; if (personeIscritte.Count <= numMax) { //Controllo se le persone aggiunte non siano gia stata iscritte altre volte in modo da evitare di inserire una persona più volte for (int i = 0; i < personeIscritte.Count; i++) { if (_persone.Count == 0) //in caso l'archivio _persone sia vuoto inserisco la prima persona in quanto non vi è bisogno di alcun controllo non potendoci essere persone doppie { _persone.Add(personeIscritte[i]); } else //se l'archivio presente al suo interno altre persone eseguo uj controllo per accertarmi che non vengano inserite persone già presenti in esso { for (int j = 0; j < _persone.Count; j++) { if (!Equals(personeIscritte[i], _persone[j])) //tramite il metodo Equals verifico se le due persone sono ugauali tra loro { isValid = true; index = i; //in caso ciò non sia vero mi segno la posizione della persona } else { isValid = false; break; } } if (isValid) { _persone.Add(personeIscritte[index]); //per poi inserirla nell'archivio } } } // Controllo che dentro l'escursione non ci sia gia stato inserito una stessa persona per evitare ridondanze //basandomi sullo stesso principio del controllo precendente isValid = false; index = -1; for (int i = 0; i < personeIscritte.Count; i++) { if (escursione.PersoneIscritteEscursione.Count == 0) { escursione.PersoneIscritteEscursione.Add(personeIscritte[0]); } else { for (int j = 0; j < escursione.PersoneIscritteEscursione.Count; j++) { if (!Equals(personeIscritte[i], escursione.PersoneIscritteEscursione[j])) { isValid = true; index = i; } else { isValid = false; break; } } if (isValid) { escursione.PersoneIscritteEscursione.Add(personeIscritte[index]); } } } //Inserisco gli optional per ogni persona dentro la lista for (int i = 0; i < optionalPersoneIscritte.Count; i++) { //uso il metodo VerificaOptional per assicurarmi che gli optional scelti dal partecipante siano conformi con quelli offerti dall'escursione escursione.OptionalPerPartecipante.Add(escursione.VerificaOptional(optionalPersoneIscritte[i])); } // Calcolo il prezzo dell'escursione per ogni partecipante e lo aggiungo alla lista costoPerPartecipante dell'istanza della classe Escursione // Inoltre creo una stringa con la quale comunicherò i prezzi a seconda dei partecipanti StringBuilder sb = new StringBuilder(); foreach (Persona persona in personeIscritte) { int indexPersona = escursione.PersoneIscritteEscursione.IndexOf(persona); if (indexPersona != -1) { double costoEscursione = escursione.CalcoloCostoEscursione(escursione.OptionalPerPartecipante[indexPersona]); costoEscursione += costoEscursione * incrementoCostoBiglietto; // calcolo il prezzo del biglietto compreso del 'moltiplicatore' escursione.CostoPerPartecipante.Add(costoEscursione); sb.AppendLine($"{persona.Cognome} {persona.Nome} dovrà pagare: {costoEscursione} €".Pastel("#00FF00")); } } return(sb.ToString()); } else { //Controllo se le persone aggiunte non siano gia stata iscritte altre volte in modo da evitare di inserire una persona più volte isValid = false; index = -1; for (int i = 0; i < numMax; i++) //controllo solo all'interno delle persone massime inseribili { if (_persone.Count == 0) //in caso l'archivio _persone sia vuoto inserisco la prima persona in quanto non vi è bisogno di alcun controllo non potendoci essere persone doppie { _persone.Add(personeIscritte[i]); } for (int j = 0; j < _persone.Count; j++) { if (!Equals(personeIscritte[i], _persone[j])) //tramite il metodo Equals verifico se le due persone sono ugauali tra loro { isValid = true; index = i;//in caso ciò non sia vero mi segno la posizione della persona } else { isValid = false; break; } } if (isValid) { _persone.Add(personeIscritte[index]); //per poi inserirla all'interno dell'archivio } } // Aggiungo le prime 10 persone della lista di iscritti controllando che non vi siano al suo interno due persone uguali isValid = false; index = -1; for (int i = 0; i < numMax; i++) { for (int j = 0; j < escursione.PersoneIscritteEscursione.Count; j++) { if (!Equals(personeIscritte[i], escursione.PersoneIscritteEscursione[j])) { isValid = true; index = i; } else { isValid = false; break; } } if (isValid) { escursione.PersoneIscritteEscursione.Add(personeIscritte[index]); } } for (int i = 0; i < numMax; i++) { //Aggiungo gli optional per ogni paretcipante escursione.OptionalPerPartecipante.Add(escursione.VerificaOptional(optionalPersoneIscritte[i])); } //Infine calcolo il costo dell'escursione di ogni partecipante e lo salvo nella lista CostoPerPartecipante presente nella classe escursione //inoltre mi creo una stringa che potrà venire utilizzata in caso si voglia comunicare i costi all'utente StringBuilder sb = new StringBuilder(); for (int i = 0; i < numMax; i++) { Persona persona = personeIscritte[i]; int indexPersona = escursione.PersoneIscritteEscursione.IndexOf(persona); double costoEscursione = escursione.CalcoloCostoEscursione(escursione.OptionalPerPartecipante[indexPersona]); costoEscursione += costoEscursione * incrementoCostoBiglietto; // Calcolo il prezzo comprensivo dell'incremento del biglietto escursione.CostoPerPartecipante.Add(costoEscursione); sb.AppendLine($"{persona.Cognome} {persona.Nome} dovrà pagare:\t{costoEscursione} €".Pastel("#00FF00")); } return($"Sono stati selezionati solo le prime {numMax} persone, il numero di partecipanti era superiore a quello limite {numMax}!".Pastel("#FFFF00")); } }