private RichiestaAssistenza CreaRichiestaContenenteUnicoEventoDiComposizione(out SituazioneMezzo expected) { var richiestaConUnicoEventoDiAssegnazione = new RichiestaAssistenza() { Codice = "R1", }; var componentePartenza = new ComponentePartenza("CF1", "M1"); var istanteEvento = DateTime.Now.AddMinutes(-10); var eventoComposizione = new ComposizionePartenze(richiestaConUnicoEventoDiAssegnazione, istanteEvento, "Fonte", false) { Componenti = new HashSet <ComponentePartenza>() { componentePartenza } }; expected = new SituazioneMezzo() { Codice = "M1", CodiceStato = new Assegnato(istanteEvento, "R1").Codice, CodiceRichiestaAssistenza = "R1", IstanteAggiornamentoStato = istanteEvento }; return(richiestaConUnicoEventoDiAssegnazione); }
/// <summary> /// Esegue l'azione /// </summary> /// <param name="istanteEffettivo"> /// L'istante effettivo (simulato) in cui l'azione viene eseguita /// </param> /// <returns>Le azioni da eseguire a seguito dell'esecuzione della presente azione</returns> public IEnumerable <IAzioneSuRichiesta> Esegui(DateTime istanteEffettivo) { var mezzoSelezionato = this.parcoMezzi.GetPrimoMezzoDisponibile(); if (mezzoSelezionato == null) { yield break; } mezzoSelezionato.ContestoMezzo.Composizione(); this.parametriMezzo.MezzoUtilizzato = mezzoSelezionato; // questa assegnazione alimenta l'esecuzione di tutti gli altri eventi successivi var composizione = new ComposizionePartenze(this.richiesta.Richiesta, istanteEffettivo, "Fonte", false) { Componenti = new HashSet <ComponentePartenza>(mezzoSelezionato.Membri .Select((m, i) => new ComponentePartenza(m, mezzoSelezionato.Mezzo.Codice, "Ticket") { Ruoli = i == 0 ? new HashSet <Ruolo>() { Ruolo.CapoPartenza } : i == 1 ? new HashSet <Ruolo> { Ruolo.Autista } : new HashSet <Ruolo> { Ruolo.Vigile } })) }; this.eseguita = true; yield return(new AggiungiPartenzaDallaSede( istanteEffettivo.AddMinutes(1), // la partenza avviene un minuto dopo la composizione this.richiesta, this.parametriMezzo)); }
public void Un_evento_di_composizione_partenze_con_parametri_corretti_e_correttamente_creato() { var now = DateTime.Now; var evento = new ComposizionePartenze(this.richiesta, now, "Fonte", false); Assert.That(evento.Istante, Is.EqualTo(now)); Assert.That(evento.CodiceFonte, Is.EqualTo("Fonte")); }
private void Crea_Richiesta_R1_Con_M1_e_M2_revocato_e_riassegnato_e_M1_revocato_e_M2_in_viaggio(out IEnumerable <SituazioneMezzo> expected, out IEnumerable <RichiestaAssistenza> richieste) { var richiesta = new RichiestaAssistenza() { Codice = "R1", }; var richiestaSubentrata = new RichiestaAssistenza() { Codice = "R2", }; richieste = new RichiestaAssistenza[] { richiesta, richiestaSubentrata }; var now = DateTime.Now; var componentePartenza1 = new ComponentePartenza("CF1", "M1"); var componentePartenza2 = new ComponentePartenza("CF2", "M2"); var istanteEventoAssegnazione = now.AddMinutes(-10); var eventoComposizione = new ComposizionePartenze(richiesta, istanteEventoAssegnazione, "Fonte", false) { Componenti = new HashSet <ComponentePartenza>() { componentePartenza1, componentePartenza2 } }; var istanteEventoUscitaM1 = now.AddMinutes(-7); var eventoUscitaM1 = new UscitaPartenza(richiesta, "M1", istanteEventoUscitaM1, "Fonte"); var istanteEventoUscitaM2 = now.AddMinutes(-6); var eventoUscitaM2 = new UscitaPartenza(richiesta, "M2", istanteEventoUscitaM2, "Fonte"); var istanteSulPostoM1 = now.AddMinutes(-4); var eventoSulPostoM1 = new ArrivoSulPosto(richiesta, "M1", istanteSulPostoM1, "Fonte"); var istanteSganciatoM1 = now.AddMinutes(-2); var eventoSganciatoM1 = new RevocaPerRiassegnazione(richiesta, richiestaSubentrata, "M1", istanteSganciatoM1, "Fonte"); var istanteRiassegnatoM1 = now.AddMinutes(-1); var eventoComposizione2 = new ComposizionePartenze(richiestaSubentrata, istanteRiassegnatoM1, "Fonte", true) { Componenti = new HashSet <ComponentePartenza>() { componentePartenza1 } }; expected = new SituazioneMezzo[] { new SituazioneMezzo() { Codice = "M1", CodiceStato = new InViaggio(istanteRiassegnatoM1, "R2").Codice, CodiceRichiestaAssistenza = "R2", IstanteAggiornamentoStato = istanteRiassegnatoM1 }, new SituazioneMezzo() { Codice = "M2", CodiceStato = new InViaggio(istanteEventoUscitaM2, "R1").Codice, CodiceRichiestaAssistenza = "R1", IstanteAggiornamentoStato = istanteEventoUscitaM2 }, }; }
public void UnaComposizionePartenzaAppenaCreataHaLAttributoComponentiNonNull() { var richiesta = new RichiestaAssistenza(); var cp = new ComposizionePartenze(richiesta, DateTime.Now, "Fonte", false); var componenti = cp.Componenti; Assert.That(componenti, Is.Not.Null); }
/// <summary> /// Nello stato <see cref="FuoriSincro" /> un evento <see cref="ComposizionePartenze" /> fa /// transire verso lo stato <see cref="Assegnato" /> se la composizione avviene col mezzo /// in sede, oppure verso lo stato <see cref="Libero" /> se la composizione avviene mentre /// il mezzo non è in sede. /// </summary> /// <param name="composizionePartenze">Il visitor</param> /// <returns>Il nuovo stato a valle dell'evento di composizione</returns> public override IStatoMezzo AcceptVisitor(ComposizionePartenze composizionePartenze) { if (composizionePartenze.FuoriSede) { return(new Libero(composizionePartenze.Istante)); } else { return(new Assegnato(composizionePartenze.Istante, composizionePartenze.CodiceRichiesta)); } }
private RichiestaAssistenza Crea_Richiesta_Con_M3_e_M4_assegnati_e_M4_in_sede_e_M3_in_rientro(out IEnumerable <SituazioneMezzo> expected) { var richiesta = new RichiestaAssistenza() { Codice = "R2", }; var componentePartenza1 = new ComponentePartenza("CF3", "M3"); var componentePartenza2 = new ComponentePartenza("CF4", "M4"); var istanteEventoAssegnazione = DateTime.Now.AddMinutes(-10); var eventoComposizione = new ComposizionePartenze(richiesta, istanteEventoAssegnazione, "Fonte", false) { Componenti = new HashSet <ComponentePartenza>() { componentePartenza1, componentePartenza2 } }; var istanteEventoUscitaM3 = DateTime.Now.AddMinutes(-7); var eventoUscitaM3 = new UscitaPartenza(richiesta, "M3", istanteEventoUscitaM3, "Fonte"); var istanteSulPostoM3 = DateTime.Now.AddMinutes(-4); var eventoSulPostoM3 = new ArrivoSulPosto(richiesta, "M3", istanteSulPostoM3, "Fonte"); var istanteInRientroM3 = DateTime.Now.AddMinutes(-2); var eventoInRientroM3 = new PartenzaInRientro(richiesta, "M3", istanteInRientroM3, "Fonte"); var istanteEventoUscitaM4 = DateTime.Now.AddMinutes(-7); var eventoUscitaM4 = new UscitaPartenza(richiesta, "M4", istanteEventoUscitaM4, "Fonte"); var istanteSulPostoM4 = DateTime.Now.AddMinutes(-4); var eventoSulPostoM4 = new ArrivoSulPosto(richiesta, "M4", istanteSulPostoM4, "Fonte"); var istanteInRientroM4 = DateTime.Now.AddMinutes(-3); var eventoInRientroM4 = new PartenzaInRientro(richiesta, "M4", istanteInRientroM4, "Fonte"); var istanteRientratoM4 = DateTime.Now.AddMinutes(-2); var eventoRientratoM4 = new PartenzaRientrata(richiesta, "M4", istanteRientratoM4, "Fonte"); expected = new SituazioneMezzo[] { new SituazioneMezzo() { Codice = "M3", CodiceStato = new InRientro(istanteInRientroM3, "R2").Codice, CodiceRichiestaAssistenza = "R2", IstanteAggiornamentoStato = istanteSulPostoM3 }, new SituazioneMezzo() { Codice = "M4", CodiceStato = new InSede(istanteRientratoM4).Codice, CodiceRichiestaAssistenza = "R2", IstanteAggiornamentoStato = istanteRientratoM4 }, }; return(richiesta); }
public void CreaComposizionePartenzaStandard() { var richiesta = new RichiestaAssistenza(); this.partenzaDiCinquePersoneConUnicoCapopartenzaEUnicoAutista = new ComposizionePartenze(richiesta, DateTime.Now, "Fonte", false) { Componenti = new HashSet <ComponentePartenza>() { new ComponentePartenza("XXX") { Ruoli = new HashSet <ComponentePartenza.Ruolo>() { ComponentePartenza.Ruolo.CapoPartenza } }, new ComponentePartenza("YYY") { Ruoli = new HashSet <ComponentePartenza.Ruolo>() { ComponentePartenza.Ruolo.Autista } }, new ComponentePartenza("ZZZ") { Ruoli = new HashSet <ComponentePartenza.Ruolo>() { ComponentePartenza.Ruolo.Vigile } }, new ComponentePartenza("KKK") { Ruoli = new HashSet <ComponentePartenza.Ruolo>() { ComponentePartenza.Ruolo.Vigile } }, new ComponentePartenza("LLL") { Ruoli = new HashSet <ComponentePartenza.Ruolo>() { ComponentePartenza.Ruolo.Vigile } } } }; }
private RichiestaAssistenza Crea_Richiesta_Con_M3_e_M4_assegnati_e_M3_sul_posto_e_in_viaggio(out IEnumerable <SituazioneMezzo> expected) { var richiesta = new RichiestaAssistenza() { Codice = "R2", }; var componentePartenza1 = new ComponentePartenza("CF3", "M3"); var componentePartenza2 = new ComponentePartenza("CF4", "M4"); var istanteEvento1 = DateTime.Now.AddMinutes(-11); var eventoComposizione = new ComposizionePartenze(richiesta, istanteEvento1, "Fonte", false) { Componenti = new HashSet <ComponentePartenza>() { componentePartenza1, componentePartenza2 } }; var istanteEvento2 = DateTime.Now.AddMinutes(-6); var eventoUscita = new UscitaPartenza(richiesta, "M4", istanteEvento2, "Fonte"); var istanteEvento3 = DateTime.Now.AddMinutes(-3); var eventoSulPosto = new ArrivoSulPosto(richiesta, "M4", istanteEvento3, "Fonte"); expected = new SituazioneMezzo[] { new SituazioneMezzo() { Codice = "M4", CodiceStato = new SulPosto(istanteEvento3, "R2").Codice, CodiceRichiestaAssistenza = "R2", IstanteAggiornamentoStato = istanteEvento3 }, new SituazioneMezzo() { Codice = "M3", CodiceStato = new Assegnato(istanteEvento1, "R2").Codice, CodiceRichiestaAssistenza = "R2", IstanteAggiornamentoStato = istanteEvento1 }, }; return(richiesta); }
/// <summary> /// Nello stato <see cref="InRientro" /> l'evento <see cref="ComposizionePartenze" /> /// produce la transizione nello stato <see cref="InViaggio" />. /// </summary> /// <param name="composizionePartenze">Il visitor</param> /// <returns>Lo stato <see cref="Assegnato" /></returns> public override IStatoMezzo AcceptVisitor(ComposizionePartenze composizionePartenze) { return(new Assegnato(composizionePartenze.Istante, composizionePartenze.CodiceRichiesta)); }
/// <summary> /// Accetta il visitor e scatena l'implementazione di default che consiste nel sollevare /// una <see cref="WorkflowException" />. Gli stati concreti, implementati nelle classi /// derivate, effettuano l'override dei metodi corrispondenti a transizioni di stato /// ammesse, restituendo lo stato corretto a fronte dell'evento (visitor) di ingresso. /// </summary> /// <param name="composizionePartenze">Il visitor accettato</param> /// <returns>Niente, poiché solleva un'eccezione</returns> public virtual IStatoMezzo AcceptVisitor(ComposizionePartenze composizionePartenze) { throw new WorkflowException($"Impossibile transire in seguito all'evento {nameof(composizionePartenze)}"); }
/// <summary> /// Cambio lo stato di una singola partenza e dei relativi mezzi e stato squadre /// </summary> /// <param name="partenzaDaLavorare">La partenza la quale devo cambiarne lo stato</param> /// <param name="stato">Lo stato che va attribuito alla partenza</param> internal void CambiaStatoPartenza(ComposizionePartenze partenzaDaLavorare, CambioStatoMezzo stato) { #region SWITCH STATO MEZZI if (stato.Stato == Costanti.MezzoInViaggio) { new UscitaPartenza(this, partenzaDaLavorare.Partenza.Mezzo.Codice, stato.DataOraAggiornamento, CodOperatore, partenzaDaLavorare.Partenza.Codice); SincronizzaStatoRichiesta(Costanti.RichiestaAssegnata, StatoRichiesta, CodOperatore, "", stato.DataOraAggiornamento); partenzaDaLavorare.Partenza.Mezzo.Stato = Costanti.MezzoInViaggio; partenzaDaLavorare.Partenza.Mezzo.IdRichiesta = Id; } else if (stato.Stato == Costanti.MezzoSulPosto) { new ArrivoSulPosto(this, partenzaDaLavorare.Partenza.Mezzo.Codice, stato.DataOraAggiornamento, CodOperatore, partenzaDaLavorare.Partenza.Codice); SincronizzaStatoRichiesta(Costanti.RichiestaPresidiata, StatoRichiesta, CodOperatore, "", stato.DataOraAggiornamento); partenzaDaLavorare.Partenza.Mezzo.Stato = Costanti.MezzoSulPosto; partenzaDaLavorare.Partenza.Mezzo.IdRichiesta = Id; } else if (stato.Stato == Costanti.MezzoInRientro) { partenzaDaLavorare.Partenza.Mezzo.Stato = Costanti.MezzoInRientro; new PartenzaInRientro(this, partenzaDaLavorare.Partenza.Mezzo.Codice, stato.DataOraAggiornamento, CodOperatore, partenzaDaLavorare.Partenza.Codice); if (lstPartenze.Select(p => p.Mezzo.Stato).All(s => s != Costanti.MezzoInSede && s != Costanti.MezzoInViaggio && s != Costanti.MezzoInUscita && s != Costanti.MezzoSulPosto)) { new ChiusuraRichiesta("", this, stato.DataOraAggiornamento, CodOperatore); } } else if (stato.Stato == Costanti.MezzoRientrato) { partenzaDaLavorare.Partenza.Mezzo.Stato = Costanti.MezzoInSede; partenzaDaLavorare.Partenza.Mezzo.IdRichiesta = null; partenzaDaLavorare.Partenza.Terminata = true; new PartenzaRientrata(this, partenzaDaLavorare.Partenza.Mezzo.Codice, stato.DataOraAggiornamento, CodOperatore, partenzaDaLavorare.Partenza.Codice); if (lstPartenze.Select(p => p.Mezzo.Stato).All(s => s != Costanti.MezzoInSede && s != Costanti.MezzoInViaggio && s != Costanti.MezzoInUscita && s != Costanti.MezzoSulPosto)) { new ChiusuraRichiesta("", this, stato.DataOraAggiornamento, CodOperatore); } } else if (stato.Stato == Costanti.MezzoInViaggio) { partenzaDaLavorare.Partenza.Mezzo.Stato = Costanti.MezzoInViaggio; partenzaDaLavorare.Partenza.Mezzo.IdRichiesta = Id; } else if (stato.Stato == Costanti.MezzoInUscita) { partenzaDaLavorare.Partenza.Mezzo.Stato = Costanti.MezzoInUscita; } #endregion SWITCH STATO MEZZI foreach (var squadra in partenzaDaLavorare.Partenza.Squadre) { squadra.Stato = MappaStatoSquadraDaStatoMezzo.MappaStato(stato.Stato); } }
public void Un_evento_di_composizione_partenze_ha_i_componenti_non_null() { var evento = new ComposizionePartenze(this.richiesta, DateTime.Now, "Fonte", false); Assert.That(evento.Componenti, Is.Not.Null); }
public async void Handle(SostituzionePartenzaCommand command) { Parallel.ForEach(command.sostituzione.Sostituzioni, sostituzione => { #region GESTIONE NOTE string NoteSquadreSmontanti = ""; string NoteSquadreMontanti = ""; if (sostituzione.SquadreSmontanti.Count() > 1) { foreach (var squadra in sostituzione.SquadreSmontanti) { NoteSquadreSmontanti = NoteSquadreSmontanti + squadra + ","; } NoteSquadreSmontanti = "Le squadre " + NoteSquadreSmontanti.Substring(0, NoteSquadreSmontanti.Length - 1) + " vengono sostituite "; } else { NoteSquadreSmontanti = "La squadra " + sostituzione.SquadreSmontanti[0] + " viene sostituita "; } if (sostituzione.SquadreMontanti.Count() > 1) { foreach (var squadra in sostituzione.SquadreMontanti) { NoteSquadreMontanti = NoteSquadreMontanti + squadra + ","; } NoteSquadreMontanti = " dalle squadre " + NoteSquadreMontanti.Substring(0, NoteSquadreMontanti.Length - 1); } else { NoteSquadreMontanti = " dalla squadra " + sostituzione.SquadreMontanti[0]; } string Note = NoteSquadreSmontanti + NoteSquadreMontanti + " sul mezzo " + sostituzione.CodMezzoSmontante + " tornando in sede con il mezzo " + sostituzione.CodMezzoMontante; #endregion #region GESTIONE RICHIESTA E EVENTI RICIHESTA new SostituzionePartenzaFineTurno(command.Richiesta, sostituzione.CodMezzoSmontante, command.sostituzione.DataOraOperazione, command.sostituzione.idOperatore, Note); var PartenzaMontante = command.Richiesta.Partenze.FirstOrDefault(x => x.Partenza.Mezzo.Codice.Equals(sostituzione.CodMezzoMontante) && x.PartenzaAnnullata == false && x.Partenza.Terminata == false && x.Partenza.Sganciata == false); var PartenzaSmontante = command.Richiesta.Partenze.FirstOrDefault(x => x.Partenza.Mezzo.Codice.Equals(sostituzione.CodMezzoSmontante) && x.PartenzaAnnullata == false && x.Partenza.Terminata == false && x.Partenza.Sganciata == false); var SquadreSwitch = PartenzaSmontante.Partenza.Squadre; //GESTIONE PARTENZA SMONTANTE PartenzaSmontante.Partenza.Squadre = PartenzaMontante.Partenza.Squadre; PartenzaSmontante.Partenza.Terminata = true; //GESTIONE PARTENZA MONTANTE PartenzaMontante.Partenza.Squadre = PartenzaSmontante.Partenza.Squadre; PartenzaMontante.Partenza.Terminata = true; //GESTIONE NUOVA PARTENZA SMONTANTE var PartenzaSmontanteNuova = new ComposizionePartenze(command.Richiesta, DateTime.Now, command.sostituzione.idOperatore, false) { Partenza = new Partenza() { Codice = command.Richiesta.CodiceUltimaPartenza + 1, Mezzo = PartenzaSmontante.Partenza.Mezzo, Squadre = PartenzaMontante.Partenza.Squadre } }; //GESTIONE NUOVA PARTENZA MONTANTE var PartenzaMontanteNuova = new ComposizionePartenze(command.Richiesta, DateTime.Now, command.sostituzione.idOperatore, false) { Partenza = new Partenza() { Codice = command.Richiesta.CodiceUltimaPartenza + 1, Mezzo = PartenzaMontante.Partenza.Mezzo, Squadre = SquadreSwitch } }; var CodSede = PartenzaSmontante.Partenza.Mezzo.Distaccamento.Codice; _updateRichiesta.UpDate(command.Richiesta); #endregion #region Comunicazione a servizi GAC //RIENTRO SMONTANTE Task.Factory.StartNew(async() => { _rientroMezzo.Set(new RientroGAC() { idPartenza = PartenzaSmontante.Partenza.Codice.ToString(), dataIntervento = PartenzaSmontante.DataOraInserimento, numeroIntervento = command.Richiesta.CodRichiesta, dataRientro = PartenzaSmontante.DataOraInserimento, targa = PartenzaSmontante.Partenza.Mezzo.Codice, tipoMezzo = PartenzaSmontante.Partenza.Mezzo.Genere }); //RIENTRO MONTANTE _rientroMezzo.Set(new RientroGAC() { idPartenza = PartenzaMontante.Partenza.Codice.ToString(), dataIntervento = PartenzaMontante.DataOraInserimento, numeroIntervento = command.Richiesta.CodRichiesta, dataRientro = PartenzaMontante.DataOraInserimento, targa = PartenzaMontante.Partenza.Mezzo.Codice, tipoMezzo = PartenzaMontante.Partenza.Mezzo.Genere }); //USCITA NUOVA PARTENZA MONTANTE _uscitaMezzo.Set(new UscitaGAC() { idPartenza = PartenzaMontanteNuova.Partenza.Codice.ToString(), dataIntervento = PartenzaMontanteNuova.DataOraInserimento, numeroIntervento = command.Richiesta.CodRichiesta, dataUscita = PartenzaMontanteNuova.DataOraInserimento, targa = PartenzaMontanteNuova.Partenza.Mezzo.Codice, tipoMezzo = PartenzaMontanteNuova.Partenza.Mezzo.Genere }); //USCITA NUOVA PARTENZA SMONTANTE _uscitaMezzo.Set(new UscitaGAC() { idPartenza = PartenzaSmontanteNuova.Partenza.Codice.ToString(), dataIntervento = PartenzaSmontanteNuova.DataOraInserimento, numeroIntervento = command.Richiesta.CodRichiesta, dataUscita = PartenzaSmontanteNuova.DataOraInserimento, targa = PartenzaSmontanteNuova.Partenza.Mezzo.Codice, tipoMezzo = PartenzaSmontanteNuova.Partenza.Mezzo.Genere }); }); #endregion }); }