using Api.SeaHavenIndustries.DTOs; using Api.SeaHavenIndustries.Helper; using Data.SeaHavenIndustries; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using SeaHaven.Services.DTOs; using SeaHaven.Services.Interfaces; namespace Api.SeaHavenIndustries.Controllers { [Authorize] [ApiController] [Route("api/Quotes")] public class QuotesController : Controller { private readonly IQuotesService _quotesService; private readonly ILogger _logger; public QuotesController(IQuotesService quotesService, ILogger logger) { _quotesService = quotesService; _logger = logger; } [HttpPost] [Route("AddQuote")] public async Task AddQuote([FromBody] Quote_DTO model, CancellationToken cancellationToken) { try { await _quotesService.CreateQuoteAsync(MapToCreateInput(model), cancellationToken); return Ok(new DataResponse { Message = "Updated Successfully", Status = "200" }); } catch (Exception ex) { return BadRequest(new Response { Status = "Error", Message = _logger.Sanitize(ex) }); } } [HttpPut] [Route("EditQuote")] public async Task EditQuote([FromBody] EditQuote_DTO model, CancellationToken cancellationToken) { try { var updated = await _quotesService.UpdateQuoteAsync(MapToUpdateInput(model), cancellationToken); if (!updated) return BadRequest("ID not matched!"); return Ok(new DataResponse { Message = "Updated Successfully", Status = "200" }); } catch (Exception ex) { return BadRequest(new Response { Status = "Error", Message = _logger.Sanitize(ex) }); } } [HttpDelete] [Route("DeleteQuote")] public async Task DeleteQuote(EditQuote_DTO model, CancellationToken cancellationToken) { int id = model.id; try { var deleted = await _quotesService.DeleteQuoteAsync(id, cancellationToken); if (!deleted) return BadRequest("ID not matched!"); return Ok(new DataResponse { Message = "Removed Successfully", Status = "200" }); } catch (Exception ex) { return BadRequest(new Response { Status = "Error", Message = _logger.Sanitize(ex) }); } } [HttpGet] [Route("GetQuoutes")] public async Task GetQuotes(string search = "", int page = 1, int pageSize = 10, CancellationToken cancellationToken = default) { var result = await _quotesService.GetQuotesPagedAsync(page, pageSize, search, cancellationToken); var totalPages = (int)Math.Ceiling(result.TotalCount / (double)pageSize); var viewModel = new Pagination_DTO { Data = result.Items, PageNumber = page, PageSize = pageSize, TotalCount = result.TotalCount, TotalPages = totalPages }; return Ok(viewModel); } [HttpGet] [Route("GetQuoutesdetailsAgainstWorkOrder")] public async Task GetQuoutesdetailsAgainstWorkOrder(int woId, CancellationToken cancellationToken) { var data = await _quotesService.GetWorkOrderQuoteDetailsAsync(woId, cancellationToken); return Ok(data); } [HttpGet] [Route("GetQuoutesById")] public async Task GetQuoutesById(int id, CancellationToken cancellationToken) { var data = await _quotesService.GetQuoteDetailsByIdAsync(id, cancellationToken); return Ok(data); } [HttpGet] [Route("GetReporting")] public async Task GetReporting(CancellationToken cancellationToken) { var data = await _quotesService.GetReportingAsync(cancellationToken); var reportingDto = new Reporting_DTO { TotalCreatedWorkOrder = data.TotalCreatedWorkOrder, TotalCompleted = data.TotalCompleted, TotalSev1 = data.TotalSev1, TotalSev2 = data.TotalSev2, TotalSev3 = data.TotalSev3, TotalSev4 = data.TotalSev4, TotalSev5 = data.TotalSev5 }; return Ok(reportingDto); } private static CreateQuoteInput MapToCreateInput(Quote_DTO dto) { return new CreateQuoteInput { QuotId = dto.QuotId, ContactId = dto.ContactId, PO = dto.PO, TT = dto.TT, ProjectName = dto.ProjectName, Date = dto.Date != null ? DateTime.Parse(dto.Date) : null, WorkorderId = dto.WorkorderId, SiteName = dto.SiteName, SiteId = dto.SiteId, BillingAddress = dto.BillingAddress, LineItems = dto.LineItems?.Select(li => new QuoteLineItemInput { LineitemNumber = li.LineitemNumber, Lineitem = li.Lineitem, Descriptions = li.Descriptions }).ToList() }; } private static UpdateQuoteInput MapToUpdateInput(EditQuote_DTO dto) { return new UpdateQuoteInput { Id = dto.id, QuotId = dto.QuotId, ContactId = dto.ContactId, PO = dto.PO, TT = dto.TT, ProjectName = dto.ProjectName, Date = dto.Date != null ? DateTime.Parse(dto.Date) : null, WorkorderId = dto.WorkorderId, SiteName = dto.SiteName, SiteId = dto.SiteId, BillingAddress = dto.BillingAddress, LineItems = dto.LineItems?.Select(li => new QuoteLineItemInput { LineitemNumber = li.LineitemNumber, Lineitem = li.Lineitem, Descriptions = li.Descriptions }).ToList() }; } } }