using Api.SeaHavenIndustries.DTOs; using Data.SeaHavenIndustries; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; using Microsoft.Data.SqlClient; using Microsoft.EntityFrameworkCore; using System.Linq; using static System.Runtime.InteropServices.JavaScript.JSType; namespace Api.SeaHavenIndustries.Controllers { [Authorize] [ApiController] [Route("api/Quotes")] public class QuotesController : Controller { private readonly UserManager _userManager; private readonly ApplicationDbContext _db; private readonly IWebHostEnvironment _webHostEnvironment; IHttpContextAccessor _httpContext; public QuotesController(UserManager userManager, ApplicationDbContext db, IWebHostEnvironment webHostEnvironment, IHttpContextAccessor httpContext) { _userManager = userManager; _db = db; _webHostEnvironment = webHostEnvironment; _httpContext = httpContext; } [HttpPost] [Route("AddQuote")] public async Task AddQuote([FromBody] Quote_DTO model) { try { Random rnd = new Random(); int id = rnd.Next(1, 99999); Quotes quotes = new Quotes(); quotes.QuotId = id.ToString(); quotes.ContactId = model.ContactId; quotes.PO = model.PO; quotes.TT = model.TT; quotes.ProjectName = model.ProjectName; quotes.Date = DateTime.Parse(model.Date); quotes.WorkorderId = model.WorkorderId; quotes.SiteName = model.SiteName; quotes.SiteId = model.SiteId; quotes.BillingAddress = model.BillingAddress; quotes.LineItems = quotes.LineItems == null ? new List() : quotes.LineItems; if (model.LineItems != null && model.LineItems.Any()) { foreach (var lineItemDto in model.LineItems) { QuotesLineItems lineItem = new QuotesLineItems() { LineitemNumber = lineItemDto.LineitemNumber, Lineitem = lineItemDto.Lineitem, Descriptions = lineItemDto.Descriptions }; quotes.LineItems.Add(lineItem); } } _db.Quotes.Add(quotes); await _db.SaveChangesAsync(); return Ok(new DataResponse { Message = "Updated Successfully", Status = "200" }); } catch (Exception ex) { return BadRequest(new Response { Status = "Error", Message = ex.Message }); } } [HttpPut] [Route("EditQuote")] public async Task EditQuote([FromBody] EditQuote_DTO model) { try { var quotes = _db.Quotes.Where(w => w.Id == model.id).FirstOrDefault(); if (quotes != null) { quotes.QuotId = model.QuotId; quotes.ContactId = model.ContactId; quotes.PO = model.PO; quotes.TT = model.TT; quotes.ProjectName = model.ProjectName; quotes.Date = DateTime.Parse(model.Date); quotes.WorkorderId = model.WorkorderId; quotes.SiteName = model.SiteName; quotes.SiteId = model.SiteId; quotes.BillingAddress = model.BillingAddress; var existQuoteLine = _db.QuotesLines.Where(w => w.QuoteId == model.id).ToList(); if (existQuoteLine.Count() > 0) { _db.QuotesLines.RemoveRange(existQuoteLine); } quotes.LineItems = quotes.LineItems == null ? new List() : quotes.LineItems; if (model.LineItems != null && model.LineItems.Any()) { foreach (var lineItemDto in model.LineItems) { QuotesLineItems lineItem = new QuotesLineItems() { LineitemNumber = lineItemDto.LineitemNumber, Lineitem = lineItemDto.Lineitem, Descriptions = lineItemDto.Descriptions }; quotes.LineItems.Add(lineItem); } } _db.Update(quotes); } else { return BadRequest("ID not matched!"); } await _db.SaveChangesAsync(); return Ok(new DataResponse { Message = "Updated Successfully", Status = "200" }); } catch (Exception ex) { return BadRequest(new Response { Status = "Error", Message = ex.Message }); } } [HttpDelete] [Route("DeleteQuote")] public IActionResult DeleteQuote(EditQuote_DTO model) { int id = model.id; try { var data = _db.Quotes.Where(w => w.Id == id).FirstOrDefault(); if (data != null) { var existlineitem = _db.QuotesLines.Where(w => w.QuoteId == id).ToList(); if (existlineitem.Any()) { _db.QuotesLines.RemoveRange(existlineitem); } _db.Quotes.Remove(data); } else { return BadRequest("ID not matched!"); } _db.SaveChanges(); return Ok(new DataResponse { Message = "Removed Successfully", Status = "200" }); } catch (Exception ex) { return BadRequest(new Response { Status = "Error", Message = ex.Message }); } } [HttpGet] [Route("GetQuoutes")] public IActionResult GetQuotes(string search = "", int page = 1, int pageSize = 10) { var totalCount = _db.Quotes.Count(); var data = _db.Quotes.Include(s => s.WorkOrder).AsNoTracking().Where(w => w.QuotId.ToLower().Contains(search.ToLower()) || w.SiteName.ToLower().Contains(search.ToLower()) || w.WorkOrder.WorkerOrderTitle.ToLower().Contains(search.ToLower())).Select(s => new { s.Id, QuoteId = "QO-" + s.QuotId, WorkOrder = s.WorkOrder != null ? s.WorkOrder.WorkerOrderNumber : "", s.ProjectName, TotalAmount = "$" + s.LineItems.Sum(s => s.Lineitem.Value).ToString(), s.SiteName, s.SiteId, s.PO, s.TT, s.BillingAddress, s.Status, s.ContactId, s.Date, lineitems = s.LineItems.Select(q => new { q.Descriptions, q.Lineitem, q.LineitemNumber}), }).OrderByDescending(d => d.Id).ToList().Skip((page - 1) * pageSize) .Take(pageSize); // Calculate the number of pages var totalPages = (int)Math.Ceiling(totalCount / (double)pageSize); // Create a view model containing the paged items and pagination metadata var viewModel = new Pagination_DTO { Data = data, PageNumber = page, PageSize = pageSize, TotalCount = totalCount, TotalPages = totalPages }; return Ok(viewModel); } [HttpGet] [Route("GetQuoutesdetailsAgainstWorkOrder")] public async Task GetQuoutesdetailsAgainstWorkOrder(int woId) { var data = await _db.workOrders.Include(s => s.Locations).Where(w => w.Id == woId).Select(s => new { s.Id, s.PO, s.TT, s.Locations.Title, s.Locations.Name }).ToListAsync(); return Ok(data); } [HttpGet] [Route("GetQuoutesById")] public async Task GetQuoutesById(int id) { var data = await _db.Quotes.Where(s => s.Id == id).Include(s => s.WorkOrder).Select(s => new { s.Id, s.QuotId, s.Date, s.Contacts.Name, s.PO, s.TT, s.SiteName, s.ProjectName, s.SiteId, s.BillingAddress, s.ShippingAddress, lineitems = s.LineItems.Select(q => new { q.Descriptions, q.Lineitem }), TotalAmount = "$" + s.LineItems.Sum(s => s.Lineitem.Value).ToString() }).FirstOrDefaultAsync(); return Ok(data); } [HttpGet] [Route("GetReporting")] public async Task GetReporting() { var totalCreatedWorkOrder = await _db.workOrders.CountAsync(); var totalCompleted = _db.workOrders.Count(w => w.Status == "Done"); var totalSev1 = _db.workOrders.Count(w => w.Priority == "Sev 1"); var totalSev2 = _db.workOrders.Count(w => w.Priority == "Sev 2"); var totalSev3 = _db.workOrders.Count(w => w.Priority == "Sev 3"); var totalSev4 = _db.workOrders.Count(w => w.Priority == "Sev 4"); var totalSev5 = _db.workOrders.Count(w => w.Priority == "Sev 5"); var data = new Reporting_DTO { TotalCreatedWorkOrder = totalCreatedWorkOrder, TotalCompleted = totalCompleted, TotalSev1 = totalSev1, TotalSev2 = totalSev2, TotalSev3 = totalSev3, TotalSev4 = totalSev4, TotalSev5 = totalSev5 }; return Ok(data); } } }