syntax = "proto3"; package commission; import "public_messages.proto"; import "google/protobuf/empty.proto"; import "google/protobuf/wrappers.proto"; import "google/protobuf/timestamp.proto"; import "google/api/annotations.proto"; option csharp_namespace = "CMSMicroservice.Protobuf.Protos.Commission"; service CommissionContract { // Commands rpc CalculateWeeklyBalances(CalculateWeeklyBalancesRequest) returns (google.protobuf.Empty){ option (google.api.http) = { post: "/Commission/CalculateWeeklyBalances" body: "*" }; }; rpc CalculateWeeklyCommissionPool(CalculateWeeklyCommissionPoolRequest) returns (google.protobuf.Empty){ option (google.api.http) = { post: "/Commission/CalculateWeeklyPool" body: "*" }; }; rpc ProcessUserPayouts(ProcessUserPayoutsRequest) returns (google.protobuf.Empty){ option (google.api.http) = { post: "/Commission/ProcessPayouts" body: "*" }; }; rpc RequestWithdrawal(RequestWithdrawalRequest) returns (google.protobuf.Empty){ option (google.api.http) = { post: "/Commission/RequestWithdrawal" body: "*" }; }; rpc ProcessWithdrawal(ProcessWithdrawalRequest) returns (google.protobuf.Empty){ option (google.api.http) = { post: "/Commission/ProcessWithdrawal" body: "*" }; }; // Queries rpc GetWeeklyCommissionPool(GetWeeklyCommissionPoolRequest) returns (GetWeeklyCommissionPoolResponse){ option (google.api.http) = { get: "/Commission/GetWeeklyPool" }; }; rpc GetUserCommissionPayouts(GetUserCommissionPayoutsRequest) returns (GetUserCommissionPayoutsResponse){ option (google.api.http) = { get: "/Commission/GetUserPayouts" }; }; rpc GetCommissionPayoutHistory(GetCommissionPayoutHistoryRequest) returns (GetCommissionPayoutHistoryResponse){ option (google.api.http) = { get: "/Commission/GetPayoutHistory" }; }; rpc GetUserWeeklyBalances(GetUserWeeklyBalancesRequest) returns (GetUserWeeklyBalancesResponse){ option (google.api.http) = { get: "/Commission/GetUserWeeklyBalances" }; }; } // ============ Commands ============ // CalculateWeeklyBalances Command message CalculateWeeklyBalancesRequest { string week_number = 1; // Format: "YYYY-Www" (e.g., "2025-W01") bool force_recalculate = 2; } // CalculateWeeklyCommissionPool Command message CalculateWeeklyCommissionPoolRequest { string week_number = 1; } // ProcessUserPayouts Command message ProcessUserPayoutsRequest { 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 } // ProcessWithdrawal Command message ProcessWithdrawalRequest { int64 payout_id = 1; bool is_approved = 2; google.protobuf.StringValue reason = 3; // Required for rejection } // ============ Queries ============ // GetWeeklyCommissionPool Query message GetWeeklyCommissionPoolRequest { 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; } // 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; } message GetUserCommissionPayoutsResponse { 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; } // 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; } message GetCommissionPayoutHistoryResponse { 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; } // 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; } message GetUserWeeklyBalancesResponse { 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; }