public async Task <IActionResult> Edit(int id,
                                               [Bind("Id,ItemName,ProjectId,Category, UnitOfMeasure,CostPerUnit,Quantity,DateUsed")]
                                               CustomProjectCost customProjectCost)
        {
            if (id != customProjectCost.Id)
            {
                return(NotFound());
            }

            ModelState.Remove("Project");

            if (ModelState.IsValid)
            {
                _context.Update(customProjectCost);
                await _context.SaveChangesAsync();

                return(RedirectToAction("Details", "Project", new { id = customProjectCost.ProjectId }));
            }

            ProjectController controller = new ProjectController(_context, _config);

            customProjectCost.Project = controller.GetProjectById(customProjectCost.ProjectId);

            ViewData["ProjectId"] = customProjectCost.ProjectId;
            return(View(customProjectCost));
        }
        // GET: CustomProjectCosts/Create
        public IActionResult Create(int id)
        {
            DateTime today = DateTime.UtcNow;

            ProjectController controller = new ProjectController(_context, _config);

            CustomCostCreateViewModel viewModel = new CustomCostCreateViewModel {
                ProjectId   = id,
                Project     = controller.GetProjectById(id),
                CustomCosts = new List <CustomProjectCost>(),
            };

            CustomProjectCost customCost = new CustomProjectCost {
                ProjectId     = id,
                ItemName      = "",
                DateUsed      = today,
                UnitOfMeasure = "",
                Category      = "Custom",
                Quantity      = 0
            };

            viewModel.CustomCosts.Add(customCost);

            ViewData["ProjectId"] = id;
            return(View(viewModel));
        }
        public async Task <IActionResult> Create(CustomCostCreateViewModel customProjectCosts)
        {
            List <CustomProjectCost> CustomProjectCostsInContext = await _context.CustomProjectCost
                                                                   .Where(cpc => cpc.ProjectId == customProjectCosts.ProjectId).ToListAsync();

            List <CustomProjectCost> CostsEntered = (customProjectCosts.CustomCosts?.Count > 0) ?
                                                    customProjectCosts.CustomCosts : customProjectCosts.RejectedEntries;
            List <CustomProjectCost> RejectecdEntries = new List <CustomProjectCost>();
            List <CustomProjectCost> UpdatedRecords   = new List <CustomProjectCost>();

            Project Project = await _context.Project.FirstOrDefaultAsync(p => p.Id == customProjectCosts.ProjectId);

            DateTime CheckStartDate = Project.StartDate;

            foreach (var cost in CostsEntered.ToList())
            {
                CustomProjectCost ExistingCost = new CustomProjectCost();

                if (cost.ItemName != null)
                {
                    ExistingCost = CustomProjectCostsInContext
                                   .FirstOrDefault(cpc => cpc.ProjectId == cost.ProjectId &&
                                                   cpc.ItemName.ToUpper() == cost.ItemName.ToUpper() && cpc.DateUsed == cost?.DateUsed);
                }
                else
                {
                    ExistingCost = null;
                }

                if (cost.ItemName == null || cost.UnitOfMeasure == null || cost.CostPerUnit <= 0 ||
                    cost.Quantity == 0 || cost.DateUsed < CheckStartDate)
                {
                    CostsEntered.Remove(cost);
                    RejectecdEntries.Add(cost);
                }

                if (ExistingCost != null)
                {
                    ExistingCost.Quantity += cost.Quantity;
                    CostsEntered.Remove(cost);
                    UpdatedRecords.Add(ExistingCost);

                    _context.Update(ExistingCost);
                    await _context.SaveChangesAsync();
                }
            }

            foreach (var projectCost in CostsEntered)
            {
                _context.Add(projectCost);
                await _context.SaveChangesAsync();
            }

            if (RejectecdEntries.Count > 0 || UpdatedRecords.Count > 0)
            {
                CustomCostCreateViewModel viewModel = new CustomCostCreateViewModel {
                    ProjectId       = customProjectCosts.ProjectId,
                    RejectedEntries = RejectecdEntries,
                    UpdatedRecords  = UpdatedRecords
                };


                ViewData["ProjectId"] = customProjectCosts.ProjectId;
                return(View("CreateFinish", viewModel));
            }
            else
            {
                return(RedirectToAction("Details", "Project", new { id = customProjectCosts.ProjectId }));
            }
        }
