250 lines
9.8 KiB
C#
250 lines
9.8 KiB
C#
|
|
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("[controller]")]
|
|||
|
|
public class QuotesController : Controller
|
|||
|
|
{
|
|||
|
|
private readonly UserManager<ApplicationUser> _userManager;
|
|||
|
|
private readonly ApplicationDbContext _db;
|
|||
|
|
private readonly IWebHostEnvironment _webHostEnvironment;
|
|||
|
|
IHttpContextAccessor _httpContext;
|
|||
|
|
public QuotesController(UserManager<ApplicationUser> userManager, ApplicationDbContext db, IWebHostEnvironment webHostEnvironment, IHttpContextAccessor httpContext)
|
|||
|
|
{
|
|||
|
|
_userManager = userManager;
|
|||
|
|
_db = db;
|
|||
|
|
_webHostEnvironment = webHostEnvironment;
|
|||
|
|
_httpContext = httpContext;
|
|||
|
|
}
|
|||
|
|
[HttpPost]
|
|||
|
|
[Route("AddQuote")]
|
|||
|
|
public async Task<IActionResult> AddQuote([FromBody] Quote_DTO model)
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
Quotes quotes = new Quotes();
|
|||
|
|
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;
|
|||
|
|
quotes.LineItems = quotes.LineItems == null ? new List<QuotesLineItems>() : 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 });
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
[HttpPost]
|
|||
|
|
[Route("EditQuote")]
|
|||
|
|
public async Task<IActionResult> 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<QuotesLineItems>() : 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 });
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
[HttpGet]
|
|||
|
|
[Route("DeleteQuote")]
|
|||
|
|
public IActionResult DeleteQuote(int 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,
|
|||
|
|
WOID = s.WorkOrder != null ? s.WorkOrder.WorkerOrderNumber : "",
|
|||
|
|
s.ProjectName,
|
|||
|
|
TotalAmount = "$" + s.LineItems.Sum(s => s.Lineitem.Value).ToString(),
|
|||
|
|
siteName = s.SiteName,
|
|||
|
|
status = s.Status
|
|||
|
|
}).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<IActionResult> 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<IActionResult> 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<IActionResult> 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);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|