From f583354764a5cdf6a5531ecfe6d35e98e308a8e0 Mon Sep 17 00:00:00 2001
From: Julian Horner <julianhorner@web.de>
Date: Sat, 4 Jul 2020 17:49:43 +0200
Subject: [PATCH] Finish chapter 8

---
 bin/.gitignore                                |   5 +
 bin/README.md                                 |   1 +
 bin/azure-pipelines.yml                       |  31 ++++++
 bin/pom.xml                                   |  48 +++++++++
 .../controller/DonateMoneyController.class    | Bin 0 -> 4369 bytes
 .../controller/EditCampaignController.class   | Bin 0 -> 2498 bytes
 .../EditDonationFormController.class          | Bin 0 -> 3937 bytes
 .../controller/ListCampaignsController.class  | Bin 0 -> 3458 bytes
 .../controller/ListDonationsController.class  | Bin 0 -> 1476 bytes
 .../de/dpunkt/myaktion/controller/Pages.class | Bin 0 -> 1195 bytes
 .../myaktion/data/CampaignListProducer.class  | Bin 0 -> 3902 bytes
 .../myaktion/data/CampaignProducer$Mode.class | Bin 0 -> 1848 bytes
 .../myaktion/data/CampaignProducer.class      | Bin 0 -> 2683 bytes
 .../de/dpunkt/myaktion/model/Account.class    | Bin 0 -> 2289 bytes
 .../de/dpunkt/myaktion/model/Campaign.class   | Bin 0 -> 4151 bytes
 .../myaktion/model/Donation$Status.class      | Bin 0 -> 1561 bytes
 .../de/dpunkt/myaktion/model/Donation.class   | Bin 0 -> 3246 bytes
 bin/src/main/resources/messages_de.properties |  66 ++++++++++++
 bin/src/main/resources/messages_en.properties |  66 ++++++++++++
 bin/src/main/webapp/WEB-INF/beans.xml         |   6 ++
 bin/src/main/webapp/WEB-INF/faces-config.xml  |  18 ++++
 bin/src/main/webapp/contracts/de/screen.css   |  35 +++++++
 .../main/webapp/contracts/de/template.xhtml   |  27 +++++
 bin/src/main/webapp/contracts/en/screen.css   |  35 +++++++
 .../main/webapp/contracts/en/template.xhtml   |  27 +++++
 bin/src/main/webapp/donateMoney.xhtml         |  74 +++++++++++++
 bin/src/main/webapp/editCampaign.xhtml        |  99 ++++++++++++++++++
 bin/src/main/webapp/editDonationForm.xhtml    |  41 ++++++++
 bin/src/main/webapp/index.html                |   5 +
 bin/src/main/webapp/index.xhtml               |  14 +++
 bin/src/main/webapp/listCampaigns.xhtml       |  79 ++++++++++++++
 bin/src/main/webapp/listDonations.xhtml       |  76 ++++++++++++++
 .../de/dpunkt/myaktion/model/Donation.java    |  16 ++-
 .../myaktion/scheduler/SchedulerBean.java     |  26 +++++
 .../services/CampaignServiceBean.java         |  27 ++---
 .../myaktion/services/DonationService.java    |   2 +
 .../services/DonationServiceBean.java         |  30 +++++-
 src/main/resources/messages_de.properties     |   5 +-
 src/main/resources/messages_en.properties     |   2 +
 src/main/webapp/WEB-INF/jboss-ejb3.xml        |   6 +-
 40 files changed, 839 insertions(+), 28 deletions(-)
 create mode 100644 bin/.gitignore
 create mode 100644 bin/README.md
 create mode 100644 bin/azure-pipelines.yml
 create mode 100644 bin/pom.xml
 create mode 100644 bin/src/main/java/de/dpunkt/myaktion/controller/DonateMoneyController.class
 create mode 100644 bin/src/main/java/de/dpunkt/myaktion/controller/EditCampaignController.class
 create mode 100644 bin/src/main/java/de/dpunkt/myaktion/controller/EditDonationFormController.class
 create mode 100644 bin/src/main/java/de/dpunkt/myaktion/controller/ListCampaignsController.class
 create mode 100644 bin/src/main/java/de/dpunkt/myaktion/controller/ListDonationsController.class
 create mode 100644 bin/src/main/java/de/dpunkt/myaktion/controller/Pages.class
 create mode 100644 bin/src/main/java/de/dpunkt/myaktion/data/CampaignListProducer.class
 create mode 100644 bin/src/main/java/de/dpunkt/myaktion/data/CampaignProducer$Mode.class
 create mode 100644 bin/src/main/java/de/dpunkt/myaktion/data/CampaignProducer.class
 create mode 100644 bin/src/main/java/de/dpunkt/myaktion/model/Account.class
 create mode 100644 bin/src/main/java/de/dpunkt/myaktion/model/Campaign.class
 create mode 100644 bin/src/main/java/de/dpunkt/myaktion/model/Donation$Status.class
 create mode 100644 bin/src/main/java/de/dpunkt/myaktion/model/Donation.class
 create mode 100644 bin/src/main/resources/messages_de.properties
 create mode 100644 bin/src/main/resources/messages_en.properties
 create mode 100644 bin/src/main/webapp/WEB-INF/beans.xml
 create mode 100644 bin/src/main/webapp/WEB-INF/faces-config.xml
 create mode 100644 bin/src/main/webapp/contracts/de/screen.css
 create mode 100644 bin/src/main/webapp/contracts/de/template.xhtml
 create mode 100644 bin/src/main/webapp/contracts/en/screen.css
 create mode 100644 bin/src/main/webapp/contracts/en/template.xhtml
 create mode 100644 bin/src/main/webapp/donateMoney.xhtml
 create mode 100644 bin/src/main/webapp/editCampaign.xhtml
 create mode 100644 bin/src/main/webapp/editDonationForm.xhtml
 create mode 100644 bin/src/main/webapp/index.html
 create mode 100644 bin/src/main/webapp/index.xhtml
 create mode 100644 bin/src/main/webapp/listCampaigns.xhtml
 create mode 100644 bin/src/main/webapp/listDonations.xhtml
 create mode 100644 src/main/java/de/dpunkt/myaktion/scheduler/SchedulerBean.java

