ACH implements a reader, writer, and validator for Automated Clearing House (ACH) files.

Moov Banner Logo

Project Documentation · API Endpoints · API Guide · Community · Blog

GoDoc Build Status Coverage Status Go Report Card Repo Size Apache 2 License Slack Channel Docker Pulls GitHub Stars Twitter

moov-io/ach

Moov's mission is to give developers an easy way to create and integrate bank processing into their own software products. Our open source projects are each focused on solving a single responsibility in financial services and designed around performance, scalability, and ease of use.

ACH implements a reader, writer, and validator for Automated Clearing House (ACH) files. ACH is the primary method of electronic money movement throughout the United States. The HTTP server is available in a Docker image and the Go package github.com/moov-io/ach is available.

If you're looking for an event driven ACH engine for uploading/downloading files and operations we have built moov-io/achgateway and run it in production. Our article How and When to use the Moov ACH Library will help to generate ACH files for upload to your ODFI.

Table of contents

Project status

Moov ACH is actively used in multiple production environments. Please star the project if you are interested in its progress. The project supports generating and parsing all Standard Entry Class (SEC) codes. If you have layers above ACH to simplify tasks, perform business operations, or found bugs we would appreciate an issue or pull request. Thanks!

Usage

The ACH project implements an HTTP server and Go library for creating and modifying ACH files. There are client libraries available for both Go and Node/JavaScript. We also have an extensive list of examples of the reader and writer applied to various ACH transaction types.

Docker

We publish a public Docker image moov/ach from Docker Hub or use this repository. No configuration is required to serve on :8080 and metrics at :9090/metrics in Prometheus format. We also have Docker images for OpenShift published as quay.io/moov/ach.

Pull & start the Docker image:

docker pull moov/ach:latest
docker run -p 8080:8080 -p 9090:9090 moov/ach:latest

List files stored in-memory:

curl localhost:8080/files
{"files":[],"error":null}

Create a file on the HTTP server:

