public GeneralFollowUp GetResults(CostProductOption cpo, GeneralFollowUp inGFU)
        {
            GeneralFollowUp gfu = new GeneralFollowUp();

            var products = from p in CostProducts
                           where p.CeProductID.Equals(inGFU.ObjectID)
                           orderby p.CeIncomeDate descending
                           select p;

            CostProduct product = null;

            var pg = from p in ProductManagement.Instance.Products
                     where p.ProductGroupID.Equals(inGFU.ObjectID)
                     select p;

            var pd = from p in ProductManagement.Instance.Products
                     where p.DepartmentID.Equals(inGFU.ObjectID)
                     select p;

            var cps = from cp in CostProducts
                      orderby cp.CeIncomeDate descending
                      select cp;

            Product productToLookFor = null;


            switch (cpo)
            {
            case CostProductOption.Product:

                if (products.Any())
                {
                    product = products.First(s => s.CeProductID.Equals(inGFU.ObjectID));
                }

                if (product != null)
                {
                    var revenues = from c in db.IncomeProductCustomer
                                   where c.IeProductID.Equals(product.CeProductID)
                                   orderby c.IeAmount ascending
                                   select c;

                    var costs = from r in db.CostProduct
                                where r.CeProductID.Equals(product.CeProductID)
                                orderby r.CeAmount descending
                                select r;

                    int revenue = 0, cost = 0;

                    if (revenues.Any())
                    {
                        var p = revenues.First();
                        revenue = ~p.IeAmount + 1;
                    }

                    if (costs.Any())
                    {
                        var re = costs.First();
                        cost = re.CeAmount;
                    }

                    gfu.ObjectName = product.CeProductName;
                    gfu.Costs      = cost;
                    gfu.Revenues   = revenue;
                    gfu.Result     = gfu.Revenues - gfu.Costs;
                    gfu.Date       = inGFU.Date;
                }
                break;

            case CostProductOption.Productgroup:


                foreach (var p in pg.Where(p => p.ProductGroupID.Equals(inGFU.ObjectID)))
                {
                    productToLookFor = p;
                }

                if (cps.Any() && productToLookFor != null)
                {
                    gfu.Date = cps.First(s => s.CeProductID.Equals(productToLookFor.ProductID)).CeIncomeDate;
                }

                gfu.Revenues = GetProductGroupRevenues(productToLookFor.ProductID);
                gfu.Costs    = GetProductGroupCosts(productToLookFor.ProductID);

                var productGroup = db.ProductGroup.Single(p => p.ProductGroupID.Equals(inGFU.ObjectID));
                gfu.ObjectName = productGroup.ProductGroupName;

                gfu.Result = gfu.Revenues - gfu.Costs;

                break;

            case CostProductOption.Department:

                foreach (var p in from p in pd.Where(p => p.DepartmentID.Equals(inGFU.ObjectID))
                         from item in cps
                         where item.CeProductID.Equals(p.ProductID)
                         select p)
                {
                    productToLookFor = p;
                }

                if (cps.Any() && productToLookFor != null)
                {
                    gfu.Date = cps.First(s => s.CeProductID.Equals(productToLookFor.ProductID)).CeIncomeDate;
                }


                gfu.Costs    = GetProductGroupCosts(productToLookFor.ProductID);
                gfu.Revenues = GetProductGroupRevenues(productToLookFor.ProductID);

                var department = db.Department.First(p => p.DepartmentID.Equals(inGFU.ObjectID));
                gfu.ObjectName = department.DepartmentName;

                gfu.Result = gfu.Revenues - gfu.Costs;
                break;

            case CostProductOption.Company:
                gfu.ObjectName = "IT-Service";


                foreach (var item in db.CostProduct)
                {
                    gfu.Costs += item.CeAmount;
                }


                foreach (var item in db.IncomeProductCustomer)
                {
                    gfu.Revenues += ~item.IeAmount + 1;
                }

                gfu.Date   = inGFU.Date;
                gfu.Result = gfu.Revenues - gfu.Costs;
                break;
            }

            return(gfu);
        }
        public void CreateCostProductFromFile(string fileName)
        {
            // First, delete all current CostProduct items in database
            db.CostProduct.RemoveRange(db.CostProduct);
            db.SaveChanges();

            using (var reader = new StreamReader(fileName, Encoding.Default))
            {
                // Ignore first row since it's a header
                reader.ReadLine();
                while (!reader.EndOfStream)
                {
                    string row = reader.ReadLine();

                    if (!String.IsNullOrEmpty(row))
                    {
                        /* KostnadProdukt.txt is formatted in such a way that there are up to three tabs separating each
                         * 'column' in the text file. If a row contains multiple tabs they are replaced with one. */
                        if (row.Contains("\t\t\t"))
                        {
                            row = row.Replace("\t\t\t", "\t");
                        }

                        if (row.Contains("\t\t"))
                        {
                            row = row.Replace("\t\t", "\t");
                        }

                        // At this point each column is only separated by one tab which makes it easy to read the file
                        string[] field = row.Split('\t');

                        CostProduct cp = new CostProduct
                        {
                            CeProductID   = field[0],
                            CeProductName = field[1],
                            CeIncomeDate  = DateTime.ParseExact(field[2], "yyyyMMdd", CultureInfo.InvariantCulture),
                            CeAmount      = int.Parse(field[3]),
                        };

                        bool updated          = false;
                        var  costProductsInDB = db.CostProduct.Select(s => s);

                        // Update a costproduct if it already exists in db
                        foreach (var costProduct in costProductsInDB
                                 .Where(costProduct => costProduct.CeProductID.Equals(cp.CeProductID) &&
                                        costProduct.CeIncomeDate.Equals(cp.CeIncomeDate)))
                        {
                            costProduct.CeAmount += cp.CeAmount;
                            db.SaveChanges();
                            updated = true;
                        }

                        if (!updated)
                        {
                            // Add cp to database
                            AddCostProduct(cp);
                        }
                    }
                }
            }
        }
 private void AddCostProduct(CostProduct cp)
 {
     CostProducts.Add(cp);
     db.CostProduct.Add(cp);
     db.SaveChanges();
 }