feat: add GetVATRate RPC and corresponding query handler for VAT rate retrieval

This commit is contained in:
masoodafar-web
2025-12-18 03:50:00 +03:30
parent 5c03335f0b
commit 9db854ba0e
5 changed files with 109 additions and 0 deletions
@@ -0,0 +1,6 @@
namespace FrontOffice.BFF.Application.UserOrderCQ.Queries.GetVATRate;
/// <summary>
/// دریافت نرخ مالیات بر ارزش افزوده
/// </summary>
public record GetVATRateQuery : IRequest<GetVATRateResponseDto>;
@@ -0,0 +1,61 @@
using CMSMicroservice.Protobuf.Protos.Configuration;
namespace FrontOffice.BFF.Application.UserOrderCQ.Queries.GetVATRate;
/// <summary>
/// هندلر دریافت نرخ مالیات بر ارزش افزوده
/// </summary>
public class GetVATRateQueryHandler : IRequestHandler<GetVATRateQuery, GetVATRateResponseDto>
{
private readonly IApplicationContractContext _context;
public GetVATRateQueryHandler(IApplicationContractContext context)
{
_context = context;
}
public async Task<GetVATRateResponseDto> Handle(GetVATRateQuery request, CancellationToken cancellationToken)
{
// Default values
var response = new GetVATRateResponseDto
{
VatRate = 0.09, // 9% default
VatPercentage = 9,
IsEnabled = true
};
try
{
// دریافت نرخ مالیات از تنظیمات سیستم
// Scope: VAT = 4
var rateConfig = await _context.Configuration.GetConfigurationByKeyAsync(
new GetConfigurationByKeyRequest { Key = "VAT.Rate" },
cancellationToken: cancellationToken);
if (rateConfig != null && !string.IsNullOrEmpty(rateConfig.Value))
{
if (double.TryParse(rateConfig.Value, out var rate))
{
response.VatRate = rate;
response.VatPercentage = (int)(rate * 100);
}
}
// دریافت وضعیت فعال بودن مالیات
var enabledConfig = await _context.Configuration.GetConfigurationByKeyAsync(
new GetConfigurationByKeyRequest { Key = "VAT.IsEnabled" },
cancellationToken: cancellationToken);
if (enabledConfig != null && !string.IsNullOrEmpty(enabledConfig.Value))
{
response.IsEnabled = bool.TryParse(enabledConfig.Value, out var enabled) && enabled;
}
}
catch
{
// در صورت خطا، مقادیر پیش‌فرض برگردانده می‌شود
}
return response;
}
}
@@ -0,0 +1,22 @@
namespace FrontOffice.BFF.Application.UserOrderCQ.Queries.GetVATRate;
/// <summary>
/// پاسخ نرخ مالیات بر ارزش افزوده
/// </summary>
public class GetVATRateResponseDto
{
/// <summary>
/// نرخ مالیات (مثلاً 0.09 = 9%)
/// </summary>
public double VatRate { get; set; }
/// <summary>
/// درصد مالیات (مثلاً 9)
/// </summary>
public int VatPercentage { get; set; }
/// <summary>
/// آیا مالیات فعال است
/// </summary>
public bool IsEnabled { get; set; }
}
@@ -4,6 +4,7 @@ using FrontOffice.BFF.Application.UserOrderCQ.Commands.UpdateUserOrder;
using FrontOffice.BFF.Application.UserOrderCQ.Commands.DeleteUserOrder;
using FrontOffice.BFF.Application.UserOrderCQ.Queries.GetUserOrder;
using FrontOffice.BFF.Application.UserOrderCQ.Queries.GetAllUserOrderByFilter;
using FrontOffice.BFF.Application.UserOrderCQ.Queries.GetVATRate;
using FrontOffice.BFF.Application.UserOrderCQ.Commands.SubmitShopBuyOrder;
using FrontOffice.BFF.UserOrder.Protobuf.Protos.UserOrder;
@@ -40,4 +41,9 @@ public class UserOrderService : UserOrderContract.UserOrderContractBase
{
return await _dispatchRequestToCQRS.Handle<SubmitShopBuyOrderRequest, SubmitShopBuyOrderCommand, SubmitShopBuyOrderResponse>(request, context);
}
public override async Task<GetVATRateResponse> GetVATRate(Empty request, ServerCallContext context)
{
return await _dispatchRequestToCQRS.Handle<Empty, GetVATRateQuery, GetVATRateResponse>(request, context);
}
}
@@ -48,6 +48,12 @@ service UserOrderContract
body: "*"
};
};
// دریافت نرخ مالیات بر ارزش افزوده
rpc GetVATRate(google.protobuf.Empty) returns (GetVATRateResponse){
option (google.api.http) = {
get: "/GetVATRate"
};
};
}
message CreateNewUserOrderRequest
{
@@ -216,4 +222,12 @@ message SubmitShopBuyOrderResponse
sfixed32 nanos = 2;
}
// پاسخ نرخ مالیات بر ارزش افزوده
message GetVATRateResponse
{
double vat_rate = 1; // نرخ مالیات (مثلاً 0.09 = 9%)
int32 vat_percentage = 2; // درصد مالیات (مثلاً 9)
bool is_enabled = 3; // آیا مالیات فعال است
}