using Asp.Versioning; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using OnlineSalesAutoCrop.CoreAPI.Models.Requests.Integrations; using OnlineSalesAutoCrop.CoreAPI.Models.Responses.Integrations; using OnlineSalesAutoCrop.CoreAPI.Services.Contracts.Integrations; using System; using System.Threading.Tasks; namespace OnlineSalesAutoCrop.CoreAPI.Controllers.IntegretionApi { /// /// /// /// /// /// /// /// [Authorize] [ApiController] [ApiVersion("1.0")] [ValidateAntiForgeryToken] [Route("api/v{version:apiVersion}/Integration")] public class IntegrationController(ILogger logger, IIntegrationService integrationService) : ControllerBase { private readonly ILogger _logger = logger; private readonly IIntegrationService _integrationService = integrationService; /// /// Insert or Update Customers for SAP /// /// /// /// /// if created return 201 or if updated return 200 true [HttpPost("Customers")] [IgnoreAntiforgeryToken] [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(IntegrationLoginResponse))] public async Task UpsertCustomers(IntegrationCustomerRequest request) { IntegrationCustomerResponse response = new IntegrationCustomerResponse(); try { response = await _integrationService.UpsertCustomerAsync(request); if (!response.IsUpdated) { response.ReturnMessage.Add($"Customer Created Successfully for CustomerNumber :{request.CustomerNumber} & CompanyCode:{request.CompanyCode}"); response.ReturnStatus = StatusCodes.Status201Created; return StatusCode(StatusCodes.Status201Created, response); } else { response.ReturnMessage.Add($"Customer Updated Successfully for CustomerNumber :{request.CustomerNumber} & CompanyCode:{request.CompanyCode}"); response.ReturnStatus = StatusCodes.Status200OK; return StatusCode(StatusCodes.Status200OK, response); } } catch (Exception ex) { string msg = $"Exception Occur in Customer Operation {request?.CustomerName}~{request?.CompanyCode}"; _logger.LogError(exception: ex, msg); response.ReturnStatus = StatusCodes.Status500InternalServerError; response.ReturnMessage.Add(ex.InnerException != null ? ex.InnerException.Message : ex.Message); return StatusCode(StatusCodes.Status500InternalServerError, response); } } /// /// Insert or Update Employees for SAP /// /// /// /// /// if created return 201 or if updated return 200 true [HttpPost("Employees")] [IgnoreAntiforgeryToken] [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(EmployeeIntegrationReqResponse))] public async Task UpsertEmployee(IntegrationEmployeeRequest request) { EmployeeIntegrationReqResponse response = new EmployeeIntegrationReqResponse(); try { response = await _integrationService.UpsertEmployeeAsync(request); if (!response.IsUpdated) { response.ReturnMessage.Add($"Employee Created Successfully for EmployeeVendorName :{request.EmployeeVendorName} & SalesOrgCode:{request.CompanyCode}"); response.ReturnStatus = StatusCodes.Status201Created; return StatusCode(StatusCodes.Status201Created, response); } else { response.ReturnMessage.Add($"Employee Updated Successfully for EmployeeVendorName :{request.EmployeeVendorName} & SalesOrgCode:{request.CompanyCode}"); response.ReturnStatus = StatusCodes.Status200OK; return StatusCode(StatusCodes.Status200OK, response); } } catch (Exception ex) { string msg = $"Exception Occur in Employee Operation {request?.EmployeeVendorName}~{request?.CompanyCode}"; _logger.LogError(exception: ex, msg); response.ReturnStatus = StatusCodes.Status500InternalServerError; response.ReturnMessage.Add(ex.InnerException != null ? ex.InnerException.Message : ex.Message); return StatusCode(StatusCodes.Status500InternalServerError, response); } } /// /// Insert or Update Material for SAP /// /// /// /// /// if created return 201 or if updated return 200 true [HttpPost("Materials")] [IgnoreAntiforgeryToken] [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(MaterialIntegrationReqResponse))] [ProducesResponseType(StatusCodes.Status201Created, Type = typeof(MaterialIntegrationReqResponse))] public async Task UpsertMeterial(IntegrationMaterialRequest request) { MaterialIntegrationReqResponse response = new MaterialIntegrationReqResponse(); try { response = await _integrationService.UpsertMaterialAsync(request); if (!response.IsUpdated) { response.ReturnMessage.Add($"Material Created Successfully for MaterialCode :{request.MaterialCode} "); response.ReturnStatus = StatusCodes.Status201Created; return StatusCode(StatusCodes.Status201Created, response); } else { response.ReturnMessage.Add($"Material Updated Successfully for MaterialCode :{request.MaterialCode} "); response.ReturnStatus = StatusCodes.Status200OK; return StatusCode(StatusCodes.Status200OK, response); } } catch (Exception ex) { string msg = $"Exception Occur in Material Operation {request?.MaterialCode}"; _logger.LogError(exception: ex, msg); response.ReturnStatus = StatusCodes.Status500InternalServerError; response.ReturnMessage.Add(ex.InnerException != null ? ex.InnerException.Message : ex.Message); return StatusCode(StatusCodes.Status500InternalServerError, response); } } /// /// Insert or Update Material Prices for SAP /// /// /// /// /// if created return 201 or if updated return 200 true [HttpPost("MaterialPrices")] [IgnoreAntiforgeryToken] [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(MaterialIntegrationPriceReqResponse))] [ProducesResponseType(StatusCodes.Status201Created, Type = typeof(MaterialIntegrationPriceReqResponse))] public async Task UpsertMeterialPrices(IntegrationMaterialPriceRequest request) { MaterialIntegrationPriceReqResponse response = new MaterialIntegrationPriceReqResponse(); try { response = await _integrationService.UpsertMaterialPriceAsync(request); if (!response.IsUpdated) { response.ReturnMessage.Add($"Material Price Created Successfully for MaterialCode :{request.MaterialCode} And ConditionType : {request.ConditionType}" + $"And Customer Number : {request.CustomerNumber} And Customer Group Code : {request.CustomerGroupCode} "); response.ReturnStatus = StatusCodes.Status201Created; return StatusCode(StatusCodes.Status201Created, response); } else { response.ReturnMessage.Add($"Material Price Updated Successfully for MaterialCode :{request.MaterialCode} And ConditionType : {request.ConditionType}" + $"And Customer Number : {request.CustomerNumber} And Customer Group Code : {request.CustomerGroupCode} "); response.ReturnStatus = StatusCodes.Status200OK; return StatusCode(StatusCodes.Status200OK, response); } } catch (Exception ex) { string msg = $"Exception Occur in Material Price Operation MaterialCode :{request.MaterialCode} And ConditionType : {request.ConditionType}" + $"And Customer Number : {request.CustomerNumber} And Customer Group Code : {request.CustomerGroupCode} "; _logger.LogError(exception: ex, msg); response.ReturnStatus = StatusCodes.Status500InternalServerError; response.ReturnMessage.Add(ex.InnerException != null ? ex.InnerException.Message : ex.Message); return StatusCode(StatusCodes.Status500InternalServerError, response); } } /// /// Insert or Update Material Prices for SAP /// /// /// /// /// if created return 201 or if updated return 200 true [HttpPost("MaterialFreeGoods")] [IgnoreAntiforgeryToken] [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(MaterialFreeGoodsByReqResponse))] [ProducesResponseType(StatusCodes.Status201Created, Type = typeof(MaterialFreeGoodsByReqResponse))] public async Task UpsertMaterialFreeGoods(IntegrationMaterialFreeGoodsRequest request) { MaterialFreeGoodsByReqResponse response = new MaterialFreeGoodsByReqResponse(); try { response = await _integrationService.UpsertMaterialFreeGoodsAsync(request); if (!response.IsUpdated) { response.ReturnMessage.Add($"Material Free Goods Created Successfully for SalesOrg :{request.SalesOrg} " + $"And CustomerPriceGroup : {request.CustomerPriceGroup} And MaterialCode : {request.MaterialCode} And DistributorChannel : {request.DistributionChannel}" + $" And Customer Number :{request.CustomerNumber} And Customer Price Group : {request.CustomerPriceGroup}"); response.ReturnStatus = StatusCodes.Status201Created; return StatusCode(StatusCodes.Status201Created, response); } else { response.ReturnMessage.Add($"Material Free Goods Updated Successfully for SalesOrg :{request.SalesOrg} " + $"And CustomerPriceGroup : {request.CustomerPriceGroup} And MaterialCode : {request.MaterialCode} And DistributorChannel : {request.DistributionChannel}" + $" And Customer Number :{request.CustomerNumber} And Customer Price Group : {request.CustomerPriceGroup}"); response.ReturnStatus = StatusCodes.Status200OK; return StatusCode(StatusCodes.Status200OK, response); } } catch (Exception ex) { string msg = $"Exception Occur in Material Free Goods Operation SalesOrg :{request.SalesOrg} " + $" And CustomerPriceGroup : {request.CustomerPriceGroup} And MaterialCode : {request.MaterialCode} And DistributorChannel : {request.DistributionChannel}" + $" And Customer Number :{request.CustomerNumber} And Customer Price Group : {request.CustomerPriceGroup}"; _logger.LogError(exception: ex, msg); response.ReturnStatus = StatusCodes.Status500InternalServerError; response.ReturnMessage.Add(ex.InnerException != null ? ex.InnerException.Message : ex.Message); return StatusCode(StatusCodes.Status500InternalServerError, response); } } /// /// Insert or Update Payment Terms for SAP /// /// /// /// /// if created return 201 or if updated return 200 true [HttpPost("PaymentTerms")] [IgnoreAntiforgeryToken] [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(IntegrationPaymentTermReqResponse))] [ProducesResponseType(StatusCodes.Status201Created, Type = typeof(IntegrationPaymentTermReqResponse))] public async Task UpsertPaymentTerms(IntegrationPaymentTermRequest request) { IntegrationPaymentTermReqResponse response = new IntegrationPaymentTermReqResponse(); try { response = await _integrationService.UpsertPaymentTermsAsync(request); if (!response.IsUpdated) { response.ReturnMessage.Add($"Payment Terms Created Successfully for SalesOrg :{request.SalesOrg} " + $"And CreditCode : {request.CreditCode} "); response.ReturnStatus = StatusCodes.Status201Created; return StatusCode(StatusCodes.Status201Created, response); } else { response.ReturnMessage.Add($"Payment Terms Updated Successfully for SalesOrg :{request.SalesOrg} " + $"And CreditCode : {request.CreditCode} "); response.ReturnStatus = StatusCodes.Status200OK; return StatusCode(StatusCodes.Status200OK, response); } } catch (Exception ex) { string msg = $"Exception Occur in Payment Terms for SalesOrg :{request.SalesOrg} " + $"And CreditCode : {request.CreditCode} "; _logger.LogError(exception: ex, msg); response.ReturnStatus = StatusCodes.Status500InternalServerError; response.ReturnMessage.Add(ex.InnerException != null ? ex.InnerException.Message : ex.Message); return StatusCode(StatusCodes.Status500InternalServerError, response); } } } }