diff --git a/src/BackOffice.BFF.Application/CommissionCQ/Queries/GetUserPayouts/GetUserPayoutsQuery.cs b/src/BackOffice.BFF.Application/CommissionCQ/Queries/GetUserPayouts/GetUserPayoutsQuery.cs index e011f97..3a6baa9 100644 --- a/src/BackOffice.BFF.Application/CommissionCQ/Queries/GetUserPayouts/GetUserPayoutsQuery.cs +++ b/src/BackOffice.BFF.Application/CommissionCQ/Queries/GetUserPayouts/GetUserPayoutsQuery.cs @@ -1,24 +1,37 @@ namespace BackOffice.BFF.Application.CommissionCQ.Queries.GetUserPayouts; public record GetUserPayoutsQuery : IRequest +{ + /// + /// موقعیت صفحه‌بندی + /// + public PaginationState? PaginationState { get; init; } + + /// + /// مرتب‌سازی بر اساس + /// + public string? SortBy { get; init; } + + /// + /// فیلتر + /// + public GetUserPayoutsFilter? Filter { get; init; } +} + +public class GetUserPayoutsFilter { /// /// شناسه کاربر /// - public long UserId { get; init; } + public long? UserId { get; set; } /// /// شماره هفته (اختیاری - برای فیلتر) /// - public string? WeekNumber { get; init; } + public string? WeekNumber { get; set; } /// - /// شماره صفحه (پیش‌فرض: 1) + /// وضعیت (اختیاری) /// - public int PageNumber { get; init; } = 1; - - /// - /// تعداد در هر صفحه (پیش‌فرض: 10) - /// - public int PageSize { get; init; } = 10; + public int? Status { get; set; } } diff --git a/src/BackOffice.BFF.Application/CommissionCQ/Queries/GetUserPayouts/GetUserPayoutsQueryHandler.cs b/src/BackOffice.BFF.Application/CommissionCQ/Queries/GetUserPayouts/GetUserPayoutsQueryHandler.cs index 7cf294f..564de90 100644 --- a/src/BackOffice.BFF.Application/CommissionCQ/Queries/GetUserPayouts/GetUserPayoutsQueryHandler.cs +++ b/src/BackOffice.BFF.Application/CommissionCQ/Queries/GetUserPayouts/GetUserPayoutsQueryHandler.cs @@ -1,5 +1,3 @@ - - using CMSMicroservice.Protobuf.Protos.Commission; namespace BackOffice.BFF.Application.CommissionCQ.Queries.GetUserPayouts; @@ -15,10 +13,55 @@ public class GetUserPayoutsQueryHandler : IRequestHandler Handle(GetUserPayoutsQuery request, CancellationToken cancellationToken) { + var cmsRequest = new GetUserCommissionPayoutsRequest + { + PageIndex = request.PaginationState?.PageNumber ?? 1, + PageSize = request.PaginationState?.PageSize ?? 10 + }; + + if (request.Filter?.UserId.HasValue == true && request.Filter.UserId.Value > 0) + { + cmsRequest.UserId = request.Filter.UserId.Value; + } + + if (!string.IsNullOrWhiteSpace(request.Filter?.WeekNumber)) + { + cmsRequest.WeekNumber = request.Filter.WeekNumber; + } + + if (request.Filter?.Status.HasValue == true) + { + cmsRequest.Status = request.Filter.Status.Value; + } + var response = await _context.Commissions.GetUserCommissionPayoutsAsync( - request.Adapt(), + cmsRequest, cancellationToken: cancellationToken); - return response.Adapt(); + return new GetUserPayoutsResponseDto + { + MetaData = new MetaData + { + CurrentPage = response.MetaData.CurrentPage, + PageSize = response.MetaData.PageSize, + TotalCount = response.MetaData.TotalCount, + TotalPage = response.MetaData.TotalPage + }, + Models = response.Models.Select(m => new GetUserPayoutsResponseModel + { + Id = m.Id, + UserId = m.UserId, + UserName = m.UserName, + WeekNumber = m.WeekNumber, + BalancesEarned = m.BalancesEarned, + ValuePerBalance = m.ValuePerBalance, + TotalAmount = m.TotalAmount, + Status = m.Status, + WithdrawalMethod = m.WithdrawalMethod, + IbanNumber = m.IbanNumber, + Created = m.Created.ToDateTime(), + LastModified = m.LastModified?.ToDateTime() + }).ToList() + }; } } diff --git a/src/BackOffice.BFF.Application/CommissionCQ/Queries/GetUserPayouts/GetUserPayoutsQueryValidator.cs b/src/BackOffice.BFF.Application/CommissionCQ/Queries/GetUserPayouts/GetUserPayoutsQueryValidator.cs new file mode 100644 index 0000000..374434f --- /dev/null +++ b/src/BackOffice.BFF.Application/CommissionCQ/Queries/GetUserPayouts/GetUserPayoutsQueryValidator.cs @@ -0,0 +1,24 @@ +namespace BackOffice.BFF.Application.CommissionCQ.Queries.GetUserPayouts; + +public class GetUserPayoutsQueryValidator : AbstractValidator +{ + public GetUserPayoutsQueryValidator() + { + RuleFor(x => x.PaginationState) + .NotNull() + .WithMessage("موقعیت صفحه‌بندی الزامی است"); + + When(x => x.Filter != null, () => + { + RuleFor(x => x.Filter!.UserId) + .GreaterThan(0) + .When(x => x.Filter!.UserId.HasValue) + .WithMessage("شناسه کاربر معتبر نیست"); + + RuleFor(x => x.Filter!.WeekNumber) + .Matches(@"^\d{4}-W\d{2}$") + .When(x => !string.IsNullOrWhiteSpace(x.Filter!.WeekNumber)) + .WithMessage("فرمت شماره هفته باید به صورت YYYY-Www باشد (مثال: 2025-W48)"); + }); + } +} diff --git a/src/BackOffice.BFF.Application/CommissionCQ/Queries/GetUserPayouts/GetUserPayoutsResponseDto.cs b/src/BackOffice.BFF.Application/CommissionCQ/Queries/GetUserPayouts/GetUserPayoutsResponseDto.cs index 57c6357..7d69ea0 100644 --- a/src/BackOffice.BFF.Application/CommissionCQ/Queries/GetUserPayouts/GetUserPayoutsResponseDto.cs +++ b/src/BackOffice.BFF.Application/CommissionCQ/Queries/GetUserPayouts/GetUserPayoutsResponseDto.cs @@ -3,27 +3,17 @@ namespace BackOffice.BFF.Application.CommissionCQ.Queries.GetUserPayouts; public class GetUserPayoutsResponseDto { /// - /// لیست Payout ها + /// متادیتا /// - public List Payouts { get; set; } = new(); + public MetaData MetaData { get; set; } /// - /// تعداد کل رکوردها + /// مدل خروجی /// - public int TotalCount { get; set; } - - /// - /// شماره صفحه فعلی - /// - public int PageNumber { get; set; } - - /// - /// تعداد در هر صفحه - /// - public int PageSize { get; set; } + public List? Models { get; set; } } -public class UserPayoutDto +public class GetUserPayoutsResponseModel { /// /// شناسه Payout @@ -35,43 +25,53 @@ public class UserPayoutDto /// public long UserId { get; set; } + /// + /// نام کاربر + /// + public string UserName { get; set; } = string.Empty; + /// /// شماره هفته /// public string WeekNumber { get; set; } = string.Empty; /// - /// بالانس Leg چپ + /// تعداد تعادل‌های کسب شده /// - public decimal LeftLegBalance { get; set; } + public int BalancesEarned { get; set; } /// - /// بالانس Leg راست + /// ارزش هر تعادل /// - public decimal RightLegBalance { get; set; } + public long ValuePerBalance { get; set; } /// - /// بالانس Leg ضعیف‌تر + /// مبلغ کل /// - public decimal WeakerLegBalance { get; set; } + public long TotalAmount { get; set; } /// - /// مبلغ کمیسیون (تومان) + /// وضعیت (0=Pending, 1=Paid, 2=Failed) /// - public decimal CommissionAmount { get; set; } + public int Status { get; set; } /// - /// وضعیت پرداخت + /// روش برداشت /// - public string Status { get; set; } = string.Empty; + public int? WithdrawalMethod { get; set; } /// - /// تاریخ پرداخت + /// شماره شبا /// - public DateTime? PaidAt { get; set; } + public string IbanNumber { get; set; } = string.Empty; /// /// تاریخ ایجاد /// - public DateTime CreatedAt { get; set; } + public DateTime Created { get; set; } + + /// + /// آخرین تغییر + /// + public DateTime? LastModified { get; set; } } diff --git a/src/BackOffice.BFF.Application/CommissionCQ/Queries/GetUserWeeklyBalances/GetUserWeeklyBalancesQuery.cs b/src/BackOffice.BFF.Application/CommissionCQ/Queries/GetUserWeeklyBalances/GetUserWeeklyBalancesQuery.cs index 87259d6..7bc6679 100644 --- a/src/BackOffice.BFF.Application/CommissionCQ/Queries/GetUserWeeklyBalances/GetUserWeeklyBalancesQuery.cs +++ b/src/BackOffice.BFF.Application/CommissionCQ/Queries/GetUserWeeklyBalances/GetUserWeeklyBalancesQuery.cs @@ -1,29 +1,37 @@ namespace BackOffice.BFF.Application.CommissionCQ.Queries.GetUserWeeklyBalances; public record GetUserWeeklyBalancesQuery : IRequest +{ + /// + /// موقعیت صفحه‌بندی + /// + public PaginationState? PaginationState { get; init; } + + /// + /// مرتب‌سازی بر اساس + /// + public string? SortBy { get; init; } + + /// + /// فیلتر + /// + public GetUserWeeklyBalancesFilter? Filter { get; init; } +} + +public class GetUserWeeklyBalancesFilter { /// /// شناسه کاربر (فیلتر اختیاری) /// - public long? UserId { get; init; } + public long? UserId { get; set; } /// /// شماره هفته (فیلتر اختیاری) /// - public string? WeekNumber { get; init; } + public string? WeekNumber { get; set; } /// /// فقط تعادل‌های فعال (منقضی نشده) /// - public bool OnlyActive { get; init; } - - /// - /// شماره صفحه - /// - public int PageIndex { get; init; } = 1; - - /// - /// تعداد در صفحه - /// - public int PageSize { get; init; } = 10; + public bool? OnlyActive { get; set; } } diff --git a/src/BackOffice.BFF.Application/CommissionCQ/Queries/GetUserWeeklyBalances/GetUserWeeklyBalancesQueryHandler.cs b/src/BackOffice.BFF.Application/CommissionCQ/Queries/GetUserWeeklyBalances/GetUserWeeklyBalancesQueryHandler.cs index d2e3786..ce44cf8 100644 --- a/src/BackOffice.BFF.Application/CommissionCQ/Queries/GetUserWeeklyBalances/GetUserWeeklyBalancesQueryHandler.cs +++ b/src/BackOffice.BFF.Application/CommissionCQ/Queries/GetUserWeeklyBalances/GetUserWeeklyBalancesQueryHandler.cs @@ -17,19 +17,19 @@ public class GetUserWeeklyBalancesQueryHandler : IRequestHandler 0) { - grpcRequest.UserId = request.UserId.Value; + grpcRequest.UserId = request.Filter.UserId.Value; } - if (!string.IsNullOrWhiteSpace(request.WeekNumber)) + if (!string.IsNullOrWhiteSpace(request.Filter?.WeekNumber)) { - grpcRequest.WeekNumber = request.WeekNumber; + grpcRequest.WeekNumber = request.Filter.WeekNumber; } var response = await _context.Commissions.GetUserWeeklyBalancesAsync(grpcRequest, cancellationToken: cancellationToken); diff --git a/src/BackOffice.BFF.Application/CommissionCQ/Queries/GetUserWeeklyBalances/GetUserWeeklyBalancesQueryValidator.cs b/src/BackOffice.BFF.Application/CommissionCQ/Queries/GetUserWeeklyBalances/GetUserWeeklyBalancesQueryValidator.cs new file mode 100644 index 0000000..57b090e --- /dev/null +++ b/src/BackOffice.BFF.Application/CommissionCQ/Queries/GetUserWeeklyBalances/GetUserWeeklyBalancesQueryValidator.cs @@ -0,0 +1,24 @@ +namespace BackOffice.BFF.Application.CommissionCQ.Queries.GetUserWeeklyBalances; + +public class GetUserWeeklyBalancesQueryValidator : AbstractValidator +{ + public GetUserWeeklyBalancesQueryValidator() + { + RuleFor(x => x.PaginationState) + .NotNull() + .WithMessage("موقعیت صفحه‌بندی الزامی است"); + + When(x => x.Filter != null, () => + { + RuleFor(x => x.Filter!.UserId) + .GreaterThan(0) + .When(x => x.Filter!.UserId.HasValue) + .WithMessage("شناسه کاربر معتبر نیست"); + + RuleFor(x => x.Filter!.WeekNumber) + .Matches(@"^\d{4}-W\d{2}$") + .When(x => !string.IsNullOrWhiteSpace(x.Filter!.WeekNumber)) + .WithMessage("فرمت شماره هفته باید به صورت YYYY-Www باشد (مثال: 2025-W48)"); + }); + } +} diff --git a/src/BackOffice.BFF.Application/ManualPaymentCQ/Commands/ProcessManualMembershipPayment/ProcessManualMembershipPaymentCommand.cs b/src/BackOffice.BFF.Application/ManualPaymentCQ/Commands/ProcessManualMembershipPayment/ProcessManualMembershipPaymentCommand.cs new file mode 100644 index 0000000..fedcc31 --- /dev/null +++ b/src/BackOffice.BFF.Application/ManualPaymentCQ/Commands/ProcessManualMembershipPayment/ProcessManualMembershipPaymentCommand.cs @@ -0,0 +1,9 @@ +namespace BackOffice.BFF.Application.ManualPaymentCQ.Commands.ProcessManualMembershipPayment; + +public record ProcessManualMembershipPaymentCommand : IRequest +{ + public long UserId { get; init; } + public long Amount { get; init; } + public string ReferenceNumber { get; init; } = string.Empty; + public string? Description { get; init; } +} diff --git a/src/BackOffice.BFF.Application/ManualPaymentCQ/Commands/ProcessManualMembershipPayment/ProcessManualMembershipPaymentCommandHandler.cs b/src/BackOffice.BFF.Application/ManualPaymentCQ/Commands/ProcessManualMembershipPayment/ProcessManualMembershipPaymentCommandHandler.cs new file mode 100644 index 0000000..41cbdc4 --- /dev/null +++ b/src/BackOffice.BFF.Application/ManualPaymentCQ/Commands/ProcessManualMembershipPayment/ProcessManualMembershipPaymentCommandHandler.cs @@ -0,0 +1,55 @@ +using CMSMicroservice.Protobuf.Protos.ManualPayment; +using Microsoft.Extensions.Logging; + +namespace BackOffice.BFF.Application.ManualPaymentCQ.Commands.ProcessManualMembershipPayment; + +public class ProcessManualMembershipPaymentCommandHandler : IRequestHandler +{ + private readonly IApplicationContractContext _context; + private readonly ICurrentUserService _currentUser; + private readonly ILogger _logger; + + public ProcessManualMembershipPaymentCommandHandler( + IApplicationContractContext context, + ICurrentUserService currentUser, + ILogger logger) + { + _context = context; + _currentUser = currentUser; + _logger = logger; + } + + public async Task Handle( + ProcessManualMembershipPaymentCommand request, + CancellationToken cancellationToken) + { + _logger.LogInformation( + "Processing manual membership payment via BFF for UserId {UserId}, Amount {Amount}", + request.UserId, + request.Amount); + + var grpcRequest = new ProcessManualMembershipPaymentRequest + { + UserId = request.UserId, + Amount = request.Amount, + ReferenceNumber = request.ReferenceNumber + }; + + if (!string.IsNullOrWhiteSpace(request.Description)) + { + grpcRequest.Description = request.Description; + } + + var response = await _context.ManualPayments.ProcessManualMembershipPaymentAsync( + grpcRequest, + cancellationToken: cancellationToken); + + return new ProcessManualMembershipPaymentResponseDto + { + TransactionId = response.TransactionId, + OrderId = response.OrderId, + NewWalletBalance = response.NewWalletBalance, + Message = response.Message + }; + } +} diff --git a/src/BackOffice.BFF.Application/ManualPaymentCQ/Commands/ProcessManualMembershipPayment/ProcessManualMembershipPaymentCommandValidator.cs b/src/BackOffice.BFF.Application/ManualPaymentCQ/Commands/ProcessManualMembershipPayment/ProcessManualMembershipPaymentCommandValidator.cs new file mode 100644 index 0000000..ad90e4e --- /dev/null +++ b/src/BackOffice.BFF.Application/ManualPaymentCQ/Commands/ProcessManualMembershipPayment/ProcessManualMembershipPaymentCommandValidator.cs @@ -0,0 +1,21 @@ +namespace BackOffice.BFF.Application.ManualPaymentCQ.Commands.ProcessManualMembershipPayment; + +public class ProcessManualMembershipPaymentCommandValidator : AbstractValidator +{ + public ProcessManualMembershipPaymentCommandValidator() + { + RuleFor(x => x.UserId) + .GreaterThan(0) + .WithMessage("شناسه کاربر معتبر نیست"); + + RuleFor(x => x.Amount) + .GreaterThan(0) + .WithMessage("مبلغ باید بزرگتر از صفر باشد"); + + RuleFor(x => x.ReferenceNumber) + .NotEmpty() + .WithMessage("شماره مرجع الزامی است") + .MaximumLength(50) + .WithMessage("شماره مرجع نباید بیشتر از 50 کاراکتر باشد"); + } +} diff --git a/src/BackOffice.BFF.Application/ManualPaymentCQ/Commands/ProcessManualMembershipPayment/ProcessManualMembershipPaymentResponseDto.cs b/src/BackOffice.BFF.Application/ManualPaymentCQ/Commands/ProcessManualMembershipPayment/ProcessManualMembershipPaymentResponseDto.cs new file mode 100644 index 0000000..1cbae57 --- /dev/null +++ b/src/BackOffice.BFF.Application/ManualPaymentCQ/Commands/ProcessManualMembershipPayment/ProcessManualMembershipPaymentResponseDto.cs @@ -0,0 +1,9 @@ +namespace BackOffice.BFF.Application.ManualPaymentCQ.Commands.ProcessManualMembershipPayment; + +public class ProcessManualMembershipPaymentResponseDto +{ + public long TransactionId { get; set; } + public long OrderId { get; set; } + public long NewWalletBalance { get; set; } + public string Message { get; set; } = string.Empty; +} diff --git a/src/BackOffice.BFF.Domain/BackOffice.BFF.Domain.csproj b/src/BackOffice.BFF.Domain/BackOffice.BFF.Domain.csproj index b516b23..cb328eb 100644 --- a/src/BackOffice.BFF.Domain/BackOffice.BFF.Domain.csproj +++ b/src/BackOffice.BFF.Domain/BackOffice.BFF.Domain.csproj @@ -7,7 +7,7 @@ - + diff --git a/src/BackOffice.BFF.WebApi/Common/Mappings/CommissionProfile.cs b/src/BackOffice.BFF.WebApi/Common/Mappings/CommissionProfile.cs index 0c5f7de..6dc9c0c 100644 --- a/src/BackOffice.BFF.WebApi/Common/Mappings/CommissionProfile.cs +++ b/src/BackOffice.BFF.WebApi/Common/Mappings/CommissionProfile.cs @@ -2,7 +2,9 @@ using BackOffice.BFF.Application.CommissionCQ.Queries.GetWeeklyPool; using BackOffice.BFF.Application.CommissionCQ.Queries.GetAllWeeklyPools; using BackOffice.BFF.Application.CommissionCQ.Queries.GetUserWeeklyBalances; using BackOffice.BFF.Application.CommissionCQ.Queries.GetAvailableWeeks; +using BackOffice.BFF.Application.CommissionCQ.Queries.GetUserPayouts; using Foursat.BackOffice.BFF.Commission.Protos; +using System.Collections.Generic; namespace BackOffice.BFF.WebApi.Common.Mappings; @@ -28,32 +30,34 @@ public class CommissionProfile : IRegister }); // GetUserPayoutsResponseDto -> GetUserCommissionPayoutsResponse - // config.NewConfig() - // .MapWith(src => new GetUserCommissionPayoutsResponse - // { - // MetaData = new BackOffice.BFF.Protobuf.Common.MetaData - // { - // CurrentPage = src.PageNumber, - // PageSize = src.PageSize, - // TotalCount = src.TotalCount, - // TotalPage = src.TotalPages - // }, - // Models = { src.Payouts.Select(m => new UserCommissionPayoutModel - // { - // Id = m.Id, - // UserId = m.UserId, - // UserName = m.UserName ?? string.Empty, - // WeekNumber = m.WeekNumber ?? string.Empty, - // BalanceCount = m.BalanceCount, - // PayoutAmount = m.PayoutAmount, - // Status = m.Status, - // StatusDisplay = m.StatusDisplay ?? string.Empty, - // PayoutDate = m.PayoutDate.HasValue - // ? Timestamp.FromDateTime(DateTime.SpecifyKind(m.PayoutDate.Value, DateTimeKind.Utc)) - // : null, - // Created = Timestamp.FromDateTime(DateTime.SpecifyKind(m.Created, DateTimeKind.Utc)) - // }) } - // }); + config.NewConfig() + .MapWith(src => new GetUserCommissionPayoutsResponse + { + MetaData = new BackOffice.BFF.Protobuf.Common.MetaData + { + CurrentPage = src.MetaData.CurrentPage, + PageSize = src.MetaData.PageSize, + TotalCount = src.MetaData.TotalCount, + TotalPage = src.MetaData.TotalPage + }, + Models = { (src.Models ?? new List()).Select(m => new UserCommissionPayoutModel + { + Id = m.Id, + UserId = m.UserId, + UserName = m.UserName, + WeekNumber = m.WeekNumber, + BalancesEarned = m.BalancesEarned, + ValuePerBalance = m.ValuePerBalance, + TotalAmount = m.TotalAmount, + Status = m.Status, + WithdrawalMethod = m.WithdrawalMethod, + IbanNumber = m.IbanNumber, + Created = Timestamp.FromDateTime(DateTime.SpecifyKind(m.Created, DateTimeKind.Utc)), + LastModified = m.LastModified.HasValue + ? Timestamp.FromDateTime(DateTime.SpecifyKind(m.LastModified.Value, DateTimeKind.Utc)) + : null + }) } + }); // GetAllWeeklyPoolsResponseDto -> GetAllWeeklyPoolsResponse config.NewConfig() diff --git a/src/BackOffice.BFF.WebApi/Services/ManualPaymentService.cs b/src/BackOffice.BFF.WebApi/Services/ManualPaymentService.cs index 80f6cc4..1ed3fd6 100644 --- a/src/BackOffice.BFF.WebApi/Services/ManualPaymentService.cs +++ b/src/BackOffice.BFF.WebApi/Services/ManualPaymentService.cs @@ -3,6 +3,7 @@ using BackOffice.BFF.WebApi.Common.Services; using BackOffice.BFF.Application.ManualPaymentCQ.Commands.CreateManualPayment; using BackOffice.BFF.Application.ManualPaymentCQ.Commands.ApproveManualPayment; using BackOffice.BFF.Application.ManualPaymentCQ.Commands.RejectManualPayment; +using BackOffice.BFF.Application.ManualPaymentCQ.Commands.ProcessManualMembershipPayment; using BackOffice.BFF.Application.ManualPaymentCQ.Queries.GetManualPayments; namespace BackOffice.BFF.WebApi.Services; @@ -70,4 +71,14 @@ public class ManualPaymentService : ManualPaymentContract.ManualPaymentContractB return result.Adapt(); } + + [RequiresPermission(PermissionNames.ManualPaymentsCreate)] + public override async Task ProcessManualMembershipPayment( + ProcessManualMembershipPaymentRequest request, + ServerCallContext context) + { + return await _dispatchRequestToCQRS.Handle( + request, + context); + } } diff --git a/src/Protobufs/BackOffice.BFF.Commission.Protobuf/BackOffice.BFF.Commission.Protobuf.csproj b/src/Protobufs/BackOffice.BFF.Commission.Protobuf/BackOffice.BFF.Commission.Protobuf.csproj index 78059ea..31c02fa 100644 --- a/src/Protobufs/BackOffice.BFF.Commission.Protobuf/BackOffice.BFF.Commission.Protobuf.csproj +++ b/src/Protobufs/BackOffice.BFF.Commission.Protobuf/BackOffice.BFF.Commission.Protobuf.csproj @@ -6,7 +6,7 @@ enable true Foursat.BackOffice.BFF.Commission.Protobuf - 0.0.7 + 0.0.12 FourSat FourSat BackOffice.BFF.Commission.Protobuf @@ -32,7 +32,7 @@ - + diff --git a/src/Protobufs/BackOffice.BFF.Commission.Protobuf/Protos/commission.proto b/src/Protobufs/BackOffice.BFF.Commission.Protobuf/Protos/commission.proto index feb7293..4c20b4b 100644 --- a/src/Protobufs/BackOffice.BFF.Commission.Protobuf/Protos/commission.proto +++ b/src/Protobufs/BackOffice.BFF.Commission.Protobuf/Protos/commission.proto @@ -12,109 +12,109 @@ option csharp_namespace = "Foursat.BackOffice.BFF.Commission.Protos"; service CommissionContract { - // Commands - rpc CalculateWeeklyBalances(CalculateWeeklyBalancesRequest) returns (google.protobuf.Empty){ - option (google.api.http) = { - post: "/CalculateWeeklyBalances" - body: "*" - }; + // Commands + rpc CalculateWeeklyBalances(CalculateWeeklyBalancesRequest) returns (google.protobuf.Empty){ + option (google.api.http) = { + post: "/CalculateWeeklyBalances" + body: "*" }; - rpc CalculateWeeklyCommissionPool(CalculateWeeklyCommissionPoolRequest) returns (google.protobuf.Empty){ - option (google.api.http) = { - post: "/CalculateWeeklyCommissionPool" - body: "*" - }; + }; + rpc CalculateWeeklyCommissionPool(CalculateWeeklyCommissionPoolRequest) returns (google.protobuf.Empty){ + option (google.api.http) = { + post: "/CalculateWeeklyCommissionPool" + body: "*" }; - rpc ProcessUserPayouts(ProcessUserPayoutsRequest) returns (google.protobuf.Empty){ - option (google.api.http) = { - post: "/ProcessUserPayouts" - body: "*" - }; + }; + rpc ProcessUserPayouts(ProcessUserPayoutsRequest) returns (google.protobuf.Empty){ + option (google.api.http) = { + post: "/ProcessUserPayouts" + body: "*" }; - rpc RequestWithdrawal(RequestWithdrawalRequest) returns (google.protobuf.Empty){ - option (google.api.http) = { - post: "/RequestWithdrawal" - body: "*" - }; + }; + rpc RequestWithdrawal(RequestWithdrawalRequest) returns (google.protobuf.Empty){ + option (google.api.http) = { + post: "/RequestWithdrawal" + body: "*" }; - rpc ProcessWithdrawal(ProcessWithdrawalRequest) returns (google.protobuf.Empty){ - option (google.api.http) = { - post: "/ProcessWithdrawal" - body: "*" - }; + }; + rpc ProcessWithdrawal(ProcessWithdrawalRequest) returns (google.protobuf.Empty){ + option (google.api.http) = { + post: "/ProcessWithdrawal" + body: "*" }; - - // Queries - rpc GetWeeklyCommissionPool(GetWeeklyCommissionPoolRequest) returns (GetWeeklyCommissionPoolResponse){ - option (google.api.http) = { - get: "/GetWeeklyCommissionPool" - }; + }; + + // Queries + rpc GetWeeklyCommissionPool(GetWeeklyCommissionPoolRequest) returns (GetWeeklyCommissionPoolResponse){ + option (google.api.http) = { + get: "/GetWeeklyCommissionPool" }; - rpc GetUserCommissionPayouts(GetUserCommissionPayoutsRequest) returns (GetUserCommissionPayoutsResponse){ - option (google.api.http) = { - get: "/GetUserCommissionPayouts" - }; + }; + rpc GetUserCommissionPayouts(GetUserCommissionPayoutsRequest) returns (GetUserCommissionPayoutsResponse){ + option (google.api.http) = { + get: "/GetUserCommissionPayouts" }; - rpc GetCommissionPayoutHistory(GetCommissionPayoutHistoryRequest) returns (GetCommissionPayoutHistoryResponse){ - option (google.api.http) = { - get: "/GetCommissionPayoutHistory" - }; + }; + rpc GetCommissionPayoutHistory(GetCommissionPayoutHistoryRequest) returns (GetCommissionPayoutHistoryResponse){ + option (google.api.http) = { + get: "/GetCommissionPayoutHistory" }; - rpc GetUserWeeklyBalances(GetUserWeeklyBalancesRequest) returns (GetUserWeeklyBalancesResponse){ - option (google.api.http) = { - get: "/GetUserWeeklyBalances" - }; + }; + rpc GetUserWeeklyBalances(GetUserWeeklyBalancesRequest) returns (GetUserWeeklyBalancesResponse){ + option (google.api.http) = { + get: "/GetUserWeeklyBalances" }; - rpc GetAllWeeklyPools(GetAllWeeklyPoolsRequest) returns (GetAllWeeklyPoolsResponse){ - option (google.api.http) = { - get: "/GetAllWeeklyPools" - }; + }; + rpc GetAllWeeklyPools(GetAllWeeklyPoolsRequest) returns (GetAllWeeklyPoolsResponse){ + option (google.api.http) = { + get: "/GetAllWeeklyPools" }; - rpc GetWithdrawalRequests(GetWithdrawalRequestsRequest) returns (GetWithdrawalRequestsResponse){ - option (google.api.http) = { - get: "/GetWithdrawalRequests" - }; + }; + rpc GetWithdrawalRequests(GetWithdrawalRequestsRequest) returns (GetWithdrawalRequestsResponse){ + option (google.api.http) = { + get: "/GetWithdrawalRequests" }; - rpc ApproveWithdrawal(ApproveWithdrawalRequest) returns (google.protobuf.Empty){ - option (google.api.http) = { - post: "/ApproveWithdrawal" - body: "*" - }; + }; + rpc ApproveWithdrawal(ApproveWithdrawalRequest) returns (google.protobuf.Empty){ + option (google.api.http) = { + post: "/ApproveWithdrawal" + body: "*" }; - rpc RejectWithdrawal(RejectWithdrawalRequest) returns (google.protobuf.Empty){ - option (google.api.http) = { - post: "/RejectWithdrawal" - body: "*" - }; + }; + rpc RejectWithdrawal(RejectWithdrawalRequest) returns (google.protobuf.Empty){ + option (google.api.http) = { + post: "/RejectWithdrawal" + body: "*" }; - - // Worker Control APIs - rpc TriggerWeeklyCalculation(TriggerWeeklyCalculationRequest) returns (TriggerWeeklyCalculationResponse){ - option (google.api.http) = { - post: "/TriggerWeeklyCalculation" - body: "*" - }; + }; + + // Worker Control APIs + rpc TriggerWeeklyCalculation(TriggerWeeklyCalculationRequest) returns (TriggerWeeklyCalculationResponse){ + option (google.api.http) = { + post: "/TriggerWeeklyCalculation" + body: "*" }; - rpc GetWorkerStatus(GetWorkerStatusRequest) returns (GetWorkerStatusResponse){ - option (google.api.http) = { - get: "/GetWorkerStatus" - }; + }; + rpc GetWorkerStatus(GetWorkerStatusRequest) returns (GetWorkerStatusResponse){ + option (google.api.http) = { + get: "/GetWorkerStatus" }; - rpc GetWorkerExecutionLogs(GetWorkerExecutionLogsRequest) returns (GetWorkerExecutionLogsResponse){ - option (google.api.http) = { - get: "/GetWorkerExecutionLogs" - }; + }; + rpc GetWorkerExecutionLogs(GetWorkerExecutionLogsRequest) returns (GetWorkerExecutionLogsResponse){ + option (google.api.http) = { + get: "/GetWorkerExecutionLogs" }; - rpc GetAvailableWeeks(GetAvailableWeeksRequest) returns (GetAvailableWeeksResponse){ - option (google.api.http) = { - get: "/GetAvailableWeeks" - }; + }; + rpc GetAvailableWeeks(GetAvailableWeeksRequest) returns (GetAvailableWeeksResponse){ + option (google.api.http) = { + get: "/GetAvailableWeeks" }; - rpc GetWithdrawalReports(GetWithdrawalReportsRequest) returns (GetWithdrawalReportsResponse){ - option (google.api.http) = { - get: "/GetWithdrawalReports" - }; + }; + rpc GetWithdrawalReports(GetWithdrawalReportsRequest) returns (GetWithdrawalReportsResponse){ + option (google.api.http) = { + get: "/GetWithdrawalReports" }; + }; } // ============ Commands ============ @@ -122,51 +122,51 @@ service CommissionContract // CalculateWeeklyBalances Command message CalculateWeeklyBalancesRequest { - string week_number = 1; // Format: "YYYY-Www" (e.g., "2025-W01") - bool force_recalculate = 2; + string week_number = 1; // Format: "YYYY-Www" (e.g., "2025-W01") + bool force_recalculate = 2; } // CalculateWeeklyCommissionPool Command message CalculateWeeklyCommissionPoolRequest { - string week_number = 1; + string week_number = 1; } // ProcessUserPayouts Command message ProcessUserPayoutsRequest { - string week_number = 1; - bool force_reprocess = 2; + string week_number = 1; + bool force_reprocess = 2; } // RequestWithdrawal Command message RequestWithdrawalRequest { - int64 payout_id = 1; - int32 withdrawal_method = 2; // WithdrawalMethod enum: Cash=0, Diamond=1 - google.protobuf.StringValue iban_number = 3; // Required for Cash method + int64 payout_id = 1; + int32 withdrawal_method = 2; // WithdrawalMethod enum: Cash=0, Diamond=1 + google.protobuf.StringValue iban_number = 3; // Required for Cash method } // ProcessWithdrawal Command message ProcessWithdrawalRequest { - int64 payout_id = 1; - bool is_approved = 2; - google.protobuf.StringValue reason = 3; // Required for rejection + int64 payout_id = 1; + bool is_approved = 2; + google.protobuf.StringValue reason = 3; // Required for rejection } // ApproveWithdrawal Command message ApproveWithdrawalRequest { - int64 payout_id = 1; - google.protobuf.StringValue notes = 2; // Optional admin notes + int64 payout_id = 1; + google.protobuf.StringValue notes = 2; // Optional admin notes } // RejectWithdrawal Command message RejectWithdrawalRequest { - int64 payout_id = 1; - string reason = 2; // Required reason for rejection + int64 payout_id = 1; + string reason = 2; // Required reason for rejection } // ============ Queries ============ @@ -174,178 +174,183 @@ message RejectWithdrawalRequest // GetWeeklyCommissionPool Query message GetWeeklyCommissionPoolRequest { - string week_number = 1; + string week_number = 1; } message GetWeeklyCommissionPoolResponse { - int64 id = 1; - string week_number = 2; - int64 total_pool_amount = 3; // Rials - int32 total_balances = 4; - int64 value_per_balance = 5; // Rials per balance - bool is_calculated = 6; - google.protobuf.Timestamp calculated_at = 7; - google.protobuf.Timestamp created = 8; + int64 id = 1; + string week_number = 2; + int64 total_pool_amount = 3; // Rials + int32 total_balances = 4; + int64 value_per_balance = 5; // Rials per balance + bool is_calculated = 6; + google.protobuf.Timestamp calculated_at = 7; + google.protobuf.Timestamp created = 8; } // GetUserCommissionPayouts Query message GetUserCommissionPayoutsRequest { - google.protobuf.Int64Value user_id = 1; - google.protobuf.Int32Value status = 2; // CommissionPayoutStatus enum - google.protobuf.StringValue week_number = 3; - int32 page_index = 4; - int32 page_size = 5; + + messages.PaginationState pagination_state = 1; + GetUserPayoutsFilter filter = 2; + +} +message GetUserPayoutsFilter +{ + google.protobuf.Int64Value user_id = 1; + google.protobuf.Int32Value status = 2; // CommissionPayoutStatus enum + google.protobuf.StringValue week_number = 3; + } message GetUserCommissionPayoutsResponse { - messages.MetaData meta_data = 1; - repeated UserCommissionPayoutModel models = 2; + messages.MetaData meta_data = 1; + repeated UserCommissionPayoutModel models = 2; } message UserCommissionPayoutModel { - int64 id = 1; - int64 user_id = 2; - string user_name = 3; - string week_number = 4; - int32 balances_earned = 5; - int64 value_per_balance = 6; - int64 total_amount = 7; - int32 status = 8; // CommissionPayoutStatus enum - google.protobuf.Int32Value withdrawal_method = 9; - string iban_number = 10; - google.protobuf.Timestamp created = 11; - google.protobuf.Timestamp last_modified = 12; + int64 id = 1; + int64 user_id = 2; + string user_name = 3; + string week_number = 4; + int32 balances_earned = 5; + int64 value_per_balance = 6; + int64 total_amount = 7; + int32 status = 8; // CommissionPayoutStatus enum (0=Pending, 1=Paid, 2=Failed) + google.protobuf.Int32Value withdrawal_method = 9; + string iban_number = 10; + google.protobuf.Timestamp created = 11; + google.protobuf.Timestamp last_modified = 12; } // GetCommissionPayoutHistory Query message GetCommissionPayoutHistoryRequest { - google.protobuf.Int64Value payout_id = 1; - google.protobuf.Int64Value user_id = 2; - google.protobuf.StringValue week_number = 3; - int32 page_index = 4; - int32 page_size = 5; + google.protobuf.Int64Value payout_id = 1; + google.protobuf.Int64Value user_id = 2; + google.protobuf.StringValue week_number = 3; + messages.PaginationState pagination_state = 4; } message GetCommissionPayoutHistoryResponse { - messages.MetaData meta_data = 1; - repeated CommissionPayoutHistoryModel models = 2; + messages.MetaData meta_data = 1; + repeated CommissionPayoutHistoryModel models = 2; } message CommissionPayoutHistoryModel { - int64 id = 1; - int64 payout_id = 2; - int64 user_id = 3; - string week_number = 4; - int64 amount_before = 5; - int64 amount_after = 6; - int32 old_status = 7; // CommissionPayoutStatus enum - int32 new_status = 8; - int32 action = 9; // CommissionPayoutAction enum - string performed_by = 10; - string reason = 11; - google.protobuf.Timestamp created = 12; + int64 id = 1; + int64 payout_id = 2; + int64 user_id = 3; + string week_number = 4; + int64 amount_before = 5; + int64 amount_after = 6; + int32 old_status = 7; // CommissionPayoutStatus enum + int32 new_status = 8; + int32 action = 9; // CommissionPayoutAction enum + string performed_by = 10; + string reason = 11; + google.protobuf.Timestamp created = 12; } // GetUserWeeklyBalances Query message GetUserWeeklyBalancesRequest { - google.protobuf.Int64Value user_id = 1; - google.protobuf.StringValue week_number = 2; - bool only_active = 3; // Only non-expired balances - int32 page_index = 4; - int32 page_size = 5; + google.protobuf.Int64Value user_id = 1; + google.protobuf.StringValue week_number = 2; + bool only_active = 3; // Only non-expired balances + int32 page_index = 4; + int32 page_size = 5; } message GetUserWeeklyBalancesResponse { - messages.MetaData meta_data = 1; - repeated UserWeeklyBalanceModel models = 2; + messages.MetaData meta_data = 1; + repeated UserWeeklyBalanceModel models = 2; } message UserWeeklyBalanceModel { - int64 id = 1; - int64 user_id = 2; - string week_number = 3; - int32 left_leg_balances = 4; - int32 right_leg_balances = 5; - int32 total_balances = 6; - int64 weekly_pool_contribution = 7; - google.protobuf.Timestamp calculated_at = 8; - bool is_expired = 9; - google.protobuf.Timestamp created = 10; + int64 id = 1; + int64 user_id = 2; + string week_number = 3; + int32 left_leg_balances = 4; + int32 right_leg_balances = 5; + int32 total_balances = 6; + int64 weekly_pool_contribution = 7; + google.protobuf.Timestamp calculated_at = 8; + bool is_expired = 9; + google.protobuf.Timestamp created = 10; } // GetAllWeeklyPools Query message GetAllWeeklyPoolsRequest { - google.protobuf.StringValue from_week = 1; // Format: "YYYY-Www" (optional) - google.protobuf.StringValue to_week = 2; // Format: "YYYY-Www" (optional) - google.protobuf.BoolValue only_calculated = 3; // Only show calculated pools - int32 page_index = 4; - int32 page_size = 5; + google.protobuf.StringValue from_week = 1; // Format: "YYYY-Www" (optional) + google.protobuf.StringValue to_week = 2; // Format: "YYYY-Www" (optional) + google.protobuf.BoolValue only_calculated = 3; // Only show calculated pools + int32 page_index = 4; + int32 page_size = 5; } message GetAllWeeklyPoolsResponse { - messages.MetaData meta_data = 1; - repeated WeeklyCommissionPoolModel models = 2; + messages.MetaData meta_data = 1; + repeated WeeklyCommissionPoolModel models = 2; } message WeeklyCommissionPoolModel { - int64 id = 1; - string week_number = 2; - int64 total_pool_amount = 3; - int32 total_balances = 4; - int64 value_per_balance = 5; - bool is_calculated = 6; - google.protobuf.Timestamp calculated_at = 7; - google.protobuf.Timestamp created = 8; + int64 id = 1; + string week_number = 2; + int64 total_pool_amount = 3; + int32 total_balances = 4; + int64 value_per_balance = 5; + bool is_calculated = 6; + google.protobuf.Timestamp calculated_at = 7; + google.protobuf.Timestamp created = 8; } // GetWithdrawalRequests Query message GetWithdrawalRequestsRequest { - google.protobuf.Int32Value status = 1; // CommissionPayoutStatus enum: Pending=1, Approved=2, Rejected=3 - google.protobuf.Int64Value user_id = 2; - google.protobuf.StringValue week_number = 3; - int32 page_index = 4; - int32 page_size = 5; - string iban_number = 6; + google.protobuf.Int32Value status = 1; // CommissionPayoutStatus enum: Pending=1, Approved=2, Rejected=3 + google.protobuf.Int64Value user_id = 2; + google.protobuf.StringValue week_number = 3; + int32 page_index = 4; + int32 page_size = 5; + string iban_number = 6; } message GetWithdrawalRequestsResponse { - messages.MetaData meta_data = 1; - repeated WithdrawalRequestModel models = 2; + messages.MetaData meta_data = 1; + repeated WithdrawalRequestModel models = 2; } message WithdrawalRequestModel { - int64 id = 1; - int64 user_id = 2; - string user_name = 3; - string week_number = 4; - int64 amount = 5; - int32 status = 6; // CommissionPayoutStatus enum - int32 withdrawal_method = 7; // WithdrawalMethod enum - string iban_number = 8; - google.protobuf.Timestamp requested_at = 9; - google.protobuf.Timestamp processed_at = 10; - string processed_by = 11; - string reason = 12; - google.protobuf.Timestamp created = 13; - string bank_reference_id = 14; - string bank_tracking_code = 15; - string payment_failure_reason = 16; + int64 id = 1; + int64 user_id = 2; + string user_name = 3; + string week_number = 4; + int64 amount = 5; + int32 status = 6; // CommissionPayoutStatus enum + int32 withdrawal_method = 7; // WithdrawalMethod enum + string iban_number = 8; + google.protobuf.Timestamp requested_at = 9; + google.protobuf.Timestamp processed_at = 10; + string processed_by = 11; + string reason = 12; + google.protobuf.Timestamp created = 13; + string bank_reference_id = 14; + string bank_tracking_code = 15; + string payment_failure_reason = 16; } // ============ Worker Control APIs ============ @@ -353,141 +358,141 @@ message WithdrawalRequestModel // TriggerWeeklyCalculation Command message TriggerWeeklyCalculationRequest { - string week_number = 1; // Format: "YYYY-Www" (e.g., "2025-W48") - bool force_recalculate = 2; // اگر true باشد، محاسبات قبلی را حذف و دوباره محاسبه می‌کند - bool skip_balances = 3; // Skip balance calculation (only pool and payouts) - bool skip_pool = 4; // Skip pool calculation (only balances and payouts) - bool skip_payouts = 5; // Skip payout processing (only balances and pool) + string week_number = 1; // Format: "YYYY-Www" (e.g., "2025-W48") + bool force_recalculate = 2; // اگر true باشد، محاسبات قبلی را حذف و دوباره محاسبه می‌کند + bool skip_balances = 3; // Skip balance calculation (only pool and payouts) + bool skip_pool = 4; // Skip pool calculation (only balances and payouts) + bool skip_payouts = 5; // Skip payout processing (only balances and pool) } message TriggerWeeklyCalculationResponse { - bool success = 1; - string message = 2; - string execution_id = 3; // Unique ID for tracking this execution - google.protobuf.Timestamp started_at = 4; + bool success = 1; + string message = 2; + string execution_id = 3; // Unique ID for tracking this execution + google.protobuf.Timestamp started_at = 4; } // GetWorkerStatus Query message GetWorkerStatusRequest { - // Empty - returns current worker status + // Empty - returns current worker status } message GetWorkerStatusResponse { - bool is_running = 1; - bool is_enabled = 2; - google.protobuf.StringValue current_execution_id = 3; - google.protobuf.StringValue current_week_number = 4; - google.protobuf.StringValue current_step = 5; // "Balances" | "Pool" | "Payouts" | "Idle" - google.protobuf.Timestamp last_run_at = 6; - google.protobuf.Timestamp next_scheduled_run = 7; - int32 total_executions = 8; - int32 successful_executions = 9; - int32 failed_executions = 10; + bool is_running = 1; + bool is_enabled = 2; + google.protobuf.StringValue current_execution_id = 3; + google.protobuf.StringValue current_week_number = 4; + google.protobuf.StringValue current_step = 5; // "Balances" | "Pool" | "Payouts" | "Idle" + google.protobuf.Timestamp last_run_at = 6; + google.protobuf.Timestamp next_scheduled_run = 7; + int32 total_executions = 8; + int32 successful_executions = 9; + int32 failed_executions = 10; } // GetWorkerExecutionLogs Query message GetWorkerExecutionLogsRequest { - google.protobuf.StringValue week_number = 1; // Filter by week - google.protobuf.StringValue execution_id = 2; // Filter by specific execution - google.protobuf.BoolValue success_only = 3; // Show only successful runs - google.protobuf.BoolValue failed_only = 4; // Show only failed runs - int32 page_index = 5; - int32 page_size = 6; + google.protobuf.StringValue week_number = 1; // Filter by week + google.protobuf.StringValue execution_id = 2; // Filter by specific execution + google.protobuf.BoolValue success_only = 3; // Show only successful runs + google.protobuf.BoolValue failed_only = 4; // Show only failed runs + int32 page_index = 5; + int32 page_size = 6; } message GetWorkerExecutionLogsResponse { - messages.MetaData meta_data = 1; - repeated WorkerExecutionLogModel models = 2; + messages.MetaData meta_data = 1; + repeated WorkerExecutionLogModel models = 2; } message WorkerExecutionLogModel { - string execution_id = 1; - string week_number = 2; - string step = 3; // "Balances" | "Pool" | "Payouts" | "Full" - bool success = 4; - google.protobuf.StringValue error_message = 5; - google.protobuf.Timestamp started_at = 6; - google.protobuf.Timestamp completed_at = 7; - int64 duration_ms = 8; // Duration in milliseconds - int32 records_processed = 9; - google.protobuf.StringValue details = 10; // JSON or text details + string execution_id = 1; + string week_number = 2; + string step = 3; // "Balances" | "Pool" | "Payouts" | "Full" + bool success = 4; + google.protobuf.StringValue error_message = 5; + google.protobuf.Timestamp started_at = 6; + google.protobuf.Timestamp completed_at = 7; + int64 duration_ms = 8; // Duration in milliseconds + int32 records_processed = 9; + google.protobuf.StringValue details = 10; // JSON or text details } // GetWithdrawalReports Query message GetWithdrawalReportsRequest { - google.protobuf.Timestamp start_date = 1; // Optional - default: 30 days ago - google.protobuf.Timestamp end_date = 2; // Optional - default: today - int32 period_type = 3; // ReportPeriodType: Daily=1, Weekly=2, Monthly=3 - google.protobuf.Int32Value status = 4; // CommissionPayoutStatus enum (optional) - google.protobuf.Int64Value user_id = 5; // Optional user filter + google.protobuf.Timestamp start_date = 1; // Optional - default: 30 days ago + google.protobuf.Timestamp end_date = 2; // Optional - default: today + int32 period_type = 3; // ReportPeriodType: Daily=1, Weekly=2, Monthly=3 + google.protobuf.Int32Value status = 4; // CommissionPayoutStatus enum (optional) + google.protobuf.Int64Value user_id = 5; // Optional user filter } message GetWithdrawalReportsResponse { - repeated PeriodReport period_reports = 1; - WithdrawalSummary summary = 2; + repeated PeriodReport period_reports = 1; + WithdrawalSummary summary = 2; } message PeriodReport { - string period_label = 1; // e.g., "2025-01-15", "هفته 3", "فروردین 1404" - google.protobuf.Timestamp start_date = 2; - google.protobuf.Timestamp end_date = 3; - int32 total_requests = 4; - int32 pending_count = 5; - int32 approved_count = 6; - int32 rejected_count = 7; - int32 completed_count = 8; - int32 failed_count = 9; - int64 total_amount = 10; - int64 paid_amount = 11; - int64 pending_amount = 12; + string period_label = 1; // e.g., "2025-01-15", "هفته 3", "فروردین 1404" + google.protobuf.Timestamp start_date = 2; + google.protobuf.Timestamp end_date = 3; + int32 total_requests = 4; + int32 pending_count = 5; + int32 approved_count = 6; + int32 rejected_count = 7; + int32 completed_count = 8; + int32 failed_count = 9; + int64 total_amount = 10; + int64 paid_amount = 11; + int64 pending_amount = 12; } message WithdrawalSummary { - int32 total_requests = 1; - int64 total_amount = 2; - int64 total_paid = 3; - int64 total_pending = 4; - int64 total_rejected = 5; - int64 average_amount = 6; - int32 unique_users = 7; - float success_rate = 8; // Percentage (0-100) + int32 total_requests = 1; + int64 total_amount = 2; + int64 total_paid = 3; + int64 total_pending = 4; + int64 total_rejected = 5; + int64 average_amount = 6; + int32 unique_users = 7; + float success_rate = 8; // Percentage (0-100) } // ============ GetAvailableWeeks ============ message GetAvailableWeeksRequest { - int32 future_weeks_count = 1; // تعداد هفته‌های آینده (پیش‌فرض: 4) - int32 past_weeks_count = 2; // تعداد هفته‌های گذشته (پیش‌فرض: 12) + int32 future_weeks_count = 1; // تعداد هفته‌های آینده (پیش‌فرض: 4) + int32 past_weeks_count = 2; // تعداد هفته‌های گذشته (پیش‌فرض: 12) } message GetAvailableWeeksResponse { - WeekInfo current_week = 1; - repeated WeekInfo calculated_weeks = 2; - repeated WeekInfo pending_weeks = 3; - repeated WeekInfo future_weeks = 4; + WeekInfo current_week = 1; + repeated WeekInfo calculated_weeks = 2; + repeated WeekInfo pending_weeks = 3; + repeated WeekInfo future_weeks = 4; } message WeekInfo { - string week_number = 1; // YYYY-Www format - google.protobuf.Timestamp start_date = 2; - google.protobuf.Timestamp end_date = 3; - bool is_calculated = 4; - google.protobuf.Timestamp calculated_at = 5; - string last_execution_status = 6; - int64 total_pool_amount = 7; - int32 eligible_users_count = 8; - string display_text = 9; // نمایش فارسی برای UI + string week_number = 1; // YYYY-Www format + google.protobuf.Timestamp start_date = 2; + google.protobuf.Timestamp end_date = 3; + bool is_calculated = 4; + google.protobuf.Timestamp calculated_at = 5; + string last_execution_status = 6; + int64 total_pool_amount = 7; + int32 eligible_users_count = 8; + string display_text = 9; // نمایش فارسی برای UI } diff --git a/src/Protobufs/BackOffice.BFF.ManualPayment.Protobuf/BackOffice.BFF.ManualPayment.Protobuf.csproj b/src/Protobufs/BackOffice.BFF.ManualPayment.Protobuf/BackOffice.BFF.ManualPayment.Protobuf.csproj index 0d8f494..4d0f3a0 100644 --- a/src/Protobufs/BackOffice.BFF.ManualPayment.Protobuf/BackOffice.BFF.ManualPayment.Protobuf.csproj +++ b/src/Protobufs/BackOffice.BFF.ManualPayment.Protobuf/BackOffice.BFF.ManualPayment.Protobuf.csproj @@ -4,7 +4,7 @@ net9.0 enable enable - 0.0.2 + 0.0.4 None False False diff --git a/src/Protobufs/BackOffice.BFF.ManualPayment.Protobuf/Protos/manualpayment.proto b/src/Protobufs/BackOffice.BFF.ManualPayment.Protobuf/Protos/manualpayment.proto index 565b8c4..14adb8d 100644 --- a/src/Protobufs/BackOffice.BFF.ManualPayment.Protobuf/Protos/manualpayment.proto +++ b/src/Protobufs/BackOffice.BFF.ManualPayment.Protobuf/Protos/manualpayment.proto @@ -15,6 +15,7 @@ service ManualPaymentContract rpc ApproveManualPayment(ApproveManualPaymentRequest) returns (google.protobuf.Empty); rpc RejectManualPayment(RejectManualPaymentRequest) returns (google.protobuf.Empty); rpc GetManualPayments(GetManualPaymentsRequest) returns (GetManualPaymentsResponse); + rpc ProcessManualMembershipPayment(ProcessManualMembershipPaymentRequest) returns (ProcessManualMembershipPaymentResponse); } message GetManualPaymentsRequest @@ -82,3 +83,19 @@ message RejectManualPaymentRequest string rejection_reason = 2; } +message ProcessManualMembershipPaymentRequest +{ + int64 user_id = 1; + int64 amount = 2; + string reference_number = 3; + google.protobuf.StringValue description = 4; +} + +message ProcessManualMembershipPaymentResponse +{ + int64 transaction_id = 1; + int64 order_id = 2; + int64 new_wallet_balance = 3; + string message = 4; +} +