diff --git a/Api/OnlineSalesAutoCrop.CoreAPI.Models/Requests/MobileApp/MobileMasterDataRequest.cs b/Api/OnlineSalesAutoCrop.CoreAPI.Models/Requests/MobileApp/MobileMasterDataRequest.cs index 033cb87..96807ba 100644 --- a/Api/OnlineSalesAutoCrop.CoreAPI.Models/Requests/MobileApp/MobileMasterDataRequest.cs +++ b/Api/OnlineSalesAutoCrop.CoreAPI.Models/Requests/MobileApp/MobileMasterDataRequest.cs @@ -40,6 +40,22 @@ public class GetMaterialsRequest : PagedRequest public string? EmployeeNumber { get; set; } } +public class GetMaterialPriceRequest : PagedRequest +{ + [StringLength(10, MinimumLength = 1, ErrorMessage = "Sales organization code must be between 1 and 10 characters.")] + public string SalesOrgCode { get; set; } + + [StringLength(6, MinimumLength = 1, ErrorMessage = "Brand code must be between 1 and 6 characters.")] + public string? BrandCode { get; set; } + + [StringLength(10, MinimumLength = 1, ErrorMessage = "Material Code must be between 1 and 10 characters.")] + public string? MaterialCode { get; set; } + + [StringLength(10, MinimumLength = 1, ErrorMessage = "Employee number must be between 1 and 10 characters.")] + public string? EmployeeNumber { get; set; } +} + + public class GetCustomersRequest : PagedRequest { [StringLength(10, MinimumLength = 3, ErrorMessage = "Sales organization code must be between 1 and 10 characters.")] @@ -78,7 +94,7 @@ public class UpsertAttendanceByEmpRequest public bool IsCheckOut => CheckOutTime.HasValue ? true : false; } -public class GetDiscountRequest +public class GetDiscountRequest : PagedRequest { [StringLength(10, MinimumLength = 3, ErrorMessage = "Sales organization code must be between 1 and 10 characters.")] public string SalesOrgCode { get; set; } @@ -98,7 +114,7 @@ public class GetDiscountRequest public bool IsIncludeChild { get; set; } = false; } -public class GetDiscountMaterialRequest +public class GetDiscountMaterialRequest : PagedRequest { [StringLength(10, MinimumLength = 3, ErrorMessage = "Sales organization code must be between 1 and 10 characters.")] public string SalesOrgCode { get; set; } @@ -116,7 +132,7 @@ public class GetDiscountMaterialRequest public string? DiscountCode { get; set; } } -public class GetDiscountCustomerRequest +public class GetDiscountCustomerRequest : PagedRequest { [StringLength(10, MinimumLength = 3, ErrorMessage = "Sales organization code must be between 1 and 10 characters.")] public string SalesOrgCode { get; set; } diff --git a/Api/OnlineSalesAutoCrop.CoreAPI.Models/Responses/MobileApp/MobileMasterDataResponse.cs b/Api/OnlineSalesAutoCrop.CoreAPI.Models/Responses/MobileApp/MobileMasterDataResponse.cs index efdfc81..645b4f8 100644 --- a/Api/OnlineSalesAutoCrop.CoreAPI.Models/Responses/MobileApp/MobileMasterDataResponse.cs +++ b/Api/OnlineSalesAutoCrop.CoreAPI.Models/Responses/MobileApp/MobileMasterDataResponse.cs @@ -104,9 +104,15 @@ public class GetMaterialResponse public string BrandCode { get; set; } public string BrandName { get; set; } public string SalesOrg { get; set; } - public decimal BasePrice { get; set; } } +public class GetMaterialPriceResponse +{ + public string SalesOrgCode { get; set; } + public string CustomerCode { get; set; } + public string MaterialCode { get; set; } + public decimal BasePrice { get; set; } +} public class GetCustomerResponse { @@ -157,32 +163,18 @@ public class GetAttendanceByEmpResponse public class GetDiscountResponse { - public GetDiscountResponse() - { - Customers = new List(); - Materials = new List(); - } - public string DiscountCode { get; set; } public string SalesOrgcCode { get; set; } - public string DistributorChannelCode { get; set; } - public DateTime StartDate { get; set; } - public DateTime EndDate { get; set; } - - public List Customers { get; set; } - public List Materials { get; set; } -} - -public class GetDiscountCustomerResponse -{ public string DiscountCode { get; set; } - public string CustomerCode { get; set; } - public DateTime FromDate { get; set; } - public DateTime EndDate { get; set; } + public string DiscountName { get; set; } + public string DistributorChannelCode { get; set; } + public string DistributorChannelName { get; set; } + } public class GetDiscountMaterialResponse { public string DiscountCode { get; set; } + public string CustomerCode { get; set; } public string MaterialCode { get; set; } public string UnitOfMeasurement { get; set; } public string CalculationType { get; set; } diff --git a/Api/OnlineSalesAutoCrop.CoreAPI.Services/Contracts/MobileApp/IMobileMasterDataService.cs b/Api/OnlineSalesAutoCrop.CoreAPI.Services/Contracts/MobileApp/IMobileMasterDataService.cs index 1c3f518..a52a05a 100644 --- a/Api/OnlineSalesAutoCrop.CoreAPI.Services/Contracts/MobileApp/IMobileMasterDataService.cs +++ b/Api/OnlineSalesAutoCrop.CoreAPI.Services/Contracts/MobileApp/IMobileMasterDataService.cs @@ -11,10 +11,10 @@ public interface IMobileMasterDataService Task GetMarketHeirarchiesByEmpAsync(GetMarketHeirarchyByEmpRequest request); Task> GetBrandsAsync(GetBrandsRequest request); Task> GetMaterialsAsync(GetMaterialsRequest request); + Task> GetMaterialPricesAsync(GetMaterialPriceRequest request); Task> GetCustomersAsync(GetCustomersRequest request); Task GetAttendanceByEmpAsync(GetAttendanceByEmpRequest request); Task UpsertAttendanceByEmpAsync(UpsertAttendanceByEmpRequest request); - Task> GetDiscountAsync(GetDiscountRequest request); - Task> GetDiscountCustomersAsync(GetDiscountCustomerRequest request); - Task> GetDiscountMaterialsAsync(GetDiscountMaterialRequest request); + Task> GetDiscountAsync(GetDiscountRequest request); + Task> GetDiscountMaterialsAsync(GetDiscountMaterialRequest request); } diff --git a/Api/OnlineSalesAutoCrop.CoreAPI.Services/Services/MobileApp/MobileMasterDataService.cs b/Api/OnlineSalesAutoCrop.CoreAPI.Services/Services/MobileApp/MobileMasterDataService.cs index ae9a193..f3be735 100644 --- a/Api/OnlineSalesAutoCrop.CoreAPI.Services/Services/MobileApp/MobileMasterDataService.cs +++ b/Api/OnlineSalesAutoCrop.CoreAPI.Services/Services/MobileApp/MobileMasterDataService.cs @@ -115,8 +115,6 @@ public class MobileMasterDataService : IMobileMasterDataService } - - public async Task> GetMaterialsAsync(GetMaterialsRequest request) { PagedResult response = new(); @@ -152,8 +150,62 @@ public class MobileMasterDataService : IMobileMasterDataService UnitConversionValue = dr.GetDecimal(8), BrandCode = dr.GetString(9), BrandName = dr.GetString(10), - SalesOrg = dr.GetString(11), - BasePrice = dr.GetDecimal(12) + SalesOrg = dr.GetString(11) + }); + } + dr.Close(); + + + response.TotalCount = response.Items.Count; + response.PageNumber = request.PageNumber; + response.PageSize = request.PageSize; + + } + tc.End(); + } + catch (Exception ie) + { + tc?.HandleError(); + + throw DBCustomError.GenerateCustomError(ie); + } + } + catch (Exception ex) + { + throw; + } + + return response; + } + + public async Task> GetMaterialPricesAsync(GetMaterialPriceRequest request) + { + PagedResult response = new(); + try + { + using TransactionContext tc = await TransactionContext.BeginAsync(_settings.DefaultConnection.ConnectionNode); + try + { + SqlParameter[] p = + [ + SqlHelperExtension.CreateInParam(pName: "@BrandCode", pType: SqlDbType.VarChar, pValue: request.BrandCode), + SqlHelperExtension.CreateInParam(pName: "@MaterialCode", pType: SqlDbType.VarChar, pValue: request.MaterialCode), + SqlHelperExtension.CreateInParam(pName: "@SalesOrgCode", pType: SqlDbType.VarChar, pValue: request.SalesOrgCode), + SqlHelperExtension.CreateInParam(pName: "@EmployeeNumber", pType: SqlDbType.VarChar, pValue: request.EmployeeNumber), + SqlHelperExtension.CreateInParam(pName: "@PageNumber", pType: SqlDbType.Int, pValue: request.PageNumber), + SqlHelperExtension.CreateInParam(pName: "@PageSize", pType: SqlDbType.Int, pValue: request.PageSize) + ]; + + using (IDataReader dr = await tc.ExecuteReaderSpAsync("dbo.GetMaterialPricePaginated", parameterValues: p)) + { + while (dr.Read()) + { + response.Items.Add(new GetMaterialPriceResponse + { + SalesOrgCode = dr.GetString(0), + CustomerCode = dr.GetString(1), + MaterialCode = dr.GetString(2), + BasePrice = dr.GetDecimal(3) }); } dr.Close(); @@ -596,18 +648,117 @@ public class MobileMasterDataService : IMobileMasterDataService }; } - public Task> GetDiscountAsync(GetDiscountRequest request) + public async Task> GetDiscountAsync(GetDiscountRequest request) { - throw new NotImplementedException(); + PagedResult response = new(); + try + { + using TransactionContext tc = await TransactionContext.BeginAsync(_settings.DefaultConnection.ConnectionNode); + try + { + SqlParameter[] p = + [ + SqlHelperExtension.CreateInParam(pName: "@SalesOrgCode", pType: SqlDbType.VarChar, pValue: request.SalesOrgCode), + SqlHelperExtension.CreateInParam(pName: "@CustomerCode", pType: SqlDbType.VarChar, pValue: request.CustomerCode), + SqlHelperExtension.CreateInParam(pName: "@EmployeeNumber", pType: SqlDbType.VarChar, pValue: request.EmployeeNumber), + SqlHelperExtension.CreateInParam(pName: "@MaterialCode", pType: SqlDbType.VarChar, pValue: request.MaterialCode), + SqlHelperExtension.CreateInParam(pName: "@DiscountCode", pType: SqlDbType.VarChar, pValue: request.DiscountCode), + SqlHelperExtension.CreateInParam(pName: "@PageNumber", pType: SqlDbType.Int, pValue: request.PageNumber), + SqlHelperExtension.CreateInParam(pName: "@PageSize", pType: SqlDbType.Int, pValue: request.PageSize) + ]; + + using (IDataReader dr = await tc.ExecuteReaderSpAsync("dbo.GetDiscountPaginated", parameterValues: p)) + { + while (dr.Read()) + { + response.Items.Add(new GetDiscountResponse + { + SalesOrgcCode = dr.GetString(0), + DiscountCode = dr.GetString(1), + DiscountName = dr.GetString(2), + DistributorChannelCode = dr.GetString(3), + DistributorChannelName = dr.GetString(4) + }); + } + dr.Close(); + + response.TotalCount = response.Items.Count; + response.PageNumber = request.PageNumber; + response.PageSize = request.PageSize; + } + tc.End(); + } + catch (Exception ie) + { + tc?.HandleError(); + + throw DBCustomError.GenerateCustomError(ie); + } + } + catch (Exception ex) + { + throw; + } + + return response; } - public Task> GetDiscountCustomersAsync(GetDiscountCustomerRequest request) + public async Task> GetDiscountMaterialsAsync(GetDiscountMaterialRequest request) { - throw new NotImplementedException(); - } + PagedResult response = new(); + try + { + using TransactionContext tc = await TransactionContext.BeginAsync(_settings.DefaultConnection.ConnectionNode); + try + { + SqlParameter[] p = + [ + SqlHelperExtension.CreateInParam(pName: "@SalesOrgCode", pType: SqlDbType.VarChar, pValue: request.SalesOrgCode), + SqlHelperExtension.CreateInParam(pName: "@CustomerCode", pType: SqlDbType.VarChar, pValue: request.CustomerCode), + SqlHelperExtension.CreateInParam(pName: "@EmployeeNumber", pType: SqlDbType.VarChar, pValue: request.EmployeeNumber), + SqlHelperExtension.CreateInParam(pName: "@MaterialCode", pType: SqlDbType.VarChar, pValue: request.MaterialCode), + SqlHelperExtension.CreateInParam(pName: "@DiscountCode", pType: SqlDbType.VarChar, pValue: request.DiscountCode), + SqlHelperExtension.CreateInParam(pName: "@PageNumber", pType: SqlDbType.Int, pValue: request.PageNumber), + SqlHelperExtension.CreateInParam(pName: "@PageSize", pType: SqlDbType.Int, pValue: request.PageSize) + ]; - public Task> GetDiscountMaterialsAsync(GetDiscountMaterialRequest request) - { - throw new NotImplementedException(); + using (IDataReader dr = await tc.ExecuteReaderSpAsync("dbo.GetDiscountMaterialsPaginated", parameterValues: p)) + { + while (dr.Read()) + { + response.Items.Add(new GetDiscountMaterialResponse + { + DiscountCode = dr.GetString(0), + CustomerCode = dr.GetString(1), + MaterialCode = dr.GetString(2), + UnitOfMeasurement = dr.GetString(3), + CalculationType = dr.GetString(4), + DiscountValue = dr.GetDecimal(5), + StartDate = dr.GetDateTime(6), + EndDate = dr.GetDateTime(7), + }); + } + dr.Close(); + + response.TotalCount = response.Items.Count; + response.PageNumber = request.PageNumber; + response.PageSize = request.PageSize; + } + tc.End(); + } + catch (Exception ie) + { + tc?.HandleError(); + + throw DBCustomError.GenerateCustomError(ie); + } + } + catch (Exception ex) + { + throw; + } + + return response; } } + diff --git a/Api/OnlineSalesAutoCrop.CoreAPI/Controllers/Mobile/MobileMasterDataController.cs b/Api/OnlineSalesAutoCrop.CoreAPI/Controllers/Mobile/MobileMasterDataController.cs index ede6c66..83f18bc 100644 --- a/Api/OnlineSalesAutoCrop.CoreAPI/Controllers/Mobile/MobileMasterDataController.cs +++ b/Api/OnlineSalesAutoCrop.CoreAPI/Controllers/Mobile/MobileMasterDataController.cs @@ -120,6 +120,32 @@ namespace OnlineSalesAutoCrop.CoreAPI.Controllers } } + /// + /// Login using your credential data retrieve from SqlServer + /// + /// + /// + /// + /// If login successful Return Material List + [HttpGet("CustomerWiseMaterialPrices")] + [IgnoreAntiforgeryToken] + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(GetMaterialPriceResponse))] + public async Task GetCustomerWiseMaterialPrices([FromQuery] GetMaterialPriceRequest request) + { + PagedResult response = new(); + try + { + response = await _service.GetMaterialPricesAsync(request); + return Ok(MobileResponseBase>.Success(response)); + } + catch (Exception ex) + { + string msg = $"Exception occur on Materials prices endpoint with employee request - {request?.MaterialCode} -{request?.EmployeeNumber}"; + _logger.LogError(exception: ex, message: msg); + return StatusCode(StatusCodes.Status500InternalServerError, MobileResponseBase.Failure(ex.InnerException != null ? ex.InnerException.Message : ex.Message, StatusCodes.Status500InternalServerError)); + } + } + /// /// Login using your credential data retrieve from SqlServer /// @@ -213,11 +239,11 @@ namespace OnlineSalesAutoCrop.CoreAPI.Controllers [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(GetDiscountResponse))] public async Task GetDiscounts([FromQuery] GetDiscountRequest request) { - List response = new(); + PagedResult response = new(); try { response = await _service.GetDiscountAsync(request); - return Ok(MobileResponseBase>.Success(response)); + return Ok(MobileResponseBase>.Success(response)); } catch (Exception ex) { @@ -227,32 +253,6 @@ namespace OnlineSalesAutoCrop.CoreAPI.Controllers } } - /// - /// Login using your credential data retrieve from SqlServer - /// - /// - /// - /// - /// If login successful Return Attendance List - [HttpGet("DiscountCustomers")] - [IgnoreAntiforgeryToken] - [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(GetDiscountCustomerResponse))] - public async Task GetDiscountCustomers([FromQuery] GetDiscountCustomerRequest request) - { - List response = new(); - try - { - response = await _service.GetDiscountCustomersAsync(request); - return Ok(MobileResponseBase>.Success(response)); - } - catch (Exception ex) - { - string msg = $"Exception occur on Get DiscountCustomers endpoint with request - {request?.EmployeeNumber} -{request?.DiscountCode}"; - _logger.LogError(exception: ex, message: msg); - return StatusCode(StatusCodes.Status500InternalServerError, MobileResponseBase.Failure(ex.InnerException != null ? ex.InnerException.Message : ex.Message, StatusCodes.Status500InternalServerError)); - } - } - /// /// Login using your credential data retrieve from SqlServer @@ -266,11 +266,11 @@ namespace OnlineSalesAutoCrop.CoreAPI.Controllers [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(GetDiscountMaterialResponse))] public async Task GetDiscountMaterials([FromQuery] GetDiscountMaterialRequest request) { - List response = new(); + PagedResult response = new(); try { response = await _service.GetDiscountMaterialsAsync(request); - return Ok(MobileResponseBase>.Success(response)); + return Ok(MobileResponseBase>.Success(response)); } catch (Exception ex) {