Fixed billing fees unreachable error propagation. Added USDT ledger creation. Fixed ledger boundaries operation types
This commit is contained in:
@@ -62,17 +62,42 @@ func (e *gatewayLedgerExecutor) ExecuteLedger(ctx context.Context, req sexec.Ste
|
||||
return nil, err
|
||||
}
|
||||
|
||||
transferReq := &ledgerv1.TransferRequest{
|
||||
IdempotencyKey: ledgerStepIdempotencyKey(req.Payment, req.Step),
|
||||
OrganizationRef: req.Payment.OrganizationRef.Hex(),
|
||||
Money: amount,
|
||||
Description: ledgerDescription(req.Step),
|
||||
Metadata: ledgerTransferMetadata(req.Payment, req.Step, roles),
|
||||
FromRole: ledgerRoleToProto(roles.from),
|
||||
ToRole: ledgerRoleToProto(roles.to),
|
||||
}
|
||||
idempotencyKey := ledgerStepIdempotencyKey(req.Payment, req.Step)
|
||||
organizationRef := req.Payment.OrganizationRef.Hex()
|
||||
description := ledgerDescription(req.Step)
|
||||
metadata := ledgerTransferMetadata(req.Payment, req.Step, roles)
|
||||
|
||||
resp, err := e.ledgerClient.TransferInternal(ctx, transferReq)
|
||||
var resp *ledgerv1.PostResponse
|
||||
switch action {
|
||||
case model.RailOperationExternalCredit:
|
||||
resp, err = e.ledgerClient.PostExternalCreditWithCharges(ctx, &ledgerv1.PostCreditRequest{
|
||||
IdempotencyKey: idempotencyKey,
|
||||
OrganizationRef: organizationRef,
|
||||
Money: amount,
|
||||
Description: description,
|
||||
Metadata: metadata,
|
||||
Role: ledgerRoleToProto(roles.to),
|
||||
})
|
||||
case model.RailOperationExternalDebit:
|
||||
resp, err = e.ledgerClient.PostExternalDebitWithCharges(ctx, &ledgerv1.PostDebitRequest{
|
||||
IdempotencyKey: idempotencyKey,
|
||||
OrganizationRef: organizationRef,
|
||||
Money: amount,
|
||||
Description: description,
|
||||
Metadata: metadata,
|
||||
Role: ledgerRoleToProto(roles.from),
|
||||
})
|
||||
default:
|
||||
resp, err = e.ledgerClient.TransferInternal(ctx, &ledgerv1.TransferRequest{
|
||||
IdempotencyKey: idempotencyKey,
|
||||
OrganizationRef: organizationRef,
|
||||
Money: amount,
|
||||
Description: description,
|
||||
Metadata: metadata,
|
||||
FromRole: ledgerRoleToProto(roles.from),
|
||||
ToRole: ledgerRoleToProto(roles.to),
|
||||
})
|
||||
}
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@@ -80,6 +80,146 @@ func TestGatewayLedgerExecutor_ExecuteLedger_CreditUsesSourceAmountAndDefaultRol
|
||||
}
|
||||
}
|
||||
|
||||
func TestGatewayLedgerExecutor_ExecuteLedger_ExternalCreditUsesPostCreditWithCharges(t *testing.T) {
|
||||
orgID := bson.NewObjectID()
|
||||
payment := testLedgerExecutorPayment(orgID)
|
||||
|
||||
var (
|
||||
postReq *ledgerv1.PostCreditRequest
|
||||
transferCalled bool
|
||||
)
|
||||
executor := &gatewayLedgerExecutor{
|
||||
ledgerClient: &ledgerclient.Fake{
|
||||
PostExternalCreditWithChargesFn: func(_ context.Context, req *ledgerv1.PostCreditRequest) (*ledgerv1.PostResponse, error) {
|
||||
postReq = req
|
||||
return &ledgerv1.PostResponse{JournalEntryRef: "entry-ext-credit"}, nil
|
||||
},
|
||||
TransferInternalFn: func(_ context.Context, _ *ledgerv1.TransferRequest) (*ledgerv1.PostResponse, error) {
|
||||
transferCalled = true
|
||||
return &ledgerv1.PostResponse{JournalEntryRef: "entry-transfer"}, nil
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
out, err := executor.ExecuteLedger(context.Background(), sexec.StepRequest{
|
||||
Payment: payment,
|
||||
Step: xplan.Step{
|
||||
StepRef: "edge_1_2_ledger_credit",
|
||||
StepCode: "edge.1_2.ledger.credit",
|
||||
Action: model.RailOperationExternalCredit,
|
||||
Rail: model.RailLedger,
|
||||
},
|
||||
StepExecution: agg.StepExecution{
|
||||
StepRef: "edge_1_2_ledger_credit",
|
||||
StepCode: "edge.1_2.ledger.credit",
|
||||
Attempt: 1,
|
||||
},
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatalf("ExecuteLedger returned error: %v", err)
|
||||
}
|
||||
if out == nil {
|
||||
t.Fatal("expected output")
|
||||
}
|
||||
if postReq == nil {
|
||||
t.Fatal("expected external credit request")
|
||||
}
|
||||
if transferCalled {
|
||||
t.Fatal("expected external credit to skip transfer")
|
||||
}
|
||||
if got, want := postReq.GetMoney().GetAmount(), "1.000000"; got != want {
|
||||
t.Fatalf("money.amount mismatch: got=%q want=%q", got, want)
|
||||
}
|
||||
if got, want := postReq.GetMoney().GetCurrency(), "USDT"; got != want {
|
||||
t.Fatalf("money.currency mismatch: got=%q want=%q", got, want)
|
||||
}
|
||||
if got, want := postReq.GetRole(), ledgerv1.AccountRole_ACCOUNT_ROLE_OPERATING; got != want {
|
||||
t.Fatalf("role mismatch: got=%v want=%v", got, want)
|
||||
}
|
||||
if got, want := out.StepExecution.State, agg.StepStateCompleted; got != want {
|
||||
t.Fatalf("state mismatch: got=%q want=%q", got, want)
|
||||
}
|
||||
if len(out.StepExecution.ExternalRefs) != 1 {
|
||||
t.Fatalf("expected one external ref, got=%d", len(out.StepExecution.ExternalRefs))
|
||||
}
|
||||
if got, want := out.StepExecution.ExternalRefs[0].Ref, "entry-ext-credit"; got != want {
|
||||
t.Fatalf("external ref value mismatch: got=%q want=%q", got, want)
|
||||
}
|
||||
}
|
||||
|
||||
func TestGatewayLedgerExecutor_ExecuteLedger_ExternalDebitUsesPostDebitWithCharges(t *testing.T) {
|
||||
orgID := bson.NewObjectID()
|
||||
payment := testLedgerExecutorPayment(orgID)
|
||||
|
||||
var (
|
||||
postReq *ledgerv1.PostDebitRequest
|
||||
transferCalled bool
|
||||
)
|
||||
executor := &gatewayLedgerExecutor{
|
||||
ledgerClient: &ledgerclient.Fake{
|
||||
PostExternalDebitWithChargesFn: func(_ context.Context, req *ledgerv1.PostDebitRequest) (*ledgerv1.PostResponse, error) {
|
||||
postReq = req
|
||||
return &ledgerv1.PostResponse{JournalEntryRef: "entry-ext-debit"}, nil
|
||||
},
|
||||
TransferInternalFn: func(_ context.Context, _ *ledgerv1.TransferRequest) (*ledgerv1.PostResponse, error) {
|
||||
transferCalled = true
|
||||
return &ledgerv1.PostResponse{JournalEntryRef: "entry-transfer"}, nil
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
out, err := executor.ExecuteLedger(context.Background(), sexec.StepRequest{
|
||||
Payment: payment,
|
||||
Step: xplan.Step{
|
||||
StepRef: "edge_3_4_ledger_debit",
|
||||
StepCode: "edge.3_4.ledger.debit",
|
||||
Action: model.RailOperationExternalDebit,
|
||||
Rail: model.RailLedger,
|
||||
Metadata: map[string]string{
|
||||
"mode": "finalize_debit",
|
||||
},
|
||||
},
|
||||
StepExecution: agg.StepExecution{
|
||||
StepRef: "edge_3_4_ledger_debit",
|
||||
StepCode: "edge.3_4.ledger.debit",
|
||||
Attempt: 1,
|
||||
},
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatalf("ExecuteLedger returned error: %v", err)
|
||||
}
|
||||
if out == nil {
|
||||
t.Fatal("expected output")
|
||||
}
|
||||
if postReq == nil {
|
||||
t.Fatal("expected external debit request")
|
||||
}
|
||||
if transferCalled {
|
||||
t.Fatal("expected external debit to skip transfer")
|
||||
}
|
||||
if got, want := postReq.GetMoney().GetAmount(), "76.5"; got != want {
|
||||
t.Fatalf("money.amount mismatch: got=%q want=%q", got, want)
|
||||
}
|
||||
if got, want := postReq.GetMoney().GetCurrency(), "RUB"; got != want {
|
||||
t.Fatalf("money.currency mismatch: got=%q want=%q", got, want)
|
||||
}
|
||||
if got, want := postReq.GetRole(), ledgerv1.AccountRole_ACCOUNT_ROLE_HOLD; got != want {
|
||||
t.Fatalf("role mismatch: got=%v want=%v", got, want)
|
||||
}
|
||||
if got, want := postReq.GetMetadata()[ledgerMetadataMode], "finalize_debit"; got != want {
|
||||
t.Fatalf("mode metadata mismatch: got=%q want=%q", got, want)
|
||||
}
|
||||
if got, want := out.StepExecution.State, agg.StepStateCompleted; got != want {
|
||||
t.Fatalf("state mismatch: got=%q want=%q", got, want)
|
||||
}
|
||||
if len(out.StepExecution.ExternalRefs) != 1 {
|
||||
t.Fatalf("expected one external ref, got=%d", len(out.StepExecution.ExternalRefs))
|
||||
}
|
||||
if got, want := out.StepExecution.ExternalRefs[0].Ref, "entry-ext-debit"; got != want {
|
||||
t.Fatalf("external ref value mismatch: got=%q want=%q", got, want)
|
||||
}
|
||||
}
|
||||
|
||||
func TestGatewayLedgerExecutor_ExecuteLedger_FinalizeDebitUsesHoldToTransitAndSettlementAmount(t *testing.T) {
|
||||
orgID := bson.NewObjectID()
|
||||
payment := testLedgerExecutorPayment(orgID)
|
||||
|
||||
Reference in New Issue
Block a user