/// <summary>
        /// Gets the credit detail deposit record (type 61).
        /// </summary>
        /// <param name="fileFormat">The file format that contains the configuration to use.</param>
        /// <param name="bundleIndex">Number of existing bundle records in the cash letter.</param>
        /// <param name="transactions">The transactions associated with this deposit.</param>
        /// <returns>A collection of records.</returns>
        protected override List <X937.Record> GetCreditDetailRecords(ImageCashLetterFileFormat fileFormat, int bundleIndex, List <FinancialTransaction> transactions)
        {
            var accountNumber = Rock.Security.Encryption.DecryptString(GetAttributeValue(fileFormat, "AccountNumber"));
            var routingNumber = Rock.Security.Encryption.DecryptString(GetAttributeValue(fileFormat, "RoutingNumber"));

            var records = new List <X937.Record>();

            var creditDetail = new X937.Records.CreditDetail
            {
                PayorRoutingNumber  = "500100015",
                CreditAccountNumber = accountNumber,
                Amount = transactions.Sum(t => t.TotalAmount),
                InstitutionItemSequenceNumber = string.Format("{0}{1}", RockDateTime.Now.ToString("yyMMddHHmmss"), bundleIndex),
                DebitCreditIndicator          = "2"
            };

            records.Add(creditDetail);

            for (int i = 0; i < 2; i++)
            {
                using (var ms = GetDepositSlipImage(fileFormat, creditDetail, i == 0))
                {
                    //
                    // Get the Image View Detail record (type 50).
                    //
                    var detail = new X937.Records.ImageViewDetail
                    {
                        ImageIndicator                 = 1,
                        ImageCreatorRoutingNumber      = routingNumber,
                        ImageCreatorDate               = DateTime.Now,
                        ImageViewFormatIndicator       = 0,
                        CompressionAlgorithmIdentifier = 0,
                        SideIndicator             = i,
                        ViewDescriptor            = 0,
                        DigitalSignatureIndicator = 0
                    };

                    //
                    // Get the Image View Data record (type 52).
                    //
                    var data = new X937.Records.ImageViewData
                    {
                        InstitutionRoutingNumber            = routingNumber,
                        BundleBusinessDate                  = DateTime.Now,
                        ClientInstitutionItemSequenceNumber = accountNumber,
                        ClippingOrigin = 0,
                        ImageData      = ms.ReadBytesToEnd()
                    };

                    records.Add(detail);
                    records.Add(data);
                }
            }

            return(records);
        }
        /// <summary>
        /// Gets the credit detail deposit record (type 61).
        /// </summary>
        /// <param name="fileFormat">The file format that contains the configuration to use.</param>
        /// <param name="transactions">The transactions associated with this deposit.</param>
        /// <param name="isFrontSide">True if the image to be retrieved is the front image.</param>
        /// <returns>A stream that contains the image data in TIFF 6.0 CCITT Group 4 format.</returns>
        protected virtual Stream GetDepositSlipImage(ImageCashLetterFileFormat fileFormat, X937.Records.CreditDetail creditDetail, bool isFrontSide)
        {
            var bitmap = new System.Drawing.Bitmap(1200, 550);
            var g      = System.Drawing.Graphics.FromImage(bitmap);

            var depositSlipTemplate = GetAttributeValue(fileFormat, "DepositSlipTemplate");
            var mergeFields         = new Dictionary <string, object>
            {
                { "FileFormat", fileFormat },
                { "Amount", creditDetail.Amount.ToString("C") }
            };
            var depositSlipText = depositSlipTemplate.ResolveMergeFields(mergeFields, null);

            //
            // Ensure we are opague with white.
            //
            g.FillRectangle(System.Drawing.Brushes.White, new System.Drawing.Rectangle(0, 0, 1200, 550));

            if (isFrontSide)
            {
                g.DrawString(depositSlipText,
                             new System.Drawing.Font("Tahoma", 30),
                             System.Drawing.Brushes.Black,
                             new System.Drawing.PointF(50, 50));
            }

            g.Flush();

            //
            // Ensure the DPI is correct.
            //
            bitmap.SetResolution(200, 200);

            //
            // Compress using TIFF, CCITT Group 4 format.
            //
            var codecInfo = System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders()
                            .Where(c => c.MimeType == "image/tiff")
                            .First();
            var parameters = new System.Drawing.Imaging.EncoderParameters(1);

            parameters.Param[0] = new System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.Compression, ( long )System.Drawing.Imaging.EncoderValue.CompressionCCITT4);

            var ms = new MemoryStream();

            bitmap.Save(ms, codecInfo, parameters);
            ms.Position = 0;

            return(ms);
        }