using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Strata.ContinuousImprovement.Biz.StrategicOpportunities; using Strata.ContinuousImprovement.Biz.StrategicOpportunities.Dtos; using System.Linq; using System.Threading; using System.Threading.Tasks; namespace Strata.ContinuousImprovement.Api.Controllers { [ApiController] [ApiVersion("1.0")] [Route("api/v{api-version:apiVersion}/[controller]")] public class StrategicGeneralLedgerController : ControllerBase { private readonly IStrategicOpportunityService _strategicOpportunityService; private readonly IStrategicGLOpportunityDetailService _strategicGLOpportunityDetailService; public StrategicGeneralLedgerController(IStrategicOpportunityService strategicOpportunityService, IStrategicGLOpportunityDetailService strategicGLOpportunityDetailService) { _strategicOpportunityService = strategicOpportunityService; _strategicGLOpportunityDetailService = strategicGLOpportunityDetailService; } [HttpGet("{opportunityId}/[action]")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status404NotFound)] [ProducesDefaultResponseType] public async Task> GetOpportunityGL(long opportunityId, CancellationToken cancellationToken) { var result = await _strategicOpportunityService.GetStrategicOpportunityGL(opportunityId, cancellationToken); return result != null ? Ok(result) : NotFound(); } [HttpPost] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status400BadRequest)] public async Task> CreateOpportunityGeneralLedger([FromBody] StrategicOpportunityGLDto opportunity, CancellationToken cancellationToken) { var opportunityId = await _strategicOpportunityService.CreateOpportunityGeneralLedgerAsync(opportunity, cancellationToken); if (opportunityId == 0) return BadRequest(); return Ok(opportunityId); } [HttpPut("{opportunityId}")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status404NotFound)] [ProducesDefaultResponseType] public async Task> UpdateOpportunityGeneralLedger(long opportunityId, [FromBody] StrategicOpportunityGLUpdateDto opportunity, CancellationToken cancellationToken) { var strategicOpportunityId = await _strategicOpportunityService.UpdateOpportunityGeneralLedger(opportunityId, opportunity, cancellationToken); return strategicOpportunityId != 0 ? Ok(true) : NotFound(); } [HttpDelete("{opportunityId}")] [ProducesResponseType(StatusCodes.Status204NoContent)] [ProducesResponseType(StatusCodes.Status400BadRequest)] [ProducesResponseType(StatusCodes.Status404NotFound)] [ProducesDefaultResponseType] public async Task DeleteOpportunityGeneralLedger(long opportunityId, CancellationToken cancellationToken) { if (!await _strategicOpportunityService.ContainsGLAsync(opportunityId, cancellationToken)) return NotFound(); var isDeleted = await _strategicOpportunityService.DeleteGeneralLedgerOpportunityAsync(opportunityId, cancellationToken); return isDeleted ? NoContent() : BadRequest(); } [HttpPost("{opportunityId}/detail")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status404NotFound)] [ProducesDefaultResponseType] public async Task> GetGLDetail(long opportunityId, [FromBody] string[] dimensions, CancellationToken cancellationToken) { var result = await _strategicGLOpportunityDetailService.GetStrategicOpportunityGLDetailData(opportunityId, false, dimensions, cancellationToken); return result != null ? Ok(result) : NotFound(); } [HttpPost("{opportunityId}/tracking-detail")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status404NotFound)] [ProducesDefaultResponseType] public async Task> GetGLTrackingDetail(long opportunityId, [FromBody] string[] dimensions, CancellationToken cancellationToken) { var result = await _strategicGLOpportunityDetailService.GetStrategicOpportunityGLDetailData(opportunityId, true, dimensions, cancellationToken); return result != null ? Ok(result) : NotFound(); } [HttpPut("{opportunityId}/details")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status400BadRequest)] [ProducesDefaultResponseType] public async Task UpdateGLDetails(long opportunityId, [FromBody] UpdateGLDetailsDto dto, CancellationToken cancellationToken) { if (dto == null || dto.Adjustments?.Any() != true || dto.Rows?.Any() != true) return BadRequest(); await _strategicGLOpportunityDetailService.UpdateStrategicOpportunityGLDetailsData(opportunityId, dto.Adjustments, dto.Rows, cancellationToken); return Ok(); } } }