Example #4
0
        public Project GetProjectById(int?id)
        {
            using (SqlConnection conn = Connection) {
                conn.Open();
                using (SqlCommand cmd = conn.CreateCommand()) {
                    cmd.CommandText = @"SELECT p.Id AS ProjectId, p.ProjectName, p.StartDate AS ProjectStart, p.IsComplete,
                                               p.CompletionDate AS ProjectEnd, p.AmountCharged, c.Id AS CustomerId, 
                                               c.FirstName, c.LastName, c.PhoneNumber, c.Email, pc.Id AS ProjectCostId, 
                                               pc.DateUsed, pc.Quantity, ci.Id AS CostItemId, ci.ItemName, um.Id AS UnitId,
                                               um.UnitName, cc.Id AS CostCategoryId, cc.CategoryName, cpu.Id AS CostPerUnitId,
                                               cpu.Cost, cpu.StartDate AS CostStart, cpu.EndDate AS CostEnd, cpc.Id AS CustomCostID, 
                                               cpc.ItemName AS CustomItem, cpc.CostPerUnit AS CustomCPU, cpc.Quantity AS CustomQuantity, 
                                               cpc.DateUsed AS CustomDate, cpc.UnitOfMeasure AS CustomUnits, cpc.Category AS CustomCategory
                                          FROM Project p
                                     LEFT JOIN Customer c ON p.CustomerId = c.Id
                                     LEFT JOIN ProjectCost pc ON p.Id = pc.ProjectId
                                     LEFT JOIN CustomProjectCost cpc ON p.Id = cpc.ProjectId
                                     LEFT JOIN CostItem ci ON pc.CostItemId = ci.Id
                                     LEFT JOIN CostPerUnit cpu ON pc.CostPerUnitId = cpu.Id
                                     LEFT JOIN CostCategory cc ON ci.CostCategoryId = cc.Id
                                     LEFT JOIN UnitOfMeasure um ON ci.UnitOfMeasureId = um.Id 
                                         WHERE p.Id = @id
                                      ORDER BY pc.DateUsed DESC;";

                    cmd.Parameters.Add(new SqlParameter("@id", id));
                    SqlDataReader reader = cmd.ExecuteReader();

                    Project project = null;

                    while (reader.Read())
                    {
                        if (project == null)
                        {
                            project = new Project {
                                Id           = reader.GetInt32(reader.GetOrdinal("ProjectId")),
                                ProjectName  = reader.GetString(reader.GetOrdinal("ProjectName")),
                                StartDate    = reader.GetDateTime(reader.GetOrdinal("ProjectStart")),
                                IsComplete   = reader.GetBoolean(reader.GetOrdinal("IsComplete")),
                                Customer     = new Customer(),
                                ProjectCosts = new List <ProjectCost>(),
                                CustomCosts  = new List <CustomProjectCost>()
                            };
                        }

                        if (!reader.IsDBNull(reader.GetOrdinal("ProjectEnd")))
                        {
                            project.CompletionDate = reader.GetDateTime(reader.GetOrdinal("ProjectEnd"));
                        }

                        if (!reader.IsDBNull(reader.GetOrdinal("AmountCharged")))
                        {
                            project.AmountCharged = reader.GetDouble(reader.GetOrdinal("AmountCharged"));
                        }

                        if (!reader.IsDBNull(reader.GetOrdinal("CustomerId")))
                        {
                            project.Customer.Id          = reader.GetInt32(reader.GetOrdinal("CustomerId"));
                            project.Customer.FirstName   = reader.GetString(reader.GetOrdinal("FirstName"));
                            project.Customer.LastName    = reader.GetString(reader.GetOrdinal("LastName"));
                            project.Customer.Email       = reader.GetString(reader.GetOrdinal("Email"));
                            project.Customer.PhoneNumber = reader.GetString(reader.GetOrdinal("PhoneNumber"));
                        }

                        if (!reader.IsDBNull(reader.GetOrdinal("CustomCostId")))
                        {
                            int customCostId = reader.GetInt32(reader.GetOrdinal("CustomCostId"));

                            if (!project.CustomCosts.Any(cpc => cpc.Id == customCostId))
                            {
                                CustomProjectCost customCost = new CustomProjectCost {
                                    Id            = reader.GetInt32(reader.GetOrdinal("CustomCostId")),
                                    ItemName      = reader.GetString(reader.GetOrdinal("CustomItem")),
                                    CostPerUnit   = reader.GetDouble(reader.GetOrdinal("CustomCPU")),
                                    Quantity      = reader.GetInt32(reader.GetOrdinal("CustomQuantity")),
                                    DateUsed      = reader.GetDateTime(reader.GetOrdinal("CustomDate")),
                                    UnitOfMeasure = reader.GetString(reader.GetOrdinal("CustomUnits")),
                                    Category      = reader.GetString(reader.GetOrdinal("CustomCategory"))
                                };
                                project.CustomCosts.Add(customCost);
                            }
                        }

                        if (!reader.IsDBNull(reader.GetOrdinal("ProjectCostId")))
                        {
                            int projectCostId = reader.GetInt32(reader.GetOrdinal("ProjectCostId"));

                            if (!project.ProjectCosts.Any(pc => pc.Id == projectCostId))
                            {
                                ProjectCost projectCost = new ProjectCost {
                                    Id       = reader.GetInt32(reader.GetOrdinal("ProjectCostId")),
                                    DateUsed = reader.GetDateTime(reader.GetOrdinal("DateUsed")),
                                    Quantity = reader.GetDouble(reader.GetOrdinal("Quantity")),
                                    CostItem = new CostItem {
                                        Id            = reader.GetInt32(reader.GetOrdinal("CostItemId")),
                                        ItemName      = reader.GetString(reader.GetOrdinal("ItemName")),
                                        UnitOfMeasure = new UnitOfMeasure {
                                            Id       = reader.GetInt32(reader.GetOrdinal("UnitId")),
                                            UnitName = reader.GetString(reader.GetOrdinal("UnitName"))
                                        },
                                        CostCategory = new CostCategory {
                                            Id           = reader.GetInt32(reader.GetOrdinal("CostCategoryId")),
                                            CategoryName = reader.GetString(reader.GetOrdinal("CategoryName"))
                                        }
                                    },
                                    CostPerUnit = new CostPerUnit {
                                        Id   = reader.GetInt32(reader.GetOrdinal("CostPerUnitId")),
                                        Cost = reader.GetDouble(reader.GetOrdinal("Cost"))
                                    }
                                };
                                project.ProjectCosts.Add(projectCost);
                            }
                        }
                    }
                    reader.Close();
                    return(project);
                }
            }
        }