Giving Type Breakdown Widget¶
The Giving Type Breakdown widget displays a bar chart showing the past eight weeks of different giving types. The types included are those you specify on the basis of bundle types. Giving types are indicated by color according to the legend at the bottom of the chart. The date is also shown at the bottom, along the horizontal axis, under each bar of the chart.
The widget utilizes an HTML file, SQL script and Python script as shown below. Since the giving data is the same for all users, Caching should be set to all users.
To customize the widget, you will need to change line 2 of the Python script with the fund ID desired.
HTML Code¶
Below is the HTML code for the Giving Type Breakdown widget. As supplied by TouchPoint, the file name is WidgetGivingTypeBreakdownHTML.
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 | <div class="box">
<div class="box-title hidden-xs">
<h5>{{WidgetName}}</h5>
</div>
<a class="visible-xs-block" id="giving-fc-collapse" data-toggle="collapse" href="#{{WidgetId}}-section" aria-expanded="true" aria-controls="{{WidgetId}}-section">
<div class="box-title">
<h5>
<i class="fa fa-chevron-circle-right"></i> {{WidgetName}}
</h5>
</div>
</a>
<div class="collapse in" id="{{WidgetId}}-section">
<div class="box-content center">
<div class="chart"></div>
</div>
</div>
</div>
<script type="text/javascript">
var myData = [];
var weekCount = [];
var weeksDate = [];
var myResultsArrayofArrays = [];
var {{WidgetId}} = function() {
myData = {{{results}}};
var data = new google.visualization.DataTable();
data.addColumn('string', 'Week');
{{{addcolumns}}}
var i = 0;
$.each(myData,function(index, value){
var myResultsArray = [];
for(let j = 0; j < value.results.length; j++){
myResultsArray[j] = value.results[j].amount;
if(i == 0){
weekCount[j] = value.results[j].w.toString();
}
}
myResultsArrayofArrays[i] = myResultsArray;
i++;
});
var thisSunday = new Date();
for(let i =0; i < 7; i++){
if(thisSunday.getDay() != 0){
thisSunday.setDate(thisSunday.getDate() + 1);
} else{
break;
}
}
thisSunday.setDate(thisSunday.getDate() + 7);
for(let i = 7; i >= 0; i--){
thisSunday.setDate(thisSunday.getDate() - 7);
let day = thisSunday.getDate().toString();
let month = thisSunday.getMonth() + 1;
month = month.toString();
weekCount[i] = month + '/' + day;
}
switch(myResultsArrayofArrays.length)
{
case 1:
for(let x = 0; x < 8; x++){
data.addRow([weekCount[x], myResultsArrayofArrays[0][x]]);
}
break;
case 2:
for(let x = 0; x < 8; x++){
data.addRow([weekCount[x], myResultsArrayofArrays[0][x], myResultsArrayofArrays[1][x]]);
}
break;
case 3:
for(let x = 0; x < 8; x++){
data.addRow([weekCount[x], myResultsArrayofArrays[0][x], myResultsArrayofArrays[1][x], myResultsArrayofArrays[2][x] ]);
}
break;
case 4:
for(let x = 0; x < 8; x++){
data.addRow([weekCount[x], myResultsArrayofArrays[0][x], myResultsArrayofArrays[1][x], myResultsArrayofArrays[2][x], myResultsArrayofArrays[3][x]]);
}
break;
case 5:
for(let x = 0; x < 8; x++){
data.addRow([weekCount[x], myResultsArrayofArrays[0][x], myResultsArrayofArrays[1][x], myResultsArrayofArrays[2][x], myResultsArrayofArrays[3][x], myResultsArrayofArrays[4][x]]);
}
break;
case 6:
for(let x = 0; x < 8; x++){
data.addRow([weekCount[x], myResultsArrayofArrays[0][x], myResultsArrayofArrays[1][x], myResultsArrayofArrays[2][x], myResultsArrayofArrays[3][x], myResultsArrayofArrays[4][x], myResultsArrayofArrays[5][x]]);
}
break;
default:
break;
}
var formatter = new google.visualization.NumberFormat(
{negativeColor: 'red', negativeParens: true, pattern: '$###,###'});
formatter.format(data, 1);
formatter.format(data, 2);
formatter.format(data, 3);
var options = {
colors: ['#CC0300', '#5CA12B', '#345CAD', '#F9B710', '#9E4EBC', '#74746D'],
seriesType: 'bars',
series: {5: {type: 'line'}},
legend: {
position: "bottom",
textStyle: {fontSize: 8},
alignment: 'center'
},
isStacked: true,
vAxis: {format: 'currency'},
hAxis: {
textStyle: {
fontSize: 10
}
},
};
var chart = new google.visualization.ComboChart(document.querySelector('#{{WidgetId}}-section .chart'));
chart.draw(data, options);
}
// load and register the chart
google.charts.load("current", {packages:["corechart"]});
google.charts.setOnLoadCallback({{WidgetId}});
WidgetCharts.{{WidgetId}} = {{WidgetId}};
</script>
|
SQL Script¶
Below is the SQL script for the Giving Type Breakdown widget. As supplied by TouchPoint, the file name is WidgetGivingTypeBreakdownSQL.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | set datefirst 1;
with weeks as (
select DATEPART(week, getdate()) w UNION ALL
select DATEPART(week, getdate() - 7) w UNION ALL
select DATEPART(week, getdate() - 14) w UNION ALL
select DATEPART(week, getdate() - 21) w UNION ALL
select DATEPART(week, getdate() - 28) w UNION ALL
select DATEPART(week, getdate() - 35) w UNION ALL
select DATEPART(week, getdate() - 42) w UNION ALL
select DATEPART(week, getdate() - 49) w
),
tags as (
select weeks.w, SUM(coalesce(c.ContributionAmount,0)) as amount, TagName from weeks
cross join ContributionTag ct
left join Contribution c on datepart(week, c.ContributionDate) = weeks.w
and c.ContributionId = ct.ContributionId
and c.ContributionStatusId = 0
and c.ContributionTypeId NOT IN (6,7,8)
where TagName = @Tag
group by weeks.w, TagName
)
select * from tags
order by (case when datepart(week, getdate()) < 10 then (case when w < 10 then w + 53 else w end) else w end)
|
Python Script¶
Below is the Python script for the Giving Type Breakdown widget. As supplied by TouchPoint, the file name is WidgetGivingTypeBreakdownPython.
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 | # You can change FundIds to select the Fund you wish to view data for
FundIds = '9'
from System import DateTime
# Initialize global data
MaxDate = DateTime.Today
GivingTypesData = model.DynamicData()
Priority = 0
Days = 56
selectedTags = []
Base = model.DynamicData()
Base.MinDate = MaxDate.AddDays(-Days).ToString("d")
Base.NonTaxDed = -1 # both tax and non tax
Base.MaxDate = MaxDate.ToString("d")
Base.FundIds = FundIds
def NextPriority():
global Priority
Priority += 1
return Priority
def GetResults(tagName):
results = q.QuerySql(Data.SQLContent, {'Tag': tagName})
return results
def CreateTag(fundSet, typeCategory, searchParameters):
TagName = 'Gt{}-{}'.format(fundSet, typeCategory)
NamePriority = '{}-{}'.format(TagName, Priority)
dd = model.DynamicData()
dd.params = searchParameters
dd.name = typeCategory
selectedTags.append(typeCategory)
dd.link = '/ContributionsJsonSearch/{}/{}'.format('GivingTypesData', NamePriority)
tag = model.CreateContributionTag(TagName, searchParameters)
dd.results = GetResults(TagName)
GivingTypesData.AddValue(NamePriority, dd)
def CreateTags(fundSet):
RowType = 'Online' # Name this set of data
SearchParameters = model.DynamicData(Base) # don't change
SearchParameters.Priority = NextPriority() # don't change
SearchParameters.BundleTypes = ['Online'] # name of type you want to retrieve data for
CreateTag(fundSet, RowType, SearchParameters) # don't change
RowType = 'Cash' # Name this set of data
SearchParameters = model.DynamicData(Base) # don't change
SearchParameters.Priority = NextPriority() # don't change
SearchParameters.BundleTypes = ['Loose Checks and Cash'] # name of type you want to retrieve data for
CreateTag(fundSet, RowType, SearchParameters) # don't change
RowType = 'Envelopes' # Name this set of data
SearchParameters = model.DynamicData(Base) # don't change
SearchParameters.Priority = NextPriority() # don't change
SearchParameters.BundleTypes = ['Preprinted Envelopes'] # name of type you want to retrieve data for
CreateTag(fundSet, RowType, SearchParameters) # don't change
Priority = 100
CreateTags('MainFund')
Data.days = Days
Data.results = model.FormatJson(GivingTypesData)
addcolumn = "data.addColumn('number', '{}');"
alist = [addcolumn.format(x) for x in selectedTags]
Data.addcolumns = '\n'.join(alist)
print model.RenderTemplate(Data.HTMLContent)
|
Latest Update | 08/12/2020 |
Added video.