diff --git a/bin/.gitignore b/bin/.gitignore
new file mode 100644
index 0000000..393434f
--- /dev/null
+++ b/bin/.gitignore
@@ -0,0 +1,5 @@
+/target/
+/.settings/
+/.metadata/
+.classpath
+.project
\ No newline at end of file
diff --git a/bin/README.md b/bin/README.md
new file mode 100644
index 0000000..9ae9e86
--- /dev/null
+++ b/bin/README.md
@@ -0,0 +1 @@
+ab
\ No newline at end of file
diff --git a/bin/azure-pipelines.yml b/bin/azure-pipelines.yml
new file mode 100644
index 0000000..bbe87cb
--- /dev/null
+++ b/bin/azure-pipelines.yml
@@ -0,0 +1,31 @@
+# Maven
+# Build your Java project and run tests with Apache Maven.
+# Add steps that analyze code, save build artifacts, deploy, and more:
+# https://docs.microsoft.com/azure/devops/pipelines/languages/java
+
+trigger:
+- master
+
+pool:
+  vmImage: 'ubuntu-latest'
+
+steps:
+- task: Maven@3
+  inputs:
+    mavenPomFile: 'pom.xml'
+    mavenOptions: '-Xmx3072m'
+    javaHomeOption: 'JDKVersion'
+    jdkVersionOption: '1.8'
+    jdkArchitectureOption: 'x64'
+    publishJUnitResults: true
+    testResultsFiles: '**/surefire-reports/TEST-*.xml'
+    goals: 'package'
+
+- task: AzureRmWebAppDeployment@4
+  inputs:
+    ConnectionType: 'AzureRM'
+    azureSubscription: 'Azure for Students (d67e4eff-f95b-4837-b21e-2daef7374625)'
+    appType: 'webAppLinux'
+    WebAppName: 'tech-recruiting'
+    packageForLinux: '$(System.DefaultWorkingDirectory)/**/*.war'
+    RuntimeStack: 'WILDFLY|14-jre8'
diff --git a/bin/pom.xml b/bin/pom.xml
new file mode 100644
index 0000000..0cb5aa5
--- /dev/null
+++ b/bin/pom.xml
@@ -0,0 +1,48 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<groupId>de.dpunkt</groupId>
+	<artifactId>my-aktion</artifactId>
+	<version>0.0.1</version>
+	<packaging>war</packaging>
+
+	<dependencies>
+		<dependency>
+			<groupId>jakarta.platform</groupId>
+			<artifactId>jakarta.jakartaee-api</artifactId>
+			<version>8.0.0</version>
+			<scope>provided</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.eclipse.microprofile</groupId>
+			<artifactId>microprofile</artifactId>
+			<version>3.0</version>
+			<type>pom</type>
+			<scope>provided</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.primefaces</groupId>
+			<artifactId>primefaces</artifactId>
+			<version>8.0</version>
+		</dependency>
+	</dependencies>
+
+	<build>
+		<finalName>my-aktion</finalName>
+		<plugins>
+			<plugin>
+				<groupId>org.wildfly.plugins</groupId>
+				<artifactId>wildfly-maven-plugin</artifactId>
+				<version>2.0.2.Final</version>
+			</plugin>
+		</plugins>
+	</build>
+
+	<properties>
+		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+		<maven.compiler.source>1.8</maven.compiler.source>
+		<maven.compiler.target>1.8</maven.compiler.target>
+		<failOnMissingWebXml>false</failOnMissingWebXml>
+	</properties>
+</project>
\ No newline at end of file
diff --git a/bin/src/main/java/de/dpunkt/myaktion/controller/DonateMoneyController.class b/bin/src/main/java/de/dpunkt/myaktion/controller/DonateMoneyController.class
new file mode 100644
index 0000000000000000000000000000000000000000..0139d27612bbd3745352d2684725c81b3563c90a
GIT binary patch
literal 4369
zcmeHKTXP#V6g~=R)^;7zhJ;JXMGZHH%bK>KKvD{c(+uu7g^AP5@F?#pwwhgO(P}dZ
z{|a6hU<Tg#Q4B}Ban~VByd6A+hdyXmm!nUgq;rnW`Qy)DeglA2*m7Wsz(%aSX2^tW
zK4M3#>GP%^CGyZT!xMIBgpy59NuyN|aNXQek{Q0EBtL0A?sZ_Az?F1%z+}Jqb?*`P
z40gp_3l{8i9V5)c_7(whpTI26j17}!p9KlO)LFmr^Q}2=mq69<W7ATB(gfx^IbPRj
zA^YnDoL>KQxaP4iVxlkGK7pA|N2TKx-_pai2-G?$RjlK@nL9!XbC<w#jg@@@(=Fw5
z2Nns;<%`_YTImYBM4TTUO3h;x9C4p|DvU&sV$w*fUcke6jn=Ar15V9J#Hj^v?XKNy
z*VJQDDnomm4nbVnHdMq^NMC3?nBWA54!Gvh!xav+3bFlNf@3~)y@16rJrDtpvsHYK
zU3Ms9-XZIAy6kf|yCHXYLvDUU%hXpqrj|m;j5nYLneyWZ*B!;cJ9q7!yD9&R5i=el
zjFdLneuXO7=6SKih@gz%@&8Q7=Y@p2Jhpn=^;CpMdH$ZMQIw@xQL8>+;aHh&Y8~Qx
zhFUcSF0+712w6)RgEKUoF=Fj73WO&NjgyFLv=lUIop?rRnwdgl#cF*beSRP$_g%V^
z#K!7kIt{Hr$Rl;gDMMu)oJFWrOOhxlR$|vrO{65{|3qwZdiD&dy3ITu+gB1_wK29d
zMzmJl#Rn<T9^XWBnvAzdm)t>@X5W;HomnZ-BZhB1da_BIZW%?Y!2-NehpVteV6kyN
za<Gs7TnC-dgCy*6y=Qsa5JPzwot*MM?VL6P5ff;2{&iG@amQ?*o7PC6QfaJYp-Kgo
z2@Fca858kJNF+W>q}s@M*n_!@B!|w1KpiO#Tk92Q5Qs|99L^Y{Nae(k64D*YBKbzn
z$P%t2;k`UkTtLQo7?-IFGIt3CC772{uWA_~<b|w9c-4^R=Hqx3$MS}+hP$i4Dj`2k
zisu+NG8&+a5q;)yE>>ksFuJKj-o{9sz*2gjf6t53;F`d--9#D@^0qt@u|U_eVKam@
zr$A3L*Ethc+AOD&MvquqY)czfiP&&yz7kwB?F~*GxI>^a)F1~iubH-f!htVQ2}h$!
z2R6?nW|<zN(2l@RR`&NWgNflfU}A&`;U!qYGJ`D#TT@WMQiIEBy?*+ih3C`u99+SF
z4P~#wJbqum)+(Y9+xsgld^`W*Pw?{Zsq8iUT2#RDDt_yk6ubtnr+se##h&vB*9#Eb
zLWDQrtr3JNM9nx9A>1rPcpKgsLCAOUZUKkeg$OI~-Uvd@p$K8E5aE6JU<4uO@L>Um
zyM+i%yuth=a}Gran}rA;JpqU9LWCPnz~O!&!p(o+aI4@Pz9~SMhL2GLrr<VwVl@G4
ZpW^>BENfT*T3G6+>Fe-0e1ST<@fS-n1APDh

literal 0
HcmV?d00001

diff --git a/bin/src/main/java/de/dpunkt/myaktion/controller/EditCampaignController.class b/bin/src/main/java/de/dpunkt/myaktion/controller/EditCampaignController.class
new file mode 100644
index 0000000000000000000000000000000000000000..98a98e86f79354ec86eec0488b81fd92e40489ad
GIT binary patch
literal 2498
zcmdT`>rNCg6h4L3S=LpMi#NPf5LvwJc;S~Cje^ECD;gI_{8>6>Da^E!PKSuk;FI_Q
zCYtDfU&Uw8cslFIB8$65V&ac>=A8NZ_1t<opTE8T2mrHi(}O+&4-&)uh)LzIvrXm)
z!Vlt9ZCF3rVjEU!<#Vm9(P1cz|1gktjzuw(O*QvZ?LmRSP_{f|s_8#lSr^=*DiKDq
za9NlHd6sJP1jrKthjC?MnX=0)OvQoek#}z<-!6P1Fv@>W*JWa#8y%!v7y`%Y`Ihba
z+XTj6q{_-j)YPU-<Vq;+E2S-SMkfS{^_p^aAaE!r-X<OXNt){rckqr>(%vP|Uzu4Z
zP?*z!@L-g{;I?xQjnSqE$4KGck}@LE;id>E*HJ9PY-<`DjkZL|Em|5_ToW`9JY)tz
zG2<JoDd<EXs;wYb^B`BZgFHb4EfR{J(1=;SMlEuPS24QM&VgyGy0lfDY1Q8|w(O8m
ztc|4^UTVsjixyoGH1}c`?A5;m1)|$tdmtJjan;q}I(B*3<rKA=GHSPCQ5slaQCCbY
zibKhzrAZnKgNemjH7U2+&{kbnW~fYPssgbp71FKZ7kp=FXxq_M`ZP_f`+_LSluKcY
zxQ((j(8!L6e9f?Ax>(;T=Psa5N2SY>KjO_#OBc?DHBvRZfO1=V<jmpiU0{EA=*jAR
z1C?L|PLyE?P7)Za)VEtqYlqve1r64*dKS`XMVLibA_Ru(nqyC8*jZ8jp)A-ni7juw
z{`bw?wZT9)*e32ZTAA5xRuRq<_}WA7>nTuqQva(Oz{@4jb4+m&7U2ScaKEC_OUMY6
z8ag#xJd&;+#yj81*|p&6XGed;<a+h23*y^YO}SQtcdbzNu@r_GzP9DTWlVgYmiDve
z!BxCU^DlYAJn#vW+uN82*LVC5w46fFQ;DrwH5aiLCvYC{n#KQ+emDgO;2=sKN_|ko
zQG!D#mr-{5!<qgF4F00)M|lX2;yjFqS!5#kEPa5Hm&0T4;P|I(-6@<Mi<`%BF1Ju{
z8qT0Z;4GZOc{c;?z%bR3VPX%4$qo!xJ1`Vr3N7h_i<!qIe49qOf@1~;zzrN_jL{{y
J0#)?#+IQP0|LFh#

literal 0
HcmV?d00001

diff --git a/bin/src/main/java/de/dpunkt/myaktion/controller/EditDonationFormController.class b/bin/src/main/java/de/dpunkt/myaktion/controller/EditDonationFormController.class
new file mode 100644
index 0000000000000000000000000000000000000000..9a971bb0e85c15b2f52f60cca6190f9e53afd478
GIT binary patch
literal 3937
zcmd^CTW=dh6h33z*jZeXhJ;JYWtswYptXUPO93IJX`;AtT2v>IcpUGZ*wgIJEVHvw
z!q4E(Ab|u=ec@Li@jnn}c9S}Z*G(;%h>C}uoilUh+cW3BfBgN+Zvb!`?o^<}U@b9z
zGZIoYAB#QF46qr*soJ&8=s@gRsa4b0${HPpXqu~mwD+_UZhcLgXyxfv1<DL&Gl)>A
zUh`r1G5VI45;RhT+h`Ixv(>uCfZb<skxnL7D7!7f6fZpa=}GYCU2%iKw8ee9qC;&M
z%(Vx29c!fOea)cK?Hz8<`XY*j?5XdJ4pJYp6Dz0I=){#rsj@P{mfDkv?1s3kl(yL&
z5(d?FOF2=Aaq1hXr2Uq`OZBB~2IUnUU<DQ!%namMHAb5%yw0Zn+ENA+9qwVkeI3Oz
z%piGeG<_pVzT)2WW*>Qgekcqv#lqheJ>-i4HgX*|j&$4@=y;I_8WT<u@<>>}&n;o#
zeoP`B#~`aUoYfjmw8pa$b2(%bYh!uFFE#gt(*o}zKf1*b+y0Bl6kws$9ZZ}9c6=Q>
zdktNlTg?Tx2Qhln4@7h(Pb-Q;=}XI#G)6-XK<;c(-)h5i*RL;enebEvxFZ$8?a&U*
zMH<@U+zq~wCf4l`7Z=KzItM-m=}mXCD3U)4a;-C@&m(0LOnG3Ofpj|H&S0OMbkBw4
z0x&|`*8%ULU5?`|6Ov_ijE=Ivat7z4vl_+54rMOq94-taNlv7CnVazZ`(&CdGo9PD
z{|$YwTN{&y?S*I`;SVX2Lq0n~#y+qnd`u|kyX;<oeePO3XQRESpYvcI-mJkTxXfUo
zK3tAnnVe};=6aAuT{N36J-NEAeJc5a3O~_@i)GuFRBqSXlj%38T$cm=aF@Y+eQ8**
zDl9SxpQA!g%rewIP==xOQib;!Tc6aY|L+NmI>M)ky9#y2?o3LvW9P835B$fH9)lXG
za&ypM*OC*YN4s~Anrn~t21G}v#>X}3qWj&^<uYqVT}C+3ZMmkso%K{STWBfQ*vQ19
zvg;C!Fn<4_0=MW_;dE)Mz-J`$@z$pTU!3^M$fK8-HuB26N##6&t3WM0{o<72GF*Tu
zqAEm{ph}MiFK6@G;rk-ILi;nc=J;mmU8VOWn4|GkqHYrsqqp}f%zr=k+RyOD??jd0
z3XSfB8{eX_mUF?|@D5R=CEzp;BU~*&xL$~GZ3M!51qe3_5K8dD2!!he2)7Cl7%YuI
zD7wXRA;O1bgMl7Oq?=rmMF^{f2p^3hL#q(s#uzee6d;u0CdplbM&>6T&6-4iOwT9u
Q0DMW0N8a{n<}IK91H0FsVE_OC

literal 0
HcmV?d00001

diff --git a/bin/src/main/java/de/dpunkt/myaktion/controller/ListCampaignsController.class b/bin/src/main/java/de/dpunkt/myaktion/controller/ListCampaignsController.class
new file mode 100644
index 0000000000000000000000000000000000000000..25efcfb44fc620e81001d9d668aeee574518ff7e
GIT binary patch
literal 3458
zcmeHJ-EQ1O6h4zC^~P+PkT(3ZfldOnn-<muQhu6%R3#~FwJoTdM(X9no^GbGXRPr!
zN_Yhxfm@z{8~!AaxZr|^;874~>^L#R8}CXH;-VKG`;0$-bAEl!AAkMy3ji#`Ck~7e
zSWC3;MNCNV8QWuCz`Y<&<*xCf1GZ~~lAf=m(JBnN_PQc5Yb=VH=*wj7Xy1Wx0yEk7
zA(MUYi|uFJH@KB>Em*k4b%I2XJL?3<eF9VXWn!2#TP#fZ#QwKG{_x#r^M4}VKji*W
zt048cCNSGA&MWp-2wZuTN+TlPk$WN$+abRzr83NFn-FMpJJOzyz$3y<wa!CsI05&F
z5Z|9)6;hZ_37l&!Z4nq>QvrA25`pPsV>Yx_x&bediQgYf%@Y;w@qqd&iba?mNn@>0
zhbXy2-O0@zP6O_TOd}{}{x0itx)|_w?$vhT)%LMh7ipk)LeT;mG2`!0gB*N6Mia^$
z7^k+4Q`@T6KAkbwLqxIChGux7sL!mI=r*T?6(?Z({~ajcb!QDg^mt;kspqTM#^Hof
z)F{fRIf%JC`H)4mm`)Uj!WV`nY0NbS7IRalzEPUydE8o}BB7}a_){T~?kT>(XO@Ph
zjBe8hX=3afL{TPf2y@~Rr90WnN<w_aFlB1A&(pXD^zZT*5?%xA87*YL1~lT)LvaoT
zDh__GU;Z;HW&Ho$e<OyjCc?dg#PFyBgmpIXl?xZ)l_t!<s|4m+-Qz!f?z<J+38uSP
z#1GSGo9j(mskRX*A6ps2hKBOt=D67r*l{+xXV65k9Zd!5ZV(hMB5<j-bW*(rED-o+
zh*mUGDiqzd!k6VA>M)!HE(B^L5J!^&f!ABdUANMtw+Q@p)+W`MQn>j{EuYOTUsp04
z4elu&VKN2E4o<};Cd^E5IFA%cVC>5-+G@Z}0$&f|k%C}IV{2f8iw2VsN1jNSe2yxP
zZ9tpA>gjsgvFJ2nx2IC=^LxUU+5CVJGn;yBUH+r}W6e0-tjXikTu0hYi=O7vd@i_V
z+TS^F;5Lqgg}x4ah~6)xBJ>V?OrTlr%nl%7X`;>Z9zhQTP9L(riQ`2A3xJa&&eG@L
zGEBgElpK`Cpn;bQFQD8++3rte`xjsu?+(f{@FK3WC@tgH1n=(8aPi6P-1qSEuNn3-
zuJ%j2Uct4QqhKChLkUX?uHt%<fmSdqR5C2W8zqJ@WX*MWvx4DTCBwB57;aWFTpxkq
zRwY9VmMX2dQDMdHN`|)w#NwR_hLsA2aq!T0V{j{rwu?{iqWm6S@8boqidPf!V;Mex
Jk1*PI{sy=`1~vcy

literal 0
HcmV?d00001

diff --git a/bin/src/main/java/de/dpunkt/myaktion/controller/ListDonationsController.class b/bin/src/main/java/de/dpunkt/myaktion/controller/ListDonationsController.class
new file mode 100644
index 0000000000000000000000000000000000000000..54dac8bfbbff773e4685ebb5859376cb04efb919
GIT binary patch
literal 1476
zcmb_c-A)uS6h2)RW*HYj1eG79;NNmHbK{j569X96EReWB;$?TH?3SHrCvAs-594c?
zXrlK%h40|K@pMLH$)Xs;MgPBkJ?Hd0=j)G;p8?<rJocbMVBP2_Oqr13Av<DW%)>a#
zW#5MB3F}*-WEd%FwMr7M!<I01LrLcL&HC?s52^&Fiu(zZ-EgOK$RmqehHJr+eXb2&
z*lTVOAg>8b;7wzhwEHZ{`6wF0zrX)BMPTfikitGEFw$7vCs18iG56p)fyp!OO|6x#
z!4#?N>`BdyN{)C;Bb8<%DeR(|R-J^W<|*~ZcYB=1JW7~GP{yJ@>vFmh^PqGxICU~O
zb8>~oiW@4Gr75#fk6Ps5#~FGw$bn%CT-X9<TJU$q(hiYkN?Tgsg`yFY?u`zor(O)f
zj{hIj=ElXm9jVNPXXq_z6=l?(WZWO$X6dDvW|}1;5|)}g;~L|QKdAG_DoxAZZmd#a
zXf9)ZASBWq;0exIp4dTjK(}&Z-3g*7lP<C)@c^Yi-Y$eA-ZA{iORR5OEoAo!Kt4>s
zbRB%SNnp0oI+I-a!kUxhWDCvS&eIOpyUsQO(=8RD#2E@5*S|KawkHgM&DIqp*BT~5
ztakbYW*V!*R@GpEK=Kc%aAk2K;I~z-BmPpj04)BYC=`i7VBt+Jtw?!O9tk5bL@%7|
z%L?M+c}}S4tJf;zh_l(Ibeh1D!=-&CxMn))op^AcKz&dj9y~l(eM(0Wv?VYHWOo-u
zZeSU(tYE1jFb|_JhNFk83e>QnM{o`MdQlfga0cLif{C}&lON#5mjX9~y}RZ5S?ud2
y3U0w|ToJefbJ!0v%wNDTcL75c7Llg{ci|q6KF*eKq}Z0R0X)K1Ll0K4J@^U0mbv->

