2026-06-16 15:18:22 +06:00
using Asp.Versioning ;
using Microsoft.AspNetCore.Authorization ;
using Microsoft.AspNetCore.Http ;
using Microsoft.AspNetCore.Mvc ;
2026-06-16 17:22:46 +06:00
using Microsoft.Extensions.Logging ;
2026-06-16 15:18:22 +06:00
using OnlineSalesAutoCrop.CoreAPI.Models.Requests.Integrations ;
using OnlineSalesAutoCrop.CoreAPI.Models.Responses.Integrations ;
2026-06-16 17:22:46 +06:00
using OnlineSalesAutoCrop.CoreAPI.Services.Contracts.Integrations ;
using System ;
2026-06-16 15:18:22 +06:00
using System.Threading.Tasks ;
namespace OnlineSalesAutoCrop.CoreAPI.Controllers.IntegretionApi
{
/// <summary>
///
/// </summary>
/// <remarks>
///
/// </remarks>
/// <param name="logger"></param>
2026-06-16 17:22:46 +06:00
/// <param name="integrationService"></param>
2026-06-16 15:18:22 +06:00
[Authorize]
[ApiController]
[ApiVersion("1.0")]
[ValidateAntiForgeryToken]
[Route("api/v{version:apiVersion}/Integration")]
2026-06-16 17:22:46 +06:00
public class IntegrationController ( ILogger < IntegrationAuthController > logger , IIntegrationService integrationService ) : ControllerBase
2026-06-16 15:18:22 +06:00
{
2026-06-16 17:22:46 +06:00
private readonly ILogger _logger = logger ;
private readonly IIntegrationService _integrationService = integrationService ;
2026-06-16 17:24:37 +06:00
/// <summary>
/// Insert or Update Customers for SAP
/// </summary>
/// <remarks>
/// </remarks>
/// <param name="request"></param>
2026-06-18 18:19:43 +06:00
/// <returns>if created return 201 or if updated return 200 true</returns>
2026-06-16 18:15:04 +06:00
[HttpPost("Customers")]
2026-06-16 15:18:22 +06:00
[IgnoreAntiforgeryToken]
[ProducesResponseType(StatusCodes.Status200OK, Type = typeof(IntegrationLoginResponse))]
2026-06-23 17:34:45 +06:00
public async Task < IActionResult > UpsertCustomers ( IntegrationCustomerRequest request )
2026-06-16 15:18:22 +06:00
{
2026-06-23 17:34:45 +06:00
IntegrationCustomerResponse response = new IntegrationCustomerResponse ( ) ;
2026-06-16 17:22:46 +06:00
try
{
2026-06-16 17:51:28 +06:00
response = await _integrationService . UpsertCustomerAsync ( request ) ;
if ( ! response . IsUpdated )
2026-06-16 17:22:46 +06:00
{
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}" ) ;
2026-06-16 18:15:04 +06:00
response . ReturnStatus = StatusCodes . Status200OK ;
return StatusCode ( StatusCodes . Status200OK , response ) ;
2026-06-16 17:22:46 +06:00
}
}
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 ) ;
}
2026-06-16 15:18:22 +06:00
}
2026-06-16 19:17:16 +06:00
/// <summary>
/// Insert or Update Employees for SAP
/// </summary>
/// <remarks>
/// </remarks>
/// <param name="request"></param>
2026-06-18 18:19:43 +06:00
/// <returns>if created return 201 or if updated return 200 true</returns>
[HttpPost("Employees")]
2026-06-16 19:17:16 +06:00
[IgnoreAntiforgeryToken]
[ProducesResponseType(StatusCodes.Status200OK, Type = typeof(EmployeeIntegrationReqResponse))]
2026-06-23 17:34:45 +06:00
public async Task < IActionResult > UpsertEmployee ( IntegrationEmployeeRequest request )
2026-06-16 19:17:16 +06:00
{
EmployeeIntegrationReqResponse response = new EmployeeIntegrationReqResponse ( ) ;
try
{
2026-06-17 13:51:19 +06:00
response = await _integrationService . UpsertEmployeeAsync ( request ) ;
if ( ! response . IsUpdated )
2026-06-16 19:17:16 +06:00
{
2026-06-18 18:19:43 +06:00
response . ReturnMessage . Add ( $"Employee Created Successfully for EmployeeVendorName :{request.EmployeeVendorName} & SalesOrgCode:{request.CompanyCode}" ) ;
2026-06-16 19:17:16 +06:00
response . ReturnStatus = StatusCodes . Status201Created ;
return StatusCode ( StatusCodes . Status201Created , response ) ;
}
else
{
2026-06-18 18:19:43 +06:00
response . ReturnMessage . Add ( $"Employee Updated Successfully for EmployeeVendorName :{request.EmployeeVendorName} & SalesOrgCode:{request.CompanyCode}" ) ;
response . ReturnStatus = StatusCodes . Status200OK ;
return StatusCode ( StatusCodes . Status200OK , response ) ;
2026-06-16 19:17:16 +06:00
}
}
catch ( Exception ex )
{
2026-06-18 18:19:43 +06:00
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 ) ;
}
}
/// <summary>
/// Insert or Update Material for SAP
/// </summary>
/// <remarks>
/// </remarks>
/// <param name="request"></param>
/// <returns>if created return 201 or if updated return 200 true</returns>
[HttpPost("Materials")]
[IgnoreAntiforgeryToken]
[ProducesResponseType(StatusCodes.Status200OK, Type = typeof(MaterialIntegrationReqResponse))]
[ProducesResponseType(StatusCodes.Status201Created, Type = typeof(MaterialIntegrationReqResponse))]
2026-06-23 17:34:45 +06:00
public async Task < IActionResult > UpsertMeterial ( IntegrationMaterialRequest request )
2026-06-18 18:19:43 +06:00
{
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}" ;
2026-06-16 19:17:16 +06:00
_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 ) ;
}
}
2026-06-23 17:34:45 +06:00
/// <summary>
2026-06-25 12:41:18 +06:00
/// Insert or Update Material Prices for SAP
2026-06-23 17:34:45 +06:00
/// </summary>
/// <remarks>
/// </remarks>
/// <param name="request"></param>
/// <returns>if created return 201 or if updated return 200 true</returns>
[HttpPost("MaterialPrices")]
[IgnoreAntiforgeryToken]
[ProducesResponseType(StatusCodes.Status200OK, Type = typeof(MaterialIntegrationPriceReqResponse))]
[ProducesResponseType(StatusCodes.Status201Created, Type = typeof(MaterialIntegrationPriceReqResponse))]
public async Task < IActionResult > UpsertMeterialPrices ( IntegrationMaterialPriceRequest request )
{
MaterialIntegrationPriceReqResponse response = new MaterialIntegrationPriceReqResponse ( ) ;
try
{
response = await _integrationService . UpsertMaterialPriceAsync ( request ) ;
if ( ! response . IsUpdated )
{
2026-06-25 19:08:21 +06:00
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} " ) ;
2026-06-23 17:34:45 +06:00
response . ReturnStatus = StatusCodes . Status201Created ;
return StatusCode ( StatusCodes . Status201Created , response ) ;
}
else
{
2026-06-25 19:08:21 +06:00
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} " ) ;
2026-06-23 17:34:45 +06:00
response . ReturnStatus = StatusCodes . Status200OK ;
return StatusCode ( StatusCodes . Status200OK , response ) ;
}
}
catch ( Exception ex )
{
2026-06-25 19:08:21 +06:00
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} " ;
2026-06-23 17:34:45 +06:00
_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 ) ;
}
}
2026-06-25 12:41:18 +06:00
/// <summary>
/// Insert or Update Material Prices for SAP
/// </summary>
/// <remarks>
/// </remarks>
/// <param name="request"></param>
/// <returns>if created return 201 or if updated return 200 true</returns>
[HttpPost("MaterialFreeGoods")]
[IgnoreAntiforgeryToken]
[ProducesResponseType(StatusCodes.Status200OK, Type = typeof(MaterialFreeGoodsByReqResponse))]
[ProducesResponseType(StatusCodes.Status201Created, Type = typeof(MaterialFreeGoodsByReqResponse))]
public async Task < IActionResult > 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} " +
2026-06-25 19:08:21 +06:00
$"And CustomerPriceGroup : {request.CustomerPriceGroup} And MaterialCode : {request.MaterialCode} And DistributorChannel : {request.DistributionChannel}" +
$" And Customer Number :{request.CustomerNumber} And Customer Price Group : {request.CustomerPriceGroup}" ) ;
2026-06-25 12:41:18 +06:00
response . ReturnStatus = StatusCodes . Status201Created ;
return StatusCode ( StatusCodes . Status201Created , response ) ;
}
else
{
response . ReturnMessage . Add ( $"Material Free Goods Updated Successfully for SalesOrg :{request.SalesOrg} " +
2026-06-25 19:08:21 +06:00
$"And CustomerPriceGroup : {request.CustomerPriceGroup} And MaterialCode : {request.MaterialCode} And DistributorChannel : {request.DistributionChannel}" +
$" And Customer Number :{request.CustomerNumber} And Customer Price Group : {request.CustomerPriceGroup}" ) ;
2026-06-25 12:41:18 +06:00
response . ReturnStatus = StatusCodes . Status200OK ;
return StatusCode ( StatusCodes . Status200OK , response ) ;
}
}
catch ( Exception ex )
{
string msg = $"Exception Occur in Material Free Goods Operation SalesOrg :{request.SalesOrg} " +
2026-06-25 19:08:21 +06:00
$" And CustomerPriceGroup : {request.CustomerPriceGroup} And MaterialCode : {request.MaterialCode} And DistributorChannel : {request.DistributionChannel}" +
$" And Customer Number :{request.CustomerNumber} And Customer Price Group : {request.CustomerPriceGroup}" ;
2026-06-25 12:41:18 +06:00
_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 ) ;
}
}
2026-06-28 19:02:40 +06:00
/// <summary>
/// Insert or Update Payment Terms for SAP
/// </summary>
/// <remarks>
/// </remarks>
/// <param name="request"></param>
/// <returns>if created return 201 or if updated return 200 true</returns>
[HttpPost("PaymentTerms")]
[IgnoreAntiforgeryToken]
[ProducesResponseType(StatusCodes.Status200OK, Type = typeof(IntegrationPaymentTermReqResponse))]
[ProducesResponseType(StatusCodes.Status201Created, Type = typeof(IntegrationPaymentTermReqResponse))]
public async Task < IActionResult > 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 ) ;
}
}
2026-06-16 15:18:22 +06:00
}
}