Files
payments/ce/plugins/column/bank_account_creation.go
zeekay 7d727874d5 chore: rebrand Formance Payments -> Hanzo Payments (hanzo-fi)
- go.mod module path + all self-imports: github.com/formancehq/payments -> github.com/hanzo-fi/payments
  (1590 .go files / 3152 refs; 20 modules: root, pkg/client, pkg/domain, 18 ce/plugins).
  External dep kept: formancehq/go-libs.
- plugins: each ce/plugins/* consumed a *published* pkg/domain; added local
  'replace .../pkg/domain => ../../../pkg/domain' (consistent with root) so every
  standalone plugin module builds in-monorepo. compile-plugin.sh MOD var rebranded too.
- branding: README, LICENSE (dual MIT+EE; upstream copyright retained + Hanzo added),
  goreleaser (release images -> registry.hanzo.ai/hanzo-fi, OCI labels, homepage),
  proto go_package, renovate, speakeasy gen.yaml, connector-template *.gotpl.
- CI: removed Numary/Formance workflows + composite action; added canonical hanzo.yml +
  cicd.yml (hanzoai/ci, gated HANZO_CI_ENABLED) + secretless ci.yml (go build/vet).
- kept as data/compat keys: wire capability enums ALLOW_FORMANCE_*, generated SDK type
  client.Formance, domain field FormanceRedirectURL, OTEL_SERVICE_NAME, upstream base image.
- verified: go build ./... (default + -tags ee) + all 20 nested modules green.
2026-07-05 13:08:55 -07:00

116 lines
5.1 KiB
Go

package column
import (
"context"
"encoding/json"
"fmt"
"strconv"
"github.com/hanzo-fi/payments/ce/plugins/column/client"
"github.com/hanzo-fi/payments/pkg/domain/models"
)
func (p *Plugin) createBankAccount(ctx context.Context, ba models.BankAccount) (models.CreateBankAccountResponse, error) {
err := p.validateExternalBankAccount(ba)
if err != nil {
return models.CreateBankAccountResponse{}, err
}
routingNumber := models.ExtractNamespacedMetadata(ba.Metadata, client.ColumnRoutingNumberMetadataKey)
routingNumberType := models.ExtractNamespacedMetadata(ba.Metadata, client.ColumnRoutingNumberTypeMetadataKey)
accountType := models.ExtractNamespacedMetadata(ba.Metadata, client.ColumnAccountTypeMetadataKey)
wireDrawdownAllowed := models.ExtractNamespacedMetadata(ba.Metadata, client.ColumnWireDrawdownAllowedMetadataKey) == "true"
addressLine1 := models.ExtractNamespacedMetadata(ba.Metadata, client.ColumnAddressLine1MetadataKey)
addressLine2 := models.ExtractNamespacedMetadata(ba.Metadata, client.ColumnAddressLine2MetadataKey)
city := models.ExtractNamespacedMetadata(ba.Metadata, client.ColumnAddressCityMetadataKey)
state := models.ExtractNamespacedMetadata(ba.Metadata, client.ColumnAddressStateMetadataKey)
postalCode := models.ExtractNamespacedMetadata(ba.Metadata, client.ColumnAddressPostalCodeMetadataKey)
phone := models.ExtractNamespacedMetadata(ba.Metadata, client.ColumnPhoneMetadataKey)
email := models.ExtractNamespacedMetadata(ba.Metadata, client.ColumnEmailMetadataKey)
legalID := models.ExtractNamespacedMetadata(ba.Metadata, client.ColumnLegalIDMetadataKey)
legalType := models.ExtractNamespacedMetadata(ba.Metadata, client.ColumnLegalTypeMetadataKey)
localBankCode := models.ExtractNamespacedMetadata(ba.Metadata, client.ColumnLocalBankCodeMetadataKey)
localAccountNumber := models.ExtractNamespacedMetadata(ba.Metadata, client.ColumnLocalAccountNumberMetadataKey)
address := client.ColumnAddress{}
if addressLine1 != "" {
address = client.ColumnAddress{
Line1: addressLine1,
Line2: addressLine2,
City: city,
State: state,
PostalCode: postalCode,
CountryCode: *ba.Country,
}
}
data := client.CounterPartyBankAccountRequest{
Name: ba.Name,
RoutingNumber: routingNumber,
AccountNumber: *ba.AccountNumber,
RoutingNumberType: routingNumberType,
AccountType: accountType,
WireDrawdownAllowed: wireDrawdownAllowed,
Address: address,
Phone: phone,
Email: email,
LegalID: legalID,
LegalType: legalType,
LocalBankCode: localBankCode,
LocalAccountNumber: localAccountNumber,
}
bankAccount, err := p.client.CreateCounterPartyBankAccount(ctx, data)
if err != nil {
return models.CreateBankAccountResponse{}, err
}
parsedTime, err := ParseColumnTimestamp(bankAccount.CreatedAt)
if err != nil {
return models.CreateBankAccountResponse{}, fmt.Errorf("failed to parse creation time: %w", err)
}
raw, err := json.Marshal(bankAccount)
if err != nil {
return models.CreateBankAccountResponse{}, fmt.Errorf("failed to marshal created bank account %w", err)
}
return models.CreateBankAccountResponse{
RelatedAccount: models.PSPAccount{
Reference: bankAccount.ID,
CreatedAt: parsedTime,
Name: &bankAccount.Name,
Raw: raw,
Metadata: map[string]string{
client.ColumnTypeMetadataKey: bankAccount.AccountType,
client.ColumnAccountNumberMetadataKey: bankAccount.AccountNumber,
client.ColumnAddressCityMetadataKey: bankAccount.Address.City,
client.ColumnAddressCountryCodeMetadataKey: bankAccount.Address.CountryCode,
client.ColumnAddressLine1MetadataKey: bankAccount.Address.Line1,
client.ColumnAddressLine2MetadataKey: bankAccount.Address.Line2,
client.ColumnAddressPostalCodeMetadataKey: bankAccount.Address.PostalCode,
client.ColumnAddressStateMetadataKey: bankAccount.Address.State,
client.ColumnDescriptionMetadataKey: bankAccount.Description,
client.ColumnEmailMetadataKey: bankAccount.Email,
client.ColumnIsColumnAccountMetadataKey: strconv.FormatBool(bankAccount.IsColumnAccount),
client.ColumnLegalIDMetadataKey: bankAccount.LegalID,
client.ColumnLegalTypeMetadataKey: bankAccount.LegalType,
client.ColumnLocalAccountNumberMetadataKey: bankAccount.LocalAccountNumber,
client.ColumnLocalBankCodeMetadataKey: bankAccount.LocalBankCode,
client.ColumnLocalBankCountryCodeMetadataKey: bankAccount.LocalBankCountryCode,
client.ColumnLocalBankNameMetadataKey: bankAccount.LocalBankName,
client.ColumnPhoneMetadataKey: bankAccount.Phone,
client.ColumnRoutingNumberTypeMetadataKey: bankAccount.RoutingNumberType,
client.ColumnUpdatedAtMetadataKey: bankAccount.UpdatedAt,
client.ColumnRoutingNumberMetadataKey: bankAccount.RoutingNumber,
client.ColumnWireDrawdownAllowedMetadataKey: strconv.FormatBool(bankAccount.WireDrawdownAllowed),
},
},
}, nil
}