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(); }