From a0285da53da11b1ef53e08d9fcbc49c06b1148ab Mon Sep 17 00:00:00 2001 From: Brooke E Kline Jr Date: Mon, 15 Apr 2019 15:23:16 -0400 Subject: [PATCH] additional mocks addiotnal mocks for writer and reader --- accountCreditedDrawdown_test.go | 2 +- accountDebitedDrawdown_test.go | 2 +- actualAmountPaid.go | 6 +- actualAmountPaid_test.go | 9 +++ adjustment.go | 4 +- adjustment_test.go | 12 +++ amountNegotiatedDiscount.go | 4 +- amountNegotiatedDiscount_test.go | 9 +++ amount_test.go | 2 +- beneficiaryCustomer_test.go | 17 ++-- beneficiaryFI_test.go | 2 +- beneficiaryReference_test.go | 2 +- beneficiary_test.go | 2 +- businessFunctionCode_test.go | 2 +- charges_test.go | 2 +- currencyInstructedAmount.go | 4 +- currencyInstructedAmount_test.go | 10 +++ dateRemittanceDocument.go | 8 +- dateRemittanceDocument_test.go | 9 +++ exchangeRate_test.go | 2 +- fIBeneficiaryFIAdvice_test.go | 2 +- fedWireMessage.go | 8 +- fiAdditionalFIToFI_test.go | 2 +- fiBeneficiaryAdvice_test.go | 2 +- fiBeneficiaryFI_test.go | 2 +- fiBeneficiary_test.go | 2 +- fiDrawdownDebitAccountAdvice_test.go | 2 +- fiIntermediaryFIAdvice_test.go | 2 +- fiIntermediaryFI_test.go | 2 +- fiPaymentMethodToBeneficiary_test.go | 2 +- fiReceiverFI_test.go | 2 +- fieldErrors.go | 2 + go.mod | 1 + go.sum | 44 +++++++++++ grossAmountRemittanceDocument.go | 4 +- grossAmountRemittanceDocument_test.go | 9 +++ inputMessageAccountabilityData_test.go | 2 +- institutionAccount.go | 92 +++++++++++----------- institutionAccount_test.go | 13 ++++ instructedAmount_test.go | 2 +- instructingFI_test.go | 2 +- intermediaryInstitution.go | 4 +- intermediaryInstitution_test.go | 13 ++++ localInstrument_test.go | 2 +- orderingCustomer.go | 4 +- orderingCustomer_test.go | 13 ++++ orderingInstitution.go | 4 +- orderingInstitution_test.go | 13 ++++ originatorFI_test.go | 2 +- originatorOptionF_test.go | 2 +- originatorToBeneficiary_test.go | 2 +- originator_test.go | 2 +- previousMessageIdentifier_test.go | 2 +- primaryRemittanceDocument.go | 4 +- primaryRemittanceDocument_test.go | 11 +++ reader_test.go | 24 ++++++ receiverDepositoryInstitution_test.go | 2 +- relatedRemittance.go | 4 +- relatedRemittance_test.go | 26 +++++++ remittance.go | 10 ++- remittanceBeneficiary.go | 44 +++++------ remittanceBeneficiary_test.go | 29 +++++++ remittanceFreeText.go | 4 +- remittanceFreeText_test.go | 10 +++ remittanceOriginator.go | 6 +- remittanceOriginator_test.go | 35 +++++++++ remittance_test.go | 12 +++ secondaryRemittanceDocument.go | 6 +- secondaryRemittanceDocument_test.go | 11 +++ senderDepositoryInstitution_test.go | 2 +- senderReference_test.go | 2 +- senderSupplied_test.go | 2 +- senderToReceiver.go | 104 ++++++++++++------------- senderToReceiver_test.go | 14 ++++ serviceMessage_test.go | 2 +- test/testdata/fedWireMessage.txt | 54 +++++++++++++ typeSubType_test.go | 2 +- unstructuredAddenda.go | 6 +- unstructuredAddenda_test.go | 9 +++ validators.go | 32 ++++---- writer_test.go | 95 ++++++++++++++++++++-- 81 files changed, 704 insertions(+), 230 deletions(-) create mode 100644 actualAmountPaid_test.go create mode 100644 adjustment_test.go create mode 100644 amountNegotiatedDiscount_test.go create mode 100644 currencyInstructedAmount_test.go create mode 100644 dateRemittanceDocument_test.go create mode 100644 grossAmountRemittanceDocument_test.go create mode 100644 institutionAccount_test.go create mode 100644 intermediaryInstitution_test.go create mode 100644 orderingCustomer_test.go create mode 100644 orderingInstitution_test.go create mode 100644 primaryRemittanceDocument_test.go create mode 100644 reader_test.go create mode 100644 relatedRemittance_test.go create mode 100644 remittanceBeneficiary_test.go create mode 100644 remittanceFreeText_test.go create mode 100644 remittanceOriginator_test.go create mode 100644 remittance_test.go create mode 100644 secondaryRemittanceDocument_test.go create mode 100644 senderToReceiver_test.go create mode 100644 test/testdata/fedWireMessage.txt create mode 100644 unstructuredAddenda_test.go diff --git a/accountCreditedDrawdown_test.go b/accountCreditedDrawdown_test.go index b3fb37b3..88f02c90 100644 --- a/accountCreditedDrawdown_test.go +++ b/accountCreditedDrawdown_test.go @@ -1,6 +1,6 @@ package wire -// mockAccountCreditedDrawdown creates a AccountCreditedDrawdown +// mockAccountCreditedDrawdown creates a AccountCreditedDrawdown func mockAccountCreditedDrawdown() *AccountCreditedDrawdown { creditDD := NewAccountCreditedDrawdown() creditDD.DrawdownCreditAccountNumber = "123456789" diff --git a/accountDebitedDrawdown_test.go b/accountDebitedDrawdown_test.go index 3986bdb4..434c218b 100644 --- a/accountDebitedDrawdown_test.go +++ b/accountDebitedDrawdown_test.go @@ -1,6 +1,6 @@ package wire -// mockAccountDebitedDrawdown creates a AccountDebitedDrawdown +// mockAccountDebitedDrawdown creates a AccountDebitedDrawdown func mockAccountDebitedDrawdown() *AccountDebitedDrawdown { debitDD := NewAccountDebitedDrawdown() debitDD.IdentificationCode = "DemandDepositAccountNumber" diff --git a/actualAmountPaid.go b/actualAmountPaid.go index d0dd2781..d86330ca 100644 --- a/actualAmountPaid.go +++ b/actualAmountPaid.go @@ -11,7 +11,7 @@ type ActualAmountPaid struct { // tag tag string // RemittanceAmount is remittance amounts - RemittanceAmount *RemittanceAmount `json:"remittanceAmount,omitempty"` + RemittanceAmount RemittanceAmount `json:"remittanceAmount,omitempty"` // validator is composed for data validation validator @@ -20,8 +20,8 @@ type ActualAmountPaid struct { } // NewActualAmountPaid returns a new ActualAmountPaid -func NewActualAmountPaid() ActualAmountPaid { - aap := ActualAmountPaid{ +func NewActualAmountPaid() *ActualAmountPaid { + aap := &ActualAmountPaid{ tag: TagActualAmountPaid, } return aap diff --git a/actualAmountPaid_test.go b/actualAmountPaid_test.go new file mode 100644 index 00000000..e8d1422e --- /dev/null +++ b/actualAmountPaid_test.go @@ -0,0 +1,9 @@ +package wire + +// ActualAmountPaid creates a ActualAmountPaid +func mockActualAmountPaid() *ActualAmountPaid { + aap := NewActualAmountPaid() + aap.RemittanceAmount.CurrencyCode = "USD" + aap.RemittanceAmount.Amount = "1234.56" + return aap +} diff --git a/adjustment.go b/adjustment.go index cb7ae533..1b36fc2a 100644 --- a/adjustment.go +++ b/adjustment.go @@ -26,8 +26,8 @@ type Adjustment struct { } // NewAdjustment returns a new Adjustment -func NewAdjustment() Adjustment { - adj := Adjustment{ +func NewAdjustment() *Adjustment { + adj := &Adjustment{ tag: TagAdjustment, } return adj diff --git a/adjustment_test.go b/adjustment_test.go new file mode 100644 index 00000000..0be25305 --- /dev/null +++ b/adjustment_test.go @@ -0,0 +1,12 @@ +package wire + +// Adjustment creates a Adjustment +func mockAdjustment() *Adjustment { + adj := NewAdjustment() + adj.AdjustmentReasonCode = PricingError + adj.CreditDebitIndicator = CreditIndicator + adj.RemittanceAmount.CurrencyCode = "USD" + adj.RemittanceAmount.Amount = "1234.56" + adj.AdditionalInfo = " Adjustment Additional Information" + return adj +} diff --git a/amountNegotiatedDiscount.go b/amountNegotiatedDiscount.go index b573fa1b..de0baf6d 100644 --- a/amountNegotiatedDiscount.go +++ b/amountNegotiatedDiscount.go @@ -20,8 +20,8 @@ type AmountNegotiatedDiscount struct { } // NewAmountNegotiatedDiscount returns a new AmountNegotiatedDiscount -func NewAmountNegotiatedDiscount() AmountNegotiatedDiscount { - nd := AmountNegotiatedDiscount{ +func NewAmountNegotiatedDiscount() *AmountNegotiatedDiscount { + nd := &AmountNegotiatedDiscount{ tag: TagAmountNegotiatedDiscount, } return nd diff --git a/amountNegotiatedDiscount_test.go b/amountNegotiatedDiscount_test.go new file mode 100644 index 00000000..f4648bff --- /dev/null +++ b/amountNegotiatedDiscount_test.go @@ -0,0 +1,9 @@ +package wire + +// AmountNegotiatedDiscount creates a AmountNegotiatedDiscount +func mockAmountNegotiatedDiscount() *AmountNegotiatedDiscount { + nd := NewAmountNegotiatedDiscount() + nd.RemittanceAmount.CurrencyCode = "USD" + nd.RemittanceAmount.Amount = "1234.56" + return nd +} diff --git a/amount_test.go b/amount_test.go index 60f3f046..7da382ee 100644 --- a/amount_test.go +++ b/amount_test.go @@ -1,6 +1,6 @@ package wire -// mockAmount creates an a Amount +// mockAmount creates an a Amount func mockAmount() *Amount { a := NewAmount() a.Amount = "000001234567" diff --git a/beneficiaryCustomer_test.go b/beneficiaryCustomer_test.go index 71e62977..1d1b013c 100644 --- a/beneficiaryCustomer_test.go +++ b/beneficiaryCustomer_test.go @@ -1,14 +1,13 @@ package wire -// mockBeneficiaryCustomer creates a BeneficiaryCustomer +// mockBeneficiaryCustomer creates a BeneficiaryCustomer func mockBeneficiaryCustomer() *BeneficiaryCustomer { bc := NewBeneficiaryCustomer() - bc.CoverPayment.SwiftFieldTag = "" - bc.CoverPayment.SwiftLineOne = "" - bc.CoverPayment.SwiftLineTwo = "" - bc.CoverPayment.SwiftLineThree= "" - bc.CoverPayment.SwiftLineFour = "" - bc.CoverPayment.SwiftLineFive = "" - bc.CoverPayment.SwiftLineSix = "" + bc.CoverPayment.SwiftFieldTag = "Swift Field Tag" + bc.CoverPayment.SwiftLineOne = "Swift Line One" + bc.CoverPayment.SwiftLineTwo = "Swift Line Two" + bc.CoverPayment.SwiftLineThree = "Swift Line Three" + bc.CoverPayment.SwiftLineFour = "Swift Line Four" + bc.CoverPayment.SwiftLineFive = "Swift Line Five" return bc -} \ No newline at end of file +} diff --git a/beneficiaryFI_test.go b/beneficiaryFI_test.go index f2bbd61f..66f52c0d 100644 --- a/beneficiaryFI_test.go +++ b/beneficiaryFI_test.go @@ -1,6 +1,6 @@ package wire -// mockBeneficiaryFI creates a BeneficiaryFI +// mockBeneficiaryFI creates a BeneficiaryFI func mockBeneficiaryFI() *BeneficiaryFI { bfi := NewBeneficiaryFI() bfi.FinancialInstitution.IdentificationCode = DemandDepositAccountNumber diff --git a/beneficiaryReference_test.go b/beneficiaryReference_test.go index edabfe49..2c69b91c 100644 --- a/beneficiaryReference_test.go +++ b/beneficiaryReference_test.go @@ -1,6 +1,6 @@ package wire -// mockBeneficiaryReference creates a BeneficiaryReference +// mockBeneficiaryReference creates a BeneficiaryReference func mockBeneficiaryReference() *BeneficiaryReference { br:= NewBeneficiaryReference() br.BeneficiaryReference = "Reference" diff --git a/beneficiary_test.go b/beneficiary_test.go index 60bb4eed..b2a48071 100644 --- a/beneficiary_test.go +++ b/beneficiary_test.go @@ -1,6 +1,6 @@ package wire -// mockBeneficiary creates a Beneficiary +// mockBeneficiary creates a Beneficiary func mockBeneficiary() *Beneficiary { ben := NewBeneficiary() ben.Personal.IdentificationCode = DriversLicenseNumber diff --git a/businessFunctionCode_test.go b/businessFunctionCode_test.go index 5d4d2f38..ff484854 100644 --- a/businessFunctionCode_test.go +++ b/businessFunctionCode_test.go @@ -1,6 +1,6 @@ package wire -// mockBusinessFunctionCode creates a BusinessFunctionCode +// mockBusinessFunctionCode creates a BusinessFunctionCode func mockBusinessFunctionCode() *BusinessFunctionCode { bfc := NewBusinessFunctionCode() bfc.BusinessFunctionCode = BankTransfer diff --git a/charges_test.go b/charges_test.go index 401ca501..4a5c7c22 100644 --- a/charges_test.go +++ b/charges_test.go @@ -1,6 +1,6 @@ package wire -// mockCharges creates a Charges +// mockCharges creates a Charges func mockCharges() *Charges { c := NewCharges() c.ChargeDetails = "B" diff --git a/currencyInstructedAmount.go b/currencyInstructedAmount.go index ff3a9299..18637689 100644 --- a/currencyInstructedAmount.go +++ b/currencyInstructedAmount.go @@ -23,8 +23,8 @@ type CurrencyInstructedAmount struct { } // NewCurrencyInstructedAmount returns a new CurrencyInstructedAmount -func NewCurrencyInstructedAmount() CurrencyInstructedAmount { - cia := CurrencyInstructedAmount{ +func NewCurrencyInstructedAmount() *CurrencyInstructedAmount { + cia := &CurrencyInstructedAmount{ tag: TagCurrencyInstructedAmount, } return cia diff --git a/currencyInstructedAmount_test.go b/currencyInstructedAmount_test.go new file mode 100644 index 00000000..2fa753da --- /dev/null +++ b/currencyInstructedAmount_test.go @@ -0,0 +1,10 @@ +package wire + +// CurrencyInstructedAmount creates a CurrencyInstructedAmount +func mockCurrencyInstructedAmount() *CurrencyInstructedAmount { + cia := NewCurrencyInstructedAmount() + cia.SwiftFieldTag = "Swift Field Tag" + cia.Amount = "1500,49" + + return cia +} diff --git a/dateRemittanceDocument.go b/dateRemittanceDocument.go index a8fa299d..b58774e0 100644 --- a/dateRemittanceDocument.go +++ b/dateRemittanceDocument.go @@ -20,8 +20,8 @@ type DateRemittanceDocument struct { } // NewDateRemittanceDocument returns a new DateRemittanceDocument -func NewDateRemittanceDocument() DateRemittanceDocument { - drd := DateRemittanceDocument{ +func NewDateRemittanceDocument() *DateRemittanceDocument { + drd := &DateRemittanceDocument{ tag: TagDateRemittanceDocument, } return drd @@ -33,7 +33,7 @@ func NewDateRemittanceDocument() DateRemittanceDocument { // successful parsing and data validity. func (drd *DateRemittanceDocument) Parse(record string) { drd.tag = record[:6] - drd.tag = drd.validateDate(record[6:14]) + drd.DateRemittanceDocument = drd.parseStringField(record[6:14]) } // String writes DateRemittanceDocument @@ -65,5 +65,5 @@ func (drd *DateRemittanceDocument) fieldInclusion() error { // DateRemittanceDocumentField gets a string of the DateRemittanceDocument field func (drd *DateRemittanceDocument) DateRemittanceDocumentField() string { - return drd.validateDate(drd.DateRemittanceDocument) + return drd.alphaField(drd.DateRemittanceDocument,8) } diff --git a/dateRemittanceDocument_test.go b/dateRemittanceDocument_test.go new file mode 100644 index 00000000..8d48c08c --- /dev/null +++ b/dateRemittanceDocument_test.go @@ -0,0 +1,9 @@ +package wire + +// DateRemittanceDocument creates a DateRemittanceDocument +func mockDateRemittanceDocument() *DateRemittanceDocument { + drd := NewDateRemittanceDocument() + // ToDo: Use date function + drd.DateRemittanceDocument = "20190415" + return drd +} diff --git a/exchangeRate_test.go b/exchangeRate_test.go index 83990c8b..e24954ed 100644 --- a/exchangeRate_test.go +++ b/exchangeRate_test.go @@ -1,6 +1,6 @@ package wire -// mockExchangeRate creates a ExchangeRate +// mockExchangeRate creates a ExchangeRate func mockExchangeRate() *ExchangeRate { eRate := NewExchangeRate() eRate.ExchangeRate = "1,2345" diff --git a/fIBeneficiaryFIAdvice_test.go b/fIBeneficiaryFIAdvice_test.go index ee252435..9ed2c760 100644 --- a/fIBeneficiaryFIAdvice_test.go +++ b/fIBeneficiaryFIAdvice_test.go @@ -1,6 +1,6 @@ package wire -// mockFIBeneficiaryFIAdvice creates a FIBeneficiaryFIAdvice +// mockFIBeneficiaryFIAdvice creates a FIBeneficiaryFIAdvice func mockFIBeneficiaryFIAdvice() *FIBeneficiaryFIAdvice { fibfia := NewFIBeneficiaryFIAdvice() fibfia.Advice.AdviceCode = AdviceCodeTelex diff --git a/fedWireMessage.go b/fedWireMessage.go index f74055ca..d21fa5aa 100644 --- a/fedWireMessage.go +++ b/fedWireMessage.go @@ -566,8 +566,8 @@ func (fwm *FedWireMessage) GetIntermediaryInstitution() *IntermediaryInstitution } // SetInstitutionAccount appends a InstitutionAccount to the FedWireMessage -func (fwm *FedWireMessage) SetInstitutionAccount(ia *InstitutionAccount) { - fwm.InstitutionAccount = ia +func (fwm *FedWireMessage) SetInstitutionAccount(iAccount *InstitutionAccount) { + fwm.InstitutionAccount = iAccount } // GetInstitutionAccount returns the current InstitutionAccount @@ -596,8 +596,8 @@ func (fwm *FedWireMessage) GetRemittance() *Remittance { } // SetSenderToReceiver appends a SenderToReceiver to the FedWireMessage -func (fwm *FedWireMessage) SetSenderToReceiver(sr *SenderToReceiver) { - fwm.SenderToReceiver = sr +func (fwm *FedWireMessage) SetSenderToReceiver(str *SenderToReceiver) { + fwm.SenderToReceiver = str } // GetSenderToReceiver returns the current SenderToReceiver diff --git a/fiAdditionalFIToFI_test.go b/fiAdditionalFIToFI_test.go index 5a505d7b..84363128 100644 --- a/fiAdditionalFIToFI_test.go +++ b/fiAdditionalFIToFI_test.go @@ -1,6 +1,6 @@ package wire -// mockFIAdditionalFIToFI creates a FIAdditionalFIToFI +// mockFIAdditionalFIToFI creates a FIAdditionalFIToFI func mockFIAdditionalFIToFI() *FIAdditionalFIToFI { fifi := NewFIAdditionalFIToFI() fifi.AdditionalFIToFI.LineOne = "Line One" diff --git a/fiBeneficiaryAdvice_test.go b/fiBeneficiaryAdvice_test.go index e88584ca..aa435762 100644 --- a/fiBeneficiaryAdvice_test.go +++ b/fiBeneficiaryAdvice_test.go @@ -1,6 +1,6 @@ package wire -// mockFIBeneficiaryAdvice creates a FIBeneficiaryAdvice +// mockFIBeneficiaryAdvice creates a FIBeneficiaryAdvice func mockFIBeneficiaryAdvice() *FIBeneficiaryAdvice { fiba := NewFIBeneficiaryAdvice() fiba.Advice.AdviceCode = AdviceCodeLetter diff --git a/fiBeneficiaryFI_test.go b/fiBeneficiaryFI_test.go index 4845d0fc..c9c36d80 100644 --- a/fiBeneficiaryFI_test.go +++ b/fiBeneficiaryFI_test.go @@ -1,6 +1,6 @@ package wire -// mockFIBeneficiaryFI creates a FIBeneficiaryFI +// mockFIBeneficiaryFI creates a FIBeneficiaryFI func mockFIBeneficiaryFI() *FIBeneficiaryFI { fibfi := NewFIBeneficiaryFI() fibfi.FIToFI.LineOne = "Line One" diff --git a/fiBeneficiary_test.go b/fiBeneficiary_test.go index c8e0ff32..c77b5745 100644 --- a/fiBeneficiary_test.go +++ b/fiBeneficiary_test.go @@ -1,6 +1,6 @@ package wire -// mockFIBeneficiary creates a FIBeneficiary +// mockFIBeneficiary creates a FIBeneficiary func mockFIBeneficiary() *FIBeneficiary { fib := NewFIBeneficiary() fib.FIToFI.LineOne = "Line One" diff --git a/fiDrawdownDebitAccountAdvice_test.go b/fiDrawdownDebitAccountAdvice_test.go index 7749e3bb..7c3276b4 100644 --- a/fiDrawdownDebitAccountAdvice_test.go +++ b/fiDrawdownDebitAccountAdvice_test.go @@ -1,6 +1,6 @@ package wire -// mockFIDrawdownDebitAccountAdvice creates a FIDrawdownDebitAccountAdvice +// mockFIDrawdownDebitAccountAdvice creates a FIDrawdownDebitAccountAdvice func mockFIDrawdownDebitAccountAdvice() *FIDrawdownDebitAccountAdvice { debitDDAdvice := NewFIDrawdownDebitAccountAdvice() debitDDAdvice.Advice.AdviceCode = AdviceCodeLetter diff --git a/fiIntermediaryFIAdvice_test.go b/fiIntermediaryFIAdvice_test.go index ac8e8d02..29730242 100644 --- a/fiIntermediaryFIAdvice_test.go +++ b/fiIntermediaryFIAdvice_test.go @@ -1,6 +1,6 @@ package wire -// mockFIIntermediaryFIAdvice creates a FIIntermediaryFIAdvice +// mockFIIntermediaryFIAdvice creates a FIIntermediaryFIAdvice func mockFIIntermediaryFIAdvice() *FIIntermediaryFIAdvice { fiifia := NewFIIntermediaryFIAdvice() fiifia.Advice.AdviceCode = AdviceCodeLetter diff --git a/fiIntermediaryFI_test.go b/fiIntermediaryFI_test.go index b5436d2e..a232cc47 100644 --- a/fiIntermediaryFI_test.go +++ b/fiIntermediaryFI_test.go @@ -1,6 +1,6 @@ package wire -// mockFIIntermediaryFI creates a FIIntermediaryFI +// mockFIIntermediaryFI creates a FIIntermediaryFI func mockFIIntermediaryFI() *FIIntermediaryFI { fiifi := NewFIIntermediaryFI() fiifi.FIToFI.LineOne = "Line One" diff --git a/fiPaymentMethodToBeneficiary_test.go b/fiPaymentMethodToBeneficiary_test.go index 5d1f2947..5a0fef48 100644 --- a/fiPaymentMethodToBeneficiary_test.go +++ b/fiPaymentMethodToBeneficiary_test.go @@ -1,6 +1,6 @@ package wire -// mockFIPaymentMethodToBeneficiary creates a FIPaymentMethodToBeneficiary +// mockFIPaymentMethodToBeneficiary creates a FIPaymentMethodToBeneficiary func mockFIPaymentMethodToBeneficiary() *FIPaymentMethodToBeneficiary { pm := NewFIPaymentMethodToBeneficiary() pm.PaymentMethod = "CHECK" diff --git a/fiReceiverFI_test.go b/fiReceiverFI_test.go index 44146b83..6b80c7d8 100644 --- a/fiReceiverFI_test.go +++ b/fiReceiverFI_test.go @@ -1,6 +1,6 @@ package wire -// mockFIReceiverFI creates a FIReceiverFI +// mockFIReceiverFI creates a FIReceiverFI func mockFIReceiverFI() *FIReceiverFI { firfi := NewFIReceiverFI() firfi.FIToFI.LineOne = "Line One" diff --git a/fieldErrors.go b/fieldErrors.go index d2fdffbf..9efd892a 100644 --- a/fieldErrors.go +++ b/fieldErrors.go @@ -34,6 +34,8 @@ var ( ErrValidYear = errors.New("is an invalid year") // ErrValidCentury is returned for an invalid century ErrValidCentury = errors.New("is an invalid century") + // ErrInvalidProperty is returned for an invalid type property + ErrInvalidProperty = errors.New("is an invalid property") // SenderSupplied Tag {1500} diff --git a/go.mod b/go.mod index 3ee3986b..24b03db2 100644 --- a/go.mod +++ b/go.mod @@ -4,6 +4,7 @@ go 1.12 require ( github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6 + github.com/moov-io/ach v1.0.0 github.com/moov-io/base v0.9.0 github.com/rickar/cal v1.0.1 // indirect golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421 diff --git a/go.sum b/go.sum index bb4545b1..0833f719 100644 --- a/go.sum +++ b/go.sum @@ -1,20 +1,64 @@ cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6 h1:uZuxRZCz65cG1o6K/xUqImNcYKtmk9ylqaH0itMSvzA= github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/gorilla/mux v1.7.0/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/moov-io/ach v1.0.0 h1:KjuQNHID1IbDKENFQ7TaH04BEUBa+a6pLiupQ8RSxws= +github.com/moov-io/ach v1.0.0/go.mod h1:lg6QuGuX7FHbAcoGohqAbpacaKda86tgIgOXeGVV3qk= +github.com/moov-io/base v0.8.0/go.mod h1:pPu/TAc9PkaaegbREVEeDHsGqyAlvji9vqTuARuAnd0= github.com/moov-io/base v0.9.0 h1:7bp5Jpola4EunGmOVVaw3WkWOqcSnyVZJEoOmYLKdhw= github.com/moov-io/base v0.9.0/go.mod h1:pPu/TAc9PkaaegbREVEeDHsGqyAlvji9vqTuARuAnd0= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190228000957-bbced9601137/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/rickar/cal v1.0.0/go.mod h1:3GBx8OBrvh4/y/JTxM0e1bUUIHMnqILl1rMANHWExxQ= github.com/rickar/cal v1.0.1 h1:Tyjkk4sBvVC3gcXCgLowEM53R2eVfFcoi1gtQuocrmk= github.com/rickar/cal v1.0.1/go.mod h1:3GBx8OBrvh4/y/JTxM0e1bUUIHMnqILl1rMANHWExxQ= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e h1:bRhVy7zSSasaqNksaRZiA5EEI+Ei4I1nO5Jh72wfHlg= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421 h1:Wo7BWFiOk0QRFMLYMqJGFMd9CgUAcGx7V+qEg/h5IBI= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4 h1:YUO/7uOKsKeq9UokNS62b8FYywz3ker1l1vDZRCRefw= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= google.golang.org/appengine v1.4.0 h1:/wp5JvzpHIxhs/dumFmF7BXTf3Z+dd4uXta4kVyO508= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/grossAmountRemittanceDocument.go b/grossAmountRemittanceDocument.go index 6eea88d4..5f414050 100644 --- a/grossAmountRemittanceDocument.go +++ b/grossAmountRemittanceDocument.go @@ -20,8 +20,8 @@ type GrossAmountRemittanceDocument struct { } // NewGrossAmountRemittanceDocument returns a new GrossAmountRemittanceDocument -func NewGrossAmountRemittanceDocument() GrossAmountRemittanceDocument { - gard := GrossAmountRemittanceDocument{ +func NewGrossAmountRemittanceDocument() *GrossAmountRemittanceDocument { + gard := &GrossAmountRemittanceDocument{ tag: TagGrossAmountRemittanceDocument, } return gard diff --git a/grossAmountRemittanceDocument_test.go b/grossAmountRemittanceDocument_test.go new file mode 100644 index 00000000..ac8432f0 --- /dev/null +++ b/grossAmountRemittanceDocument_test.go @@ -0,0 +1,9 @@ +package wire + +// GrossAmountRemittanceDocument creates a GrossAmountRemittanceDocument +func mockGrossAmountRemittanceDocument() *GrossAmountRemittanceDocument { + gard := NewGrossAmountRemittanceDocument() + gard.RemittanceAmount.CurrencyCode = "USD" + gard.RemittanceAmount.Amount = "1234.56" + return gard +} diff --git a/inputMessageAccountabilityData_test.go b/inputMessageAccountabilityData_test.go index 55c9c1f4..b0587b51 100644 --- a/inputMessageAccountabilityData_test.go +++ b/inputMessageAccountabilityData_test.go @@ -1,6 +1,6 @@ package wire -// mockInputMessageAccountabilityData creates a mockInputMessageAccountabilityData +// mockInputMessageAccountabilityData creates a mockInputMessageAccountabilityData func mockInputMessageAccountabilityData() *InputMessageAccountabilityData { imad := NewInputMessageAccountabilityData() imad.InputCycleDate = "20190410" diff --git a/institutionAccount.go b/institutionAccount.go index 9f655efa..aede0871 100644 --- a/institutionAccount.go +++ b/institutionAccount.go @@ -20,101 +20,101 @@ type InstitutionAccount struct { } // NewInstitutionAccount returns a new InstitutionAccount -func NewInstitutionAccount() InstitutionAccount { - ia := InstitutionAccount{ +func NewInstitutionAccount() *InstitutionAccount { + iAccount := &InstitutionAccount{ tag: TagInstitutionAccount, } - return ia + return iAccount } // Parse takes the input string and parses the InstitutionAccount values // // Parse provides no guarantee about all fields being filled in. Callers should make a Validate() call to confirm // successful parsing and data validity. -func (ia *InstitutionAccount) Parse(record string) { - ia.tag = record[:6] - ia.CoverPayment.SwiftFieldTag = ia.parseStringField(record[6:11]) - ia.CoverPayment.SwiftLineOne = ia.parseStringField(record[11:46]) - ia.CoverPayment.SwiftLineTwo = ia.parseStringField(record[46:81]) - ia.CoverPayment.SwiftLineThree = ia.parseStringField(record[81:116]) - ia.CoverPayment.SwiftLineFour = ia.parseStringField(record[116:151]) - ia.CoverPayment.SwiftLineFive = ia.parseStringField(record[151:186]) +func (iAccount *InstitutionAccount) Parse(record string) { + iAccount.tag = record[:6] + iAccount.CoverPayment.SwiftFieldTag = iAccount.parseStringField(record[6:11]) + iAccount.CoverPayment.SwiftLineOne = iAccount.parseStringField(record[11:46]) + iAccount.CoverPayment.SwiftLineTwo = iAccount.parseStringField(record[46:81]) + iAccount.CoverPayment.SwiftLineThree = iAccount.parseStringField(record[81:116]) + iAccount.CoverPayment.SwiftLineFour = iAccount.parseStringField(record[116:151]) + iAccount.CoverPayment.SwiftLineFive = iAccount.parseStringField(record[151:186]) } // String writes InstitutionAccount -func (ia *InstitutionAccount) String() string { +func (iAccount *InstitutionAccount) String() string { var buf strings.Builder // ToDo: Separator buf.Grow(186) - buf.WriteString(ia.tag) - buf.WriteString(ia.SwiftFieldTagField()) - buf.WriteString(ia.SwiftLineOneField()) - buf.WriteString(ia.SwiftLineTwoField()) - buf.WriteString(ia.SwiftLineThreeField()) - buf.WriteString(ia.SwiftLineFourField()) - buf.WriteString(ia.SwiftLineFiveField()) + buf.WriteString(iAccount.tag) + buf.WriteString(iAccount.SwiftFieldTagField()) + buf.WriteString(iAccount.SwiftLineOneField()) + buf.WriteString(iAccount.SwiftLineTwoField()) + buf.WriteString(iAccount.SwiftLineThreeField()) + buf.WriteString(iAccount.SwiftLineFourField()) + buf.WriteString(iAccount.SwiftLineFiveField()) return buf.String() } // Validate performs WIRE format rule checks on InstitutionAccount and returns an error if not Validated // The first error encountered is returned and stops that parsing. -func (ia *InstitutionAccount) Validate() error { - if err := ia.fieldInclusion(); err != nil { +func (iAccount *InstitutionAccount) Validate() error { + if err := iAccount.fieldInclusion(); err != nil { return err } - if err := ia.isAlphanumeric(ia.CoverPayment.SwiftFieldTag); err != nil { - return fieldError("SwiftFieldTag", err, ia.CoverPayment.SwiftFieldTag) + if err := iAccount.isAlphanumeric(iAccount.CoverPayment.SwiftFieldTag); err != nil { + return fieldError("SwiftFieldTag", err, iAccount.CoverPayment.SwiftFieldTag) } - if err := ia.isAlphanumeric(ia.CoverPayment.SwiftLineOne); err != nil { - return fieldError("SwiftLineOne", err, ia.CoverPayment.SwiftLineOne) + if err := iAccount.isAlphanumeric(iAccount.CoverPayment.SwiftLineOne); err != nil { + return fieldError("SwiftLineOne", err, iAccount.CoverPayment.SwiftLineOne) } - if err := ia.isAlphanumeric(ia.CoverPayment.SwiftLineTwo); err != nil { - return fieldError("SwiftLineTwo", err, ia.CoverPayment.SwiftLineTwo) + if err := iAccount.isAlphanumeric(iAccount.CoverPayment.SwiftLineTwo); err != nil { + return fieldError("SwiftLineTwo", err, iAccount.CoverPayment.SwiftLineTwo) } - if err := ia.isAlphanumeric(ia.CoverPayment.SwiftLineThree); err != nil { - return fieldError("SwiftLineThree", err, ia.CoverPayment.SwiftLineThree) + if err := iAccount.isAlphanumeric(iAccount.CoverPayment.SwiftLineThree); err != nil { + return fieldError("SwiftLineThree", err, iAccount.CoverPayment.SwiftLineThree) } - if err := ia.isAlphanumeric(ia.CoverPayment.SwiftLineFour); err != nil { - return fieldError("SwiftLineFour", err, ia.CoverPayment.SwiftLineFour) + if err := iAccount.isAlphanumeric(iAccount.CoverPayment.SwiftLineFour); err != nil { + return fieldError("SwiftLineFour", err, iAccount.CoverPayment.SwiftLineFour) } - if err := ia.isAlphanumeric(ia.CoverPayment.SwiftLineFive); err != nil { - return fieldError("SwiftLineFive", err, ia.CoverPayment.SwiftLineFive) + if err := iAccount.isAlphanumeric(iAccount.CoverPayment.SwiftLineFive); err != nil { + return fieldError("SwiftLineFive", err, iAccount.CoverPayment.SwiftLineFive) } return nil } // fieldInclusion validate mandatory fields. If fields are // invalid the WIRE will return an error. -func (ia *InstitutionAccount) fieldInclusion() error { +func (iAccount *InstitutionAccount) fieldInclusion() error { return nil } // SwiftFieldTagField gets a string of the SwiftFieldTag field -func (ia *InstitutionAccount) SwiftFieldTagField() string { - return ia.alphaField(ia.CoverPayment.SwiftFieldTag, 5) +func (iAccount *InstitutionAccount) SwiftFieldTagField() string { + return iAccount.alphaField(iAccount.CoverPayment.SwiftFieldTag, 5) } // SwiftLineOneField gets a string of the SwiftLineOne field -func (ia *InstitutionAccount) SwiftLineOneField() string { - return ia.alphaField(ia.CoverPayment.SwiftLineOne, 35) +func (iAccount *InstitutionAccount) SwiftLineOneField() string { + return iAccount.alphaField(iAccount.CoverPayment.SwiftLineOne, 35) } // SwiftLineTwoField gets a string of the SwiftLineTwo field -func (ia *InstitutionAccount) SwiftLineTwoField() string { - return ia.alphaField(ia.CoverPayment.SwiftLineTwo, 35) +func (iAccount *InstitutionAccount) SwiftLineTwoField() string { + return iAccount.alphaField(iAccount.CoverPayment.SwiftLineTwo, 35) } // SwiftLineThreeField gets a string of the SwiftLineThree field -func (ia *InstitutionAccount) SwiftLineThreeField() string { - return ia.alphaField(ia.CoverPayment.SwiftLineThree, 35) +func (iAccount *InstitutionAccount) SwiftLineThreeField() string { + return iAccount.alphaField(iAccount.CoverPayment.SwiftLineThree, 35) } // SwiftLineFourField gets a string of the SwiftLineFour field -func (ia *InstitutionAccount) SwiftLineFourField() string { - return ia.alphaField(ia.CoverPayment.SwiftLineFour, 35) +func (iAccount *InstitutionAccount) SwiftLineFourField() string { + return iAccount.alphaField(iAccount.CoverPayment.SwiftLineFour, 35) } // SwiftLineFiveField gets a string of the SwiftLineFive field -func (ia *InstitutionAccount) SwiftLineFiveField() string { - return ia.alphaField(ia.CoverPayment.SwiftLineFive, 35) +func (iAccount *InstitutionAccount) SwiftLineFiveField() string { + return iAccount.alphaField(iAccount.CoverPayment.SwiftLineFive, 35) } diff --git a/institutionAccount_test.go b/institutionAccount_test.go new file mode 100644 index 00000000..b0145bb5 --- /dev/null +++ b/institutionAccount_test.go @@ -0,0 +1,13 @@ +package wire + +// InstitutionAccount creates a InstitutionAccount +func mockInstitutionAccount() *InstitutionAccount { + ia := NewInstitutionAccount() + ia.CoverPayment.SwiftFieldTag = "Swift Field Tag" + ia.CoverPayment.SwiftLineOne = "Swift Line One" + ia.CoverPayment.SwiftLineTwo = "Swift Line Two" + ia.CoverPayment.SwiftLineThree = "Swift Line Three" + ia.CoverPayment.SwiftLineFour = "Swift Line Four" + ia.CoverPayment.SwiftLineFive = "Swift Line Five" + return ia +} diff --git a/instructedAmount_test.go b/instructedAmount_test.go index e28d9c6f..5a88b058 100644 --- a/instructedAmount_test.go +++ b/instructedAmount_test.go @@ -1,6 +1,6 @@ package wire -// mockInstructedAmount creates a InstructedAmount +// mockInstructedAmount creates a InstructedAmount func mockInstructedAmount() *InstructedAmount { ia := NewInstructedAmount() ia.CurrencyCode = "USD" diff --git a/instructingFI_test.go b/instructingFI_test.go index 2b39343b..c7270c0f 100644 --- a/instructingFI_test.go +++ b/instructingFI_test.go @@ -1,6 +1,6 @@ package wire -// mockInstructingFI creates a InstructingFI +// mockInstructingFI creates a InstructingFI func mockInstructingFI() *InstructingFI { ifi := NewInstructingFI() ifi.FinancialInstitution.IdentificationCode = DemandDepositAccountNumber diff --git a/intermediaryInstitution.go b/intermediaryInstitution.go index d5d3ffb5..3a73fb46 100644 --- a/intermediaryInstitution.go +++ b/intermediaryInstitution.go @@ -20,8 +20,8 @@ type IntermediaryInstitution struct { } // NewIntermediaryInstitution returns a new IntermediaryInstitution -func NewIntermediaryInstitution() IntermediaryInstitution { - ii := IntermediaryInstitution{ +func NewIntermediaryInstitution() *IntermediaryInstitution { + ii := &IntermediaryInstitution{ tag: TagIntermediaryInstitution, } return ii diff --git a/intermediaryInstitution_test.go b/intermediaryInstitution_test.go new file mode 100644 index 00000000..cfe9ebd1 --- /dev/null +++ b/intermediaryInstitution_test.go @@ -0,0 +1,13 @@ +package wire + +// IntermediaryInstitution creates a IntermediaryInstitution +func mockIntermediaryInstitution() *IntermediaryInstitution { + ii := NewIntermediaryInstitution() + ii.CoverPayment.SwiftFieldTag = "Swift Field Tag" + ii.CoverPayment.SwiftLineOne = "Swift Line One" + ii.CoverPayment.SwiftLineTwo = "Swift Line Two" + ii.CoverPayment.SwiftLineThree = "Swift Line Three" + ii.CoverPayment.SwiftLineFour = "Swift Line Four" + ii.CoverPayment.SwiftLineFive = "Swift Line Five" + return ii +} diff --git a/localInstrument_test.go b/localInstrument_test.go index 02865e7a..83570cd6 100644 --- a/localInstrument_test.go +++ b/localInstrument_test.go @@ -1,6 +1,6 @@ package wire -// mockLocalInstrument creates a LocalInstrument +// mockLocalInstrument creates a LocalInstrument func mockLocalInstrument() *LocalInstrument { li := NewLocalInstrument() li.LocalInstrumentCode = "ANSI" diff --git a/orderingCustomer.go b/orderingCustomer.go index d8d4b8cf..701f9cd9 100644 --- a/orderingCustomer.go +++ b/orderingCustomer.go @@ -20,8 +20,8 @@ type OrderingCustomer struct { } // NewOrderingCustomer returns a new OrderingCustomer -func NewOrderingCustomer() OrderingCustomer { - oc := OrderingCustomer{ +func NewOrderingCustomer() *OrderingCustomer { + oc := &OrderingCustomer{ tag: TagOrderingCustomer, } return oc diff --git a/orderingCustomer_test.go b/orderingCustomer_test.go new file mode 100644 index 00000000..73cca6bb --- /dev/null +++ b/orderingCustomer_test.go @@ -0,0 +1,13 @@ +package wire + +// OrderingCustomer creates a OrderingCustomer +func mockOrderingCustomer() *OrderingCustomer { + oc := NewOrderingCustomer() + oc.CoverPayment.SwiftFieldTag = "Swift Field Tag" + oc.CoverPayment.SwiftLineOne = "Swift Line One" + oc.CoverPayment.SwiftLineTwo = "Swift Line Two" + oc.CoverPayment.SwiftLineThree = "Swift Line Three" + oc.CoverPayment.SwiftLineFour = "Swift Line Four" + oc.CoverPayment.SwiftLineFive = "Swift Line Five" + return oc +} diff --git a/orderingInstitution.go b/orderingInstitution.go index 01c70986..2481e7b9 100644 --- a/orderingInstitution.go +++ b/orderingInstitution.go @@ -20,8 +20,8 @@ type OrderingInstitution struct { } // NewOrderingInstitution returns a new OrderingInstitution -func NewOrderingInstitution() OrderingInstitution { - oi := OrderingInstitution{ +func NewOrderingInstitution() *OrderingInstitution { + oi := &OrderingInstitution{ tag: TagOrderingInstitution, } return oi diff --git a/orderingInstitution_test.go b/orderingInstitution_test.go new file mode 100644 index 00000000..b989dadd --- /dev/null +++ b/orderingInstitution_test.go @@ -0,0 +1,13 @@ +package wire + +// OrderingInstitution creates a OrderingInstitution +func mockOrderingInstitution() *OrderingInstitution { + oi := NewOrderingInstitution() + oi.CoverPayment.SwiftFieldTag = "Swift Field Tag" + oi.CoverPayment.SwiftLineOne = "Swift Line One" + oi.CoverPayment.SwiftLineTwo = "Swift Line Two" + oi.CoverPayment.SwiftLineThree = "Swift Line Three" + oi.CoverPayment.SwiftLineFour = "Swift Line Four" + oi.CoverPayment.SwiftLineFive = "Swift Line Five" + return oi +} diff --git a/originatorFI_test.go b/originatorFI_test.go index b8231945..d5a3d617 100644 --- a/originatorFI_test.go +++ b/originatorFI_test.go @@ -1,6 +1,6 @@ package wire -// mockOriginatorFI creates a OriginatorFI +// mockOriginatorFI creates a OriginatorFI func mockOriginatorFI() *OriginatorFI { ofi := NewOriginatorFI() ofi.FinancialInstitution.IdentificationCode = DemandDepositAccountNumber diff --git a/originatorOptionF_test.go b/originatorOptionF_test.go index fe500226..99342b8f 100644 --- a/originatorOptionF_test.go +++ b/originatorOptionF_test.go @@ -1,6 +1,6 @@ package wire -// mockOriginatorOptionF creates a OriginatorOptionF +// mockOriginatorOptionF creates a OriginatorOptionF func mockOriginatorOptionF() *OriginatorOptionF { oof := NewOriginatorOptionF() oof.PartyIdentifier = "TXID/123-45-6789" diff --git a/originatorToBeneficiary_test.go b/originatorToBeneficiary_test.go index 697d83d5..9a166d7a 100644 --- a/originatorToBeneficiary_test.go +++ b/originatorToBeneficiary_test.go @@ -1,6 +1,6 @@ package wire -// mockOriginatorToBeneficiary creates a OriginatorToBeneficiary +// mockOriginatorToBeneficiary creates a OriginatorToBeneficiary func mockOriginatorToBeneficiary() *OriginatorToBeneficiary { ob := NewOriginatorToBeneficiary() ob.LineOne = "LineOne" diff --git a/originator_test.go b/originator_test.go index 1a58a3d5..cdfbced5 100644 --- a/originator_test.go +++ b/originator_test.go @@ -1,6 +1,6 @@ package wire -// mockOriginator creates a Originator +// mockOriginator creates a Originator func mockOriginator() *Originator { o := NewOriginator() o.Personal.IdentificationCode = PassportNumber diff --git a/previousMessageIdentifier_test.go b/previousMessageIdentifier_test.go index 46d7a53c..80d1a502 100644 --- a/previousMessageIdentifier_test.go +++ b/previousMessageIdentifier_test.go @@ -1,6 +1,6 @@ package wire -// mockPreviousMessageIdentifier creates a PreviousMessageIdentifier +// mockPreviousMessageIdentifier creates a PreviousMessageIdentifier func mockPreviousMessageIdentifier() *PreviousMessageIdentifier { pmi := NewPreviousMessageIdentifier() pmi.PreviousMessageIdentifier = "Previous Message Ident" diff --git a/primaryRemittanceDocument.go b/primaryRemittanceDocument.go index f5649a89..b0199989 100644 --- a/primaryRemittanceDocument.go +++ b/primaryRemittanceDocument.go @@ -26,8 +26,8 @@ type PrimaryRemittanceDocument struct { } // NewPrimaryRemittanceDocument returns a new PrimaryRemittanceDocument -func NewPrimaryRemittanceDocument() PrimaryRemittanceDocument { - prd := PrimaryRemittanceDocument{ +func NewPrimaryRemittanceDocument() *PrimaryRemittanceDocument { + prd := &PrimaryRemittanceDocument{ tag: TagPrimaryRemittanceDocument, } return prd diff --git a/primaryRemittanceDocument_test.go b/primaryRemittanceDocument_test.go new file mode 100644 index 00000000..3a564db4 --- /dev/null +++ b/primaryRemittanceDocument_test.go @@ -0,0 +1,11 @@ +package wire + +// PrimaryRemittanceDocument creates a PrimaryRemittanceDocument +func mockPrimaryRemittanceDocument() *PrimaryRemittanceDocument { + prd := NewPrimaryRemittanceDocument() + prd.DocumentTypeCode = AccountsReceivableOpenItem + prd.ProprietaryDocumentTypeCode = "" + prd.DocumentIdentificationNumber = "111111" + prd.Issuer = "Issuer" + return prd +} diff --git a/reader_test.go b/reader_test.go new file mode 100644 index 00000000..c5adaa14 --- /dev/null +++ b/reader_test.go @@ -0,0 +1,24 @@ +package wire + +import ( + "os" + "testing" +) + +// TestFedWireMessage validates reading an FedWireMessage file +func TestFedWireMessageFileRead(t *testing.T) { + f, err := os.Open("./test/testdata/fedWireMessage.txt") + if err != nil { + t.Errorf("%T: %s", err, err) + } + defer f.Close() + r := NewReader(f) + _, err = r.Read() + + if _, err := r.Read(); err != nil { + t.Errorf("%T: %s", err, err) + } + if err = r.File.Validate(); err != nil { + t.Errorf("%T: %s", err, err) + } +} diff --git a/receiverDepositoryInstitution_test.go b/receiverDepositoryInstitution_test.go index 038d7e17..50cdaf46 100644 --- a/receiverDepositoryInstitution_test.go +++ b/receiverDepositoryInstitution_test.go @@ -1,6 +1,6 @@ package wire -// mockReceiverDepositoryInstitution creates a ReceiverDepositoryInstitution +// mockReceiverDepositoryInstitution creates a ReceiverDepositoryInstitution func mockReceiverDepositoryInstitution() *ReceiverDepositoryInstitution { rdi := NewReceiverDepositoryInstitution() rdi.ReceiverABANumber = "231380104" diff --git a/relatedRemittance.go b/relatedRemittance.go index 8005da79..89f26704 100644 --- a/relatedRemittance.go +++ b/relatedRemittance.go @@ -26,8 +26,8 @@ type RelatedRemittance struct { } // NewRelatedRemittance returns a new RelatedRemittance -func NewRelatedRemittance() RelatedRemittance { - rr := RelatedRemittance{ +func NewRelatedRemittance() *RelatedRemittance { + rr := &RelatedRemittance{ tag: TagRelatedRemittance, } return rr diff --git a/relatedRemittance_test.go b/relatedRemittance_test.go new file mode 100644 index 00000000..b0e1bc87 --- /dev/null +++ b/relatedRemittance_test.go @@ -0,0 +1,26 @@ +package wire + +// RelatedRemittance creates a RelatedRemittance +func mockRelatedRemittance() *RelatedRemittance { + rr := NewRelatedRemittance() + rr.RemittanceIdentification = "Remittance Identification" + rr.RemittanceLocationMethod = RLMElectronicDataExchange + rr.RemittanceLocationElectronicAddress = "http://moov.io" + rr.RemittanceData.Name = "Name" + rr.RemittanceData.AddressType = CompletePostalAddress + rr.RemittanceData.Department = "Department" + rr.RemittanceData.SubDepartment = "Sub-Department" + rr.RemittanceData.BuildingNumber = "16" + rr.RemittanceData.PostCode = "19405" + rr.RemittanceData.TownName = "AnyTown" + rr.RemittanceData.CountrySubDivisionState = "PA" + rr.RemittanceData.Country = "UA" + rr.RemittanceData.AddressLineOne = "Address Line One" + rr.RemittanceData.AddressLineTwo = "Address Line Two" + rr.RemittanceData.AddressLineThree = "Address Line Three" + rr.RemittanceData.AddressLineFour = "Address Line Four" + rr.RemittanceData.AddressLineFive = "Address Line Five" + rr.RemittanceData.AddressLineSix = "Address Line Six" + rr.RemittanceData.AddressLineSeven = "Address Line Seven" + return rr +} diff --git a/remittance.go b/remittance.go index fd41ad0f..3b0c84f1 100644 --- a/remittance.go +++ b/remittance.go @@ -22,8 +22,8 @@ type Remittance struct { } // NewRemittance returns a new Remittance -func NewRemittance() Remittance { - ri := Remittance{ +func NewRemittance() *Remittance { + ri := &Remittance{ tag: TagRemittance, } return ri @@ -77,6 +77,12 @@ func (ri *Remittance) Validate() error { if err := ri.isAlphanumeric(ri.CoverPayment.SwiftLineFour); err != nil { return fieldError("SwiftLineFour", err, ri.CoverPayment.SwiftLineFour) } + if ri.CoverPayment.SwiftLineFive != "" { + return fieldError("SwiftLineFive", ErrInvalidProperty, ri.CoverPayment.SwiftLineFive) + } + if ri.CoverPayment.SwiftLineSix != "" { + return fieldError("SwiftLineSix", ErrInvalidProperty, ri.CoverPayment.SwiftLineSix) + } return nil } diff --git a/remittanceBeneficiary.go b/remittanceBeneficiary.go index 4cdf4f64..f7122371 100644 --- a/remittanceBeneficiary.go +++ b/remittanceBeneficiary.go @@ -30,8 +30,8 @@ type RemittanceBeneficiary struct { } // NewRemittanceBeneficiary returns a new RemittanceBeneficiary -func NewRemittanceBeneficiary() RemittanceBeneficiary { - rb := RemittanceBeneficiary{ +func NewRemittanceBeneficiary() *RemittanceBeneficiary { + rb := &RemittanceBeneficiary{ tag: TagRemittanceBeneficiary, } return rb @@ -45,26 +45,26 @@ func (rb *RemittanceBeneficiary) Parse(record string) { rb.tag = record[:6] rb.RemittanceData.Name = rb.parseStringField(record[6:146]) rb.IdentificationType = rb.parseStringField(record[146:148]) - rb.IdentificationCode = rb.parseStringField(record[148:154]) - rb.IdentificationNumber = rb.parseStringField(record[154:189]) - rb.IdentificationNumberIssuer = rb.parseStringField(record[189:224]) - rb.RemittanceData.DateBirthPlace = rb.parseStringField(record[224:306]) - rb.RemittanceData.AddressType = rb.parseStringField(record[306:310]) - rb.RemittanceData.Department = rb.parseStringField(record[310:380]) - rb.RemittanceData.SubDepartment = rb.parseStringField(record[380:450]) - rb.RemittanceData.StreetName = rb.parseStringField(record[450:520]) - rb.RemittanceData.BuildingNumber = rb.parseStringField(record[520:536]) - rb.RemittanceData.PostCode = rb.parseStringField(record[536:552]) - rb.RemittanceData.TownName = rb.parseStringField(record[552:587]) - rb.RemittanceData.CountrySubDivisionState = rb.parseStringField(record[587:622]) - rb.RemittanceData.Country = rb.parseStringField(record[622:624]) - rb.RemittanceData.AddressLineOne = rb.parseStringField(record[624:694]) - rb.RemittanceData.AddressLineTwo = rb.parseStringField(record[694:764]) - rb.RemittanceData.AddressLineThree = rb.parseStringField(record[764:834]) - rb.RemittanceData.AddressLineFour = rb.parseStringField(record[834:904]) - rb.RemittanceData.AddressLineFive = rb.parseStringField(record[904:974]) - rb.RemittanceData.AddressLineSix = rb.parseStringField(record[974:1044]) - rb.RemittanceData.AddressLineSeven = rb.parseStringField(record[1044:1114]) + rb.IdentificationCode = rb.parseStringField(record[148:152]) + rb.IdentificationNumber = rb.parseStringField(record[152:187]) + rb.IdentificationNumberIssuer = rb.parseStringField(record[187:222]) + rb.RemittanceData.DateBirthPlace = rb.parseStringField(record[222:304]) + rb.RemittanceData.AddressType = rb.parseStringField(record[304:308]) + rb.RemittanceData.Department = rb.parseStringField(record[308:378]) + rb.RemittanceData.SubDepartment = rb.parseStringField(record[378:448]) + rb.RemittanceData.StreetName = rb.parseStringField(record[448:518]) + rb.RemittanceData.BuildingNumber = rb.parseStringField(record[518:534]) + rb.RemittanceData.PostCode = rb.parseStringField(record[534:550]) + rb.RemittanceData.TownName = rb.parseStringField(record[550:585]) + rb.RemittanceData.CountrySubDivisionState = rb.parseStringField(record[585:620]) + rb.RemittanceData.Country = rb.parseStringField(record[620:622]) + rb.RemittanceData.AddressLineOne = rb.parseStringField(record[622:692]) + rb.RemittanceData.AddressLineTwo = rb.parseStringField(record[692:762]) + rb.RemittanceData.AddressLineThree = rb.parseStringField(record[762:832]) + rb.RemittanceData.AddressLineFour = rb.parseStringField(record[832:902]) + rb.RemittanceData.AddressLineFive = rb.parseStringField(record[902:972]) + rb.RemittanceData.AddressLineSix = rb.parseStringField(record[972:1042]) + rb.RemittanceData.AddressLineSeven = rb.parseStringField(record[1042:1112]) } // String writes RemittanceBeneficiary diff --git a/remittanceBeneficiary_test.go b/remittanceBeneficiary_test.go new file mode 100644 index 00000000..f98cc3e1 --- /dev/null +++ b/remittanceBeneficiary_test.go @@ -0,0 +1,29 @@ +package wire + +// RemittanceBeneficiary creates a RemittanceBeneficiary +func mockRemittanceBeneficiary() *RemittanceBeneficiary { + rb := NewRemittanceBeneficiary() + rb.RemittanceData.Name = "Name" + rb.IdentificationType = OrganizationID + rb.IdentificationCode = OICCustomerNumber + rb.IdentificationNumber = "111111" + rb.IdentificationNumberIssuer = "Bank" + rb.RemittanceData.DateBirthPlace = "03062013 AnyTown" + rb.RemittanceData.AddressType = CompletePostalAddress + rb.RemittanceData.Department = "Department" + rb.RemittanceData.SubDepartment = "Sub-Department" + rb.RemittanceData.BuildingNumber = "16" + rb.RemittanceData.PostCode = "19405" + rb.RemittanceData.TownName = "AnyTown" + rb.RemittanceData.CountrySubDivisionState = "PA" + rb.RemittanceData.Country = "UA" + rb.RemittanceData.AddressLineOne = "Address Line One" + rb.RemittanceData.AddressLineTwo = "Address Line Two" + rb.RemittanceData.AddressLineThree = "Address Line Three" + rb.RemittanceData.AddressLineFour = "Address Line Four" + rb.RemittanceData.AddressLineFive = "Address Line Five" + rb.RemittanceData.AddressLineSix = "Address Line Six" + rb.RemittanceData.AddressLineSeven = "Address Line Seven" + rb.CountryOfResidence = "US" + return rb +} diff --git a/remittanceFreeText.go b/remittanceFreeText.go index 078b69d0..822c4818 100644 --- a/remittanceFreeText.go +++ b/remittanceFreeText.go @@ -24,8 +24,8 @@ type RemittanceFreeText struct { } // NewRemittanceFreeText returns a new RemittanceFreeText -func NewRemittanceFreeText() RemittanceFreeText { - rft := RemittanceFreeText{ +func NewRemittanceFreeText() *RemittanceFreeText { + rft := &RemittanceFreeText{ tag: TagRemittanceFreeText, } return rft diff --git a/remittanceFreeText_test.go b/remittanceFreeText_test.go new file mode 100644 index 00000000..cf4f2dc2 --- /dev/null +++ b/remittanceFreeText_test.go @@ -0,0 +1,10 @@ +package wire + +// RemittanceFreeText creates a RemittanceFreeText +func mockRemittanceFreeText() *RemittanceFreeText { + rft := NewRemittanceFreeText() + rft.LineOne = "Remittance Free Text Line One" + rft.LineTwo = "Remittance Free Text Line Two" + rft.LineThree = "Remittance Free Text Line Three" + return rft +} diff --git a/remittanceOriginator.go b/remittanceOriginator.go index c385ee0b..60131056 100644 --- a/remittanceOriginator.go +++ b/remittanceOriginator.go @@ -18,8 +18,6 @@ type RemittanceOriginator struct { IdentificationNumber string `json:"identificationNumber,omitempty"` // IdentificationNumberIssuer IdentificationNumberIssuer string `json:"identificationNumberIssuer,omitempty"` - // DateAndBirthPlace - DateAndBirthPlace string `json:"dateAndBirthPlace,omitempty"` // RemittanceData RemittanceData RemittanceData `json:"remittanceData,omitempty"` // CountryOfResidence @@ -44,8 +42,8 @@ type RemittanceOriginator struct { } // NewRemittanceOriginator returns a new RemittanceOriginator -func NewRemittanceOriginator() RemittanceOriginator { - ro := RemittanceOriginator{ +func NewRemittanceOriginator() *RemittanceOriginator { + ro := &RemittanceOriginator{ tag: TagRemittanceOriginator, } return ro diff --git a/remittanceOriginator_test.go b/remittanceOriginator_test.go new file mode 100644 index 00000000..82c9b0b5 --- /dev/null +++ b/remittanceOriginator_test.go @@ -0,0 +1,35 @@ +package wire + +// RemittanceOriginator creates a RemittanceOriginator +func mockRemittanceOriginator() *RemittanceOriginator { + ro := NewRemittanceOriginator() + ro.IdentificationType = OrganizationID + ro.IdentificationCode = OICCustomerNumber + ro.IdentificationNumber = "111111" + ro.IdentificationNumberIssuer = "Bank" + ro.RemittanceData.DateBirthPlace = "12072008 AnyTown" + ro.RemittanceData.Name = "Name" + ro.RemittanceData.AddressType = CompletePostalAddress + ro.RemittanceData.Department = "Department" + ro.RemittanceData.SubDepartment = "Sub-Department" + ro.RemittanceData.BuildingNumber = "16" + ro.RemittanceData.PostCode = "19405" + ro.RemittanceData.TownName = "AnyTown" + ro.RemittanceData.CountrySubDivisionState = "PA" + ro.RemittanceData.Country = "UA" + ro.RemittanceData.AddressLineOne = "Address Line One" + ro.RemittanceData.AddressLineTwo = "Address Line Two" + ro.RemittanceData.AddressLineThree = "Address Line Three" + ro.RemittanceData.AddressLineFour = "Address Line Four" + ro.RemittanceData.AddressLineFive = "Address Line Five" + ro.RemittanceData.AddressLineSix = "Address Line Six" + ro.RemittanceData.AddressLineSeven = "Address Line Seven" + ro.CountryOfResidence = "US" + ro.ContactName = "Contact Name" + ro.ContactPhoneNumber = "5551231212" + ro.ContactMobileNumber = "5551231212" + ro.ContactFaxNumber = "5551231212" + ro.ContactElectronicAddress = "http://www.moov.io" + ro.ContactOther = "Contact Other" + return ro +} diff --git a/remittance_test.go b/remittance_test.go new file mode 100644 index 00000000..3f94a640 --- /dev/null +++ b/remittance_test.go @@ -0,0 +1,12 @@ +package wire + +// Remittance creates a Remittance +func mockRemittance() *Remittance { + ri := NewRemittance() + ri.CoverPayment.SwiftFieldTag = "Swift Field Tag" + ri.CoverPayment.SwiftLineOne = "Swift Line One" + ri.CoverPayment.SwiftLineTwo = "Swift Line Two" + ri.CoverPayment.SwiftLineThree = "Swift Line Three" + ri.CoverPayment.SwiftLineFour = "Swift Line Four" + return ri +} diff --git a/secondaryRemittanceDocument.go b/secondaryRemittanceDocument.go index 37ac2ea6..5a66ab25 100644 --- a/secondaryRemittanceDocument.go +++ b/secondaryRemittanceDocument.go @@ -26,8 +26,8 @@ type SecondaryRemittanceDocument struct { } // NewSecondaryRemittanceDocument returns a new SecondaryRemittanceDocument -func NewSecondaryRemittanceDocument() SecondaryRemittanceDocument { - srd := SecondaryRemittanceDocument{ +func NewSecondaryRemittanceDocument() *SecondaryRemittanceDocument { + srd := &SecondaryRemittanceDocument{ tag: TagSecondaryRemittanceDocument, } return srd @@ -63,7 +63,7 @@ func (srd *SecondaryRemittanceDocument) Validate() error { if err := srd.fieldInclusion(); err != nil { return err } - if err := srd.isAlphanumeric(srd.DocumentTypeCode); err != nil { + if err := srd.isDocumentTypeCode(srd.DocumentTypeCode); err != nil { return fieldError("DocumentTypeCode", err, srd.DocumentTypeCode) } if err := srd.isAlphanumeric(srd.ProprietaryDocumentTypeCode); err != nil { diff --git a/secondaryRemittanceDocument_test.go b/secondaryRemittanceDocument_test.go new file mode 100644 index 00000000..be055018 --- /dev/null +++ b/secondaryRemittanceDocument_test.go @@ -0,0 +1,11 @@ +package wire + +// SecondaryRemittanceDocument creates a SecondaryRemittanceDocument +func mockSecondaryRemittanceDocument() *SecondaryRemittanceDocument { + srd := NewSecondaryRemittanceDocument() + srd.DocumentTypeCode = StatementAccount + srd.ProprietaryDocumentTypeCode = "" + srd.DocumentIdentificationNumber = "222222" + srd.Issuer = "Issuer 2" + return srd +} diff --git a/senderDepositoryInstitution_test.go b/senderDepositoryInstitution_test.go index 7f2b2a89..38420a3e 100644 --- a/senderDepositoryInstitution_test.go +++ b/senderDepositoryInstitution_test.go @@ -1,6 +1,6 @@ package wire -// mockSenderDepositoryInstitution creates a SenderDepositoryInstitution +// mockSenderDepositoryInstitution creates a SenderDepositoryInstitution func mockSenderDepositoryInstitution() *SenderDepositoryInstitution { sdi := NewSenderDepositoryInstitution() sdi.SenderABANumber = "121042882" diff --git a/senderReference_test.go b/senderReference_test.go index 8df1b572..c428e4ac 100644 --- a/senderReference_test.go +++ b/senderReference_test.go @@ -1,6 +1,6 @@ package wire -// mockSenderReference creates a SenderReference +// mockSenderReference creates a SenderReference func mockSenderReference() *SenderReference { sr := NewSenderReference() sr.SenderReference = "Sender Reference" diff --git a/senderSupplied_test.go b/senderSupplied_test.go index 2ad756e6..872816ad 100644 --- a/senderSupplied_test.go +++ b/senderSupplied_test.go @@ -1,6 +1,6 @@ package wire -// mockSenderSupplied creates a SenderSupplied +// mockSenderSupplied creates a SenderSupplied func mockSenderSupplied() *SenderSupplied { ss := NewSenderSupplied() ss.UserRequestCorrelation = "User Req" diff --git a/senderToReceiver.go b/senderToReceiver.go index 7c420e09..abd8bb17 100644 --- a/senderToReceiver.go +++ b/senderToReceiver.go @@ -20,111 +20,111 @@ type SenderToReceiver struct { } // NewSenderToReceiver returns a new SenderToReceiver -func NewSenderToReceiver() SenderToReceiver { - sr := SenderToReceiver{ +func NewSenderToReceiver() *SenderToReceiver { + str := &SenderToReceiver{ tag: TagSenderToReceiver, } - return sr + return str } // Parse takes the input string and parses the SenderToReceiver values // // Parse provides no guarantee about all fields being filled in. Callers should make a Validate() call to confirm // successful parsing and data validity. -func (sr *SenderToReceiver) Parse(record string) { - sr.tag = record[:6] - sr.CoverPayment.SwiftFieldTag = sr.parseStringField(record[6:11]) - sr.CoverPayment.SwiftLineOne = sr.parseStringField(record[11:46]) - sr.CoverPayment.SwiftLineTwo = sr.parseStringField(record[46:81]) - sr.CoverPayment.SwiftLineThree = sr.parseStringField(record[81:116]) - sr.CoverPayment.SwiftLineFour = sr.parseStringField(record[116:151]) - sr.CoverPayment.SwiftLineFive = sr.parseStringField(record[151:186]) - sr.CoverPayment.SwiftLineSix = sr.parseStringField(record[186:221]) +func (str *SenderToReceiver) Parse(record string) { + str.tag = record[:6] + str.CoverPayment.SwiftFieldTag = str.parseStringField(record[6:11]) + str.CoverPayment.SwiftLineOne = str.parseStringField(record[11:46]) + str.CoverPayment.SwiftLineTwo = str.parseStringField(record[46:81]) + str.CoverPayment.SwiftLineThree = str.parseStringField(record[81:116]) + str.CoverPayment.SwiftLineFour = str.parseStringField(record[116:151]) + str.CoverPayment.SwiftLineFive = str.parseStringField(record[151:186]) + str.CoverPayment.SwiftLineSix = str.parseStringField(record[186:221]) } // String writes SenderToReceiver -func (sr *SenderToReceiver) String() string { +func (str *SenderToReceiver) String() string { var buf strings.Builder // ToDo: Separator buf.Grow(221) - buf.WriteString(sr.tag) - buf.WriteString(sr.SwiftFieldTagField()) - buf.WriteString(sr.SwiftLineOneField()) - buf.WriteString(sr.SwiftLineTwoField()) - buf.WriteString(sr.SwiftLineThreeField()) - buf.WriteString(sr.SwiftLineFourField()) - buf.WriteString(sr.SwiftLineFiveField()) - buf.WriteString(sr.SwiftLineSixField()) + buf.WriteString(str.tag) + buf.WriteString(str.SwiftFieldTagField()) + buf.WriteString(str.SwiftLineOneField()) + buf.WriteString(str.SwiftLineTwoField()) + buf.WriteString(str.SwiftLineThreeField()) + buf.WriteString(str.SwiftLineFourField()) + buf.WriteString(str.SwiftLineFiveField()) + buf.WriteString(str.SwiftLineSixField()) return buf.String() } // Validate performs WIRE format rule checks on SenderToReceiver and returns an error if not Validated // The first error encountered is returned and stops that parsing. -func (sr *SenderToReceiver) Validate() error { - if err := sr.fieldInclusion(); err != nil { +func (str *SenderToReceiver) Validate() error { + if err := str.fieldInclusion(); err != nil { return err } - if err := sr.isAlphanumeric(sr.CoverPayment.SwiftFieldTag); err != nil { - return fieldError("SwiftFieldTag", err, sr.CoverPayment.SwiftFieldTag) + if err := str.isAlphanumeric(str.CoverPayment.SwiftFieldTag); err != nil { + return fieldError("SwiftFieldTag", err, str.CoverPayment.SwiftFieldTag) } - if err := sr.isAlphanumeric(sr.CoverPayment.SwiftLineOne); err != nil { - return fieldError("SwiftLineOne", err, sr.CoverPayment.SwiftLineOne) + if err := str.isAlphanumeric(str.CoverPayment.SwiftLineOne); err != nil { + return fieldError("SwiftLineOne", err, str.CoverPayment.SwiftLineOne) } - if err := sr.isAlphanumeric(sr.CoverPayment.SwiftLineTwo); err != nil { - return fieldError("SwiftLineTwo", err, sr.CoverPayment.SwiftLineTwo) + if err := str.isAlphanumeric(str.CoverPayment.SwiftLineTwo); err != nil { + return fieldError("SwiftLineTwo", err, str.CoverPayment.SwiftLineTwo) } - if err := sr.isAlphanumeric(sr.CoverPayment.SwiftLineThree); err != nil { - return fieldError("SwiftLineThree", err, sr.CoverPayment.SwiftLineThree) + if err := str.isAlphanumeric(str.CoverPayment.SwiftLineThree); err != nil { + return fieldError("SwiftLineThree", err, str.CoverPayment.SwiftLineThree) } - if err := sr.isAlphanumeric(sr.CoverPayment.SwiftLineFour); err != nil { - return fieldError("SwiftLineFour", err, sr.CoverPayment.SwiftLineFour) + if err := str.isAlphanumeric(str.CoverPayment.SwiftLineFour); err != nil { + return fieldError("SwiftLineFour", err, str.CoverPayment.SwiftLineFour) } - if err := sr.isAlphanumeric(sr.CoverPayment.SwiftLineFive); err != nil { - return fieldError("SwiftLineFive", err, sr.CoverPayment.SwiftLineFive) + if err := str.isAlphanumeric(str.CoverPayment.SwiftLineFive); err != nil { + return fieldError("SwiftLineFive", err, str.CoverPayment.SwiftLineFive) } - if err := sr.isAlphanumeric(sr.CoverPayment.SwiftLineSix); err != nil { - return fieldError("SwiftLineSix", err, sr.CoverPayment.SwiftLineSix) + if err := str.isAlphanumeric(str.CoverPayment.SwiftLineSix); err != nil { + return fieldError("SwiftLineSix", err, str.CoverPayment.SwiftLineSix) } return nil } // fieldInclusion validate mandatory fields. If fields are // invalid the WIRE will return an error. -func (sr *SenderToReceiver) fieldInclusion() error { +func (str *SenderToReceiver) fieldInclusion() error { return nil } // SwiftFieldTagField gets a string of the SwiftFieldTag field -func (sr *SenderToReceiver) SwiftFieldTagField() string { - return sr.alphaField(sr.CoverPayment.SwiftFieldTag, 5) +func (str *SenderToReceiver) SwiftFieldTagField() string { + return str.alphaField(str.CoverPayment.SwiftFieldTag, 5) } // SwiftLineOneField gets a string of the SwiftLineOne field -func (sr *SenderToReceiver) SwiftLineOneField() string { - return sr.alphaField(sr.CoverPayment.SwiftLineOne, 35) +func (str *SenderToReceiver) SwiftLineOneField() string { + return str.alphaField(str.CoverPayment.SwiftLineOne, 35) } // SwiftLineTwoField gets a string of the SwiftLineTwo field -func (sr *SenderToReceiver) SwiftLineTwoField() string { - return sr.alphaField(sr.CoverPayment.SwiftLineTwo, 35) +func (str *SenderToReceiver) SwiftLineTwoField() string { + return str.alphaField(str.CoverPayment.SwiftLineTwo, 35) } // SwiftLineThreeField gets a string of the SwiftLineThree field -func (sr *SenderToReceiver) SwiftLineThreeField() string { - return sr.alphaField(sr.CoverPayment.SwiftLineThree, 35) +func (str *SenderToReceiver) SwiftLineThreeField() string { + return str.alphaField(str.CoverPayment.SwiftLineThree, 35) } // SwiftLineFourField gets a string of the SwiftLineFour field -func (sr *SenderToReceiver) SwiftLineFourField() string { - return sr.alphaField(sr.CoverPayment.SwiftLineFour, 35) +func (str *SenderToReceiver) SwiftLineFourField() string { + return str.alphaField(str.CoverPayment.SwiftLineFour, 35) } // SwiftLineFiveField gets a string of the SwiftLineFive field -func (sr *SenderToReceiver) SwiftLineFiveField() string { - return sr.alphaField(sr.CoverPayment.SwiftLineFive, 35) +func (str *SenderToReceiver) SwiftLineFiveField() string { + return str.alphaField(str.CoverPayment.SwiftLineFive, 35) } // SwiftLineSixField gets a string of the SwiftLineSix field -func (sr *SenderToReceiver) SwiftLineSixField() string { - return sr.alphaField(sr.CoverPayment.SwiftLineSix, 35) +func (str *SenderToReceiver) SwiftLineSixField() string { + return str.alphaField(str.CoverPayment.SwiftLineSix, 35) } diff --git a/senderToReceiver_test.go b/senderToReceiver_test.go new file mode 100644 index 00000000..ec08c215 --- /dev/null +++ b/senderToReceiver_test.go @@ -0,0 +1,14 @@ +package wire + +// SenderToReceiver creates a SenderToReceiver +func mockSenderToReceiver() *SenderToReceiver { + sr := NewSenderToReceiver() + sr.CoverPayment.SwiftFieldTag = "Swift Field Tag" + sr.CoverPayment.SwiftLineOne = "Swift Line One" + sr.CoverPayment.SwiftLineTwo = "Swift Line Two" + sr.CoverPayment.SwiftLineThree = "Swift Line Three" + sr.CoverPayment.SwiftLineFour = "Swift Line Four" + sr.CoverPayment.SwiftLineFive = "Swift Line Five" + sr.CoverPayment.SwiftLineSix = "Swift Line Six" + return sr +} diff --git a/serviceMessage_test.go b/serviceMessage_test.go index af6f8b77..a438e502 100644 --- a/serviceMessage_test.go +++ b/serviceMessage_test.go @@ -1,6 +1,6 @@ package wire -// mockServiceMessage creates a ServiceMessage +// mockServiceMessage creates a ServiceMessage func mockServiceMessage () *ServiceMessage { sm := NewServiceMessage() sm.LineOne = "Line One" diff --git a/test/testdata/fedWireMessage.txt b/test/testdata/fedWireMessage.txt new file mode 100644 index 00000000..fcf7bfe6 --- /dev/null +++ b/test/testdata/fedWireMessage.txt @@ -0,0 +1,54 @@ +{1500}30User ReqT +{1510}1000 +{1520}20190410Source08000001 +{2000}000001234567 +{3100}121042882Wells Fargo NA +{3400}231380104Citadel +{3600}BTRXYZ +{3320}Sender Reference +{3500}Previous Message Ident +{3610}ANSIPROP CODE +{3700}BUSD0,99 USD2,99 USD3,99 USD1,00 +{3710}USD4567,89 +{3720}1,2345 +{4000}D123456789 FI Name Address One Address Two Address Three +{4100}D123456789 FI Name Address One Address Two Address Three +{4200}31234 Name Address One Address Two Address Three +{4320}Reference +{4400}D123456789 debitDD Name Address One Address Two Address Three +{5000}11234 Name Address One Address Two Address Three +{5010}TXID/123-45-6789 Name LineOne LineTwo LineThree +{5100}D123456789 FI Name Address One Address Two Address Three +{5200}D123456789 FI Name Address One Address Two Address Three +{5400}123456789 +{6000}LineOne LineTwo LineThree LineFour +{6100}Line Six +{6110}LTRLine One Line Two Line Three Line Four Line Five Line Six +{6200}Line Six +{6210}LTRLine One Line Two Line Three Line Four Line Five Line Six +{6300}Line One Line Two Line Three Line Four Line Five Line Six +{6310}TLXLine One Line Two Line Three Line Four Line Five Line Six +{6400}Line One Line Two Line Three Line Four Line Five Line Six +{6410}LTRLine One Line Two Line Three Line Four Line Five Line Six +{6420}CHECKAdditional Information +{6500}Line One Line Two Line Three Line Four Line Five Line Six +{7033}Swift1500,49 +{7050}SwiftSwift Line One Swift Line Two Swift Line Three Swift Line Four Swift Line Five +{7052}SwiftSwift Line One Swift Line Two Swift Line Three Swift Line Four Swift Line Five +{7056}SwiftSwift Line One Swift Line Two Swift Line Three Swift Line Four Swift Line Five +{7057}SwiftSwift Line One Swift Line Two Swift Line Three Swift Line Four Swift Line Five +{7059}SwiftSwift Line One Swift Line Two Swift Line Three Swift Line Four Swift Line Five +{7070}SwiftSwift Line One Swift Line Two Swift Line Three Swift Line Four +{7072}SwiftSwift Line One Swift Line Two Swift Line Three Swift Line Four Swift Line Five Swift Line Six +{8200}0014This is a test +{8250}Remittance Identification EDIChttp://moov.io Name ADDRDepartment Sub-Department 16 19405 AnyTown PA UAAddress Line One Address Line Two Address Line Three Address Line Four Address Line Five Address Line Six Address Line Seven +{8300}OICUSTName 111111 Bank 12072008 AnyTown ADDRDepartment Sub-Department 16 19405 AnyTown PA UAAddress Line One Address Line Two Address Line Three Address Line Four Address Line Five Address Line Six Address Line Seven USContact Name 5551231212 5551231212 5551231212 http://www.moov.io Contact Other +{8350}Name OICUST111111 Bank 03062013 AnyTown ADDRDepartment Sub-Department 16 19405 AnyTown PA UAAddress Line One Address Line Two Address Line Three Address Line Four Address Line Five Address Line Six Address Line Seven US +{8400}AROI 111111 Issuer +{8450}USD1234.56 +{8500}USD1234.56 +{8550}USD1234.56 +{8600}01CRDTUSD1234.56 Adjustment Additional Information +{8650}20190415 +{8750}Remittance Free Text Line One Remittance Free Text Line Two Remittance Free Text Line Three +{9000}Line One Line Two Line Three Line Four Line Five Line Five Line Six Line Seven Line Eight Line Nine Line Ten Line Eleven line Twelve diff --git a/typeSubType_test.go b/typeSubType_test.go index 00b463e2..9c8e942c 100644 --- a/typeSubType_test.go +++ b/typeSubType_test.go @@ -1,6 +1,6 @@ package wire -// mockTypeSubType creates a TypeSubType +// mockTypeSubType creates a TypeSubType func mockTypeSubType() *TypeSubType { tst := NewTypeSubType() tst.tag = TagTypeSubType diff --git a/unstructuredAddenda.go b/unstructuredAddenda.go index 66d2e579..f9104ee1 100644 --- a/unstructuredAddenda.go +++ b/unstructuredAddenda.go @@ -22,8 +22,8 @@ type UnstructuredAddenda struct { } // NewUnstructuredAddenda returns a new UnstructuredAddenda -func NewUnstructuredAddenda() UnstructuredAddenda { - ua := UnstructuredAddenda{ +func NewUnstructuredAddenda() *UnstructuredAddenda { + ua := &UnstructuredAddenda{ tag: TagUnstructuredAddenda, } return ua @@ -36,6 +36,7 @@ func NewUnstructuredAddenda() UnstructuredAddenda { func (ua *UnstructuredAddenda) Parse(record string) { ua.tag = record[:6] ua.AddendaLength = record[6:10] + // ToDo : Only read to length ua.Addenda = record[10:9004] } @@ -43,6 +44,7 @@ func (ua *UnstructuredAddenda) Parse(record string) { func (ua *UnstructuredAddenda) String() string { var buf strings.Builder // ToDo: Separator + //ToDo: Only grow to length buf.Grow(9004) buf.WriteString(ua.tag) buf.WriteString(ua.AddendaLengthField()) diff --git a/unstructuredAddenda_test.go b/unstructuredAddenda_test.go new file mode 100644 index 00000000..ecbd0fd1 --- /dev/null +++ b/unstructuredAddenda_test.go @@ -0,0 +1,9 @@ +package wire + +// UnstructuredAddenda creates a UnstructuredAddenda +func mockUnstructuredAddenda() *UnstructuredAddenda { + ua := NewUnstructuredAddenda() + ua.AddendaLength = "0014" + ua.Addenda = "This is a test" + return ua +} diff --git a/validators.go b/validators.go index d0af38d2..80321a62 100644 --- a/validators.go +++ b/validators.go @@ -9,6 +9,7 @@ package wire import ( "fmt" "regexp" + "strings" "unicode/utf8" "golang.org/x/text/currency" @@ -18,7 +19,7 @@ var ( upperAlphanumericRegex = regexp.MustCompile(`[^ A-Z0-9!"#$%&'()*+,-.\\/:;<>=?@\[\]^_{}|~]+`) alphanumericRegex = regexp.MustCompile(`[^ \w!"#$%&'()*+,-.\\/:;<>=?@\[\]^_{}|~]+`) numericRegex = regexp.MustCompile(`[^0-9]`) - amountRegex = regexp.MustCompile("[^0-9,]") + amountRegex = regexp.MustCompile("[^0-9,.]") ) // validator is common validation and formatting of golang types to WIRE type strings @@ -42,17 +43,14 @@ func (v *validator) isNumeric(s string) error { return nil } +// ToDo; Change to is amount comma? Create Amount Types... + // isAmount checks if a string only contains once comma and ASCII numeric (0-9) characters func (v *validator) isAmount(s string) error { - c := regexp.MustCompile(",") - - matches := c.FindAllStringIndex(s, -1) - if len(matches) != 1 { - return ErrNonAmount - } - - if amountRegex.MatchString(s) { - // [^ 0-9] + str := strings.Trim(s, ",") + str = strings.Trim(s,".") + if amountRegex.MatchString(str) { + // [^ [0-9],.] return ErrNonAmount } return nil @@ -61,7 +59,6 @@ func (v *validator) isAmount(s string) error { // isAmountImplied checks if a string only contains only ASCII numeric (0-9) characters, decimal precision is // implied (2), and no commas func (v *validator) isAmountImplied(s string) error { - if amountRegex.MatchString(s) { // [^ 0-9] return ErrNonAmount @@ -69,6 +66,8 @@ func (v *validator) isAmountImplied(s string) error { return nil } +// ToDo Add 5 decimal precision + // isTypeCode ensures tag {1510} TypeCode is valid func (v *validator) isTypeCode(code string) error { switch code { @@ -250,11 +249,11 @@ func (v *validator) isRemittanceLocationMethod(code string) error { switch code { case RLMElectronicDataExchange, - RLMEmail, - RLMFax, - RLMPostalService, - RLMSMSM, - RLMURI: + RLMEmail, + RLMFax, + RLMPostalService, + RLMSMSM, + RLMURI: return nil } return ErrRemittanceLocationMethod @@ -358,7 +357,6 @@ func (v *validator) isAdjustmentReasonCode(code string) error { return ErrAdjustmentReasonCode } - func (v *validator) isCurrencyCode(code string) error { _, err := currency.ParseISO(code) return err diff --git a/writer_test.go b/writer_test.go index e3547051..fd84ed06 100644 --- a/writer_test.go +++ b/writer_test.go @@ -4,6 +4,7 @@ import ( "bytes" "log" "os" + "path/filepath" "strings" "testing" ) @@ -91,6 +92,56 @@ func TestFedWireMessageWrite(t *testing.T) { fifi := mockFIAdditionalFIToFI() fwm.SetFIAdditionalFIToFI(fifi) + // Cover Payment Information + cia := mockCurrencyInstructedAmount() + fwm.SetCurrencyInstructedAmount(cia) + oc := mockOrderingCustomer() + fwm.SetOrderingCustomer(oc) + oi := mockOrderingInstitution() + fwm.SetOrderingInstitution(oi) + ii := mockIntermediaryInstitution() + fwm.SetIntermediaryInstitution(ii) + iAccount := mockInstitutionAccount() + fwm.SetInstitutionAccount(iAccount) + bc := mockBeneficiaryCustomer() + fwm.SetBeneficiaryCustomer(bc) + ri := mockRemittance() + fwm.SetRemittance(ri) + str := mockSenderToReceiver() + fwm.SetSenderToReceiver(str) + + // Unstructured Addenda + ua := mockUnstructuredAddenda() + fwm.SetUnstructuredAddenda(ua) + + // Related Remittance Information + rr := mockRelatedRemittance() + fwm.SetRelatedRemittance(rr) + + // Structured Remittance Information + ro := mockRemittanceOriginator() + fwm.SetRemittanceOriginator(ro) + rb := mockRemittanceBeneficiary() + fwm.SetRemittanceBeneficiary(rb) + + // Additional Remittance Data + prd := mockPrimaryRemittanceDocument() + fwm.SetPrimaryRemittanceDocument(prd) + aap := mockActualAmountPaid() + fwm.SetActualAmountPaid(aap) + gard := mockGrossAmountRemittanceDocument() + fwm.SetGrossAmountRemittanceDocument(gard) + nd := mockAmountNegotiatedDiscount() + fwm.SetAmountNegotiatedDiscount(nd) + adj := mockAdjustment() + fwm.SetAdjustment(adj) + drd := mockDateRemittanceDocument() + fwm.SetDateRemittanceDocument(drd) + srd := mockPrimaryRemittanceDocument() + fwm.SetPrimaryRemittanceDocument(srd) + rft := mockRemittanceFreeText() + fwm.SetRemittanceFreeText(rft) + // ServiceMessage sm := mockServiceMessage() fwm.SetServiceMessage(sm) @@ -112,19 +163,47 @@ func TestFedWireMessageWrite(t *testing.T) { t.Errorf("%T: %s", err, err) } - // We want to write the file to an io.Writer - w := NewWriter(os.Stdout) - if err := w.Write(file); err != nil { - log.Fatalf("Unexpected error: %s\n", err) - } - w.Flush() + fd, err := os.Create(filepath.Join("", "test/testdata", "fedWireMessage.txt")) + if err != nil { + log.Fatalf("Unexpected error creating output file: %s\n", err) + } + defer func() { + fd.Sync() + fd.Close() + }() + w := NewWriter(fd) + if err := w.Write(file); err != nil { + log.Fatalf("Unexpected error: %s\n", err) + } + + // We want to write the file to an io.Writer + w = NewWriter(os.Stdout) + if err := w.Write(file); err != nil { + log.Fatalf("Unexpected error: %s\n", err) + } + w.Flush() r := NewReader(strings.NewReader(b.String())) - _, err := r.Read() + _, err = r.Read() if err != nil { t.Errorf("%T: %s", err, err) } if err = r.File.Validate(); err != nil { t.Errorf("%T: %s", err, err) } -} \ No newline at end of file +} + +/*// write the file to std out. Anything io.Writer +fd, err := os.Create(filepath.Join("..", "ach-rck-read", "rck-debit.ach")) +if err != nil { +log.Fatalf("Unexpected error creating output file: %s\n", err) +} +defer func() { + fd.Sync() + fd.Close() +}() +w := ach.NewWriter(fd) +if err := w.Write(file); err != nil { +log.Fatalf("Unexpected error: %s\n", err) +} +w.Flush()*/