literal 0
HcmV?d00001

diff --git a/bin/src/main/java/de/dpunkt/myaktion/controller/Pages.class b/bin/src/main/java/de/dpunkt/myaktion/controller/Pages.class
new file mode 100644
index 0000000000000000000000000000000000000000..8f57b945cb4a1a75a73b833d27977b208d910158
GIT binary patch
literal 1195
zcmd5+O>fgc5S?w)CUMiI6bh8jZTU(swh){EAysLLBITnZp;AxP#@?pe+Pl{7x}v`f
z2_(34<Od;Uou)BDLgL0{?B{)YGy7)7-+zAo3IH!*y9{##o*Nwo2@^6nW#=r2co3zT
zJhMS^!OpBuG6<ElTE#Kf!9E*vQ-%_O)tntOIS%@xQyy9ZE1mXWc+}kK?(ekU^#%mi
zIy2J1Y9Yt32`o32G?qzwz~YQopo*VjVQiBnDHCI95Vv;QGocF92-J8at|+LSGj{vE
zongD*JKF2N?^d9WRXN(OlFSvpr*tx{YDyhcVC^#Dl!ggw`El#0+wZjwE3i&rDRLsb
zt0cc5u=qwuVc!y%Z)_hBC^c2Y%W#K4eRjc?)=F349w9$INX?Ck&v`^cm82rh%b}@O
zqnIb=74@pa6HX%@#!MqAW#JhbOSdBKPt5nH=KC}Aw`ioep;B3zFdLpwiyHi6iryDB
zu${hZr|(Mh|E}m&+esRWP*`fRlxr*(d!w_^DorPCZERCvXeJ|mEF|VR#uI#JS!|1J
zpLR22-3hWNldiCda6!_mPNsl{OuB1~IK48;D$1z6Ncn$B@?ZlV)ZivOB(UE2bFAG|
z)H`_fUY3lw9x`mSn|~Fu_<(8Q@a4ynJrOu^FFOCccep&>KxI1Qd&0?k`8MW#F2l3m
zR&wGq4t7@<gL^kbV-0KqPB5<i0^Vi;77>*Z%|QjRSHMe%mkW3W@oE8ILwvn}Z=e!E
zb8cb0o&Q?q@eRQH0vm^GcR#`XZ+RYy(PedU6Ju?{f-QK2Xbv9d@d-5WS;DiYzW`C?
BQ5FCI

literal 0
HcmV?d00001

diff --git a/bin/src/main/java/de/dpunkt/myaktion/data/CampaignListProducer.class b/bin/src/main/java/de/dpunkt/myaktion/data/CampaignListProducer.class
new file mode 100644
index 0000000000000000000000000000000000000000..8d832d75f2b4e3af716427764f18f80db14965c3
GIT binary patch
literal 3902
zcmeHKQEwbI5FRJj?A?-*Hf?}Xpl&E|DeY~Mcxs|bRa(@bOF&#2sgKU?<j%cad*$_>
z8u%^z1D-(w3EufnAjW%HHBm2|g|<BPVfWU)&!5NRna|@t|NixN0QeHV2w;K1{ldgi
zCZvj<i;0L5jFP-mV;g11Vr->WQ6j8}wndf;IaGaF*l&$a${0-mEe4mWVX08V=$pgm
z7+dNp&`6OUpebnl)15~Q*w+j$ZfjLoq3nT3OT6&cWdDi!@$pX#I`Ij4!C<NHX4s_8
z0nH|CX^_Ec)w$KLjo5rZfTb;|q<z3(vAc1=ptY?N3}BVP%1etL8>3AduCm~Vr^;ZV
z(+MU#)>$r7;TFepqYqQeiu*k5?2nKq7^lJzC>QZq43V!V*qeH!S9_%AJhILcjRjZQ
z@=Vxx#4U}+7dd(0^l0*K&w01!jOv}oHJw{#xi*$pNU3=&lw&_cUR(Yuth6$16!^l2
zZ7wLmc{HyPF~Gvb-5}Pv+w51o$gSpr+v6O=&YsBTVg^+-%kKpR${acuyK^9Q49|h>
zWO*uMX?aoRXeeYUbxavsZTK|Jx*J>;yi^GuNrg#|@0K(-1z<HSJ?2tP^ccCI7#f{r
z2s_Q$>2fARJJRH7gTmsjj>q*H3o`P^=&Z^O=Wt&Cb6Q3yypKpK+_tzJ$|P-{8de*`
z9j-}pn_GBuOpi3_oYSIz4^>atz>;Vd=W<O1Nizj<*m)Sox>WPR)pJ%)Si{D7?186Y
zeW}Knc<|K$e6EA1y5b4*+XGKBPgrw{^mSSYm*JgdcpKhju-5IrJe~*EP^NFX<9mh3
zaIee`(d@hUbceo<sfaj<*OShc9Z9MZw)+3QYN66$d5E_57O}Ov8+Fxj_2lzRt<eU~
z;Af8lqDj{_bdWH(GDDZ!@G)E5`(Ib&nTVdShK0m)R!>;N#(6}Qr(wPc+o_Y|jmo*=
z!|!Nd5Ds){V*E-v`MOs7&~0CRW2$Ze46c7i2d~U<M@?iQN$noGO1~-sNRC$eXDV3I
ztDs-isr0qBqg*LSl&I_ziAI=sbR59vq+<1i0o<kQkefDuh{W!6{YuT<X??X%<yZkX
zf$mRq8(e_*;Q}mCE2vs+>Iva3YA;vqi-cmN;4AdLRNWq38zB4*E<ann@(Zl}QQ_XB
zw_|bdYxG{8qKN%EwHSN=9}@GF^P?F|H)b&1p2>7`4%7M!rh7A(T5yXjTYyjCQ~C|*
Y>ofZ8(z8Jiz&(0GXu)l`13g&$2WOz@bN~PV

literal 0
HcmV?d00001

diff --git a/bin/src/main/java/de/dpunkt/myaktion/data/CampaignProducer$Mode.class b/bin/src/main/java/de/dpunkt/myaktion/data/CampaignProducer$Mode.class
new file mode 100644
index 0000000000000000000000000000000000000000..4ef4b260264a2aea455e6609b7ee576882708bb0
GIT binary patch
literal 1848
zcmeHIO>fgM7=FE#b<N5;1{-XASrdm%LJ0@NfdLxYhN#pHq?Sn>UB_*`C3di#Y2}Y0
z0fIX}3h_FjTBQ|+U`Gy#WBc*@`Q-7p?;pPaz(crOg((7?*6=80QbmXCm_@OO;w)E3
zE=q^&$VsiDm^l`0vovF}uU;D+=UkY3dpZ_Xs1R5v&LvFsqgUNS!5x9h?oP8q;A!h0
zY;O{ne!jCqVCIQb(mf-vyxux>)pkaz{$_LI0NrgDvD67PP64~dXfq4*r1JTVGQ#TQ
zSj3d;G?NMQdC|=1ZX#0qm<F}ZKu|Z#1oZ|&pG>%`@|1F>ly<Z$=*UD!n~q9LrHZA&
zY?C2w^@I_Mqy3)IDbC;JxEIrqC(K&flZmhseUw>TxR+R<V;?}q_z~+1x)zJDY->1b
zYv|j$Mq@23^(m&z@d0&M2XT^NUgM{+jiIMVSXAd%w#p1;nrY+8I!ZkuwKK4j3jxJq
zqM5d^7MtDXI>U_4wv#$dS<(8Sw$IXYG0ikfB$tlbJQD`_q^vVJciPaB{p%Z^9l44{
zPbxIm!yWu)dE&;=A>GTZ^E-&5O!=yphQ~|>wYD&lCGtH(rk)f1ZzA(lUN5<JABpQO
zG{liIoD<%EnAe{%w*6T_0+@q^I?Tcq0!tGF(Cc5Lg&f+?)2=WbPZR=+EzMbSz>qvR
z|G8Lk18E5aZJiq~UZ5zU$x##|T`zudTyHARLus8*?xhrl89o>is5g}oX4}h}uvJ(k
z@aXR}9#y-%L2eV6A5(2)Dtg(I_}8j_2Nl_FJpjB4@Wz_jT7gS21At@IkGMXCm8szv
z6gS#*feSvt+}p*=AE5EopMphv&mhL*uj0F2d<Sr?uu*}f0<{d+aRj)5Pk;ylD{ymb
M74G1?g0ovc02Mw|$p8QV

literal 0
HcmV?d00001

diff --git a/bin/src/main/java/de/dpunkt/myaktion/data/CampaignProducer.class b/bin/src/main/java/de/dpunkt/myaktion/data/CampaignProducer.class
new file mode 100644
index 0000000000000000000000000000000000000000..3e85a4d05b3bec8f8f9a09f7d3f2b0eea3228324
GIT binary patch
literal 2683
zcmeHJTW=gS82y|k-OZ3RZA!SbT->zK4K1?;La7KKsu09hn}WJ&BzSXXyc;(&p27A+
z4S$9g{sR&qka*;o-@wm69M5F5TV>jml1CoA<LmMHE<WG>@%K-^645Gs(4r|uH?4`f
zsZhH6K<tZdEW2@D=snj>55%5RneN8IiSD{cbD>81E0e`VBu$H^8J#VUBtnn6U+z4R
zk;9agMu}uw8jG{{d!I34cNopDXWBZU-L^;yIrG=|cmBM0`S%|fwWC8|MnS*6WR1~u
zn#GdQ$NguccV!dD0dx8zrIq`H(W%bLHc;0w-J(TC3uEdV#$={V&$H=Y?rS4$mh8)z
zM_HPyM0gMI++;h6Oznp}nBCfy+#TeSdw|f}9&YF&<&n@jb9_hg8Y1L9$Cc$u$I8Gt
z$pMyz(nuWve`vB4<8KSB#XO7>VJ#o3MB2tX2F@rwI`La#iHkjfTts_fB>8eI!zuy7
zIsrnT0Lwhiq~+ekRJdrDJNQ99%wgB$X+$gZ$rP5}c^p<{p-S`2xXO<zYcTD|wudLO
zDVB{e18IHA4x%iFMMuNQUB*Qj`e631NRQpqOY=lU%5hud(jcGk08A0N%<$^5bXI(J
z6grker2#j@3i_f*+~n?%Zx+`173|_dd#_i(6Oh5|pnP}gJAq6+hW!(m`Bd&yxpp0i
z>rRwn{k)H%_y0DpKNH#ZbPfsV9KA3{XXr&nOP&5$->Pt~dHq}HBZux5>5ep8K2aDg
z_Ol3bEg;$$A5KoYU1b^FdPebu?w%h>H;_rG4mEv7bDfp3#<%HpM)^}HZhihl(gxIQ
z6Seuyn3?y~tg^S`*jJIVc6`&OHyB-dGFy}fI5amhhos_kO&oU~PHx1?jc0>FR+vbB
z4$()*>iN3DmJ-V7;=MvUmCBypS5_fLw|$){>k>k=(0@d>;Q3a+6eskSdfF?5vQBFE
zg_1^?X!ih7=xHs@x-U4=w&(_<wf|6LQB=K`TJ#=@d2K_B-p4(Yl7!)=g23w07K*2(
zO9a2-Z^$XSKr?h2qZUR})J6;Fxw1b;^Z5F;Gqix;vly-71j9G@na+K^c>YIP`mNmi
z(&0|R>dWZQRl9(G5hF&g(5v`8itt(k!qr9uUUIGxrhr;;XhOKwh_FnT8#!EQ;Bcc6
z;mybRp^3w4Bf`~xVa2Tmgc<6<@+n%Ox4Z|?yN2&|w71cSLbL!@cG2GX^a9<)xQ&>-
H>m&CMJedbK

literal 0
HcmV?d00001

diff --git a/bin/src/main/java/de/dpunkt/myaktion/model/Account.class b/bin/src/main/java/de/dpunkt/myaktion/model/Account.class
new file mode 100644
index 0000000000000000000000000000000000000000..dfe9a53daa28b1269b05072fbf8f60c46b818ebf
GIT binary patch
literal 2289
zcmeH|TW`}a6vt1x(o1ORC>wW}*D=&ekbndaT!aJ&B&4!EtW4t3b==NtVponku}_8s
z61?-F5XVWn3k^~$O?%?S*W-VF=fwK^*Y9sX0N@GSFGIlrFV@VDsF40XJ)nNT{a`$i
zBjZPhbYz5*exw2(`mY&N6KTp&bYM9N4XGUZ+x>mci~~hUBkn-6d%U${w2;FW4!Cx2
zd+>(J5eAArl@63%3MtGh2bS8MU0i*OA1OoKfyS}GJFS(jK*K3+e3F{SDm>r;VJaGn
zkXke{)~X-!D1J`dYHyE|fU}Tl3>s55qC-wv0r%2;ylFmOl23~SipNAMLn3O}9x-^F
ze;H#kCy!%sJX;*kQhEOrbE|2xgi&cF`<xu{8bv5Ehhu)0K{i>YWNh?=8Kp_~ciJh&
z19H0WAkBd5m>`SIGZJx(zb2u|LeCOzu3G$^L3)we9U@{fkpUkF$%AvJnhX7Z(0O0?
zc`EKg4KCN93QY%A+p|7oZKl!1TeUTb`ds%YI)^nZ#b~%owXpMSv1s;0?7*Y$V%~^W
z_blhbvnaDG7Op(xW-D>gm3C(~qyo1b2<I@ud5SgH4@9JRid4_wrZ!&BcBXR+{~>X9
zdnO&ZJ8GgCe=lsIYneqQPFjY0r(Tg18G}Bi&eTJ@jA0${dBCS?2?}rlN;oP&IqNG)
zU%`kfxY%Ayp0p(#0l43x_PKfKD=hy^&RoH^l<bsX1;@2C3RdAN&aA>UY^MrETw7G(
zI@~y+aLjNshhaUJ;Wji+C=`wu@)S06749s+(8*P}y8y$(T!pm-7#`;;kOdf?<|q{K
P*4TT}f=%p;SksL^rdD4m

literal 0
HcmV?d00001

diff --git a/bin/src/main/java/de/dpunkt/myaktion/model/Campaign.class b/bin/src/main/java/de/dpunkt/myaktion/model/Campaign.class
new file mode 100644
index 0000000000000000000000000000000000000000..472d6ce0793c7aad9619c2d80e9ac9080f2e20f8
GIT binary patch
literal 4151
zcmeHJZFAf-5MCe2y|`DdO`GyoKut@zYvJ6cq0l6xq)7v5opgqT%+PO&E$-CVmdBPe
z<d-o6Gw_`s#jujkxx0yIe4U$q;)^Xyt7jkWdbQ8r|NQ<Z04%|a8dNNB(!_H@$|L6$
zJ*JM&96!#YBk6=E^hk0MIic`b;B3$^ro0!`V8((=+BTq3&v|k9ih0t4nTUqWf;o4%
zv?miD^;RrsN}BYTTn|MSp=sUS6xm_GaHZvoh$=5TJmO&%A^_D^n`)l<dt!?w7SyQc
z<$LeBCHb!BJJ3gk`xaDPS7<Jc!ego@c`DJQv4<z4GE49Tk6afgSIhd*MDYMCYlu@_
z#bd}d3*KpW4lpJg7`hs~hvytd<!O?Lqz)fgv;3zhVW|j?nNK_s#yrrWAaNovI$^p@
z?8bhd5ubShP0%Q&-VyCFvf#6Bo~3S)rLNA>0`Ub)NhBl*sr33p;&%3Hj2Rl;jv?%-
zly?=Y?tg;i-gy{{L=tV9Ngfc7M#{k<BL#cAk*C_QM5G{;$dj1ajXdjb%}6Eu9A_%i
z=a_7Valkz;Nt(qh!8}E&OfpZ3gyg?|yF++NvdCw@@QC?cvXdbw23>CpP6&^V#StSE
zgVrBMC>gg>!JVGbTTave?xt86W&ZgRWicI-^NXuQ{Y}NhhHLOq6RyB@3+CHrTa>!2
zTP~LGZWbQ0WS`>wt9qI6XmCIiuD%D8GqTUIb=)u8ABw(--Jym(a94N9tL@HN5_Py`
zK~SP6Os&+BQd&@IA-VmrHf<xxL8GoiryRAZ6*J}osf`o5&@T9>e9a-@qWKQh18zDq
zIe)4>^wO!Sm`CGWlZ?;X%DxaBix`CoB}W||Sa9R@iNxM+fvpG>jvllp^`oLNixAtW
zZyN1f;B*e^@W_Jx>%D7fF_pUl8DO*&gE|Ikps|`Gsli&&E4k2GQATeluj=q!$%9Sf
z;z89q@-N{jRD{(bRMc1V@tcT5wcXwmS>mxRu5Ou&#SNj=SPi~M8JU++4YpB3DyKDg
zu10t**I;K%e&=@qlHK8HifVfwl~xKj03|4jd{p=_3soFda9r2##^7xa-WQ;$=P$y$
z`rU#{xcjmm&p`{vSKul>=W%8UQ7wGif55e$=idJfKKx7DeT>hlUa7(-IBw=v@F@`d
z!eW30e4a(PX+XGbMEDG@k04YKHRoVLxMM`P4WEx73{TNEaOfHl?!es<gdqnL!lDu3
ziwQV9G$MRC0f%KHLU#fVYeocT0uE1%2>0OrNF;~3STy8f%ZRW9UyUFPb74YwW<+=h
zUmFp=F>u&5A}qto2*U6bCWIf22&?cdR%TvnYlixGY~XTWL|TU@r$`&8NW-|8kX{;)
XDzJ&QRe`6lt7;5pU<-bLXW;$|YF$Q?

literal 0
HcmV?d00001

diff --git a/bin/src/main/java/de/dpunkt/myaktion/model/Donation$Status.class b/bin/src/main/java/de/dpunkt/myaktion/model/Donation$Status.class
new file mode 100644
index 0000000000000000000000000000000000000000..942f08992d2d41687b398220a8f826f67b182683
GIT binary patch
literal 1561
zcmcgsT~8B16ukqL(ruxLg5nnw;sYdRHzvjyF$Se2HYs4*O5&55?hbV5?#yOpme@b!
zUog=`-~Ca>J6kFxQK`o8u=BBd?mc(T&OP70fBFIdk6^V3Qv@Cx9R>*#GB{=@EQojz
zrJ3y8AQ`Z}6-ow)ig+B<lw@vuzipY#Oc4qM7V?mo$)jMud(1;ipxkM_*lX|9TdjJH
zz?0^`W#1&=HTK@UZtZW^+ie0f&x92AIf3Q%<{4+(Y9Ws{8yg1%3fov^5h?_#XMnoa
zO3%VPnf~xbYHn0~!Xp~0Bo%Rf7@BI;jd^08Qm@qMaT@V3W*R{$3;XPd)3u2ELqYtJ
zAbu{$8jTb;R4PjoX2Tw}7|!3PsKR(Sp5J%s`mQSfx5>OxO=VaK4ViQ)yPW>4*DA`W
z9i-eV4NrUl=%rFIXYvA6BS~Ws3QJ9va*d)$V|5l<rD<Je$@-A$0Tt42P+@2$BYr3(
zp6w7JxMo>w$HRQOn;GlAAc`VCiZNsu%k7o^z&pG{>*wiC(~gqG1FYyo^&Nvk$<I|j
zp^6hp{r^A{{j^I4O?F2v9pyn87Ai0cR|zcrqSaleSDSdh_OhhQb%$Zg5Lj%gki`c~
z3%5UgS+G4}&_>!S(;?px4mdY5vAi3Rq9NVg6vlFCUkR?64toOvm4=jDZ^z6Sj!t)r
zK=7A7hL$z*$-4yR$1DkZ3ki0GG3Z?#>}s?15C}}8B~NXwz!jJQz`5vVd_RR^lyLTP
z%bw10-e)MkU7Y&})vqoJ7IB<Gj2o}vSjpEOT+ee9U@1o}!wsAPZsOx1g1`#gMy7kX
IFW~OZ4<=OW^#A|>

literal 0
HcmV?d00001

diff --git a/bin/src/main/java/de/dpunkt/myaktion/model/Donation.class b/bin/src/main/java/de/dpunkt/myaktion/model/Donation.class
new file mode 100644
index 0000000000000000000000000000000000000000..b68f89894d2b81abb326868d781b7b9d9af05993
GIT binary patch
literal 3246
zcmchZZFAH%5XV=S^nB+WO-P`HKB1&Q9ZGEoX-X5Ck|$>9956!yGkvMpA~CTg*OoKQ
z7wT8&Ogq!Q?}zGiWuLJ#QG>~3cyX3=Uj6m+YPG9>{{7=G09b@A3pxb6EcLyZg~EHy
z4w)BlFGzB6puG5q9jH(WFO~t1yiF;X9$GL?V5+c<nAr24?Y`!|BG6^A%msFO!%dm*
zMtp@pKafJEPg%?fOb_ch+bRvk9vV!g+~;AUp7URFo+%#SoZ-5Z5oZElcQeIQo)Ne|
zd`HUb+r>=Ou$b?cV0YSztd%n~z=KePYL&p4Gyjsn_y)Sdf*Asn^~Y?bsZ4utnT-AR
zLZm#C(IF40FXJSP3XjnwmFSN+Tc&n@XP?u6`w>ggC}I8q+v9XD;BM)4xAMAMczuor
zl4n#%MPsJ?eX4Le|2096H>aa>T)l;^rgHyR%<h*vLwzQ+<SwUgc$K7#s-uM4{c?BS
zVl>*Mw^%)nlPL5<MYBBNDLO@DD$RW*Q@SPc*eRE~O+%sPX_(Pm1pHMf@Y`OY3HDhY
zspd47KFKqs-=Gy`LOY{ep`mT}Pg%E&SLgV0BiTwUIzpmDd7xL2=<;LaExp*v)#qo_
zYSZ4cQM(v<?^ZTU!^Z=dgewFtJ15hUKIxM~jIXD8yvx%ahKE<@FX^-BB}+p+9{oA4
z_CrihciU!`Dv4rh>F;s1HcFYcGhZdm9#8^Ni$rp6p@S${jWXd>B-#xFghb{lhhIX@
zI`Ng!w9<o{?TF7U`j88W8(cGp`TRsBnLygAmh|9j0-}Xm&oLSa%pm4Tu7UFgOZ!*{
zLRqZ{EF<z6D_sxn5|};x3$Xx|yIrlf;+%CkO>XNDuBz)od-S@#+B)(og?p`GDuDuG
zTjr_HABFmmUZ@UOQ3)|l9t*+KjfiC#&n$RAVCih`#j8N+GYfviJH;qUELg)A<w>+)
z<Ji5ZjCMqL5@s3Rc6P9~W-tqQm%!WC2hhP^7keGBpjWhgu#0vA21R=TKE!qcXH3Er
zJ}=^E5oZ%@?LT4q=jlto!$*G?wpa1lE#7qD6YLL4EBF*X!x4ec;R}48RJdkPxM@_F
zg}H`82USZ3lfo^d!k2Kpp-_Lt4FiK~RQL+6G!$wElfr^g!GZaPLd|f?z_4UgxDDSl
z6lw;O!m?4p1+Sq{Gu$yStQr*-;9f(aW-uwN8x<De+lIpF43CToOYmJo;dF+d3<_g#
fA7iKk-@~$wCDdBM-wzM3!X}P;80V|-5Z3<#mAh!P

literal 0
HcmV?d00001

diff --git a/bin/src/main/resources/messages_de.properties b/bin/src/main/resources/messages_de.properties
new file mode 100644
index 0000000..07544ff
--- /dev/null
+++ b/bin/src/main/resources/messages_de.properties
@@ -0,0 +1,66 @@
+# index.xhtml
+welcome.title= Workshop Java EE 7
+welcome.text=Java EE 7: Willkommen zu unserem Workshop!
+
+# listCampaigns.xhtml
+listCampaigns.my_campaigns=Meine Aktionen
+listCampaigns.name=Name
+listCampaigns.target_amount=Spendenziel
+listCampaigns.donated_so_far=bisher gespendet
+listCampaigns.edit=Editieren
+listCampaigns.list_donations=Spendenliste
+listCampaigns.form=Formular
+listCampaigns.add_campaign=Aktion hinzufügen
+
+# editCampaign.xhtml
+editCampaign.add_new_campaign=Neue Aktion anlegen
+editCampaign.edit_campaign=Aktionsdaten editieren
+editCampaign.general=Allgemein
+editCampaign.name=Name
+editCampaign.campaign_name_validation=Der Name einer Aktion muss min. 4 und darf max. 30 Zeichen lang sein.
+editCampaign.name_of_the_campaign=Name der Spendenaktion
+editCampaign.target_amount=Spendenziel
+editCampaign.target_amount_validation=Das Spendenziel für die Aktion muss min. 10 Euro sein.
+editCampaign.donation_amount=Spendenbetrag
+editCampaign.donation_amount_validation=Der Spendenbetrag muss min. 1 Euro sein.
+editCampaign.bank_account=Bankverbindung
+editCampaign.iban=IBAN
+editCampaign.name_of_bank=Name der Bank
+editCampaign.save=Speichern
+editCampaign.cancel=Abbrechen
+
+# listDonations.xhtml
+listDonations.donation_list=Spenderliste
+listDonations.beneficiary_account=Empfängerkonto
+listDonations.iban=IBAN
+listDonations.name=Name
+listDonations.name_of_bank=Name der Bank
+listDonations.donation_amount=Spendenbetrag
+listDonations.receipt=Quittung
+listDonations.yes=ja
+listDonations.no=nein
+listDonations.status=Status
+listDonations.status.TRANSFERRED=überwiesen
+listDonations.status.IN_PROCESS=in Bearbeitung
+
+# editDonationForm.xhtml
+editDonationForm.edit_donation_form=Spendenformular bearbeiten
+editDonationForm.background_color=Hintergrundfarbe
+editDonationForm.text_color=Textfarbe
+editDonationForm.form_url=URL des Formulars
+editDonationForm.update_url=Aktualisieren der URL
+
+# donateMoney.xhtml
+donateMoney.donate_money=Geld spenden
+donateMoney.name=Name
+donateMoney.iban=IBAN
+donateMoney.name_of_bank=Name der Bank
+donateMoney.donation_amount=Spendenbetrag
+donateMoney.i_want_a_receipt=Ja, ich möchte eine Spendenquittung
+donateMoney.donate=Spenden
+donateMoney.thank_you=Vielen Dank für die Spende!
+
+listCampaigns.ask_delete_campaign=Aktion wirklich löschen?
+listCampaigns.delete_campaign=Aktion löschen
+listCampaigns.yes=Ja
+listCampaigns.no=Nein
\ No newline at end of file
diff --git a/bin/src/main/resources/messages_en.properties b/bin/src/main/resources/messages_en.properties
new file mode 100644
index 0000000..5df0b5a
--- /dev/null
+++ b/bin/src/main/resources/messages_en.properties
@@ -0,0 +1,66 @@
+# index.xhtml
+welcome.title=Workshop Java EE 7
+welcome.text=Java EE 7: Welcome to our Workshop!
+
+# listCampaigns.xhtml
+listCampaigns.my_campaigns=My campaigns
+listCampaigns.name=Name
+listCampaigns.target_amount=Target amount
+listCampaigns.donated_so_far=Donated so far
+listCampaigns.edit=Edit
+listCampaigns.list_donations=List donations
+listCampaigns.form=Form
+listCampaigns.add_campaign=Add campaign
+
+# editCampaign.xhtml
+editCampaign.add_new_campaign=Add a new campaign
+editCampaign.edit_campaign=Edit campaign
+editCampaign.general=General
+editCampaign.name=Name
+editCampaign.campaign_name_validation=The name of a campaign must be at least 4 and max. 30 characters long.
+editCampaign.name_of_the_campaign=Name of the campaign
+editCampaign.target_amount=Target amount
+editCampaign.target_amount_validation=The target amount for the campaign must be at least 10 Euro.
+editCampaign.donation_amount=Donation amount
+editCampaign.donation_amount_validation=The donation amount must be at least 1 Euro.
+editCampaign.bank_account=Bank account
+editCampaign.iban=IBAN
+editCampaign.name_of_bank=Name of Bank
+editCampaign.save=Save
+editCampaign.cancel=Cancel
+
+# listDonations.xhtml
+listDonations.donation_list=List of donations
+listDonations.beneficiary_account=Beneficiary account
+listDonations.iban=IBAN
+listDonations.name=Name
+listDonations.name_of_bank=Name of Bank
+listDonations.donation_amount=Donation amount
+listDonations.receipt=Receipt
+listDonations.yes=yes
+listDonations.no=no
+listDonations.status=Status
+listDonations.status.TRANSFERRED=transferred
+listDonations.status.IN_PROCESS=in process
+
+# editDonationForm.xhtml
+editDonationForm.edit_donation_form=Edit donation form
+editDonationForm.background_color=Background color
+editDonationForm.text_color=Text color
+editDonationForm.form_url=Form URL
+editDonationForm.update_url=Update URL
+
+# donateMoney.xhtml
+donateMoney.donate_money=Donate money
+donateMoney.name=Name
+donateMoney.iban=IBAN
+donateMoney.name_of_bank=Name of bank
+donateMoney.donation_amount=Donation amount
+donateMoney.i_want_a_receipt=Yes, I would like a donation receipt
+donateMoney.donate=Donate
+donateMoney.thank_you=Thank you for your donation!
+
+listCampaigns.ask_delete_campaign=Really delete campaign?
+listCampaigns.delete_campaign=Delete campaign
+listCampaigns.yes=Yes
+listCampaigns.no=No
\ No newline at end of file
diff --git a/bin/src/main/webapp/WEB-INF/beans.xml b/bin/src/main/webapp/WEB-INF/beans.xml
new file mode 100644
index 0000000..51e8caf
--- /dev/null
+++ b/bin/src/main/webapp/WEB-INF/beans.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_2_0.xsd"
+       bean-discovery-mode="all" version="2.0">
+</beans>
\ No newline at end of file
diff --git a/bin/src/main/webapp/WEB-INF/faces-config.xml b/bin/src/main/webapp/WEB-INF/faces-config.xml
new file mode 100644
index 0000000..c5fd527
--- /dev/null
+++ b/bin/src/main/webapp/WEB-INF/faces-config.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<faces-config version="2.3"
+	xmlns="http://xmlns.jcp.org/xml/ns/javaee"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
+            http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_3.xsd">
+	<application>
+		<locale-config>
+			<default-locale>de</default-locale>
+			<supported-locale>en</supported-locale>
+			<supported-locale>de</supported-locale>
+		</locale-config>
+		<resource-bundle>
+			<base-name>messages</base-name>
+			<var>msg</var>
+		</resource-bundle>
+	</application>
+</faces-config>
\ No newline at end of file
diff --git a/bin/src/main/webapp/contracts/de/screen.css b/bin/src/main/webapp/contracts/de/screen.css
new file mode 100644
index 0000000..fd7253d
--- /dev/null
+++ b/bin/src/main/webapp/contracts/de/screen.css
@@ -0,0 +1,35 @@
+body {
+	margin: 0;
+	padding: 0;
+	background-color: #EAECEE;
+	font-family: Verdana, sans-serif;
+	font-size: 0.9em;
+}
+
+#container {
+	margin: 0 auto;
+	padding: 0 20px 10px 20px;
+	border: 1px solid #666666;
+	width: 865px;
+	padding-top: 10px;
+}
+
+#header {
+	font-size: 1.3em;
+	border: 1px solid #666666;
+	background: #EAECEE;
+	padding: 0 15px 5px 15px;
+	margin-bottom: 50px;
+}
+
+#footer {
+	clear: both;
+	text-align: center;
+	color: #666666;
+	font-size: 0.85em;
+	padding: 3em 0 0 0;
+}
+
+h2 {
+	font-size: 1.2em;
+}
\ No newline at end of file
diff --git a/bin/src/main/webapp/contracts/de/template.xhtml b/bin/src/main/webapp/contracts/de/template.xhtml
new file mode 100644
index 0000000..17cdc03
--- /dev/null
+++ b/bin/src/main/webapp/contracts/de/template.xhtml
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml"
+    xmlns:h="http://xmlns.jcp.org/jsf/html"
+    xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
+<h:head>
+    <title>My-Aktion</title>
+    <meta charset="utf-8" />
+    <h:outputStylesheet name="/screen.css" />
+</h:head>
+<h:body>
+    <div id="container">
+        <div id="header">
+            <p>
+                Beispielanwendung <b>My-Aktion</b> – Workshop Java EE 7
+            </p>
+        </div>
+        <div id="content">
+            <ui:insert name="content">
+                [Template content will be inserted here]
+            </ui:insert>
+        </div>
+        <div id="footer">
+            <p>(C) 2013-2014 dpunkt.verlag GmbH, MIT Lizenz</p>
+        </div>
+    </div>
+</h:body>
+</html>
\ No newline at end of file
diff --git a/bin/src/main/webapp/contracts/en/screen.css b/bin/src/main/webapp/contracts/en/screen.css
new file mode 100644
index 0000000..fd7253d
--- /dev/null
+++ b/bin/src/main/webapp/contracts/en/screen.css
@@ -0,0 +1,35 @@
+body {
+	margin: 0;
+	padding: 0;
+	background-color: #EAECEE;
+	font-family: Verdana, sans-serif;
+	font-size: 0.9em;
+}
+
+#container {
+	margin: 0 auto;
+	padding: 0 20px 10px 20px;
+	border: 1px solid #666666;
+	width: 865px;
+	padding-top: 10px;
+}
+
+#header {
+	font-size: 1.3em;
+	border: 1px solid #666666;
+	background: #EAECEE;
+	padding: 0 15px 5px 15px;
+	margin-bottom: 50px;
+}
+
+#footer {
+	clear: both;
+	text-align: center;
+	color: #666666;
+	font-size: 0.85em;
+	padding: 3em 0 0 0;
+}
+
+h2 {
+	font-size: 1.2em;
+}
\ No newline at end of file
diff --git a/bin/src/main/webapp/contracts/en/template.xhtml b/bin/src/main/webapp/contracts/en/template.xhtml
new file mode 100644
index 0000000..56e9c61
--- /dev/null
+++ b/bin/src/main/webapp/contracts/en/template.xhtml
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml"
+    xmlns:h="http://xmlns.jcp.org/jsf/html"
+    xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
+<h:head>
+    <title>My-Aktion</title>
+    <meta charset="utf-8" />
+    <h:outputStylesheet name="/screen.css" />
+</h:head>
+<h:body>
+    <div id="container">
+        <div id="header">
+            <p>
+                Example application <b>My-Aktion</b> – Workshop Java EE 7
+            </p>
+        </div>
+        <div id="content">
+            <ui:insert name="content">
+                [Template content will be inserted here]
+            </ui:insert>
+        </div>
+        <div id="footer">
+            <p>(C) 2013-2014 dpunkt.verlag GmbH, MIT license</p>
+        </div>
+    </div>
+</h:body>
+</html>
\ No newline at end of file
diff --git a/bin/src/main/webapp/donateMoney.xhtml b/bin/src/main/webapp/donateMoney.xhtml
new file mode 100644
index 0000000..000a55a
--- /dev/null
+++ b/bin/src/main/webapp/donateMoney.xhtml
@@ -0,0 +1,74 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml"
+    xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
+    xmlns:f="http://xmlns.jcp.org/jsf/core"
+    xmlns:p="http://primefaces.org/ui"
+    xmlns:h="http://xmlns.jcp.org/jsf/html">
+<h:head>
+    <title>#{msg['donateMoney.donate_money']}</title>
+    <meta charset="utf-8" />
+    <f:metadata>
+        <f:viewParam id="bgColor" name="bgColor"
+            value="#{donateMoneyController.bgColor}">
+            <f:validateRegex pattern="[A-Fa-f0-9]{6}" />
+        </f:viewParam>
+        <f:viewParam id="textColor" name="textColor"
+            value="#{donateMoneyController.textColor}">
+            <f:validateRegex pattern="[A-Fa-f0-9]{6}" />
+        </f:viewParam>
+        <f:viewParam id="campaignId" name="campaignId"
+            converter="javax.faces.Long"
+            value="#{donateMoneyController.campaignId}">
+        </f:viewParam>
+    </f:metadata>
+</h:head>
+<h:body style="margin:0; font-family: Verdana, sans-serif; font-size: 0.9em;
+        background-color: ##{donateMoneyController.bgColor}; 
+        color: ##{donateMoneyController.textColor}">
+    <h1>#{msg['donateMoney.donate_money']}</h1>
+    <p:messages globalOnly="true" />
+    <p:message for="bgColor" style="color: red;" />
+    <p:message for="textColor" style="color: red;" />
+    <p:message for="campaignId" style="color: red;" />
+    <h:form>
+        <h:panelGrid columns="3">
+            <h:outputLabel value="#{msg['donateMoney.name']}:">
+            </h:outputLabel>
+            <p:inputText id="name"
+                    value="#{donateMoneyController.donation.donorName}">
+                <f:validateRequired />
+            </p:inputText>
+            <p:message for="name" style="color: red;" />
+            <h:outputLabel value="#{msg['donateMoney.iban']}:">
+            </h:outputLabel>
+            <p:inputText id="iban"
+                    value="#{donateMoneyController.donation.account.iban}">
+                <f:validateRequired />
+            </p:inputText>
+            <p:message for="iban" style="color: red;" />
+            <h:outputLabel value="#{msg['donateMoney.name_of_bank']}:">
+            </h:outputLabel>
+            <p:inputText id="name_bank"
+                    value="#{donateMoneyController.donation.account.nameOfBank}">
+                <f:validateRequired />
+            </p:inputText>
+            <p:message for="name_bank" style="color: red;" />
+            <h:outputLabel value="#{msg['donateMoney.donation_amount']}:">
+            </h:outputLabel>
+            <h:panelGroup>
+                <p:inputText id="donationAmount"
+                        value="#{donateMoneyController.donation.amount}">
+                    <f:validateRequired />
+                    <f:convertNumber maxFractionDigits="2" minFractionDigits="2" />
+                </p:inputText> EUR
+            </h:panelGroup>
+            <p:message for="donationAmount" style="color: red;" />
+        </h:panelGrid>
+        <p:selectBooleanCheckbox
+                value="#{donateMoneyController.donation.receiptRequested}" /> 
+            #{msg['donateMoney.i_want_a_receipt']}<br />
+        <p:commandButton value="#{msg['donateMoney.donate']}" ajax="false"
+                action="#{donateMoneyController.doDonation}" />
+    </h:form>
+</h:body>
+</html>
\ No newline at end of file
diff --git a/bin/src/main/webapp/editCampaign.xhtml b/bin/src/main/webapp/editCampaign.xhtml
new file mode 100644
index 0000000..456c7ed
--- /dev/null
+++ b/bin/src/main/webapp/editCampaign.xhtml
@@ -0,0 +1,99 @@
+<html xmlns="http://www.w3.org/1999/xhtml"
+    xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
+    xmlns:f="http://xmlns.jcp.org/jsf/core" 
+    xmlns:p="http://primefaces.org/ui"
+    xmlns:h="http://xmlns.jcp.org/jsf/html">
+<body>
+    <f:view contracts="#{view.locale.language}">
+        <ui:composition template="/template.xhtml">
+            <ui:define name="content">
+                <h1>#{campaignProducer.addMode ?
+                    msg['editCampaign.add_new_campaign'] :
+                    msg['editCampaign.edit_campaign']}</h1>
+                <h:form>
+                    <p:messages closable="true" />
+                    <p:tabView id="tabView">
+                        <p:tab title="#{msg['editCampaign.general']}">
+                            <h:panelGrid columns="3">
+                                <h:outputLabel
+                                    value="#{msg['editCampaign.name']}:">
+                                </h:outputLabel>
+                                <p:inputText id="a_name"
+                                    value="#{campaignProducer.selectedCampaign.name}"
+                                    validatorMessage="#{msg['editCampaign.campaign_name_validation']}">
+                                    <f:passThroughAttribute name="placeholder"
+                                        value="#{msg['editCampaign.name_of_the_campaign']}" />
+                                    <f:validateRequired />
+                                    <f:validateLength minimum="4" maximum="30" />
+                                </p:inputText>
+                                <p:message for="a_name" />
+                                <h:outputLabel
+                                    value="#{msg['editCampaign.target_amount']}:">
+                                </h:outputLabel>
+                                <h:panelGroup>
+                                    <p:inputText id="a_targetAmount"
+                                        value="#{campaignProducer.selectedCampaign.targetAmount}"
+                                        validatorMessage="#{msg['editCampaign.target_amount_validation']}">
+                                        <f:convertNumber maxFractionDigits="2"
+                                            minFractionDigits="2" />
+                                        <f:validateRequired />
+                                        <f:validateDoubleRange minimum="10.0" />
+                                    </p:inputText> EUR
+                                </h:panelGroup>
+                                <p:message for="a_targetAmount" />
+                                <h:outputLabel
+                                    value="#{msg['editCampaign.donation_amount']}:">
+                                </h:outputLabel>
+                                <h:panelGroup>
+                                    <p:inputText id="a_donationMinimum"
+                                        value="#{campaignProducer.selectedCampaign.donationMinimum}"
+                                        validatorMessage="#{msg['editCampaign.donation_amount_validation']}">
+                                        <f:convertNumber maxFractionDigits="2"
+                                            minFractionDigits="2" />
+                                        <f:validateRequired />
+                                        <f:validateDoubleRange minimum="1.0" />
+                                    </p:inputText> EUR
+                                </h:panelGroup>
+                                <p:message for="a_donationMinimum" />
+                            </h:panelGrid>
+                        </p:tab>
+                        <p:tab title="#{msg['editCampaign.bank_account']}">
+                            <h:panelGrid columns="3">
+                                <h:outputLabel
+                                    value="#{msg['editCampaign.name']}:">
+                                </h:outputLabel>
+                                <p:inputText id="b_name"
+                                    value="#{campaignProducer.selectedCampaign.account.name}">
+                                    <f:validateRequired />
+                                </p:inputText>
+                                <p:message for="b_name" />
+                                <h:outputLabel
+                                    value="#{msg['editCampaign.iban']}:">
+                                </h:outputLabel>
+                                <p:inputText id="b_iban"
+                                    value="#{campaignProducer.selectedCampaign.account.iban}">
+                                    <f:validateRequired />
+                                </p:inputText>
+                                <p:message for="b_iban" />
+                                <h:outputLabel
+                                    value="#{msg['editCampaign.name_of_bank']}:">
+                                </h:outputLabel>
+                                <p:inputText id="b_name_bank"
+                                    value="#{campaignProducer.selectedCampaign.account.nameOfBank}">
+                                    <f:validateRequired />
+                                </p:inputText>
+                                <p:message for="b_name_bank" />
+                            </h:panelGrid>
+                        </p:tab>
+                    </p:tabView>
+                    <p:commandButton value="#{msg['editCampaign.save']}"
+                        ajax="false" action="#{editCampaignController.doSave}" />
+                    <p:commandButton value="#{msg['editCampaign.cancel']}"
+                        immediate="true" ajax="false"
+                        action="#{editCampaignController.doCancel}" />
+                </h:form>
+            </ui:define>
+        </ui:composition>
+    </f:view>
+</body>
+</html>
\ No newline at end of file
diff --git a/bin/src/main/webapp/editDonationForm.xhtml b/bin/src/main/webapp/editDonationForm.xhtml
new file mode 100644
index 0000000..78107ac
--- /dev/null
+++ b/bin/src/main/webapp/editDonationForm.xhtml
@@ -0,0 +1,41 @@
+<html xmlns="http://www.w3.org/1999/xhtml"
+    xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
+    xmlns:f="http://xmlns.jcp.org/jsf/core" xmlns:p="http://primefaces.org/ui"
+    xmlns:h="http://xmlns.jcp.org/jsf/html">
+<body>
+    <f:view contracts="#{view.locale.language}">
+        <ui:composition template="/template.xhtml">
+            <ui:define name="content">
+                <h1>#{msg['editDonationForm.edit_donation_form']}</h1>
+                <h:form>
+                    <h:panelGrid columns="2">
+                        <h:outputLabel
+                            value="#{msg['editDonationForm.background_color']}:">
+                        </h:outputLabel>
+                        <p:colorPicker id="bgColor"
+                            value="#{editDonationFormController.bgColor}"
+                            widgetVar="bgPicker">
+                        </p:colorPicker>
+                        <h:outputLabel
+                            value="#{msg['editDonationForm.text_color']}:">
+                        </h:outputLabel>
+                        <p:colorPicker id="textColor"
+                            value="#{editDonationFormController.textColor}"
+                            widgetVar="textPicker">
+                        </p:colorPicker>
+                        <h:outputLabel
+                            value="#{msg['editDonationForm.form_url']}:">
+                        </h:outputLabel>
+                        <p:inputTextarea id="url" rows="6" cols="30"
+                            readonly="true"
+                            value="#{editDonationFormController.url}" />
+                    </h:panelGrid>
+                    <p:commandButton value="#{msg['editDonationForm.update_url']}" update="url" />
+                    <p:commandButton value="OK"
+                        action="#{editDonationFormController.doOk}" ajax="false" />
+                </h:form>
+            </ui:define>
+        </ui:composition>
+    </f:view>
+</body>
+</html>
\ No newline at end of file
diff --git a/bin/src/main/webapp/index.html b/bin/src/main/webapp/index.html
new file mode 100644
index 0000000..7949e11
--- /dev/null
+++ b/bin/src/main/webapp/index.html
@@ -0,0 +1,5 @@
+<html>
+<head>
+    <meta http-equiv="Refresh" content="0; URL=listCampaigns.jsf">
+</head>
+</html>
\ No newline at end of file
diff --git a/bin/src/main/webapp/index.xhtml b/bin/src/main/webapp/index.xhtml
new file mode 100644
index 0000000..79287a7
--- /dev/null
+++ b/bin/src/main/webapp/index.xhtml
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml"
+    xmlns:f="http://xmlns.jcp.org/jsf/core"
+    xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
+<body>
+    <f:view contract="#{view.locale.language}">
+        <ui:composition template="/template.xhtml">
+            <ui:define name="content">            
+                <h1>#{msg['welcome.text']}</h1>
+            </ui:define>
+        </ui:composition>
+    </f:view>
+</body>
+</html>
\ No newline at end of file
diff --git a/bin/src/main/webapp/listCampaigns.xhtml b/bin/src/main/webapp/listCampaigns.xhtml
new file mode 100644
index 0000000..f1b4fcc
--- /dev/null
+++ b/bin/src/main/webapp/listCampaigns.xhtml
@@ -0,0 +1,79 @@
+<html xmlns="http://www.w3.org/1999/xhtml"
+    xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
+    xmlns:f="http://xmlns.jcp.org/jsf/core"
+    xmlns:p="http://primefaces.org/ui"
+    xmlns:h="http://xmlns.jcp.org/jsf/html">
+<body>
+    <f:view contracts="#{view.locale.language}">
+        <ui:composition template="/template.xhtml">
+            <ui:define name="content">           
+                <h1>#{msg['listCampaigns.my_campaigns']}</h1>
+                <h:form>
+                    <p:dataTable value="#{campaignListProducer.campaigns}"
+                            var="campaign">
+                        <p:column>
+                            <p:commandButton onclick="PF('confirmation').show()"
+                                    actionListener="#{listCampaignsController.doDeleteCampaign(campaign)}"
+                                    icon="ui-icon-close" />
+                        </p:column>
+                        <p:column>
+                            <f:facet name="header">
+                                #{msg['listCampaigns.name']}
+                            </f:facet>
+                            <h:outputText value="#{campaign.name}" />
+                        </p:column>
+                        <p:column>
+                            <f:facet name="header">
+                                #{msg['listCampaigns.target_amount']}
+                            </f:facet>
+                            <h:outputText value="#{campaign.targetAmount}">
+                                <f:convertNumber type="currency"
+                                        currencyCode="EUR" />
+                            </h:outputText>
+                        </p:column>
+                        <p:column>
+                            <f:facet name="header">
+                                #{msg['listCampaigns.donated_so_far']}
+                            </f:facet>
+                            <h:outputText value="#{campaign.amountDonatedSoFar}">
+                                <f:convertNumber type="currency"
+                                        currencyCode="EUR" />
+                            </h:outputText>
+                        </p:column>
+                        <p:column>
+                            <p:commandLink value="#{msg['listCampaigns.edit']}"
+                                    ajax="false"
+                                    action="#{listCampaignsController.doEditCampaign(campaign)}" />
+                        </p:column>
+                        <p:column>
+                            <p:commandLink
+                                    value="#{msg['listCampaigns.list_donations']}"
+                                    ajax="false"
+                                    action="#{listCampaignsController.doListDonations(campaign)}" />
+                        </p:column>
+                        <p:column>
+                            <p:commandLink value="#{msg['listCampaigns.form']}"
+                                    ajax="false"
+                                    action="#{listCampaignsController.doEditDonationForm(campaign)}" />
+                        </p:column>
+                    </p:dataTable>
+                    <p:commandButton
+                            value="#{msg['listCampaigns.add_campaign']}"
+                            ajax="false"
+                            action="#{listCampaignsController.doAddCampaign}" />
+                    <p:confirmDialog
+                            message="#{msg['listCampaigns.ask_delete_campaign']}"
+                            header="#{msg['listCampaigns.delete_campaign']}"
+                            severity="alert" widgetVar="confirmation">
+                        <p:commandButton value="#{msg['listCampaigns.yes']}"
+                                oncomplete="confirmation.hide()" ajax="false"
+                                actionListener="#{listCampaignsController.commitDeleteCampaign}" />
+                        <p:commandButton value="#{msg['listCampaigns.no']}"
+                                onclick="confirmation.hide()" />
+                    </p:confirmDialog>
+                </h:form>
+            </ui:define>
+        </ui:composition>
+    </f:view>
+</body>
+</html>
\ No newline at end of file
diff --git a/bin/src/main/webapp/listDonations.xhtml b/bin/src/main/webapp/listDonations.xhtml
new file mode 100644
index 0000000..768c1d4
--- /dev/null
+++ b/bin/src/main/webapp/listDonations.xhtml
@@ -0,0 +1,76 @@
+<html xmlns="http://www.w3.org/1999/xhtml"
+    xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
+    xmlns:f="http://xmlns.jcp.org/jsf/core"
+    xmlns:p="http://primefaces.org/ui"
+    xmlns:h="http://xmlns.jcp.org/jsf/html">
+<body>
+    <f:view contracts="#{view.locale.language}">
+        <ui:composition template="/template.xhtml">
+            <ui:define name="content">
+                <h1>#{msg['listDonations.donation_list']}
+                    '#{campaignProducer.selectedCampaign.name}'</h1>
+                <h2>#{msg['listDonations.beneficiary_account']}:
+                    #{campaignProducer.selectedCampaign.account.name},
+                    #{msg['listDonations.iban']}:
+                    #{campaignProducer.selectedCampaign.account.iban},
+                    #{campaignProducer .selectedCampaign.account.nameOfBank}</h2>
+                <h:form>
+                    <p:dataTable value="#{campaignProducer.selectedCampaign.donations}"
+                            var="donation">
+                        <p:column>
+                            <f:facet name="header">
+                                #{msg['listDonations.name']}
+                            </f:facet>
+                            <h:outputText value="#{donation.donorName}" />
+                        </p:column>
+                        <p:column>
+                            <f:facet name="header">
+                                #{msg['listDonations.iban']}
+                            </f:facet>
+                            <h:outputText value="#{donation.account.iban}" />
+                        </p:column>
+                        <p:column>
+                            <f:facet name="header">
+                                #{msg['listDonations.name_of_bank']}
+                            </f:facet>
+                            <h:outputText value="#{donation.account.nameOfBank}" />
+                        </p:column>
+                        <p:column>
+                            <f:facet name="header">
+                                #{msg['listDonations.donation_amount']}
+                            </f:facet>
+                            <h:outputText value="#{donation.amount}">
+                                <f:convertNumber type="currency"
+                                    currencyCode="EUR" />
+                            </h:outputText>
+                        </p:column>
+                        <p:column>
+                            <f:facet name="header">
+                                #{msg['listDonations.receipt']}
+                            </f:facet>
+                            <h:outputText
+                                value="#{donation.receiptRequested ? 
+                                    msg['listDonations.yes'] 
+                                    : msg['listDonations.no']}" />
+                        </p:column>
+                        <p:column>
+                            <f:facet name="header">
+                                #{msg['listDonations.status']}
+                            </f:facet>
+                            <h:outputText
+                                value="#{msg['listDonations.status.TRANSFERRED']}"
+                                rendered="#{donation.status == 'TRANSFERRED'}" />
+                            <h:outputText
+                                value="#{msg['listDonations.status.IN_PROCESS']}"
+                                rendered="#{donation.status == 'IN_PROCESS'}" />
+                        </p:column>
+                    </p:dataTable>
+                    <p:commandButton value="OK"
+                            ajax="false"
+                            action="#{listDonationsController.doOk}" />
+                </h:form>
+            </ui:define>
+        </ui:composition>
+    </f:view>
+</body>
+</html>
\ No newline at end of file
diff --git a/src/main/java/de/dpunkt/myaktion/model/Donation.java b/src/main/java/de/dpunkt/myaktion/model/Donation.java
index c72e126..b7b2a5d 100644
--- a/src/main/java/de/dpunkt/myaktion/model/Donation.java
+++ b/src/main/java/de/dpunkt/myaktion/model/Donation.java
@@ -12,6 +12,8 @@ import javax.persistence.Entity;
 import javax.persistence.GeneratedValue;
 import javax.persistence.Id;
 import javax.persistence.ManyToOne;
+import javax.persistence.NamedQueries;
+import javax.persistence.NamedQuery;
 import javax.validation.constraints.DecimalMin;
 import javax.validation.constraints.NotNull;
 import javax.validation.constraints.Size;
@@ -20,9 +22,15 @@ import javax.validation.constraints.Size;
  * @author Julian
  */
 @Entity
+@NamedQueries({ @NamedQuery(name = Donation.findByStatus,
+        query = "SELECT d FROM Donation d WHERE d.status = :status") })
 public class Donation {
     //----------------------------------------------------------------------------------------------
 
+    public static final String findByStatus = "Donation.findByStatus";
+    
+    //==============================================================================================
+    
     @GeneratedValue
     @Id
     private Long id;
@@ -30,21 +38,21 @@ public class Donation {
     @NotNull(message = "{donation.amount.notNull}")
     @DecimalMin(value = "1.00", message = "{donation.amount.decimalMin}")
     private BigDecimal amount;
-  
+
     @NotNull
     @Size(min = 5, max = 40, message = "{donation.donorName.size}")
     private String donorName;
 
     @NotNull
     private Boolean receiptRequested;
-    
+
     @NotNull
     private Status status;
-    
+
     @NotNull
     @Embedded
     private Account account;
-    
+
     @NotNull
     @ManyToOne
     private Campaign campaign;
diff --git a/src/main/java/de/dpunkt/myaktion/scheduler/SchedulerBean.java b/src/main/java/de/dpunkt/myaktion/scheduler/SchedulerBean.java
new file mode 100644
index 0000000..85d5571
--- /dev/null
+++ b/src/main/java/de/dpunkt/myaktion/scheduler/SchedulerBean.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2019 (C) by Julian Horner.
+ * All Rights Reserved.
+ */
+
+package de.dpunkt.myaktion.scheduler;
+
+import javax.ejb.Schedule;
+import javax.ejb.Singleton;
+import javax.inject.Inject;
+
+import de.dpunkt.myaktion.services.DonationService;
+
+/**
+ * @author Julian
+ */
+@Singleton
+public class SchedulerBean {
+    @Inject
+    private DonationService donationService;
+
+    @Schedule(hour = "*", minute = "*/5", persistent = false)
+    public void doTransferDonations() {
+        donationService.transferDonations();
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/de/dpunkt/myaktion/services/CampaignServiceBean.java b/src/main/java/de/dpunkt/myaktion/services/CampaignServiceBean.java
index 67d7782..06ffe96 100644
--- a/src/main/java/de/dpunkt/myaktion/services/CampaignServiceBean.java
+++ b/src/main/java/de/dpunkt/myaktion/services/CampaignServiceBean.java
@@ -13,27 +13,22 @@ import java.util.logging.Logger;
 import javax.annotation.Resource;
 import javax.annotation.security.RolesAllowed;
 import javax.ejb.SessionContext;
-import javax.ejb.TransactionManagement;
-import javax.ejb.TransactionManagementType;
+import javax.ejb.Stateless;
 import javax.inject.Inject;
-import javax.interceptor.Interceptors;
 import javax.persistence.EntityManager;
 import javax.persistence.TypedQuery;
-import javax.transaction.UserTransaction;
 
 import de.dpunkt.myaktion.model.Campaign;
 import de.dpunkt.myaktion.model.Organizer;
 import de.dpunkt.myaktion.util.Log.TecLog;
-import de.dpunkt.myaktion.util.TransactionInterceptor;
 
 /**
  * @author Julian
  */
 @RolesAllowed("Organizer")
-@TransactionManagement(TransactionManagementType.BEAN)
-@Interceptors(TransactionInterceptor.class)
+@Stateless
 public class CampaignServiceBean implements CampaignService {
-    //----------------------------------------------------------------------------------------------
+    // ----------------------------------------------------------------------------------------------
 
     @Inject
     @TecLog
@@ -45,7 +40,7 @@ public class CampaignServiceBean implements CampaignService {
     @Resource
     private SessionContext sessionContext;
 
-    //----------------------------------------------------------------------------------------------
+    // ----------------------------------------------------------------------------------------------
 
     @Override
     public List<Campaign> getAllCampaigns() {
@@ -62,24 +57,22 @@ public class CampaignServiceBean implements CampaignService {
         return campaigns;
     }
 
-    //----------------------------------------------------------------------------------------------
+    // ----------------------------------------------------------------------------------------------
 
     @Override
     public void addCampaign(Campaign campaign) {
         Organizer organizer = getLoggedinOrganizer();
         campaign.setOrganizer(organizer);
-
         entityManager.persist(campaign);
     }
-
-    //----------------------------------------------------------------------------------------------
+    // ----------------------------------------------------------------------------------------------
 
     @Override
     public void updateCampaign(Campaign campaign) {
         entityManager.merge(campaign);
     }
 
-    //----------------------------------------------------------------------------------------------
+    // ----------------------------------------------------------------------------------------------
 
     @Override
     public void deleteCampaign(Campaign campaign) {
@@ -87,7 +80,7 @@ public class CampaignServiceBean implements CampaignService {
         entityManager.remove(managedCampaign);
     }
 
-    //----------------------------------------------------------------------------------------------
+    // ----------------------------------------------------------------------------------------------
 
     private BigDecimal getAmountDonatedSoFar(Campaign campaign) {
         TypedQuery<BigDecimal> query =
@@ -101,7 +94,7 @@ public class CampaignServiceBean implements CampaignService {
         return result;
     }
 
-    //----------------------------------------------------------------------------------------------
+    // ----------------------------------------------------------------------------------------------
 
     private Organizer getLoggedinOrganizer() {
         String organizerEmail = sessionContext.getCallerPrincipal().getName();
@@ -110,5 +103,5 @@ public class CampaignServiceBean implements CampaignService {
         return organizer;
     }
 
-    //----------------------------------------------------------------------------------------------
+    // ----------------------------------------------------------------------------------------------
 }
\ No newline at end of file
diff --git a/src/main/java/de/dpunkt/myaktion/services/DonationService.java b/src/main/java/de/dpunkt/myaktion/services/DonationService.java
index bf72371..9815011 100644
--- a/src/main/java/de/dpunkt/myaktion/services/DonationService.java
+++ b/src/main/java/de/dpunkt/myaktion/services/DonationService.java
@@ -19,5 +19,7 @@ public interface DonationService {
 
     void addDonation(Long campaignId, Donation donation);
 
+    void transferDonations();
+    
     //----------------------------------------------------------------------------------------------
 }
\ No newline at end of file
diff --git a/src/main/java/de/dpunkt/myaktion/services/DonationServiceBean.java b/src/main/java/de/dpunkt/myaktion/services/DonationServiceBean.java
index a884bcc..836c64b 100644
--- a/src/main/java/de/dpunkt/myaktion/services/DonationServiceBean.java
+++ b/src/main/java/de/dpunkt/myaktion/services/DonationServiceBean.java
@@ -6,15 +6,20 @@
 package de.dpunkt.myaktion.services;
 
 import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 
 import javax.annotation.security.PermitAll;
 import javax.annotation.security.RolesAllowed;
 import javax.ejb.Stateless;
 import javax.inject.Inject;
 import javax.persistence.EntityManager;
+import javax.persistence.TypedQuery;
 
 import de.dpunkt.myaktion.model.Campaign;
 import de.dpunkt.myaktion.model.Donation;
+import de.dpunkt.myaktion.model.Donation.Status;
+import de.dpunkt.myaktion.util.Log.TecLog;
 
 /**
  * @author Julian
@@ -26,6 +31,10 @@ public class DonationServiceBean implements DonationService {
     @Inject
     EntityManager entityManager;
 
+    @Inject
+    @TecLog
+    private Logger logger;
+
     //----------------------------------------------------------------------------------------------
 
     @RolesAllowed("Organizer")
@@ -33,7 +42,7 @@ public class DonationServiceBean implements DonationService {
     public List<Donation> getDonationList(Long campaignId) {
         Campaign managedCampaign = entityManager.find(Campaign.class, campaignId);
         List<Donation> donations = managedCampaign.getDonations();
-        
+
         donations.size(); // To avoid Lazy loading exception
 
         return donations;
@@ -44,9 +53,24 @@ public class DonationServiceBean implements DonationService {
     public void addDonation(Long campaignId, Donation donation) {
         Campaign managedCampaign = entityManager.find(Campaign.class, campaignId);
         donation.setCampaign(managedCampaign);
-        
+
         entityManager.persist(donation);
     }
-    
+
+    @Override
+    @PermitAll
+    public void transferDonations() {
+        logger.log(Level.INFO, "log.transferDonation.start");
+        
+        TypedQuery<Donation> query =
+                entityManager.createNamedQuery(Donation.findByStatus, Donation.class);
+        query.setParameter("status", Status.IN_PROCESS);
+        
+        List<Donation> donations = query.getResultList();
+        donations.forEach(donation -> donation.setStatus(Status.TRANSFERRED));
+        
+        logger.log(Level.INFO, "log.transferDonation.done", new Object[] { donations.size() });
+    }
+
     //----------------------------------------------------------------------------------------------
 }
diff --git a/src/main/resources/messages_de.properties b/src/main/resources/messages_de.properties
index f120b42..1059e8d 100644
--- a/src/main/resources/messages_de.properties
+++ b/src/main/resources/messages_de.properties
@@ -63,9 +63,12 @@ donateMoney.thank_you=Vielen Dank f
 
 # logger
 log.donateMoney.thank_you={0} hat {1} Euro gespendet.
+log.transferDonation.start=Zu bearbeitende Spenden werden überwiesen.
+log.transferDonation.done=Es wurden {0} Spenden überwiesen.
 
 # login.xhtml
 login.email=E-Mail
 login.password=Passwort
 login.login=Anmelden
-login.errorMsg=Passwort oder User sind falsch
\ No newline at end of file
+login.errorMsg=Passwort oder User sind falsch
+
diff --git a/src/main/resources/messages_en.properties b/src/main/resources/messages_en.properties
index c9a4483..7ab66a6 100644
--- a/src/main/resources/messages_en.properties
+++ b/src/main/resources/messages_en.properties
@@ -63,6 +63,8 @@ donateMoney.thank_you=Thank you for your donation!
 
 # logger
 log.donateMoney.thank_you={0} has donated {1} Euro.
+log.transferDonation.start=Starting transfering donations.
+log.transferDonation.done={0} donations have been transfered.
 
 # login.xhtml
 login.email=Email
diff --git a/src/main/webapp/WEB-INF/jboss-ejb3.xml b/src/main/webapp/WEB-INF/jboss-ejb3.xml
index 3abda74..c4f882b 100644
--- a/src/main/webapp/WEB-INF/jboss-ejb3.xml
+++ b/src/main/webapp/WEB-INF/jboss-ejb3.xml
@@ -5,9 +5,9 @@
 	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 	xmlns:s="urn:security"
 	xsi:schemaLocation="http://www.jboss.com/xml/ns/javaee 
-http://www.jboss.org/j2ee/schema/jboss-ejb3-2_0.xsd 
-http://java.sun.com/xml/ns/javaee 
-http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd"
+			http://www.jboss.org/j2ee/schema/jboss-ejb3-2_0.xsd 
+			http://java.sun.com/xml/ns/javaee 
+			http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd"
 	version="3.1" impl-version="2.0">
 	<assembly-descriptor>
 		<s:security>
-- 
GitLab