github.com/moov-io/imagecashletter@v0.10.1/cmd/writeImageCashLetter/main.go (about)

     1  package main
     2  
     3  import (
     4  	"encoding/json"
     5  	"flag"
     6  	"fmt"
     7  	"log"
     8  	"os"
     9  	"path/filepath"
    10  	"runtime/pprof"
    11  	"strconv"
    12  	"time"
    13  
    14  	"github.com/moov-io/imagecashletter"
    15  )
    16  
    17  var (
    18  	fPath      = flag.String("fPath", "", "File Path")
    19  	cpuprofile = flag.String("cpuprofile", "", "write cpu profile to file")
    20  
    21  	// output formats
    22  	flagJson = flag.Bool("json", false, "Output file in json")
    23  )
    24  
    25  // main creates an ICL File with 2 CashLetters
    26  // Each CashLetter contains 2 Bundles, with 100 CheckDetails
    27  func main() {
    28  	flag.Parse()
    29  
    30  	filename := time.Now().UTC().Format("200601021504")
    31  	if *flagJson {
    32  		filename += ".json"
    33  	} else {
    34  		filename += ".icl"
    35  	}
    36  
    37  	path := filepath.Join(*fPath, filename)
    38  	write(path)
    39  }
    40  
    41  func write(path string) {
    42  	if *cpuprofile != "" {
    43  		f, err := os.Create(*cpuprofile)
    44  		if err != nil {
    45  			log.Fatal(err)
    46  		}
    47  		pprof.StartCPUProfile(f)
    48  		defer pprof.StopCPUProfile()
    49  	}
    50  
    51  	f, err := os.Create(path)
    52  	if err != nil {
    53  		fmt.Printf("%T: %s", err, err)
    54  	}
    55  
    56  	// To create a file
    57  	fh := imagecashletter.NewFileHeader()
    58  	fh.StandardLevel = "35"
    59  	fh.TestFileIndicator = "T"
    60  	fh.ImmediateDestination = "231380104"
    61  	fh.ImmediateOrigin = "121042882"
    62  	fh.FileCreationDate = time.Now()
    63  	fh.FileCreationTime = time.Now()
    64  	fh.ResendIndicator = "N"
    65  	fh.ImmediateDestinationName = "Citadel"
    66  	fh.ImmediateOriginName = "Wells Fargo"
    67  	fh.FileIDModifier = ""
    68  	fh.CountryCode = "US"
    69  	fh.UserField = ""
    70  	fh.CompanionDocumentIndicator = ""
    71  
    72  	file := imagecashletter.NewFile()
    73  	file.SetHeader(fh)
    74  
    75  	// Create 4 CashLetters
    76  	for i := 0; i < 4; i++ {
    77  
    78  		count := strconv.Itoa(i + 1)
    79  		// cashLetterHeader
    80  		clh := imagecashletter.NewCashLetterHeader()
    81  		clh.CollectionTypeIndicator = "01"
    82  		clh.DestinationRoutingNumber = "231380104"
    83  		clh.ECEInstitutionRoutingNumber = "121042882"
    84  		clh.CashLetterBusinessDate = time.Now()
    85  		clh.CashLetterCreationDate = time.Now()
    86  		clh.CashLetterCreationTime = time.Now()
    87  		clh.RecordTypeIndicator = "I"
    88  		clh.DocumentationTypeIndicator = "G"
    89  		clh.CashLetterID = "A" + count
    90  		clh.OriginatorContactName = "Contact Name"
    91  		clh.OriginatorContactPhoneNumber = "5558675552"
    92  		clh.FedWorkType = ""
    93  		clh.ReturnsIndicator = ""
    94  		clh.UserField = ""
    95  		cl := imagecashletter.NewCashLetter(clh)
    96  
    97  		for y := 0; y < 2; y++ {
    98  			{
    99  				// Create Bundle
   100  				bcount := strconv.Itoa(i + y)
   101  				bh := imagecashletter.NewBundleHeader()
   102  				bh.CollectionTypeIndicator = "01"
   103  				bh.DestinationRoutingNumber = "231380104"
   104  				bh.ECEInstitutionRoutingNumber = "121042882"
   105  				bh.BundleBusinessDate = time.Now()
   106  				bh.BundleCreationDate = time.Now()
   107  				bh.BundleID = "B" + bcount
   108  				bh.BundleSequenceNumber = bcount
   109  				bh.CycleNumber = "01"
   110  				bh.UserField = ""
   111  				bundle := imagecashletter.NewBundle(bh)
   112  
   113  				for z := 0; z < 100; z++ {
   114  					cdCount := strconv.Itoa(z + 1)
   115  
   116  					// Create Check Detail
   117  					cd := imagecashletter.NewCheckDetail()
   118  					cd.AuxiliaryOnUs = "123456789"
   119  					cd.ExternalProcessingCode = ""
   120  					cd.PayorBankRoutingNumber = "03130001"
   121  					cd.PayorBankCheckDigit = "2"
   122  					cd.OnUs = "5558881"
   123  					cd.ItemAmount = 100000 // 1000.00
   124  					cd.EceInstitutionItemSequenceNumber = cdCount
   125  					cd.DocumentationTypeIndicator = "G"
   126  					cd.ReturnAcceptanceIndicator = "D"
   127  					cd.MICRValidIndicator = 1
   128  					cd.BOFDIndicator = "Y"
   129  					cd.AddendumCount = 3
   130  					cd.CorrectionIndicator = 0
   131  					cd.ArchiveTypeIndicator = "B"
   132  
   133  					cdAddendumA := imagecashletter.NewCheckDetailAddendumA()
   134  					cdAddendumA.RecordNumber = 1
   135  					cdAddendumA.ReturnLocationRoutingNumber = "121042882"
   136  					cdAddendumA.BOFDEndorsementDate = time.Now()
   137  					cdAddendumA.BOFDItemSequenceNumber = cdCount
   138  					cdAddendumA.BOFDAccountNumber = "938383"
   139  					cdAddendumA.BOFDBranchCode = "01"
   140  					cdAddendumA.PayeeName = "Test Payee"
   141  					cdAddendumA.TruncationIndicator = "Y"
   142  					cdAddendumA.BOFDConversionIndicator = "1"
   143  					cdAddendumA.BOFDCorrectionIndicator = 0
   144  					cdAddendumA.UserField = ""
   145  
   146  					cdAddendumB := imagecashletter.NewCheckDetailAddendumB()
   147  					cdAddendumB.ImageReferenceKeyIndicator = 1
   148  					cdAddendumB.MicrofilmArchiveSequenceNumber = "1A             "
   149  					cdAddendumB.LengthImageReferenceKey = "0034"
   150  					cdAddendumB.ImageReferenceKey = "0"
   151  					cdAddendumB.Description = "CD Addendum B"
   152  					cdAddendumB.UserField = ""
   153  
   154  					cdAddendumC := imagecashletter.NewCheckDetailAddendumC()
   155  					cdAddendumC.RecordNumber = 1
   156  					cdAddendumC.EndorsingBankRoutingNumber = "121042882"
   157  					cdAddendumC.BOFDEndorsementBusinessDate = time.Now()
   158  					cdAddendumC.EndorsingBankItemSequenceNumber = "1              "
   159  					cdAddendumC.TruncationIndicator = "Y"
   160  					cdAddendumC.EndorsingBankConversionIndicator = "1"
   161  					cdAddendumC.EndorsingBankCorrectionIndicator = 0
   162  					cdAddendumC.ReturnReason = "A"
   163  					cdAddendumC.UserField = ""
   164  					cdAddendumC.EndorsingBankIdentifier = 0
   165  
   166  					ivDetail := imagecashletter.NewImageViewDetail()
   167  					ivDetail.ImageIndicator = 1
   168  					ivDetail.ImageCreatorRoutingNumber = "031300012"
   169  					ivDetail.ImageCreatorDate = time.Now()
   170  					ivDetail.ImageViewFormatIndicator = "00"
   171  					ivDetail.ImageViewCompressionAlgorithm = "00"
   172  					// use of ivDetail.ImageViewDataSize is not recommended
   173  					ivDetail.ImageViewDataSize = "0000000"
   174  					ivDetail.ViewSideIndicator = 0
   175  					ivDetail.ViewDescriptor = "00"
   176  					ivDetail.DigitalSignatureIndicator = 0
   177  					ivDetail.DigitalSignatureMethod = "00"
   178  					ivDetail.SecurityKeySize = 00000
   179  					ivDetail.ProtectedDataStart = 0000000
   180  					ivDetail.ProtectedDataLength = 0000000
   181  					ivDetail.ImageRecreateIndicator = 0
   182  					ivDetail.UserField = ""
   183  					ivDetail.OverrideIndicator = "0"
   184  
   185  					ivData := imagecashletter.NewImageViewData()
   186  					ivData.EceInstitutionRoutingNumber = "121042882"
   187  					ivData.BundleBusinessDate = time.Now()
   188  					ivData.CycleNumber = "1"
   189  					ivData.EceInstitutionItemSequenceNumber = "1             "
   190  					ivData.SecurityOriginatorName = "Sec Orig Name"
   191  					ivData.SecurityAuthenticatorName = "Sec Auth Name"
   192  					ivData.SecurityKeyName = "SECURE"
   193  					ivData.ClippingOrigin = 0
   194  					ivData.ClippingCoordinateH1 = ""
   195  					ivData.ClippingCoordinateH2 = ""
   196  					ivData.ClippingCoordinateV1 = ""
   197  					ivData.ClippingCoordinateV2 = ""
   198  					ivData.LengthImageReferenceKey = "0000"
   199  					ivData.ImageReferenceKey = ""
   200  					ivData.LengthDigitalSignature = "0    "
   201  					ivData.DigitalSignature = []byte("")
   202  					ivData.LengthImageData = "0000001"
   203  					ivData.ImageData = []byte("")
   204  
   205  					ivAnalysis := imagecashletter.NewImageViewAnalysis()
   206  					ivAnalysis.GlobalImageQuality = 2
   207  					ivAnalysis.GlobalImageUsability = 2
   208  					ivAnalysis.ImagingBankSpecificTest = 0
   209  					ivAnalysis.PartialImage = 2
   210  					ivAnalysis.ExcessiveImageSkew = 2
   211  					ivAnalysis.PiggybackImage = 2
   212  					ivAnalysis.TooLightOrTooDark = 2
   213  					ivAnalysis.StreaksAndOrBands = 2
   214  					ivAnalysis.BelowMinimumImageSize = 2
   215  					ivAnalysis.ExceedsMaximumImageSize = 2
   216  					ivAnalysis.ImageEnabledPOD = 1
   217  					ivAnalysis.SourceDocumentBad = 0
   218  					ivAnalysis.DateUsability = 2
   219  					ivAnalysis.PayeeUsability = 2
   220  					ivAnalysis.ConvenienceAmountUsability = 2
   221  					ivAnalysis.AmountInWordsUsability = 2
   222  					ivAnalysis.SignatureUsability = 2
   223  					ivAnalysis.PayorNameAddressUsability = 2
   224  					ivAnalysis.MICRLineUsability = 2
   225  					ivAnalysis.MemoLineUsability = 2
   226  					ivAnalysis.PayorBankNameAddressUsability = 2
   227  					ivAnalysis.PayeeEndorsementUsability = 2
   228  					ivAnalysis.BOFDEndorsementUsability = 2
   229  					ivAnalysis.TransitEndorsementUsability = 2
   230  
   231  					// Add CheckDetailAddendum* to CheckDetail
   232  					cd.AddCheckDetailAddendumA(cdAddendumA)
   233  					cd.AddCheckDetailAddendumB(cdAddendumB)
   234  					cd.AddCheckDetailAddendumC(cdAddendumC)
   235  
   236  					// Add ImageView* to CheckDetail
   237  					cd.AddImageViewDetail(ivDetail)
   238  					cd.AddImageViewData(ivData)
   239  					cd.AddImageViewAnalysis(ivAnalysis)
   240  
   241  					// Add CheckDetail to Bundle
   242  					bundle.AddCheckDetail(cd)
   243  				}
   244  				cl.AddBundle(bundle)
   245  			}
   246  		}
   247  		cl.Create()
   248  		file.AddCashLetter(cl)
   249  	}
   250  
   251  	// ensure we have a validated file structure
   252  	if file.Validate(); err != nil {
   253  		fmt.Printf("Could not validate entire file: %v", err)
   254  	}
   255  
   256  	// Create the file
   257  	if err := file.Create(); err != nil {
   258  		fmt.Printf("%T: %s", err, err)
   259  	}
   260  
   261  	// Write to a file
   262  	if *flagJson {
   263  		// Write in JSON format
   264  		if err := json.NewEncoder(f).Encode(file); err != nil {
   265  			fmt.Printf("%T: %s", err, err)
   266  		}
   267  	} else {
   268  		// Write in ICL plain text format
   269  		opts := []imagecashletter.WriterOption{
   270  			imagecashletter.WriteVariableLineLengthOption(),
   271  			imagecashletter.WriteEbcdicEncodingOption(),
   272  		}
   273  		w := imagecashletter.NewWriter(f, opts...)
   274  		if err := w.Write(file); err != nil {
   275  			fmt.Printf("%T: %s", err, err)
   276  		}
   277  		w.Flush()
   278  	}
   279  
   280  	if err := f.Close(); err != nil {
   281  		fmt.Println(err.Error())
   282  	}
   283  
   284  	fmt.Printf("Wrote %s\n", path)
   285  
   286  }