// GET: EstimateCosts/Create
        public async Task <IActionResult> Create(int id)
        {
            DateTime                    Today      = DateTime.UtcNow;
            EstimateController          controller = new EstimateController(_context, _config);
            EstimateCostCreateViewModel model      = new EstimateCostCreateViewModel {
                EstimateId = id,
                Estimate   = controller.GetEstimateById(id),
                Costs      = new List <EstimateCost>(),
                CostItems  = new List <CostItem>()
            };

            model.CostItems = await _context.CostItem
                              .Include(ci => ci.CostCategory)
                              .Include(ci => ci.UnitOfMeasure)
                              .OrderBy(ci => ci.ItemName)
                              .ToListAsync();

            EstimateCost Cost = new EstimateCost {
                EstimateId = id
            };

            model.Costs.Add(Cost);

            return(View(model));
        }
Exemple #2
0
        private void btnAddNewFieldfence_Click(object sender, EventArgs e)
        {
            pnlLeftConfig.Visible   = false;
            pnlLeftSettings.Visible = false;
            pnlLeftEstimate.Visible = false;

            SelectedButtonNew((int)Btn.EstimateCost);
            this.pnlMiddle.Controls.Clear();
            EstimateCost obj = new EstimateCost();

            obj.mainForm   = this;
            obj.TopLevel   = false;
            obj.AutoScroll = true;
            this.pnlMiddle.Controls.Add(obj);
            obj.Show();
            lblPageHead.Text = "Estimate Cost";
        }
        public async Task <IActionResult> Edit(int id, [Bind("Id,EstimateId,CostItemId,Quantity")] EstimateCost estimateCost)
        {
            if (id != estimateCost.Id)
            {
                return(NotFound());
            }

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

                return(RedirectToAction("Details", "Estimate", new { id = estimateCost.EstimateId }));
            }

            estimateCost.Estimate = await _context.Estimate.FindAsync(estimateCost.EstimateId);

            estimateCost.CostItem = await _context.CostItem.FindAsync(estimateCost.CostItemId);

            ViewData["CostItemId"] = estimateCost.CostItem;
            ViewData["EstimateId"] = estimateCost.EstimateId;

            return(View(estimateCost));
        }
        public Estimate GetEstimateById(int?id)
        {
            using (SqlConnection conn = Connection) {
                conn.Open();
                using (SqlCommand cmd = conn.CreateCommand()) {
                    cmd.CommandText = @"SELECT e.id AS EstimateId, e.ProjectTitle, e.EstimateDate, 
                                               e.ExpirationDate, c.Id AS CustomerId, c.FirstName, c.LastName, 
                                               c.PhoneNumber, c.Email, ec.Id AS EstimateCostId, ci.Id AS CostItemId, 
                                               ci.ItemName, um.Id AS UnitId, um.UnitName, cc.Id AS CostCategoryId, 
                                               cc.CategoryName, cc.MarkupPercent, cpu.Cost, ec.Quantity, cec.Id AS CustomCostID, 
                                               cec.ItemName AS CustomItem, cec.CostPerUnit AS CustomCPU, cec.Quantity AS CustomQuantity, 
                                               cec.MarkupPercent, cec.UnitOfMeasure AS CustomUnits, cec.Category AS CustomCategory
                                          FROM Estimate e
                                     LEFT JOIN Customer c ON e.CustomerId = c.Id
                                     LEFT JOIN EstimateCost ec on ec.EstimateId = e.id
                                     LEFT JOIN CustomEstimateCost cec on cec.EstimateId = e.id
                                     LEFT JOIN CostItem ci ON ec.CostItemId = ci.Id
                                     LEFT JOIN CostPerUnit cpu ON cpu.CostItemId = ec.CostItemId AND cpu.EndDate IS NULL
                                     LEFT JOIN CostCategory cc ON ci.CostCategoryId = cc.Id
                                     LEFT JOIN UnitOfMeasure um ON ci.UnitOfMeasureId = um.Id 
                                         WHERE e.Id = @id
                                      ORDER BY e.EstimateDate DESC;";

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

                    Estimate estimate = null;

                    while (reader.Read())
                    {
                        if (estimate == null)
                        {
                            estimate = new Estimate {
                                Id             = reader.GetInt32(reader.GetOrdinal("EstimateId")),
                                ProjectTitle   = reader.GetString(reader.GetOrdinal("ProjectTitle")),
                                EstimateDate   = reader.GetDateTime(reader.GetOrdinal("EstimateDate")),
                                ExpirationDate = reader.GetDateTime(reader.GetOrdinal("ExpirationDate")),
                                Customer       = new Customer {
                                    Id          = reader.GetInt32(reader.GetOrdinal("CustomerId")),
                                    FirstName   = reader.GetString(reader.GetOrdinal("FirstName")),
                                    LastName    = reader.GetString(reader.GetOrdinal("LastName")),
                                    Email       = reader.GetString(reader.GetOrdinal("Email")),
                                    PhoneNumber = reader.GetString(reader.GetOrdinal("PhoneNumber"))
                                },
                                EstimateCosts = new List <EstimateCost>(),
                                Categories    = new List <CostCategory>(),
                                CustomCosts   = new List <CustomEstimateCost>()
                            };
                        }

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

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

                        if (!reader.IsDBNull(reader.GetOrdinal("EstimateCostId")))
                        {
                            int estimateCostId = reader.GetInt32(reader.GetOrdinal("EstimateCostId"));

                            if (!estimate.EstimateCosts.Any(ec => ec.Id == estimateCostId))
                            {
                                EstimateCost estimateCost = new EstimateCost {
                                    Id       = reader.GetInt32(reader.GetOrdinal("EstimateCostId")),
                                    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")),
                                            MarkupPercent = reader.GetDouble(reader.GetOrdinal("MarkupPercent"))
                                        },
                                    },

                                    CostPerUnit = reader.GetDouble(reader.GetOrdinal("Cost"))
                                };
                                estimate.EstimateCosts.Add(estimateCost);
                            }
                        }

                        if (!reader.IsDBNull(reader.GetOrdinal("CostCategoryId")))
                        {
                            int costCategoryId = reader.GetInt32(reader.GetOrdinal("CostCategoryId"));

                            if (!estimate.Categories.Any(c => c.Id == costCategoryId))
                            {
                                CostCategory category = new CostCategory {
                                    Id            = reader.GetInt32(reader.GetOrdinal("CostCategoryId")),
                                    CategoryName  = reader.GetString(reader.GetOrdinal("CategoryName")),
                                    MarkupPercent = reader.GetDouble(reader.GetOrdinal("MarkupPercent"))
                                };
                                estimate.Categories.Add(category);
                            }
                        }
                    }
                    reader.Close();
                    return(estimate);
                }
            }
        }
        public async Task <IActionResult> Create(EstimateCostCreateViewModel estimateCosts)
        {
            List <EstimateCost> EstimateCostsInContext = await _context.EstimateCost
                                                         .Where(ec => ec.EstimateId == estimateCosts.EstimateId).ToListAsync();

            List <EstimateCost> CostsEntered     = (estimateCosts.Costs?.Count > 0) ? estimateCosts.Costs : estimateCosts.RejectedEntries;
            List <EstimateCost> RejectecdEntries = new List <EstimateCost>();
            List <EstimateCost> UpdatedRecords   = new List <EstimateCost>();

            foreach (var cost in CostsEntered.ToList())
            {
                cost.EstimateId = estimateCosts.EstimateId;

                EstimateCost ExistingCost = EstimateCostsInContext
                                            .FirstOrDefault(ec => ec.EstimateId == cost.EstimateId && ec.CostItemId == cost.CostItemId);

                if (cost.Quantity <= 0 || cost.CostItemId == 0)
                {
                    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 estimateCost in CostsEntered)
            {
                estimateCost.EstimateId = estimateCosts.EstimateId;
                _context.Add(estimateCost);
                await _context.SaveChangesAsync();
            }

            if (RejectecdEntries.Count > 0 || UpdatedRecords.Count > 0)
            {
                if (RejectecdEntries.Count > 0)
                {
                    foreach (var item in RejectecdEntries)
                    {
                        item.CostItem    = _context.CostItem.FirstOrDefault(ci => ci.Id == item.CostItemId);
                        item.CostPerUnit = _context.CostPerUnit.FirstOrDefault(cpu => cpu.CostItemId == item.CostItemId && cpu.EndDate == null).Cost;
                    }
                }

                if (UpdatedRecords.Count > 0)
                {
                    foreach (var item in UpdatedRecords)
                    {
                        item.CostItem    = _context.CostItem.FirstOrDefault(ci => ci.Id == item.CostItemId);
                        item.CostPerUnit = _context.CostPerUnit.FirstOrDefault(cpu => cpu.CostItemId == item.CostItemId && cpu.EndDate == null).Cost;
                    }
                }

                EstimateCostCreateViewModel viewModel = new EstimateCostCreateViewModel {
                    EstimateId      = estimateCosts.EstimateId,
                    CostItems       = new List <CostItem>(),
                    RejectedEntries = RejectecdEntries,
                    UpdatedRecords  = UpdatedRecords
                };

                viewModel.CostItems = _context.CostItem.Include(ci => ci.UnitOfMeasure).OrderBy(ci => ci.ItemName).ToList();

                return(View("CreateFinish", viewModel));
            }
            else
            {
                return(RedirectToAction("Details", "Estimate", new { id = estimateCosts.EstimateId }));
            }
        }