ledger settlement account autocreation

This commit is contained in:
Stephan D
2026-01-06 18:57:57 +01:00
parent c0ba167f69
commit 890f78a42e
2 changed files with 138 additions and 5 deletions

View File

@@ -16,14 +16,21 @@ import (
)
type accountStoreStub struct {
createErr error
created []*model.Account
existing *model.Account
existingErr error
createErr error
createErrSettlement error
created []*model.Account
existing *model.Account
existingErr error
defaultSettlement *model.Account
defaultErr error
}
func (s *accountStoreStub) Create(_ context.Context, account *model.Account) error {
if s.createErr != nil {
if account.IsSettlement {
if s.createErrSettlement != nil {
return s.createErrSettlement
}
} else if s.createErr != nil {
return s.createErr
}
if account.GetID() == nil || account.GetID().IsZero() {
@@ -47,6 +54,12 @@ func (s *accountStoreStub) Get(context.Context, primitive.ObjectID) (*model.Acco
}
func (s *accountStoreStub) GetDefaultSettlement(context.Context, primitive.ObjectID, string) (*model.Account, error) {
if s.defaultErr != nil {
return nil, s.defaultErr
}
if s.defaultSettlement != nil {
return s.defaultSettlement, nil
}
return nil, storage.ErrAccountNotFound
}
@@ -104,6 +117,47 @@ func TestCreateAccountResponder_Success(t *testing.T) {
require.Len(t, accountStore.created, 1)
}
func TestCreateAccountResponder_AutoCreatesSettlementAccount(t *testing.T) {
t.Parallel()
orgRef := primitive.NewObjectID()
accountStore := &accountStoreStub{}
svc := &Service{
logger: zap.NewNop(),
storage: &repositoryStub{accounts: accountStore},
}
req := &ledgerv1.CreateAccountRequest{
OrganizationRef: orgRef.Hex(),
AccountCode: "liability:customer:1",
AccountType: ledgerv1.AccountType_ACCOUNT_TYPE_LIABILITY,
Currency: "usd",
}
resp, err := svc.createAccountResponder(context.Background(), req)(context.Background())
require.NoError(t, err)
require.NotNil(t, resp)
require.NotNil(t, resp.Account)
require.Len(t, accountStore.created, 2)
var settlement *model.Account
var created *model.Account
for _, acc := range accountStore.created {
if acc.IsSettlement {
settlement = acc
}
if acc.AccountCode == "liability:customer:1" {
created = acc
}
}
require.NotNil(t, settlement)
require.NotNil(t, created)
require.Equal(t, defaultSettlementAccountCode("USD"), settlement.AccountCode)
require.Equal(t, model.AccountTypeAsset, settlement.AccountType)
require.Equal(t, "USD", settlement.Currency)
require.True(t, settlement.AllowNegative)
}
func TestCreateAccountResponder_DuplicateReturnsExisting(t *testing.T) {
t.Parallel()