curl -X POST --data-binary "@./test/testdata/ppd-debit.ach" http://localhost:8080/files/create
","error":null}">
{"id":"
   
    ","error":null}

   

Read the ACH file (in JSON form):

curl http://localhost:8080/files/
   

   
","fileHeader":{"id":"","immediateDestination":"231380104","immediateOrigin":"121042882", ...">
{"file":{"id":"
   
    ","fileHeader":{"id":"","immediateDestination":"231380104","immediateOrigin":"121042882", ...

   

Google Cloud Run button

To get started in a hosted environment you can deploy this project to the Google Cloud Platform.

From your Google Cloud dashboard create a new project and call it:

moov-ach-demo

Click the button below to deploy this project to Google Cloud.

Run on Google Cloud

Note: If you get an error about the image being marked as "Do Not Trust" follow the below steps.

Error: You launched this custom Cloud Shell image as "Do not trust"
$ cloudshell_open --repo_url "https://github.com/moov-io/ach" --page "shell" --git_branch "master"
Error: You launched this custom Cloud Shell image as "Do not trust".
In this mode, your credentials are not available and this experience
cannot deploy to Cloud Run. Start over and "Trust" the image.
Error: aborting due to untrusted cloud shell environment

This error occurs when some security settings on your account / cloud shell are locked down. To run ACH you need to trust the image, so in the top-right click to restart this image as Trusted.

Click to "Return to default"

Then you'll need to clone down and launch ACH. Pick option #3 to clone this project.

cloudshell_open --repo_url "https://github.com/moov-io/ach" --page "shell" --git_branch "master"

Start the ACH server inside the cloned repository.

go run ./cmd/serverr

Connect to the web preview (e.g. https://YOUR-ACH-APP-URL.a.run.app:8080/files)


In the cloud shell you should be prompted with:

Choose a project to deploy this application:

Using the arrow keys select:

moov-ach-demo

You'll then be prompted to choose a region, use the arrow keys to select the region closest to you and hit enter.

Choose a region to deploy this application:

Upon a successful build you will be given a URL where the API has been deployed:

https://YOUR-ACH-APP-URL.a.run.app

From the cloud shell you need to cd into the ach folder:

cd ach

Now you can list files stored in-memory:

curl https://YOUR-ACH-APP-URL.a.run.app/files

You should get this response:

{"files":[],"error":null}

Create a file on the server:

curl -X POST --data-binary "@./test/testdata/ppd-debit.ach" https://YOUR-ACH-APP-URL.a.run.app/files/create

You should get this response:

","error":null}">
{"id":"
   
    ","error":null}

   

Finally, read the contents of the file you've just posted:

curl https://YOUR-ACH-APP-URL.a.run.app/files/
   

   

You should get this response:

","fileHeader":{"id":"...","immediateDestination":"231380104","immediateOrigin":"121042882", ...">
{"file":{"id":"
   
    ","fileHeader":{"id":"...","immediateDestination":"231380104","immediateOrigin":"121042882", ...

   

HTTP API

The package github.com/moov-io/ach/server offers an HTTP and JSON API for creating and editing files. If you're using Go the ach.File type can be used, otherwise you can send properly formatted JSON. We have an example JSON file, but each SEC type will generate different JSON.

Examples: Go | Ruby

Configuration settings

Environmental Variable Description Default
ACH_FILE_TTL Time to live (TTL) for *ach.File objects stored in the in-memory repository. 0 = No TTL / Never delete files (Example: 240m)
LOG_FORMAT Format for logging lines to be written as. Options: json, plain - Default: plain
HTTP_BIND_ADDRESS Address for ACH to bind its HTTP server on. This overrides the command-line flag -http.addr. Default: :8080
HTTP_ADMIN_BIND_ADDRESS Address for ACH to bind its admin HTTP server on. This overrides the command-line flag -admin.addr. Default: :9090
HTTPS_CERT_FILE Filepath containing a certificate (or intermediate chain) to be served by the HTTP server. Requires all traffic be over secure HTTP. Empty
HTTPS_KEY_FILE Filepath of a private key matching the leaf certificate from HTTPS_CERT_FILE. Empty

Data persistence

By design ACH does not persist (save) any data about the files, batches, or entry details created. The only storage occurs in memory of the process and upon restart ACH will have no files, batches, or data saved. Also, no in memory encryption of the data is performed.

Go library

This project uses Go Modules and Go v1.14 or higher. See Golang's install instructions for help in setting up Go. You can download the source code and we offer tagged and released versions as well. We highly recommend you use a tagged release for production.

# Pull down into the Go Module cache
$ go get -u github.com/moov-io/ach

# Show the documentation for the BatchHeader package
$ go doc github.com/moov-io/ach BatchHeader

The package github.com/moov-io/ach offers a Go-based ACH file reader and writer. To get started, check out a specific example:

Supported Standard Entry Class (SEC) codes
SEC Code Description Example Read Write
ACK Acknowledgment Entry for CCD Credit ACK Read ACK Write
ADV Automated Accounting Advice Prenote Debit ADV Read ADV Write
ARC Accounts Receivable Entry Debit ARC Read ARC Write
ATX Acknowledgment Entry for CTX Credit ATX Read ATX Write
BOC Back Office Conversion Debit BOC Read BOC Write
CCD Corporate credit or debit Debit CCD Read CCD Write
CIE Customer-Initiated Entry Credit CIE Read CIE Write
COR Automated Notification of Change(NOC) NOC COR Read COR Write
CTX Corporate Trade Exchange Debit CTX Read CTX Write
DNE Death Notification Entry DNE DNE Read DNE Write
ENR Automatic Enrollment Entry ENR ENR Read ENR Write
IAT International ACH Transactions Credit IAT Read IAT Write
MTE Machine Transfer Entry Credit MTE Read MTE Write
POP Point of Purchase Debit POP Read POP Write
POS Point of Sale Debit POS Read POS Write
PPD Prearranged payment and deposits Debit Credit PPD Read PPD Write
RCK Represented Check Entries Debit RCK Read RCK Write
SHR Shared Network Entry Debit SHR Read SHR Write
TEL Telephone-Initiated Entry Debit TEL Read TEL Write
TRC Truncated Check Entry Debit TRC Read TRC Write
TRX Check Truncation Entries Exchange Debit TRX Read TRX Write
WEB Internet-initiated Entries Credit WEB Read WEB Write
XCK Destroyed Check Entry Debit XCK Read XCK Write
Segment Files
SEC Code Name Example Read Write
IAT International ACH Transactions Credit IAT Read IAT Write
PPD Prearranged payment and deposits Debit Credit PPD Read PPD Write

Command line

On each release there's an achcli utility released. This tool can display ACH files in a human-readable format which is easier to read than their plaintext format. It also allows masking DFIAccountNumber values with the -mask flag.

$ wget -O ./achcli https://github.com/moov-io/ach/releases/download/v1.6.3/achcli-darwin-amd64 && chmod +x ./achcli

$ achcli test/testdata/ppd-debit.ach
Describing ACH file 'test/testdata/ppd-debit.ach'

  Origin     OriginName    Destination  DestinationName       FileCreationDate  FileCreationTime
  121042882  My Bank Name  231380104    Federal Reserve Bank  190624            0000

  BatchNumber  SECCode  ServiceClassCode  CompanyName      DiscretionaryData  Identification  EntryDescription  DescriptiveDate
  1            PPD      225 (Debits Only)  Name on Account                     121042882       REG.SALARY

    TransactionCode   RDFIIdentification  AccountNumber      Amount     Name                    TraceNumber      Category
    27 (Checking Debit)  23138010            12345678           100000000  Receiver Account Name   121042880000001

  ServiceClassCode  EntryAddendaCount  EntryHash  TotalDebits  TotalCredits  MACCode  ODFIIdentification  BatchNumber
  225 (Debits Only)  1                  23138010   100000000    0                      12104288            1

  BatchCount  BlockCount  EntryAddendaCount  TotalDebitAmount  TotalCreditAmount
  1           1           1                  100000000         0

In-browser ACH file parser

Using our in-browser utility, you can instantly convert ACH files into JSON. Either paste in ACH file content directly or choose a file from your local machine. This tool is particularly useful if you're handling sensitive PII or want perform some quick tests, as operations are fully client-side with nothing stored in memory.

SDKs

Below are some SDKs generated from the API documentation:

Learn about ACH

FAQ

Is there an in-browser tool for converting ACH files into JSON? Yes! You can find our browser utility at http://oss.moov.io/ach/.
Is my data being saved somewhere? No, we do not save any data related to files, batch, or entry details. All processing is done in-memory.
What ACH transaction types are supported? We support generating and parsing all Standard Entry Class (SEC) codes.
Where can I find the official Nacha Operating Rules? You can purchase the most recent Nacha Operating Rules and Guidelines resource directly from their webstore. Additionally, Nacha has published a free ACH guide for developers.

Getting help

If you have ACH-specific questions, NACHA (National Automated Clearing House Association) has their complete specification for all file formats and message types.

channel info
Project Documentation Our project documentation available online.
Twitter @moov You can follow Moov.io's Twitter feed to get updates on our project(s). You can also tweet us questions or just share blogs or stories.
GitHub Issue If you are able to reproduce a problem please open a GitHub Issue under the specific project that caused the error.
moov-io slack Join our slack channel to have an interactive discussion about the development of the project.

Supported and tested platforms

  • 64-bit Linux (Ubuntu, Debian), macOS, and Windows
  • Raspberry Pi

Note: 32-bit platforms have known issues and are not supported.

Contributing

Yes please! Please review our Contributing guide and Code of Conduct to get started! Check out our issues for first time contributors for something to help out with.

This project uses Go Modules and uses Go v1.14 or higher. See Golang's install instructions for help setting up Go. You can download the source code and we offer tagged and released versions as well. We highly recommend you use a tagged release for production.

Releasing

To make a release of ach simply open a pull request with CHANGELOG.md and version.go updated with the next version number and details. You'll also need to push the tag (i.e. git push origin v1.0.0) to origin in order for CI to make the release.

Testing

We maintain a comprehensive suite of unit tests and recommend table-driven testing when a particular function warrants several very similar test cases. To run all test files in the current directory, use go test. Current overall coverage can be found on Codecov.

Fuzzing

We currently run fuzzing over ACH in the form of a moov/achfuzz Docker image. You can read more or run the image and report crasher examples to [email protected]. Thanks!

Related projects

As part of Moov's initiative to offer open source fintech infrastructure, we have a large collection of active projects you may find useful:

  • Moov Watchman offers search functions over numerous trade sanction lists from the United States and European Union.

  • Moov Fed implements utility services for searching the United States Federal Reserve System such as ABA routing numbers, financial institution name lookup, and FedACH and Fedwire routing information.

  • Moov Wire implements an interface to write files for the Fedwire Funds Service, a real-time gross settlement funds transfer system operated by the United States Federal Reserve Banks.

  • Moov Image Cash Letter implements Image Cash Letter (ICL) files used for Check21, X.9 or check truncation files for exchange and remote deposit in the U.S.

  • Moov Metro 2 provides a way to easily read, create, and validate Metro 2 format, which is used for consumer credit history reporting by the United States credit bureaus.

License

Apache License 2.0 - See LICENSE for details.

Owner
moov
At the core of #fintech. Moov creates open source infrastructure for financial technology. #OSS
moov
Comments
  • batch: add WithOffset to support balanced offset records

    batch: add WithOffset to support balanced offset records

    Balanced offset records sum a File's Debits or Credits to zero in a single EntryDetail within a Batch. These are used to offset transactions within an ODFI.

    Issue: https://github.com/moov-io/ach/issues/531

  • Change TraceNumber and OriginalTrace to strings to prevent errors

    Change TraceNumber and OriginalTrace to strings to prevent errors

    (The original issue was https://github.com/moov-io/ach/issues/236.)

    TraceNumber (and likely other fields) have known edge cases and bugs.

    We should change this type to be a string (perhaps a TraceNumber type) to prevent both bugs. This is a breaking change however, so we should release it sooner rather than later.

    We should also scan the other fields (int types) for similar problems.

  • Strategy for Adding Support for More Batch Types

    Strategy for Adding Support for More Batch Types

    I would like to help out adding more batch types, but based on the way the library is currently written I am not sure how you were planning on adding support for batch types other than PPD.

    Can you point me in the right direction?

  • Documentation: Curl / Postman examples for building files

    Documentation: Curl / Postman examples for building files

    Moov ACH exposes a RESTful endpoint to create ach files. We should supply a curl or postman based example of interacting with the API for file creation.

  • Adds human-readable ACH parsing to the webui

    Adds human-readable ACH parsing to the webui

    Ports the human-readable formatting from the command line achcli to the webui.

    Note: It might be worth changing the input and output textareas to vertical rather than horizontal to accommodate the wrapping that can happen with the human-readable content.

    cc @adamdecaf

  • Return batch with offset throws validation error

    Return batch with offset throws validation error

    ACH Version: v1.15.0

    What were you trying to do? Add an offset to a return batch. This was done by calling

    batch.WithOffset(&ach.Offset{
    	RoutingNumber: "DUMMY",
    	AccountNumber: "DUMMY",
    	AccountType: "checking",
    	Description: "S",
    })
    batch.Create()
    

    What did you expect to see? Successful creation

    What did you see? Error:

    batch #1 (WEB) Addenda99 is a mandatory field and has a default value
    

    While debugging and stepping through the code, we see that the error is being thrown by the OFFSET entry that gets added during the build step.

    The offset entry is created internally as a last step in the build method that is called by batch.Create() and is given the same category as the first entry in the batch, which in this case is CategoryReturn. However, since it's an OFFSET record, it doesn't get an Addenda99 record.

    When Validate() gets called on the batch, it loops through all the entries (including the OFFSET record) and errors out on the addendaFieldInclusionReturn when validating the OFFSET record.

    How can we reproduce the problem? Very simple example with dummy data.

    package main
    
    import (
    	"fmt"
    	"time"
    
    	"github.com/moov-io/ach"
    )
    
    func main() {
    	// Batch Header
    	batchHeader := ach.NewBatchHeader()
    	batchHeader.ServiceClassCode = 200
    	batchHeader.CompanyName = "COMPANY"
    	batchHeader.CompanyIdentification = "IDENTIFICATION"
    	batchHeader.StandardEntryClassCode = ach.WEB
    	batchHeader.CompanyEntryDescription = "DESCRIPTION"
    	batchHeader.CompanyDescriptiveDate = time.Now().Format("060102")
    	batchHeader.EffectiveEntryDate = time.Now().Add(time.Hour * 24).Format("060102")
    	batchHeader.ODFIIdentification = "1"
    
    	// Addenda99
    	addenda99 := ach.NewAddenda99()
    	addenda99.ReturnCode = "R07"
    	addenda99.OriginalTrace = "99912340000015"
    	addenda99.AddendaInformation = "Authorization Revoked"
    	addenda99.OriginalDFI = "9101298"
    
    	// Entry
    	entry := ach.NewEntryDetail()
    	entry.TransactionCode = 22
    	entry.RDFIIdentification = "1"
    	entry.CheckDigit = "3"
    	entry.DFIAccountNumber = "DUMMY"
    	entry.Amount = 1000
    	entry.IndividualName = "DOE, JOHN"
    	entry.Category = ach.CategoryReturn
    	entry.Addenda99 = addenda99
    	entry.AddendaRecordIndicator = 1
    
    	// Batches
    	batch1 := ach.NewBatchWEB(batchHeader)
    	batch1.AddEntry(entry)
    
    	// Prints nil
    	fmt.Printf("batch1 error: %v\n", batch1.Create())
    
    	batch2 := ach.NewBatchWEB(batchHeader)
    	batch2.AddEntry(entry)
    	batch2.WithOffset(&ach.Offset{
    		RoutingNumber: "100000007",
    		AccountNumber: "DUMMY",
    		AccountType:   "checking",
    		Description:   "S",
    	})
    
    	// Prints error
    	fmt.Printf("batch2 error: %v\n", batch2.Create())
    }
    

    Go playground link: https://go.dev/play/p/EwWCywnMq_1

  • Creating file doesn't limit to 10,000 lines

    Creating file doesn't limit to 10,000 lines

    NACHA files are limited to 10,000 lines. But when creating file with localhost:8080/files/create , then result that view with localhost:8080/files/{fileID}/contents can be longer than 10,000 lines.

  • proposal:  cmd/ach: command line tool

    proposal: cmd/ach: command line tool

    moovach

    Converts a stream of ACH input data (TXT, JSON, CSV) to a designated output format.

    Build Status

    Installation

    pre-built binaries are available under releases.

    If you have a working golang install, you can use go get.

    go get github.com/moov-io/ach/cmd/ach
    

    Usage

    usage: moovach
        -i /path/to/input.json (optional; default is stdin)
        -o /path/to/output.csv (optional; default is stdout)
        // -b build a valid ach file from the input stream // TODO: see comments below
        -f [TXT,JSON,CSV] defines format of input and output
        --version
        -h This help
    

    To convert:

    {"files":[{"id":"fmucllmgqkaxcjowdoko","fileHeader":{"id":"fmucllmgqkaxcjowdoko","immediateDestination":"231380104","immediateOrigin":"121042882","fileCreationDate":"2018-10-08T00:00:00Z","fileCreationTime":"2018-10-08T00:00:00Z","fileIDModifier":"A","immediateDestinationName":"Federal Reserve Bank","immediateOriginName":"My Bank Name"},"batches":[{"batchHeader":{"id":"fmucllmgqkaxcjowdoko","serviceClassCode":200,"companyName":"Your Company, Inc","companyIdentification":"121042882","standardEntryClassCode":"PPD","companyEntryDescription":"Online Order","effectiveEntryDate":"2018-10-09T00:00:00Z","ODFIIdentification":"12104288","batchNumber":1},"entryDetails":[{"id":"fmucllmgqkaxcjowdoko","transactionCode":22,"RDFIIdentification":"23138010","checkDigit":"4","DFIAccountNumber":"81967038518      ","amount":100000,"identificationNumber":"#83738AB#      ","individualName":"Steven Tander         ","discretionaryData":"  ","addendaRecordIndicator":1,"traceNumber":121042880000001,"category":"Forward"}],"batchControl":{"id":"fmucllmgqkaxcjowdoko","serviceClassCode":200,"entryAddendaÇount":0,"entryHash":0,"totalDebit":0,"totalCredit":0,"companyIdentification":"121042882","ODFIIdentification":"12104288","batchNumber":1}}],"IATBatches":null,"fileControl":{"id":"","batchCount":1,"blockCount":1,"entryAddendaCount":0,"entryHash":0,"totalDebit":0,"totalCredit":0},"NotificationOfChange":null,"ReturnEntries":null}],"error":null}
    
    

    to:

    101 231380104 1210428821810080000A094101Federal Reserve Bank   My Bank Name                   
    200Your Company, In                    121042882 PPDOnline Ord      181009   0121042880000001
    2223138010481967038518      0000100000#83738AB#      Steven Tander           1121042880000001
    2000000000000000000000000000000000000000000121042882                          121042880000001
    9000001000001000000000000000000000000000000000000000000                                       
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
    

    you would either

    ach  -i achfile.json -o achfile.txt
    

    or

    cat achfile.json | ach -f TXT > achfile.txt
    
  • Create GitHub Pages documentation site with Jekyll

    Create GitHub Pages documentation site with Jekyll

    These changes overhaul the current Github Pages ACH documentation site by applying a customized Jekyll theme and reorganizing existing documentation. The theme is located at https://github.com/nlakritz/bulma-clean-theme.

    Project settings under GitHub Pages need to be set to master and the docs folder to publish the site successfully at https://moov-io.github.io/ach/. Additionally, we’ll need to update the url in _config.yml from https://nlakritz.github.io to https://moov-io.github.io before merging. The site is currently live at https://nlakritz.github.io/ach.

    Improvements to consider for the future:

    • Embed API documentation
    • Embed ACH demo
    • Link to community site when it’s up
  • Same Day ACH

    Same Day ACH

    I wanted to see a same-day ACH file creation example and documentation. I also want to ensure that our library supports same-day ACH.

    The use case example and file format is identified in this update from NACHA

    Same Day ACH: FAQ

  • handle ISO8601 for time.Time JSON values

    handle ISO8601 for time.Time JSON values

    Our API docs currently state (as part of POST /files/create's response):

    {
      "fileCreationDate": "102318",
      "fileCreationTime": "1601"
    }
    

    Source: https://api.moov.io/#operation/addFile

    However, this format might be annoying for folks. Should we support RFC 3339 and YYMMDD / HHMM?

    Our api returns RFC 3339 now, which is Go's default).

    $ curl -s -H "cookie: moov_auth=..." https://api.moov.io/v1/ach/files/docrlxnuinuoouhilfws | jq '.file.fileHeader' | grep fileCreation
      "fileCreationDate": "2018-10-08T00:00:00Z",
      "fileCreationTime": "2018-10-08T00:00:00Z", 
    

    Examples:

    • https://github.com/moov-io/ach/blob/master/fileHeader.go#L48
    • https://github.com/moov-io/ach/blob/master/addenda99.go#L151
    • https://github.com/moov-io/ach/blob/master/iatBatchHeader.go#L128
  • fix(deps): update all

    fix(deps): update all

    Mend Renovate

    This PR contains the following updates:

    | Package | Type | Update | Change | |---|---|---|---| | github.com/aws/aws-lambda-go | require | patch | v1.36.0 -> v1.36.1 | | github.com/mattn/go-isatty | require | patch | v0.0.16 -> v0.0.17 |


    Release Notes

    aws/aws-lambda-go

    v1.36.1

    Compare Source

    What's Changed

    Full Changelog: https://github.com/aws/aws-lambda-go/compare/v1.36.0...v1.36.1

    mattn/go-isatty

    v0.0.17

    Compare Source


    Configuration

    📅 Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

    🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

    Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

    👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.


    • [ ] If you want to rebase/retry this PR, check this box

    This PR has been generated by Mend Renovate. View repository job log here.

  • Achcli Custom Validation

    Achcli Custom Validation

    ValidateOpts has a lot of options To add all of the options using cli flags is uncomfortable, because cli has a lot of flags

    Added one flag that specify validation opts config file

    #achcli --help
    
    achcli is a tool for displaying Nacha formatted ACH files in a human readable format.
    
    USAGE
       achcli [-mask] [-pretty] path/to/file.ach
    
    EXAMPLES
      achcli -diff first.ach second.ach    Show the difference between two ACH files
      achcli -mask file.ach                Print file details with personally identifiable information partially removed
      achcli -reformat=json first.ach      Convert an incoming ACH file into another format (options: ach, json)        
      achcli -version                      Print the version of achcli (Example: v1.26.4)
      achcli 20060102.ach                  Summarize an ACH file for human readability
    
    FLAGS
      -diff
            Compare two files against each other
    
      -flatten
            Flatten batches in each file
    
      -mask
            Mask/hide full account numbers and individual names
      -mask.accounts
            Mask/hide full account numbers
      -mask.corrections
            Mask/Hide Corrected Data in Addenda98 records      
      -mask.names
            Mask/hide full individual names
    
      -merge
            Merge files before describing
    
      -pretty
            Display all values in their human readable format  
      -pretty.amounts
            Display human readable amounts instead of exact values
    
      -reformat string
            Reformat an incoming ACH file to another format
    
      -v    Print verbose details about each ACH file
    
      -validate string
            Path to config file in json format to enable validation opts
      -validate.allowInvalidCheckDigit
            Allow the CheckDigit field in EntryDetail to differ from the expected calculation
      -validate.allowMissingFileControl
            Allow a file to be read without a FileControl record
      -validate.allowMissingFileHeader
            Allow a file to be read without a FileHeader record
      -validate.allowUnorderedBatchNumbers
            Allow a file to be read with unordered batch numbers
      -validate.allowZeroBatches
            Allow the file to have zero batches
      -validate.bypassCompanyIdentificationMatch
            Allow batches in which the Company Identification field in the batch header and control do not match
      -validate.bypassDestinationValidation
            Skip validation for the ImmediateDestination file header field
      -validate.bypassOriginValidation
            Skip validation for the ImmediateOrigin file header field
      -validate.customReturnCodes
            Skip validation for the Return Code field in an Addenda99
      -validate.customTraceNumbers
            Disable Nacha specified checks of TraceNumbers
      -validate.requireABAOrigin
            Enable routing number validation over the ImmediateOrigin file header field
      -validate.unequalAddendaCounts
            Skip checking that Addenda Count fields match their expected and computed values
      -validate.unequalServiceClassCode
            Skip equality checks for the ServiceClassCode in each pair of BatchHeader
    
      -version
            Print moov-io/ach cli version
    
    

    if use invalid config file, display example config file

    #achcli -validate=unknown sample.ach
    
    Specify validation config file in json foramt to enable valiation opts.
    
    EXAMPLE:
    {
      "requireABAOrigin": false,
      "bypassOriginValidation": false,
      "bypassDestinationValidation": false,
      "customTraceNumbers": false,
      "allowZeroBatches": false,
      "allowMissingFileHeader": false,
      "allowMissingFileControl": false,
      "bypassCompanyIdentificationMatch": false,
      "customReturnCodes": false,
      "unequalServiceClassCode": false,
      "allowUnorderedBatchNumbers": false,
      "allowInvalidCheckDigit": false,
      "unequalAddendaCounts": false
    }
    
  • feat: Validate fields according to Optional, Required, Mandatory

    feat: Validate fields according to Optional, Required, Mandatory

    With error flags / wrapping we should validate fields according to these requirements instead of what we currently have. Often we have to relax validations (see #1150 as an example) when our validations aren't aware of Required fields.

  • feat: Parse file without running any validations

    feat: Parse file without running any validations

    ACH Version

    v1.26.1

    What were you trying to do?

    I would like to be able to parse an ACH file without running any validations on the records. Often files are so badly formatted that working through validation errors causes a lot of overhead.

    What did you expect to see?

    A ValidateOpts option to disable all validations.

  • ACH file stream

    ACH file stream

    ACH Version

    1.18

    What were you trying to do?

    I am trying to adapt the reader implementation to allow for a streamed approach that could keep from having a whole file in memory at once. The use case is that in large-volume applications with a service-based architecture reading a whole file into memory at once may not be possible. This would make some validations impossible of course and that is a trade-off consumers would need to make.

    What did you expect to see?

    // new signature proposed
    func (r *Reader) Stream(ctx context.Context) (chan interface{}, <-chan error) { ... }
    // Usage sample:
    
    achReader := moov_ach.NewReader(reader)
    
    opts := &moov_ach.ValidateOpts{
    	// ...
    }
    achReader.SetValidation(opts)
    
    fileRecords, errs := Stream(ctx)
    
    var moreRecord, moreErr bool = true, true
    var record interface{}
    var err error
    select {
    case record, moreRecord = <-fileRecords:
    	if header, ok := record.(moov_ach.FileHeader); ok {
    		// handle header
    	} else if batchHeader, ok := record.(moov_ach.BatchHeader); ok {
    		// handle batch header
    	} else if entry, ok := record.(moov_ach.EntryDetail); ok {
    		// handle entry record
    	} else if record, ok := record.(moov_ach.RecordType); ok {
    		// handle other records
    	}
    case err, moreErr = <-errs:
    	// process err
    case <-ctx.Done():
    	return ctx.Err()
    }
    
A cli HackerNews reader, using HackerNews API.

HackerReader STILL WIP A cli HackerNews reader, using the HackerNews API. I mainly created this as a way to play around with Bubble Tea, Lip Gloss, an

Feb 13, 2022
Hntoebook - Converts the best HN stories to .mobi format to be read using an e-reader
Hntoebook - Converts the best HN stories to .mobi format to be read using an e-reader

HN to E-Book What? This program converts the best HN stories to .mobi format to

Jan 2, 2023
The Bhojpur Ara is a software product used for automated resource assembly within Bhojpur.NET Platform ecosystem to enable delivery of applications and services.

Bhojpur Ara - Automated Resource Assembly The Bhojpur Ara is a service product used for automated resource assembly within the Bhojpur.NET Platform ec

Apr 28, 2022
Automated social media post sharing

- SOBOT - Automated Social Media Sharing Tool Social media post sharing tool Features The application has a stable beta version. Errors that will occu

Nov 8, 2022
Need an overpowered, automated spammer CLI to impress / unimpress your friends? This is it!
Need an overpowered, automated spammer CLI to impress / unimpress your friends? This is it!

spammer Need an overpowered, automated spammer CLI to impress / unimpress your friends? This is it! Install git clone https://github.com/quackduck/spa

Aug 10, 2022
GoStorm is a Go library that implements the communications protocol required to write Storm spouts and Bolts in Go that communicate with the Storm shells.

gostorm godocs GoStorm is a Go library that implements the communications protocol required for non-Java languages to communicate as part of a storm t

Sep 27, 2022
This project implements a Go client library for the Hipchat API.

Hipchat This project implements a Go client library for the Hipchat API (API version 2 is not supported). Pull requests are welcome as the API is limi

Jan 3, 2023
Package rhymen/go-whatsapp implements the WhatsApp Web API to provide a clean interface for developers

go-whatsapp Package rhymen/go-whatsapp implements the WhatsApp Web API to provide a clean interface for developers. Big thanks to all contributors of

Mar 19, 2022
Godaddy - This package implements the libdns interfaces for the Godaddy API

Godaddy for libdns This package implements the libdns interfaces for the Godaddy

Nov 8, 2022
This library implements the pub/sub pattern in a generic way. It uses Go's generic types to declare the type of the event.

observer This library implements the pub/sub pattern in a generic way. It uses Go's generic types to declare the type of the event. Usage go get githu

Nov 16, 2022
A API scanner written in GOLANG to scan files recursively and look for API keys and IDs.

GO FIND APIS _____ ____ ______ _____ _ _ _____ _____ _____ _____ / ____|/ __ \ | ____|_ _| \ | | __ \ /\ | __ \_

Oct 25, 2021
starenv allows populating environmental variables from variety of sources, such as AWS Parameter Store, GPG encrypted files and more, with extreme ease.

starenv (*env) allows populating environmental variables from variety of sources, such as AWS Parameter Store, GPG encrypted files and more, with extr

Nov 25, 2022
A web server that sits beside jupyterhub and scrapes answers out of notebook files.

A Prototype grader tool that runs with jupyterhub that essentially parses jupyter notebooks and responds with a set of form fields automatically fille

Feb 22, 2022
Convert IBM stanza-style files to json and publish as an API

stanza_to_json Convert IBM stanza-style files to json and publish as an API Background IBM Stanza files have been extended to be used in other ways, b

Feb 2, 2022
Ztgrep - Recursively search through compressed tarballs and files

ztgrep Search for file names and contents through nested archives. Useful for fi

Jun 7, 2022
actionlint is a static checker for GitHub Actions workflow files.

actionlint actionlint is a static checker for GitHub Actions workflow files. Features: Syntax check for workflow files to check unexpected or missing

Dec 27, 2022
Simple program that uploads large files to Amazon S3 over slow connections.

shrimp is a small program that can reliably upload large files to Amazon S3. My personal use case is to upload large files to S3 over a slow residenti

Nov 30, 2022
A tool to decrypt files by AWS KMS

KMS-Decrypter Decrypt all files in folder then output to destination folder by AWS KMS. Usage Usage of ./.out/decrypter: -f string path to e

Sep 20, 2022
⚡ Cloud disk to transfer files ⚡

LeiliNetdisk V1.0 云存储”系统原型(实现一个超精简版云盘) 环境配置 ➜ ~ multipass launch -n main -c 1 -m 4G -d 20G Launched: main ➜ ~ multipass shell main ubuntu@main:~$

Jan 4, 2022