public ActionResult Deliver(long?id)
        {
            if (id == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }
            Subscription subscription = db.Subscriptions.Find(id);

            if (subscription == null)
            {
                return(HttpNotFound());
            }

            SubscriptionDeliverViewModel model = new SubscriptionDeliverViewModel()
            {
                StationAccountId   = subscription.StationAccountId,
                SubscriptionId     = subscription.SubscriptionId,
                StationAccountName = subscription.Station.StationName,
                Quantity           = subscription.CurrentQuantity
            };

            return(View(model));
        }
        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."));
        }