private ActionResult ModifyState(ClientSubscription clientSubscription, ClientSubscriptionState state)
        {
            if (ModelState.IsValid)
            {
                DateTime           time         = clientSubscription.Timestamp;
                ClientSubscription subscription = db.ClientSubscriptions.Find(clientSubscription.ClientSubscriptionId);
                long clientAccountId            = subscription.ClientAccountId;
                subscription.State     = state;
                subscription.Timestamp = DateTime.Now;
                subscription.Notes     = clientSubscription.Notes;

                db.Entry(subscription).State = EntityState.Modified;

                var clientSubscriptionHistory = new ClientSubscriptionHistory()
                {
                    UnitPrice            = subscription.UnitPrice,
                    State                = state,
                    Quantity             = subscription.CurrentQuantity,
                    Notes                = subscription.Notes,
                    VesselName           = subscription.VesselName,
                    ClientSubscriptionId = subscription.ClientSubscriptionId,
                    Timestamp            = time
                };

                db.ClientSubscriptionHistories.Add(clientSubscriptionHistory);

                db.SaveChanges();
                return(RedirectToAction("Index", new { accountId = clientAccountId }));
            }

            return(View("Invalid state."));
        }
        public ActionResult PayConfirmed([Bind(Include = "ClientSubscriptionId, Notes, Timestamp")] ClientSubscription subscription)
        {
            if (ModelState.IsValid)
            {
                DateTime time = subscription.Timestamp;

                ClientSubscription clientSubscription = db.ClientSubscriptions.Find(subscription.ClientSubscriptionId);
                long          clientAccountId         = clientSubscription.ClientAccountId;
                ClientAccount client = db.ClientAccounts.Find(clientAccountId);

                if (client.Balance >= clientSubscription.UnitPrice * clientSubscription.StartQuantity)
                {
                    clientSubscription.State           = ClientSubscriptionState.Paid;
                    db.Entry(clientSubscription).State = EntityState.Modified;
                    client.Balance -= clientSubscription.UnitPrice * clientSubscription.StartQuantity;
                    clientSubscription.Timestamp = time;
                    db.Entry(client).State       = EntityState.Modified;

                    var clientSubscriptionHistory = new ClientSubscriptionHistory()
                    {
                        UnitPrice            = clientSubscription.UnitPrice,
                        State                = ClientSubscriptionState.Paid,
                        Quantity             = clientSubscription.StartQuantity,
                        VesselName           = subscription.VesselName,
                        Notes                = clientSubscription.Notes,
                        ClientSubscriptionId = clientSubscription.ClientSubscriptionId,
                        Timestamp            = time
                    };

                    db.ClientSubscriptionHistories.Add(clientSubscriptionHistory);

                    var clientBalanceHistory = new ClientBalanceHistory()
                    {
                        Amount          = clientSubscription.UnitPrice * clientSubscription.StartQuantity * -1,
                        BalanceType     = BalanceChangeType.Pay,
                        ClientAccountId = clientAccountId,
                        Description     = string.Format("Pay for Subscription: {0}.", subscription.ClientSubscriptionId),
                        Timestamp       = time
                    };

                    db.ClientBalanceHistories.Add(clientBalanceHistory);

                    db.SaveChanges();
                    return(RedirectToAction("Index", new { accountId = clientAccountId }));
                }

                return(View("The balance is not enough to pay the subscription."));
            }

            return(View("The state is not valid."));
        }
        public ActionResult Create([Bind(Include = "ClientAccountId,StationAccountId, VesselName, Quantity,UnitPrice,Notes,Timestamp")] ClientSubscriptionViewModel clientSubscriptionViewModel)
        {
            if (ModelState.IsValid)
            {
                DateTime time = clientSubscriptionViewModel.Timestamp;

                var clientSubscription = new ClientSubscription()
                {
                    UnitPrice        = clientSubscriptionViewModel.UnitPrice,
                    State            = ClientSubscriptionState.Created,
                    StartQuantity    = clientSubscriptionViewModel.Quantity,
                    CurrentQuantity  = clientSubscriptionViewModel.Quantity,
                    ClientAccountId  = clientSubscriptionViewModel.ClientAccountId,
                    Notes            = clientSubscriptionViewModel.Notes,
                    VesselName       = clientSubscriptionViewModel.VesselName,
                    StationAccountId = int.Parse(clientSubscriptionViewModel.StationAccountId),
                    Timestamp        = time
                };

                db.ClientSubscriptions.Add(clientSubscription);



                db.SaveChanges();

                var clientSubscriptionHistory = new ClientSubscriptionHistory()
                {
                    UnitPrice            = clientSubscriptionViewModel.UnitPrice,
                    State                = ClientSubscriptionState.Created,
                    Quantity             = clientSubscriptionViewModel.Quantity,
                    Notes                = clientSubscriptionViewModel.Notes,
                    VesselName           = clientSubscriptionViewModel.VesselName,
                    ClientSubscriptionId = clientSubscription.ClientSubscriptionId,
                    Timestamp            = time
                };

                db.ClientSubscriptionHistories.Add(clientSubscriptionHistory);
                db.SaveChanges();

                return(RedirectToAction("Index", new { accountId = clientSubscriptionViewModel.ClientAccountId }));
            }

            return(View(clientSubscriptionViewModel));
        }
        public ActionResult DeliverConfirmed([Bind(Include = "ClientSubscriptionId, Quantity, Notes")] ClientSubscriptionDeliverViewModel model)
        {
            if (ModelState.IsValid)
            {
                DateTime           time         = DateTime.Now;
                ClientSubscription subscription = db.ClientSubscriptions.Find(model.ClientSubscriptionId);
                long clientAccountId            = subscription.ClientAccountId;

                float leftQuantity = subscription.CurrentQuantity - model.Quantity;

                if (leftQuantity == 0)
                {
                    subscription.State = ClientSubscriptionState.Delivered;
                }
                else
                {
                    subscription.State = ClientSubscriptionState.PartialDelivered;
                }

                subscription.CurrentQuantity = leftQuantity;
                subscription.Timestamp       = time;
                subscription.Notes           = model.Notes;

                db.Entry(subscription).State = EntityState.Modified;

                var clientSubscriptionHistory = new ClientSubscriptionHistory()
                {
                    UnitPrice            = subscription.UnitPrice,
                    State                = subscription.State,
                    Quantity             = model.Quantity,
                    Notes                = model.Notes,
                    VesselName           = subscription.VesselName,
                    ClientSubscriptionId = subscription.ClientSubscriptionId,
                    Timestamp            = time
                };

                db.ClientSubscriptionHistories.Add(clientSubscriptionHistory);

                db.SaveChanges();
                return(RedirectToAction("Index", new { accountId = clientAccountId }));
            }

            return(View("Invalid state."));
        }
        public ActionResult DeliverConfirmed([Bind(Include = "SubscriptionId, Quantity,ClientSubscriptionId, Notes, Timestamp")] SubscriptionDeliverViewModel model)
        {
            if (ModelState.IsValid)
            {
                DateTime           time         = model.Timestamp;
                Subscription       subscription = db.Subscriptions.Find(model.SubscriptionId);
                ClientSubscription cs           = db.ClientSubscriptions.Find(model.ClientSubscriptionId);
                long csId = cs.ClientSubscriptionId;

                if (cs.State != ClientSubscriptionState.Paid)
                {
                    if (cs.State != ClientSubscriptionState.PartialDelivered)
                    {
                        throw new Exception("The client subscription state must be 'paid'.");
                    }
                }

                if (cs.StationAccountId != subscription.StationAccountId)
                {
                    throw new Exception("The station does not match.");
                }

                string clientAccountName = cs.Client.ClientAccountName;
                string vesselName        = cs.VesselName;


                long accountId = subscription.StationAccountId;

                float leftQuantity = subscription.CurrentQuantity - model.Quantity;

                if (leftQuantity == 0)
                {
                    subscription.State = SubscriptionState.Delivered;
                }
                else
                {
                    subscription.State = SubscriptionState.PartialDelivered;
                }

                subscription.CurrentQuantity = leftQuantity;
                subscription.Timestamp       = time;
                subscription.Notes           = model.Notes;

                db.Entry(subscription).State = EntityState.Modified;

                var subscriptionHistory = new SubscriptionHistory()
                {
                    UnitPrice            = subscription.UnitPrice,
                    State                = subscription.State,
                    Quantity             = model.Quantity,
                    Notes                = model.Notes,
                    ClientSubscriptionId = model.ClientSubscriptionId,
                    ClientAccountName    = clientAccountName,
                    VesselName           = vesselName,
                    SubscriptionId       = subscription.SubscriptionId,
                    Timestamp            = time
                };

                db.SubscriptionHistories.Add(subscriptionHistory);

                float csLeftQuantity = cs.CurrentQuantity - model.Quantity;

                if (csLeftQuantity == 0)
                {
                    cs.State = ClientSubscriptionState.Delivered;
                }
                else
                {
                    cs.State = ClientSubscriptionState.PartialDelivered;
                }

                cs.CurrentQuantity = csLeftQuantity;
                cs.Timestamp       = time;
                cs.Notes           = model.Notes;

                db.Entry(cs).State = EntityState.Modified;

                var clientSubscriptionHistory = new ClientSubscriptionHistory()
                {
                    UnitPrice            = subscription.UnitPrice,
                    State                = cs.State,
                    Quantity             = model.Quantity,
                    Notes                = model.Notes,
                    VesselName           = vesselName,
                    ClientSubscriptionId = cs.ClientSubscriptionId,
                    Timestamp            = time
                };

                db.ClientSubscriptionHistories.Add(clientSubscriptionHistory);

                db.SaveChanges();
                return(RedirectToAction("Index", new { accountId = accountId }));
            }

            return(View("Invalid state."));
        }