public void Confirm()
    {
        if (Status != ReservationStatus.Tentative)
        {
            throw new InvalidOperationException($"Only tentative reservation can be confirmed (current status: {Status}.");
        }

        var @event = new ReservationConfirmed(Id);

        Enqueue(@event);
        Apply(@event);
    }
        public ActionResult Confirm(int Id)
        {
            if (Session["loggedAdmin"] == null)
            {
                return(RedirectToAction("Index", "Home"));
            }
            var    reservationReader               = new ReservationReader();
            var    reservationWriter               = new ReservationWriter();
            var    reservationConfirmedWriter      = new ReservationConfirmedWriter();
            string filepathPrenotazioniConfermate  = Server.MapPath("~/App_Data/Confermato.txt");
            string filepathPrenotazioni            = Server.MapPath("~/App_Data/Prenotazioni.txt");
            string fileindexPrenotazioniConfermate = Server.MapPath("~/App_Data/Confermato_Last_Id.txt");
            IList <Reservation> listaPrenotazioni  = reservationReader.Read(filepathPrenotazioni);
            var indexManager = new IndexManager();
            int index        = indexManager.Read(fileindexPrenotazioniConfermate);

            ReservationConfirmed prenoConf = listaPrenotazioni.Where(e => e.Id == Id)
                                             .Select(pre => new ReservationConfirmed()
            {
                Id            = index + 1,
                IdReservation = pre.Id,
                Data          = pre.Data,
                IdAccount     = pre.IdAccount,
                IdProdotto    = pre.IdProdotto,
                NomeProdotto  = pre.NomeProdotto,
                Prezzo        = pre.Prezzo,
                DataConferma  = DateTime.Now,
                Evasa         = false,
                DataEvasione  = new DateTime(2000, 1, 1, 0, 0, 0)
            }).First();

            string linea = $"{prenoConf.Id}|{prenoConf.IdReservation}|{prenoConf.Data}|{prenoConf.IdAccount}|{prenoConf.IdProdotto}|{prenoConf.NomeProdotto}|{prenoConf.Prezzo}|{prenoConf.DataConferma}|{prenoConf.Evasa}|{prenoConf.DataEvasione}";

            reservationConfirmedWriter.Append(filepathPrenotazioniConfermate, linea);
            indexManager.Write(fileindexPrenotazioniConfermate, index + 1);

            listaPrenotazioni.First(e => e.Id == Id).Confermata = true;
            reservationWriter.Reset(filepathPrenotazioni);
            foreach (var pre in listaPrenotazioni)
            {
                string l = $"{pre.Id}|{pre.Data}|{pre.IdAccount}|{pre.IdProdotto}|{pre.NomeProdotto}|{pre.Prezzo}|{pre.Confermata}|{false}";
                reservationWriter.Append(filepathPrenotazioni, l);
            }

            return(RedirectToAction("Index", "Reservation"));
        }
        public ActionResult Complete(int Id)
        {
            if (Session["loggedAdmin"] == null)
            {
                return(RedirectToAction("Index", "Home"));
            }
            var    reservationReader        = new ReservationReader();
            var    reservationWriter        = new ReservationWriter();
            string fileReservation          = Server.MapPath("~/App_Data/Prenotazioni.txt");
            var    reservationConfirmReader = new ReservationConfirmedReader();
            var    reservationConfirmWriter = new ReservationConfirmedWriter();
            string fileReservationConfirmed = Server.MapPath("~/App_Data/Confermato.txt");

            IList <Reservation>          prenotazioni = reservationReader.Read(fileReservation);
            IList <ReservationConfirmed> confermate   = reservationConfirmReader.Read(fileReservationConfirmed);

            ReservationConfirmed evasa = confermate.First(e => e.Id == Id);

            evasa.Evasa        = true;
            evasa.DataEvasione = DateTime.Now;
            Reservation daAggiornare = prenotazioni.First(e => e.Id == evasa.IdReservation);

            daAggiornare.Evasa = true;

            reservationWriter.Reset(fileReservation);
            foreach (var pre in prenotazioni)
            {
                string l = $"{pre.Id}|{pre.Data}|{pre.IdAccount}|{pre.IdProdotto}|{pre.NomeProdotto}|{pre.Prezzo}|{pre.Confermata}|{pre.Evasa}";
                reservationWriter.Append(fileReservation, l);
            }

            reservationConfirmWriter.Reset(fileReservationConfirmed);
            foreach (var prenoConf in confermate)
            {
                string linea = $"{prenoConf.Id}|{prenoConf.IdReservation}|{prenoConf.Data}|{prenoConf.IdAccount}|{prenoConf.IdProdotto}|{prenoConf.NomeProdotto}|{prenoConf.Prezzo}|{prenoConf.DataConferma}|{prenoConf.Evasa}|{prenoConf.DataEvasione}";
                reservationConfirmWriter.Append(fileReservationConfirmed, linea);
            }

            return(RedirectToAction("Index", "Reservation"));
        }
 public void Apply(ReservationConfirmed @event)
 {
     Status = ReservationStatus.Confirmed;
     Version++;
 }
 public void Handle(ReservationConfirmed e)
 {
     Console.WriteLine($"\t---[{nameof(DummyEventHandler)}] Handling {e.GetType().Name}---");
 }