Multi-Batch Report 2¶
The Multi-Batch Reports function similarly to the Batch Reports, except that they can report on multiple batches and are activated differently. Currently there are three standard options for this report and three specialized options. Below is a summary of each:
Multi-Batch Report - fund totals by day
Multi-Batch Report 2 - each batch entry with fund totals
Multi-Batch Report 3 - fund totals
Multi-Batch Report by Campus - fund totals by campus
Multi-Batch Report with Fee Rows - fund totals by day with rows for fees
Multi-Batch Report by Type - fund totals by type (Contribution and Registration)
Note
When configured, the report can be run by the Report option on the Caret (downward-facing arrow) drop down menu just to the left of the Batch ID column header.
See image below.
- Multi-Batch Report 2¶
This report provides the following information for the selected batches
- Header, showing the list of selected batches
Batch ID
Deposit Date
Batch Type
Estimated Amount
Estimated Count
Actual Amount
Actual Count
Bankcard Amount
ACH Amount
Cash Amount
Check Amount
- Details of the contents of the selected batches
Name
Fund
Batch ID
Date
General Ledger
Total
Base (Total minus Fees)
Fees
In the details, the individual contributions in the batch are listed, grouped by funds, with subtotals for each fund and a grand total at the bottom of the report.
Create the Multi-Batch Report¶
- Step 1
Go to Administration > Setup > Special Content > Python Scripts.
- Step 2
Click the green + New Python Script File, enter the file name
MultiBatchReport2
and click Submit.- Step 3
Copy all the Python code below and paste it into the new file.
Click Save Script.
- Step 4
Go to Administration > Setup > Special Content > SQL Scripts.
- Step 5
Click the green + New SQL Script File, enter the file name
MultiBatchReport2sql
and click Submit.- Step 6
Copy all the SQL code below and paste it into the new file.
Click Save Script.
- Step 7
Find the Setting
Custom Batch Report
at Administration > Setup > Settings on the Finance tab and in the Batches categoryPaste this as the value -
/PyScript/MultiBatchReport2?p1={batchids}
Note
Each database can have only one Multi-Batch Report. So, the Setting is just named Custom Multi Batch Report and the Value determines which is used.
Generate the Multi-Batch Report¶
To generate the report, select the desired batches to include in the report, then select the Report option from the Caret (downward-facing arrow) drop down menu just to the left of the Batch ID column header.
Use the print feature of your browser to print the report. Click the Export to Excel button to export.
Python Code¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 | import re model.Title = 'Batch Report' def Disinfect(str): idlist = str.split(',') idstr = '' for id in idlist: idInt = re.sub('[^\d]', '', id) idstr = idstr + ',' + idInt return idstr[1:] cleanlist = Disinfect(Data.p1) Data.cleanlist = cleanlist sqlheader = ''' SELECT Setting FROM dbo.Setting WHERE Id = 'NameOfChurch' ''' sqlbatches = ''' ;WITH gifts AS ( SELECT bh.BundleHeaderId, c.ContributionAmount, c.ContributionSourceId, c.CheckNo FROM dbo.BundleHeader bh JOIN dbo.BundleDetail bd ON bd.BundleHeaderId = bh.BundleHeaderId JOIN dbo.Contribution c ON c.ContributionId = bd.ContributionId WHERE bh.BundleHeaderId IN (SELECT Value FROM dbo.SplitInts('{0}')) AND c.ContributionStatusId = 0 AND c.ContributionTypeId NOT IN (6,7,8) ) SELECT bh.BundleHeaderId, CONVERT(VARCHAR(10), bh.DepositDate, 101) AS DepositDate, bt.Description, ISNULL(bh.BundleTotal, 0) EstTotal, ISNULL(bh.BundleCount, 0) EstCount, (SELECT ISNULL(SUM(ContributionAmount), 0) FROM gifts WHERE BundleHeaderId = bh.BundleHeaderId) AS Amount, (SELECT COUNT(*) FROM gifts WHERE BundleHeaderId = bh.BundleHeaderId) AS [Count], (SELECT ISNULL(SUM(ContributionAmount), 0) FROM gifts WHERE BundleHeaderId = bh.BundleHeaderId AND ContributionSourceId = 2) AS [CARD], (SELECT ISNULL(SUM(ContributionAmount), 0) FROM gifts WHERE BundleHeaderId = bh.BundleHeaderId AND ContributionSourceId = 1) AS ACH, (SELECT ISNULL(SUM(ContributionAmount), 0) FROM gifts WHERE BundleHeaderId = bh.BundleHeaderId AND ISNULL(ContributionSourceId, 0) NOT IN (1,2) AND ISNULL(CheckNo, '') = '') AS CASH, (SELECT ISNULL(SUM(ContributionAmount), 0) FROM gifts WHERE BundleHeaderId = bh.BundleHeaderId AND ISNULL(ContributionSourceId, 0) NOT IN (1,2) AND ISNULL(CheckNo, '') <> '') AS CHECKS FROM dbo.BundleHeader bh JOIN lookup.BundleHeaderTypes bt ON bt.Id = bh.BundleHeaderTypeId WHERE bh.BundleHeaderId IN (SELECT Value FROM dbo.SplitInts('{0}')) ''' template = ''' <style> button > a:visited, button > a:hover { text-decoration: none; } .header, .export { text-align: center; } @media print { .export {display: none} } table.table.no-border td, table.table.no-border th { border-top: none; } .strong { font-weight: bold; } .box p {display: none;} </style> <div class="header"> <h2>{{Church}}</h2> <h3>Batch List</h3> </div> <table class="table notwide centered"> <thead> <tr> <th>Batch</th> <th>Deposit Date</th> <th>Batch Type</th> <th>Est Amount</th> <th>Est Count</th> <th>Amount</th> <th>Count</th> <th>Card</th> <th>ACH</th> <th>Cash</th> <th>Checks</th> </tr> </thead> <tbody> {{#each batches}} <tr> <td>{{BundleHeaderId}}</td> <td>{{DepositDate}}</td> <td>{{Description}}</td> <td class="right">{{EstTotal}}</td> <td class="right">{{EstCount}}</td> <td class="right">{{Amount}}</td> <td class="right">{{Count}}</td> <td class="right">{{CARD}}</td> <td class="right">{{ACH}}</td> <td class="right">{{CASH}}</td> <td class="right">{{CHECKS}}</td> </tr> {{/each}} <tr> <td></td> <td></td> <td></td> <td></td> <td></td> <td class="right strong">{{AmountTotal}}</td> <td class="right strong">{{CountTotal}}</td> <td class="right strong">{{CardTotal}}</td> <td class="right strong">{{AchTotal}}</td> <td class="right strong">{{CashTotal}}</td> <td class="right strong">{{ChecksTotal}}</td> </tr> </tbody> </table> <div class="header"> <h3>Batch Contents</h3> </div> <div class="export"> <h4> <button> <a href=/RunScriptExcel/MultiBatchReport2sql?batchids={{cleanlist}} target="_blank">Export to Excel</a> </button> </h4> </div> <table class="table centered"> <thead> <tr> <th>Name</th> <th>Fund</th> <th>Batch</th> <th>ContributionDate</th> <th>GeneralLedger</th> <th class="right">Total</th> <th class="right">Base</th> <th class="right">Fees</th> </tr> </thead> <tbody> {{#each gifts}} <tr {{#unless BundleHeaderId}}style="font-weight:bold"{{/unless}}> <td>{{ContributorName}}</td> <td>{{FundName}}</td> <td><a href="/Batches/Detail/{{BundleHeaderId}}" target="_blank">{{BundleHeaderId}}</a></td> <td>{{ContributionDate}}</td> <td>{{GeneralLedger}}</td> <td class="right">{{Fmt Amount 'N2'}}</td> <td class="right">{{Fmt Base 'N2'}}</td> <td class="right">{{Fmt Fees 'N2'}}</td> </tr> {{/each}} </tbody> </table> ''' Data.Church = q.QuerySqlScalar(sqlheader) Data.batches = q.QuerySql(sqlbatches.format(cleanlist)) Data.AmountTotal = 0 Data.CountTotal = 0 Data.CardTotal = 0 Data.AchTotal = 0 Data.CashTotal = 0 Data.ChecksTotal = 0 for b in Data.batches: Data.AmountTotal += b.Amount Data.CountTotal += b.Count Data.CardTotal += b.CARD Data.AchTotal += b.ACH Data.CashTotal += b.CASH Data.ChecksTotal += b.CHECKS sqlgifts = model.Content('MultiBatchReport2sql') params = { 'batchids' : cleanlist } Data.gifts = q.QuerySql(sqlgifts, params) print model.RenderTemplate(template) |
SQL Code¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | DECLARE @Results1 TABLE ( ContributorName nvarchar(138), FundName nvarchar(256), ContributionDate varchar(10), BundleHeaderId INT, BundleDetailId INT, GeneralLedger NVARCHAR(100), Amount numeric(11,2), Base numeric(11,2), Fees numeric(11,2) ) INSERT INTO @Results1 ( ContributorName, FundName, ContributionDate, BundleHeaderId, BundleDetailId, GeneralLedger, Amount, Base, Fees ) SELECT p.Name AS ContributorName ,CASE WHEN cb.ContributionTypeId = 99 THEN isnull(accnt.Description, '') ELSE cf.FundName END ,CONVERT(varchar(10), cb.ContributionDate, 101) AS ContributionDate ,d.BundleHeaderId ,d.BundleDetailId ,CASE WHEN cb.ContributionTypeId = 99 THEN isnull(accnt.Code, '') ELSE cf.FundIncomeAccount END ,cb.ContributionAmount ,CASE WHEN cb.DonorCoveredFee = 0 THEN cb.ContributionAmount ELSE cb.ContributionAmount - ISNULL(cb.ChargedFee, 0) END ,CASE WHEN cb.DonorCoveredFee = 0 THEN 0 ELSE ISNULL(cb.ChargedFee, 0) END FROM dbo.Contribution AS cb LEFT JOIN dbo.People AS p ON p.PeopleId = cb.PeopleId LEFT JOIN lookup.AccountCode accnt ON accnt.Id = cb.AccountCodeId JOIN dbo.BundleDetail d ON d.ContributionId = cb.ContributionId INNER JOIN dbo.ContributionFund AS cf ON cf.FundId = cb.FundId WHERE (d.BundleHeaderId in (SELECT Value FROM dbo.SplitInts(@batchids))) AND ISNULL(cb.PledgeFlag, 0) = 0 AND cb.ContributionStatusId = 0 AND cb.ContributionTypeId NOT IN (6,7,8) SELECT CASE WHEN FundName IS NULL THEN 'Total' WHEN ContributorName IS NULL THEN CASE WHEN BundleDetailId IS NULL THEN 'Fund Total' END ELSE ContributorName END AS ContributorName ,FundName ,ContributionDate ,BundleHeaderId ,BundleDetailId ,GeneralLedger ,SUM(Amount) AS Amount ,SUM(Base) AS Base ,SUM(Fees) AS Fees FROM @Results1 GROUP BY GROUPING SETS((FundName, GeneralLedger, BundleHeaderId, BundleDetailId, ContributionDate, ContributorName), (FundName, GeneralLedger), ()) |
Latest Update |
10/06/2023 |
Update links to related articles and report image.