blob: 104f4f198f77af48a128057bc94b4aab583439c3 [file] [log] [blame]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="generator" content="Asciidoctor 2.0.17">
<title>Fineract Platform Documentation</title>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700">
<style>
/*! Asciidoctor default stylesheet | MIT License | https://asciidoctor.org */
/* Uncomment the following line when using as a custom stylesheet */
/* @import "https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700"; */
html{font-family:sans-serif;-webkit-text-size-adjust:100%}
a{background:none}
a:focus{outline:thin dotted}
a:active,a:hover{outline:0}
h1{font-size:2em;margin:.67em 0}
b,strong{font-weight:bold}
abbr{font-size:.9em}
abbr[title]{cursor:help;border-bottom:1px dotted #dddddf;text-decoration:none}
dfn{font-style:italic}
hr{height:0}
mark{background:#ff0;color:#000}
code,kbd,pre,samp{font-family:monospace;font-size:1em}
pre{white-space:pre-wrap}
q{quotes:"\201C" "\201D" "\2018" "\2019"}
small{font-size:80%}
sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}
sup{top:-.5em}
sub{bottom:-.25em}
img{border:0}
svg:not(:root){overflow:hidden}
figure{margin:0}
audio,video{display:inline-block}
audio:not([controls]){display:none;height:0}
fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}
legend{border:0;padding:0}
button,input,select,textarea{font-family:inherit;font-size:100%;margin:0}
button,input{line-height:normal}
button,select{text-transform:none}
button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}
button[disabled],html input[disabled]{cursor:default}
input[type=checkbox],input[type=radio]{padding:0}
button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}
textarea{overflow:auto;vertical-align:top}
table{border-collapse:collapse;border-spacing:0}
*,::before,::after{box-sizing:border-box}
html,body{font-size:100%}
body{background:#fff;color:rgba(0,0,0,.8);padding:0;margin:0;font-family:"Noto Serif","DejaVu Serif",serif;line-height:1;position:relative;cursor:auto;-moz-tab-size:4;-o-tab-size:4;tab-size:4;word-wrap:anywhere;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}
a:hover{cursor:pointer}
img,object,embed{max-width:100%;height:auto}
object,embed{height:100%}
img{-ms-interpolation-mode:bicubic}
.left{float:left!important}
.right{float:right!important}
.text-left{text-align:left!important}
.text-right{text-align:right!important}
.text-center{text-align:center!important}
.text-justify{text-align:justify!important}
.hide{display:none}
img,object,svg{display:inline-block;vertical-align:middle}
textarea{height:auto;min-height:50px}
select{width:100%}
.subheader,.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{line-height:1.45;color:#7a2518;font-weight:400;margin-top:0;margin-bottom:.25em}
div,dl,dt,dd,ul,ol,li,h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0}
a{color:#2156a5;text-decoration:underline;line-height:inherit}
a:hover,a:focus{color:#1d4b8f}
a img{border:0}
p{line-height:1.6;margin-bottom:1.25em;text-rendering:optimizeLegibility}
p aside{font-size:.875em;line-height:1.35;font-style:italic}
h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{font-family:"Open Sans","DejaVu Sans",sans-serif;font-weight:300;font-style:normal;color:#ba3925;text-rendering:optimizeLegibility;margin-top:1em;margin-bottom:.5em;line-height:1.0125em}
h1 small,h2 small,h3 small,#toctitle small,.sidebarblock>.content>.title small,h4 small,h5 small,h6 small{font-size:60%;color:#e99b8f;line-height:0}
h1{font-size:2.125em}
h2{font-size:1.6875em}
h3,#toctitle,.sidebarblock>.content>.title{font-size:1.375em}
h4,h5{font-size:1.125em}
h6{font-size:1em}
hr{border:solid #dddddf;border-width:1px 0 0;clear:both;margin:1.25em 0 1.1875em}
em,i{font-style:italic;line-height:inherit}
strong,b{font-weight:bold;line-height:inherit}
small{font-size:60%;line-height:inherit}
code{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;color:rgba(0,0,0,.9)}
ul,ol,dl{line-height:1.6;margin-bottom:1.25em;list-style-position:outside;font-family:inherit}
ul,ol{margin-left:1.5em}
ul li ul,ul li ol{margin-left:1.25em;margin-bottom:0}
ul.square li ul,ul.circle li ul,ul.disc li ul{list-style:inherit}
ul.square{list-style-type:square}
ul.circle{list-style-type:circle}
ul.disc{list-style-type:disc}
ol li ul,ol li ol{margin-left:1.25em;margin-bottom:0}
dl dt{margin-bottom:.3125em;font-weight:bold}
dl dd{margin-bottom:1.25em}
blockquote{margin:0 0 1.25em;padding:.5625em 1.25em 0 1.1875em;border-left:1px solid #ddd}
blockquote,blockquote p{line-height:1.6;color:rgba(0,0,0,.85)}
@media screen and (min-width:768px){h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2}
h1{font-size:2.75em}
h2{font-size:2.3125em}
h3,#toctitle,.sidebarblock>.content>.title{font-size:1.6875em}
h4{font-size:1.4375em}}
table{background:#fff;margin-bottom:1.25em;border:1px solid #dedede;word-wrap:normal}
table thead,table tfoot{background:#f7f8f7}
table thead tr th,table thead tr td,table tfoot tr th,table tfoot tr td{padding:.5em .625em .625em;font-size:inherit;color:rgba(0,0,0,.8);text-align:left}
table tr th,table tr td{padding:.5625em .625em;font-size:inherit;color:rgba(0,0,0,.8)}
table tr.even,table tr.alt{background:#f8f8f7}
table thead tr th,table tfoot tr th,table tbody tr td,table tr td,table tfoot tr td{line-height:1.6}
h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2;word-spacing:-.05em}
h1 strong,h2 strong,h3 strong,#toctitle strong,.sidebarblock>.content>.title strong,h4 strong,h5 strong,h6 strong{font-weight:400}
.center{margin-left:auto;margin-right:auto}
.stretch{width:100%}
.clearfix::before,.clearfix::after,.float-group::before,.float-group::after{content:" ";display:table}
.clearfix::after,.float-group::after{clear:both}
:not(pre).nobreak{word-wrap:normal}
:not(pre).nowrap{white-space:nowrap}
:not(pre).pre-wrap{white-space:pre-wrap}
:not(pre):not([class^=L])>code{font-size:.9375em;font-style:normal!important;letter-spacing:0;padding:.1em .5ex;word-spacing:-.15em;background:#f7f7f8;border-radius:4px;line-height:1.45;text-rendering:optimizeSpeed}
pre{color:rgba(0,0,0,.9);font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;line-height:1.45;text-rendering:optimizeSpeed}
pre code,pre pre{color:inherit;font-size:inherit;line-height:inherit}
pre>code{display:block}
pre.nowrap,pre.nowrap pre{white-space:pre;word-wrap:normal}
em em{font-style:normal}
strong strong{font-weight:400}
.keyseq{color:rgba(51,51,51,.8)}
kbd{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;display:inline-block;color:rgba(0,0,0,.8);font-size:.65em;line-height:1.45;background:#f7f7f7;border:1px solid #ccc;border-radius:3px;box-shadow:0 1px 0 rgba(0,0,0,.2),inset 0 0 0 .1em #fff;margin:0 .15em;padding:.2em .5em;vertical-align:middle;position:relative;top:-.1em;white-space:nowrap}
.keyseq kbd:first-child{margin-left:0}
.keyseq kbd:last-child{margin-right:0}
.menuseq,.menuref{color:#000}
.menuseq b:not(.caret),.menuref{font-weight:inherit}
.menuseq{word-spacing:-.02em}
.menuseq b.caret{font-size:1.25em;line-height:.8}
.menuseq i.caret{font-weight:bold;text-align:center;width:.45em}
b.button::before,b.button::after{position:relative;top:-1px;font-weight:400}
b.button::before{content:"[";padding:0 3px 0 2px}
b.button::after{content:"]";padding:0 2px 0 3px}
p a>code:hover{color:rgba(0,0,0,.9)}
#header,#content,#footnotes,#footer{width:100%;margin:0 auto;max-width:62.5em;*zoom:1;position:relative;padding-left:.9375em;padding-right:.9375em}
#header::before,#header::after,#content::before,#content::after,#footnotes::before,#footnotes::after,#footer::before,#footer::after{content:" ";display:table}
#header::after,#content::after,#footnotes::after,#footer::after{clear:both}
#content{margin-top:1.25em}
#content::before{content:none}
#header>h1:first-child{color:rgba(0,0,0,.85);margin-top:2.25rem;margin-bottom:0}
#header>h1:first-child+#toc{margin-top:8px;border-top:1px solid #dddddf}
#header>h1:only-child,body.toc2 #header>h1:nth-last-child(2){border-bottom:1px solid #dddddf;padding-bottom:8px}
#header .details{border-bottom:1px solid #dddddf;line-height:1.45;padding-top:.25em;padding-bottom:.25em;padding-left:.25em;color:rgba(0,0,0,.6);display:flex;flex-flow:row wrap}
#header .details span:first-child{margin-left:-.125em}
#header .details span.email a{color:rgba(0,0,0,.85)}
#header .details br{display:none}
#header .details br+span::before{content:"\00a0\2013\00a0"}
#header .details br+span.author::before{content:"\00a0\22c5\00a0";color:rgba(0,0,0,.85)}
#header .details br+span#revremark::before{content:"\00a0|\00a0"}
#header #revnumber{text-transform:capitalize}
#header #revnumber::after{content:"\00a0"}
#content>h1:first-child:not([class]){color:rgba(0,0,0,.85);border-bottom:1px solid #dddddf;padding-bottom:8px;margin-top:0;padding-top:1rem;margin-bottom:1.25rem}
#toc{border-bottom:1px solid #e7e7e9;padding-bottom:.5em}
#toc>ul{margin-left:.125em}
#toc ul.sectlevel0>li>a{font-style:italic}
#toc ul.sectlevel0 ul.sectlevel1{margin:.5em 0}
#toc ul{font-family:"Open Sans","DejaVu Sans",sans-serif;list-style-type:none}
#toc li{line-height:1.3334;margin-top:.3334em}
#toc a{text-decoration:none}
#toc a:active{text-decoration:underline}
#toctitle{color:#7a2518;font-size:1.2em}
@media screen and (min-width:768px){#toctitle{font-size:1.375em}
body.toc2{padding-left:15em;padding-right:0}
#toc.toc2{margin-top:0!important;background:#f8f8f7;position:fixed;width:15em;left:0;top:0;border-right:1px solid #e7e7e9;border-top-width:0!important;border-bottom-width:0!important;z-index:1000;padding:1.25em 1em;height:100%;overflow:auto}
#toc.toc2 #toctitle{margin-top:0;margin-bottom:.8rem;font-size:1.2em}
#toc.toc2>ul{font-size:.9em;margin-bottom:0}
#toc.toc2 ul ul{margin-left:0;padding-left:1em}
#toc.toc2 ul.sectlevel0 ul.sectlevel1{padding-left:0;margin-top:.5em;margin-bottom:.5em}
body.toc2.toc-right{padding-left:0;padding-right:15em}
body.toc2.toc-right #toc.toc2{border-right-width:0;border-left:1px solid #e7e7e9;left:auto;right:0}}
@media screen and (min-width:1280px){body.toc2{padding-left:20em;padding-right:0}
#toc.toc2{width:20em}
#toc.toc2 #toctitle{font-size:1.375em}
#toc.toc2>ul{font-size:.95em}
#toc.toc2 ul ul{padding-left:1.25em}
body.toc2.toc-right{padding-left:0;padding-right:20em}}
#content #toc{border:1px solid #e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;border-radius:4px}
#content #toc>:first-child{margin-top:0}
#content #toc>:last-child{margin-bottom:0}
#footer{max-width:none;background:rgba(0,0,0,.8);padding:1.25em}
#footer-text{color:hsla(0,0%,100%,.8);line-height:1.44}
#content{margin-bottom:.625em}
.sect1{padding-bottom:.625em}
@media screen and (min-width:768px){#content{margin-bottom:1.25em}
.sect1{padding-bottom:1.25em}}
.sect1:last-child{padding-bottom:0}
.sect1+.sect1{border-top:1px solid #e7e7e9}
#content h1>a.anchor,h2>a.anchor,h3>a.anchor,#toctitle>a.anchor,.sidebarblock>.content>.title>a.anchor,h4>a.anchor,h5>a.anchor,h6>a.anchor{position:absolute;z-index:1001;width:1.5ex;margin-left:-1.5ex;display:block;text-decoration:none!important;visibility:hidden;text-align:center;font-weight:400}
#content h1>a.anchor::before,h2>a.anchor::before,h3>a.anchor::before,#toctitle>a.anchor::before,.sidebarblock>.content>.title>a.anchor::before,h4>a.anchor::before,h5>a.anchor::before,h6>a.anchor::before{content:"\00A7";font-size:.85em;display:block;padding-top:.1em}
#content h1:hover>a.anchor,#content h1>a.anchor:hover,h2:hover>a.anchor,h2>a.anchor:hover,h3:hover>a.anchor,#toctitle:hover>a.anchor,.sidebarblock>.content>.title:hover>a.anchor,h3>a.anchor:hover,#toctitle>a.anchor:hover,.sidebarblock>.content>.title>a.anchor:hover,h4:hover>a.anchor,h4>a.anchor:hover,h5:hover>a.anchor,h5>a.anchor:hover,h6:hover>a.anchor,h6>a.anchor:hover{visibility:visible}
#content h1>a.link,h2>a.link,h3>a.link,#toctitle>a.link,.sidebarblock>.content>.title>a.link,h4>a.link,h5>a.link,h6>a.link{color:#ba3925;text-decoration:none}
#content h1>a.link:hover,h2>a.link:hover,h3>a.link:hover,#toctitle>a.link:hover,.sidebarblock>.content>.title>a.link:hover,h4>a.link:hover,h5>a.link:hover,h6>a.link:hover{color:#a53221}
details,.audioblock,.imageblock,.literalblock,.listingblock,.stemblock,.videoblock{margin-bottom:1.25em}
details{margin-left:1.25rem}
details>summary{cursor:pointer;display:block;position:relative;line-height:1.6;margin-bottom:.625rem;outline:none;-webkit-tap-highlight-color:transparent}
details>summary::-webkit-details-marker{display:none}
details>summary::before{content:"";border:solid transparent;border-left:solid;border-width:.3em 0 .3em .5em;position:absolute;top:.5em;left:-1.25rem;transform:translateX(15%)}
details[open]>summary::before{border:solid transparent;border-top:solid;border-width:.5em .3em 0;transform:translateY(15%)}
details>summary::after{content:"";width:1.25rem;height:1em;position:absolute;top:.3em;left:-1.25rem}
.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{text-rendering:optimizeLegibility;text-align:left;font-family:"Noto Serif","DejaVu Serif",serif;font-size:1rem;font-style:italic}
table.tableblock.fit-content>caption.title{white-space:nowrap;width:0}
.paragraph.lead>p,#preamble>.sectionbody>[class=paragraph]:first-of-type p{font-size:1.21875em;line-height:1.6;color:rgba(0,0,0,.85)}
.admonitionblock>table{border-collapse:separate;border:0;background:none;width:100%}
.admonitionblock>table td.icon{text-align:center;width:80px}
.admonitionblock>table td.icon img{max-width:none}
.admonitionblock>table td.icon .title{font-weight:bold;font-family:"Open Sans","DejaVu Sans",sans-serif;text-transform:uppercase}
.admonitionblock>table td.content{padding-left:1.125em;padding-right:1.25em;border-left:1px solid #dddddf;color:rgba(0,0,0,.6);word-wrap:anywhere}
.admonitionblock>table td.content>:last-child>:last-child{margin-bottom:0}
.exampleblock>.content{border:1px solid #e6e6e6;margin-bottom:1.25em;padding:1.25em;background:#fff;border-radius:4px}
.exampleblock>.content>:first-child{margin-top:0}
.exampleblock>.content>:last-child{margin-bottom:0}
.sidebarblock{border:1px solid #dbdbd6;margin-bottom:1.25em;padding:1.25em;background:#f3f3f2;border-radius:4px}
.sidebarblock>:first-child{margin-top:0}
.sidebarblock>:last-child{margin-bottom:0}
.sidebarblock>.content>.title{color:#7a2518;margin-top:0;text-align:center}
.exampleblock>.content>:last-child>:last-child,.exampleblock>.content .olist>ol>li:last-child>:last-child,.exampleblock>.content .ulist>ul>li:last-child>:last-child,.exampleblock>.content .qlist>ol>li:last-child>:last-child,.sidebarblock>.content>:last-child>:last-child,.sidebarblock>.content .olist>ol>li:last-child>:last-child,.sidebarblock>.content .ulist>ul>li:last-child>:last-child,.sidebarblock>.content .qlist>ol>li:last-child>:last-child{margin-bottom:0}
.literalblock pre,.listingblock>.content>pre{border-radius:4px;overflow-x:auto;padding:1em;font-size:.8125em}
@media screen and (min-width:768px){.literalblock pre,.listingblock>.content>pre{font-size:.90625em}}
@media screen and (min-width:1280px){.literalblock pre,.listingblock>.content>pre{font-size:1em}}
.literalblock pre,.listingblock>.content>pre:not(.highlight),.listingblock>.content>pre[class=highlight],.listingblock>.content>pre[class^="highlight "]{background:#f7f7f8}
.literalblock.output pre{color:#f7f7f8;background:rgba(0,0,0,.9)}
.listingblock>.content{position:relative}
.listingblock code[data-lang]::before{display:none;content:attr(data-lang);position:absolute;font-size:.75em;top:.425rem;right:.5rem;line-height:1;text-transform:uppercase;color:inherit;opacity:.5}
.listingblock:hover code[data-lang]::before{display:block}
.listingblock.terminal pre .command::before{content:attr(data-prompt);padding-right:.5em;color:inherit;opacity:.5}
.listingblock.terminal pre .command:not([data-prompt])::before{content:"$"}
.listingblock pre.highlightjs{padding:0}
.listingblock pre.highlightjs>code{padding:1em;border-radius:4px}
.listingblock pre.prettyprint{border-width:0}
.prettyprint{background:#f7f7f8}
pre.prettyprint .linenums{line-height:1.45;margin-left:2em}
pre.prettyprint li{background:none;list-style-type:inherit;padding-left:0}
pre.prettyprint li code[data-lang]::before{opacity:1}
pre.prettyprint li:not(:first-child) code[data-lang]::before{display:none}
table.linenotable{border-collapse:separate;border:0;margin-bottom:0;background:none}
table.linenotable td[class]{color:inherit;vertical-align:top;padding:0;line-height:inherit;white-space:normal}
table.linenotable td.code{padding-left:.75em}
table.linenotable td.linenos,pre.pygments .linenos{border-right:1px solid;opacity:.35;padding-right:.5em;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}
pre.pygments span.linenos{display:inline-block;margin-right:.75em}
.quoteblock{margin:0 1em 1.25em 1.5em;display:table}
.quoteblock:not(.excerpt)>.title{margin-left:-1.5em;margin-bottom:.75em}
.quoteblock blockquote,.quoteblock p{color:rgba(0,0,0,.85);font-size:1.15rem;line-height:1.75;word-spacing:.1em;letter-spacing:0;font-style:italic;text-align:justify}
.quoteblock blockquote{margin:0;padding:0;border:0}
.quoteblock blockquote::before{content:"\201c";float:left;font-size:2.75em;font-weight:bold;line-height:.6em;margin-left:-.6em;color:#7a2518;text-shadow:0 1px 2px rgba(0,0,0,.1)}
.quoteblock blockquote>.paragraph:last-child p{margin-bottom:0}
.quoteblock .attribution{margin-top:.75em;margin-right:.5ex;text-align:right}
.verseblock{margin:0 1em 1.25em}
.verseblock pre{font-family:"Open Sans","DejaVu Sans",sans-serif;font-size:1.15rem;color:rgba(0,0,0,.85);font-weight:300;text-rendering:optimizeLegibility}
.verseblock pre strong{font-weight:400}
.verseblock .attribution{margin-top:1.25rem;margin-left:.5ex}
.quoteblock .attribution,.verseblock .attribution{font-size:.9375em;line-height:1.45;font-style:italic}
.quoteblock .attribution br,.verseblock .attribution br{display:none}
.quoteblock .attribution cite,.verseblock .attribution cite{display:block;letter-spacing:-.025em;color:rgba(0,0,0,.6)}
.quoteblock.abstract blockquote::before,.quoteblock.excerpt blockquote::before,.quoteblock .quoteblock blockquote::before{display:none}
.quoteblock.abstract blockquote,.quoteblock.abstract p,.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{line-height:1.6;word-spacing:0}
.quoteblock.abstract{margin:0 1em 1.25em;display:block}
.quoteblock.abstract>.title{margin:0 0 .375em;font-size:1.15em;text-align:center}
.quoteblock.excerpt>blockquote,.quoteblock .quoteblock{padding:0 0 .25em 1em;border-left:.25em solid #dddddf}
.quoteblock.excerpt,.quoteblock .quoteblock{margin-left:0}
.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{color:inherit;font-size:1.0625rem}
.quoteblock.excerpt .attribution,.quoteblock .quoteblock .attribution{color:inherit;font-size:.85rem;text-align:left;margin-right:0}
p.tableblock:last-child{margin-bottom:0}
td.tableblock>.content{margin-bottom:1.25em;word-wrap:anywhere}
td.tableblock>.content>:last-child{margin-bottom:-1.25em}
table.tableblock,th.tableblock,td.tableblock{border:0 solid #dedede}
table.grid-all>*>tr>*{border-width:1px}
table.grid-cols>*>tr>*{border-width:0 1px}
table.grid-rows>*>tr>*{border-width:1px 0}
table.frame-all{border-width:1px}
table.frame-ends{border-width:1px 0}
table.frame-sides{border-width:0 1px}
table.frame-none>colgroup+*>:first-child>*,table.frame-sides>colgroup+*>:first-child>*{border-top-width:0}
table.frame-none>:last-child>:last-child>*,table.frame-sides>:last-child>:last-child>*{border-bottom-width:0}
table.frame-none>*>tr>:first-child,table.frame-ends>*>tr>:first-child{border-left-width:0}
table.frame-none>*>tr>:last-child,table.frame-ends>*>tr>:last-child{border-right-width:0}
table.stripes-all>*>tr,table.stripes-odd>*>tr:nth-of-type(odd),table.stripes-even>*>tr:nth-of-type(even),table.stripes-hover>*>tr:hover{background:#f8f8f7}
th.halign-left,td.halign-left{text-align:left}
th.halign-right,td.halign-right{text-align:right}
th.halign-center,td.halign-center{text-align:center}
th.valign-top,td.valign-top{vertical-align:top}
th.valign-bottom,td.valign-bottom{vertical-align:bottom}
th.valign-middle,td.valign-middle{vertical-align:middle}
table thead th,table tfoot th{font-weight:bold}
tbody tr th{background:#f7f8f7}
tbody tr th,tbody tr th p,tfoot tr th,tfoot tr th p{color:rgba(0,0,0,.8);font-weight:bold}
p.tableblock>code:only-child{background:none;padding:0}
p.tableblock{font-size:1em}
ol{margin-left:1.75em}
ul li ol{margin-left:1.5em}
dl dd{margin-left:1.125em}
dl dd:last-child,dl dd:last-child>:last-child{margin-bottom:0}
li p,ul dd,ol dd,.olist .olist,.ulist .ulist,.ulist .olist,.olist .ulist{margin-bottom:.625em}
ul.checklist,ul.none,ol.none,ul.no-bullet,ol.no-bullet,ol.unnumbered,ul.unstyled,ol.unstyled{list-style-type:none}
ul.no-bullet,ol.no-bullet,ol.unnumbered{margin-left:.625em}
ul.unstyled,ol.unstyled{margin-left:0}
li>p:empty:only-child::before{content:"";display:inline-block}
ul.checklist>li>p:first-child{margin-left:-1em}
ul.checklist>li>p:first-child>.fa-square-o:first-child,ul.checklist>li>p:first-child>.fa-check-square-o:first-child{width:1.25em;font-size:.8em;position:relative;bottom:.125em}
ul.checklist>li>p:first-child>input[type=checkbox]:first-child{margin-right:.25em}
ul.inline{display:flex;flex-flow:row wrap;list-style:none;margin:0 0 .625em -1.25em}
ul.inline>li{margin-left:1.25em}
.unstyled dl dt{font-weight:400;font-style:normal}
ol.arabic{list-style-type:decimal}
ol.decimal{list-style-type:decimal-leading-zero}
ol.loweralpha{list-style-type:lower-alpha}
ol.upperalpha{list-style-type:upper-alpha}
ol.lowerroman{list-style-type:lower-roman}
ol.upperroman{list-style-type:upper-roman}
ol.lowergreek{list-style-type:lower-greek}
.hdlist>table,.colist>table{border:0;background:none}
.hdlist>table>tbody>tr,.colist>table>tbody>tr{background:none}
td.hdlist1,td.hdlist2{vertical-align:top;padding:0 .625em}
td.hdlist1{font-weight:bold;padding-bottom:1.25em}
td.hdlist2{word-wrap:anywhere}
.literalblock+.colist,.listingblock+.colist{margin-top:-.5em}
.colist td:not([class]):first-child{padding:.4em .75em 0;line-height:1;vertical-align:top}
.colist td:not([class]):first-child img{max-width:none}
.colist td:not([class]):last-child{padding:.25em 0}
.thumb,.th{line-height:0;display:inline-block;border:4px solid #fff;box-shadow:0 0 0 1px #ddd}
.imageblock.left{margin:.25em .625em 1.25em 0}
.imageblock.right{margin:.25em 0 1.25em .625em}
.imageblock>.title{margin-bottom:0}
.imageblock.thumb,.imageblock.th{border-width:6px}
.imageblock.thumb>.title,.imageblock.th>.title{padding:0 .125em}
.image.left,.image.right{margin-top:.25em;margin-bottom:.25em;display:inline-block;line-height:0}
.image.left{margin-right:.625em}
.image.right{margin-left:.625em}
a.image{text-decoration:none;display:inline-block}
a.image object{pointer-events:none}
sup.footnote,sup.footnoteref{font-size:.875em;position:static;vertical-align:super}
sup.footnote a,sup.footnoteref a{text-decoration:none}
sup.footnote a:active,sup.footnoteref a:active{text-decoration:underline}
#footnotes{padding-top:.75em;padding-bottom:.75em;margin-bottom:.625em}
#footnotes hr{width:20%;min-width:6.25em;margin:-.25em 0 .75em;border-width:1px 0 0}
#footnotes .footnote{padding:0 .375em 0 .225em;line-height:1.3334;font-size:.875em;margin-left:1.2em;margin-bottom:.2em}
#footnotes .footnote a:first-of-type{font-weight:bold;text-decoration:none;margin-left:-1.05em}
#footnotes .footnote:last-of-type{margin-bottom:0}
#content #footnotes{margin-top:-.625em;margin-bottom:0;padding:.75em 0}
div.unbreakable{page-break-inside:avoid}
.big{font-size:larger}
.small{font-size:smaller}
.underline{text-decoration:underline}
.overline{text-decoration:overline}
.line-through{text-decoration:line-through}
.aqua{color:#00bfbf}
.aqua-background{background:#00fafa}
.black{color:#000}
.black-background{background:#000}
.blue{color:#0000bf}
.blue-background{background:#0000fa}
.fuchsia{color:#bf00bf}
.fuchsia-background{background:#fa00fa}
.gray{color:#606060}
.gray-background{background:#7d7d7d}
.green{color:#006000}
.green-background{background:#007d00}
.lime{color:#00bf00}
.lime-background{background:#00fa00}
.maroon{color:#600000}
.maroon-background{background:#7d0000}
.navy{color:#000060}
.navy-background{background:#00007d}
.olive{color:#606000}
.olive-background{background:#7d7d00}
.purple{color:#600060}
.purple-background{background:#7d007d}
.red{color:#bf0000}
.red-background{background:#fa0000}
.silver{color:#909090}
.silver-background{background:#bcbcbc}
.teal{color:#006060}
.teal-background{background:#007d7d}
.white{color:#bfbfbf}
.white-background{background:#fafafa}
.yellow{color:#bfbf00}
.yellow-background{background:#fafa00}
span.icon>.fa{cursor:default}
a span.icon>.fa{cursor:inherit}
.admonitionblock td.icon [class^="fa icon-"]{font-size:2.5em;text-shadow:1px 1px 2px rgba(0,0,0,.5);cursor:default}
.admonitionblock td.icon .icon-note::before{content:"\f05a";color:#19407c}
.admonitionblock td.icon .icon-tip::before{content:"\f0eb";text-shadow:1px 1px 2px rgba(155,155,0,.8);color:#111}
.admonitionblock td.icon .icon-warning::before{content:"\f071";color:#bf6900}
.admonitionblock td.icon .icon-caution::before{content:"\f06d";color:#bf3400}
.admonitionblock td.icon .icon-important::before{content:"\f06a";color:#bf0000}
.conum[data-value]{display:inline-block;color:#fff!important;background:rgba(0,0,0,.8);border-radius:50%;text-align:center;font-size:.75em;width:1.67em;height:1.67em;line-height:1.67em;font-family:"Open Sans","DejaVu Sans",sans-serif;font-style:normal;font-weight:bold}
.conum[data-value] *{color:#fff!important}
.conum[data-value]+b{display:none}
.conum[data-value]::after{content:attr(data-value)}
pre .conum[data-value]{position:relative;top:-.125em}
b.conum *{color:inherit!important}
.conum:not([data-value]):empty{display:none}
dt,th.tableblock,td.content,div.footnote{text-rendering:optimizeLegibility}
h1,h2,p,td.content,span.alt,summary{letter-spacing:-.01em}
p strong,td.content strong,div.footnote strong{letter-spacing:-.005em}
p,blockquote,dt,td.content,span.alt,summary{font-size:1.0625rem}
p{margin-bottom:1.25rem}
.sidebarblock p,.sidebarblock dt,.sidebarblock td.content,p.tableblock{font-size:1em}
.exampleblock>.content{background:#fffef7;border-color:#e0e0dc;box-shadow:0 1px 4px #e0e0dc}
.print-only{display:none!important}
@page{margin:1.25cm .75cm}
@media print{*{box-shadow:none!important;text-shadow:none!important}
html{font-size:80%}
a{color:inherit!important;text-decoration:underline!important}
a.bare,a[href^="#"],a[href^="mailto:"]{text-decoration:none!important}
a[href^="http:"]:not(.bare)::after,a[href^="https:"]:not(.bare)::after{content:"(" attr(href) ")";display:inline-block;font-size:.875em;padding-left:.25em}
abbr[title]{border-bottom:1px dotted}
abbr[title]::after{content:" (" attr(title) ")"}
pre,blockquote,tr,img,object,svg{page-break-inside:avoid}
thead{display:table-header-group}
svg{max-width:100%}
p,blockquote,dt,td.content{font-size:1em;orphans:3;widows:3}
h2,h3,#toctitle,.sidebarblock>.content>.title{page-break-after:avoid}
#header,#content,#footnotes,#footer{max-width:none}
#toc,.sidebarblock,.exampleblock>.content{background:none!important}
#toc{border-bottom:1px solid #dddddf!important;padding-bottom:0!important}
body.book #header{text-align:center}
body.book #header>h1:first-child{border:0!important;margin:2.5em 0 1em}
body.book #header .details{border:0!important;display:block;padding:0!important}
body.book #header .details span:first-child{margin-left:0!important}
body.book #header .details br{display:block}
body.book #header .details br+span::before{content:none!important}
body.book #toc{border:0!important;text-align:left!important;padding:0!important;margin:0!important}
body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-break-before:always}
.listingblock code[data-lang]::before{display:block}
#footer{padding:0 .9375em}
.hide-on-print{display:none!important}
.print-only{display:block!important}
.hide-for-print{display:none!important}
.show-for-print{display:inherit!important}}
@media amzn-kf8,print{#header>h1:first-child{margin-top:1.25rem}
.sect1{padding:0!important}
.sect1+.sect1{border:0}
#footer{background:none}
#footer-text{color:rgba(0,0,0,.6);font-size:.9em}}
@media amzn-kf8{#header,#content,#footnotes,#footer{padding:0}}
</style>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
<style>
/*! Stylesheet for CodeRay to loosely match GitHub themes | MIT License */
pre.CodeRay{background:#f7f7f8}
.CodeRay .line-numbers{border-right:1px solid;opacity:.35;padding:0 .5em 0 0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}
.CodeRay span.line-numbers{display:inline-block;margin-right:.75em}
.CodeRay .line-numbers strong{color:#000}
table.CodeRay{border-collapse:separate;border:0;margin-bottom:0;background:none}
table.CodeRay td{vertical-align:top;line-height:inherit}
table.CodeRay td.line-numbers{text-align:right}
table.CodeRay td.code{padding:0 0 0 .75em}
.CodeRay .debug{color:#fff!important;background:navy!important}
.CodeRay .annotation{color:#007}
.CodeRay .attribute-name{color:navy}
.CodeRay .attribute-value{color:#700}
.CodeRay .binary{color:#509}
.CodeRay .comment{color:#998;font-style:italic}
.CodeRay .char{color:#04d}
.CodeRay .char .content{color:#04d}
.CodeRay .char .delimiter{color:#039}
.CodeRay .class{color:#458;font-weight:bold}
.CodeRay .complex{color:#a08}
.CodeRay .constant,.CodeRay .predefined-constant{color:teal}
.CodeRay .color{color:#099}
.CodeRay .class-variable{color:#369}
.CodeRay .decorator{color:#b0b}
.CodeRay .definition{color:#099}
.CodeRay .delimiter{color:#000}
.CodeRay .doc{color:#970}
.CodeRay .doctype{color:#34b}
.CodeRay .doc-string{color:#d42}
.CodeRay .escape{color:#666}
.CodeRay .entity{color:#800}
.CodeRay .error{color:#808}
.CodeRay .exception{color:inherit}
.CodeRay .filename{color:#099}
.CodeRay .function{color:#900;font-weight:bold}
.CodeRay .global-variable{color:teal}
.CodeRay .hex{color:#058}
.CodeRay .integer,.CodeRay .float{color:#099}
.CodeRay .include{color:#555}
.CodeRay .inline{color:#000}
.CodeRay .inline .inline{background:#ccc}
.CodeRay .inline .inline .inline{background:#bbb}
.CodeRay .inline .inline-delimiter{color:#d14}
.CodeRay .inline-delimiter{color:#d14}
.CodeRay .important{color:#555;font-weight:bold}
.CodeRay .interpreted{color:#b2b}
.CodeRay .instance-variable{color:teal}
.CodeRay .label{color:#970}
.CodeRay .local-variable{color:#963}
.CodeRay .octal{color:#40e}
.CodeRay .predefined{color:#369}
.CodeRay .preprocessor{color:#579}
.CodeRay .pseudo-class{color:#555}
.CodeRay .directive{font-weight:bold}
.CodeRay .type{font-weight:bold}
.CodeRay .predefined-type{color:inherit}
.CodeRay .reserved,.CodeRay .keyword{color:#000;font-weight:bold}
.CodeRay .key{color:#808}
.CodeRay .key .delimiter{color:#606}
.CodeRay .key .char{color:#80f}
.CodeRay .value{color:#088}
.CodeRay .regexp .delimiter{color:#808}
.CodeRay .regexp .content{color:#808}
.CodeRay .regexp .modifier{color:#808}
.CodeRay .regexp .char{color:#d14}
.CodeRay .regexp .function{color:#404;font-weight:bold}
.CodeRay .string{color:#d20}
.CodeRay .string .string .string{background:#ffd0d0}
.CodeRay .string .content{color:#d14}
.CodeRay .string .char{color:#d14}
.CodeRay .string .delimiter{color:#d14}
.CodeRay .shell{color:#d14}
.CodeRay .shell .delimiter{color:#d14}
.CodeRay .symbol{color:#990073}
.CodeRay .symbol .content{color:#a60}
.CodeRay .symbol .delimiter{color:#630}
.CodeRay .tag{color:teal}
.CodeRay .tag-special{color:#d70}
.CodeRay .variable{color:#036}
.CodeRay .insert{background:#afa}
.CodeRay .delete{background:#faa}
.CodeRay .change{color:#aaf;background:#007}
.CodeRay .head{color:#f8f;background:#505}
.CodeRay .insert .insert{color:#080}
.CodeRay .delete .delete{color:#800}
.CodeRay .change .change{color:#66f}
.CodeRay .head .head{color:#f4f}
</style>
</head>
<body class="book">
<div id="header">
<h1>Fineract Platform Documentation</h1>
<div class="details">
<span id="revnumber">version 1.6.1-134-feature_fineract_1470</span>
</div>
</div>
<div id="content">
<div class="sect1">
<h2 id="_license">License</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Copyright 2022 Apache Foundation</p>
</div>
<div class="paragraph">
<p>Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at</p>
</div>
<div class="literalblock">
<div class="content">
<pre>http://www.apache.org/licenses/LICENSE-2.0</pre>
</div>
</div>
<div class="paragraph">
<p>Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_preface">Preface</h2>
<div class="sectionbody">
<div class="paragraph">
<p>&#169; 2015-2022</p>
</div>
<div class="paragraph">
<p><strong>Apache Fineract</strong><br>
Website: <a href="https://fineract.apache.org" class="bare">fineract.apache.org</a><br>
Email: <a href="mailto:dev@fineract.apache.org">dev@fineract.apache.org</a></p>
</div>
<div class="paragraph">
<p><strong>Version</strong>: 1.6.1-134-feature_fineract_1470</p>
</div>
<div class="paragraph">
<p><strong>Date</strong>: 2022-04-17</p>
</div>
<table class="tableblock frame-all grid-all stripes-even stretch">
<caption class="title">Table 1. Authors</caption>
<colgroup>
<col style="width: 50%;">
<col style="width: 50%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-center valign-top">Name</th>
<th class="tableblock halign-center valign-top">Email</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Michael Vorburger</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="mailto:mike@vorburger.ch">mike@vorburger.ch</a></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Aleksandar Vidakovic</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="mailto:aleks@apache.org">aleks@apache.org</a></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">Arnold Galovics</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="mailto:arnold@apache.org">arnold@apache.org</a></p></td>
</tr>
</tbody>
</table>
<table class="tableblock frame-all grid-all stripes-even stretch">
<caption class="title">Table 2. History</caption>
<colgroup>
<col style="width: 22.2222%;">
<col style="width: 44.4444%;">
<col style="width: 22.2222%;">
<col style="width: 11.1112%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-center valign-middle">Authors</th>
<th class="tableblock halign-center valign-middle">Description</th>
<th class="tableblock halign-center valign-middle">Date</th>
<th class="tableblock halign-center valign-middle">Version</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-middle"><div class="content"><div class="paragraph">
<p>Aleksandar Vidakovic</p>
</div></div></td>
<td class="tableblock halign-left valign-middle"><div class="content"><div class="paragraph">
<p>Initial version</p>
</div></div></td>
<td class="tableblock halign-center valign-middle"><div class="content"><div class="paragraph">
<p>2020-10-26</p>
</div></div></td>
<td class="tableblock halign-center valign-middle"><div class="content"><div class="paragraph">
<p>1.4.0</p>
</div></div></td>
</tr>
<tr>
<td class="tableblock halign-left valign-middle"><div class="content"><div class="paragraph">
<p>Arnold Galovics</p>
</div></div></td>
<td class="tableblock halign-left valign-middle"><div class="content"><div class="paragraph">
<p>Database architecture section</p>
</div></div></td>
<td class="tableblock halign-center valign-middle"><div class="content"><div class="paragraph">
<p>2022-03-11</p>
</div></div></td>
<td class="tableblock halign-center valign-middle"><div class="content"><div class="paragraph">
<p>1.7.0</p>
</div></div></td>
</tr>
<tr>
<td class="tableblock halign-left valign-middle"><div class="content"><div class="paragraph">
<p>Aleksandar Vidakovic</p>
</div></div></td>
<td class="tableblock halign-left valign-middle"><div class="content"><div class="paragraph">
<p>Module section</p>
</div></div></td>
<td class="tableblock halign-center valign-middle"><div class="content"><div class="paragraph">
<p>2022-03-23</p>
</div></div></td>
<td class="tableblock halign-center valign-middle"><div class="content"><div class="paragraph">
<p>1.7.0</p>
</div></div></td>
</tr>
<tr>
<td class="tableblock halign-left valign-middle"><div class="content"><div class="paragraph">
<p>Aleksandar Vidakovic</p>
</div></div></td>
<td class="tableblock halign-left valign-middle"><div class="content"><div class="paragraph">
<p>Release section, file re-organisation</p>
</div></div></td>
<td class="tableblock halign-center valign-middle"><div class="content"><div class="paragraph">
<p>2022-04-18</p>
</div></div></td>
<td class="tableblock halign-center valign-middle"><div class="content"><div class="paragraph">
<p>1.7.0</p>
</div></div></td>
</tr>
</tbody>
</table>
<div id="toc" class="toc">
<div id="toctitle" class="title">Table of Contents</div>
<ul class="sectlevel1">
<li><a href="#_license">License</a></li>
<li><a href="#_preface">Preface</a></li>
<li><a href="#_introduction">Introduction</a>
<ul class="sectlevel2">
<li><a href="#_platform_for_digital_financial_services">Platform for Digital Financial Services</a></li>
<li><a href="#_about">About</a></li>
<li><a href="#_contribute">Contribute</a></li>
<li><a href="#_mailing_lists">Mailing Lists</a></li>
</ul>
</li>
<li><a href="#_deployment">Deployment</a>
<ul class="sectlevel2">
<li><a href="#_plugins">Plugins</a></li>
<li><a href="#_https">HTTPS</a></li>
<li><a href="#_docker_compose">Docker Compose</a></li>
<li><a href="#_application_server">Application Server</a>
<ul class="sectlevel3">
<li><a href="#_tomcat">Tomcat</a></li>
<li><a href="#_undertow">Undertow</a></li>
<li><a href="#_jetty">Jetty</a></li>
<li><a href="#_jboss">JBoss</a></li>
<li><a href="#_weblogic">Weblogic</a></li>
<li><a href="#_payara">Payara</a></li>
</ul>
</li>
<li><a href="#_kubernetes">Kubernetes</a></li>
<li><a href="#_aws">AWS</a></li>
<li><a href="#_google_cloud">Google Cloud</a></li>
<li><a href="#_apache_software_foundation_infrastructure">Apache Software Foundation Infrastructure</a></li>
</ul>
</li>
<li><a href="#_architecture">Architecture</a>
<ul class="sectlevel2">
<li><a href="#_history">History</a>
<ul class="sectlevel3">
<li><a href="#_the_idea">The Idea</a></li>
<li><a href="#_timeline">Timeline</a></li>
</ul>
</li>
<li><a href="#_resources">Resources</a></li>
<li><a href="#_system_overview">System Overview</a></li>
<li><a href="#_functional_overview">Functional Overview</a></li>
<li><a href="#_principles">Principles</a>
<ul class="sectlevel3">
<li><a href="#_restful_api">RESTful API</a></li>
<li><a href="#_multi_tenanted">Multi-tenanted</a></li>
<li><a href="#_extensible">Extensible</a></li>
<li><a href="#_command_query_seperation">Command Query Seperation</a></li>
<li><a href="#_maker_checker">Maker-Checker</a></li>
<li><a href="#_package_structure">Package Structure</a></li>
</ul>
</li>
<li><a href="#_design_overview">Design Overview</a></li>
<li><a href="#_persistence">Persistence</a>
<ul class="sectlevel3">
<li><a href="#_database_support">Database support</a></li>
<li><a href="#_data_access_layer">Data-access layer</a></li>
<li><a href="#_database_schema_migration">Database schema migration</a></li>
</ul>
</li>
<li><a href="#_validation">Validation</a>
<ul class="sectlevel3">
<li><a href="#_programmatic">Programmatic</a></li>
<li><a href="#_declarative">Declarative</a></li>
</ul>
</li>
<li><a href="#_technology">Technology</a></li>
<li><a href="#_modules">Modules</a>
<ul class="sectlevel3">
<li><a href="#_how_to_create_a_fineract_module">How to create a Fineract module</a></li>
<li><a href="#_how_to_replace_an_existing_fineract_service">How to replace an existing Fineract service</a></li>
<li><a href="#_example">Example</a>
<ul class="sectlevel4">
<li><a href="#_dummy_module_structure">Dummy Module Structure</a></li>
<li><a href="#_replace_the_default_implementation_of_dummyservice">Replace the default implementation of DummyService</a></li>
<li><a href="#_testing">Testing</a></li>
<li><a href="#_deployment_2">Deployment</a></li>
<li><a href="#_how_can_i_start_replacing_services_now">How can I start replacing services now</a></li>
<li><a href="#_outlook">Outlook</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><a href="#_fineract_development_environment">Fineract Development Environment</a>
<ul class="sectlevel2">
<li><a href="#_git">Git</a></li>
<li><a href="#_gpg">GPG</a></li>
<li><a href="#_docker">Docker</a>
<ul class="sectlevel3">
<li><a href="#_docker_compose_2">Docker Compose</a></li>
<li><a href="#_podman">Podman</a></li>
<li><a href="#_rancher_docker_desktop">Rancher Docker Desktop</a></li>
</ul>
</li>
<li><a href="#_gradle">Gradle</a></li>
<li><a href="#_ide">IDE</a>
<ul class="sectlevel3">
<li><a href="#_intellij">IntelliJ</a></li>
<li><a href="#_eclipse">Eclipse</a></li>
<li><a href="#_vscode">VSCode</a></li>
</ul>
</li>
<li><a href="#_kubernetes_2">Kubernetes</a>
<ul class="sectlevel3">
<li><a href="#_minikube">Minikube</a></li>
<li><a href="#_microk8s">Microk8s</a></li>
<li><a href="#_k3d">K3d</a></li>
<li><a href="#_helm_charts">Helm Charts</a></li>
</ul>
</li>
<li><a href="#_tools">Tools</a>
<ul class="sectlevel3">
<li><a href="#_sdkman">SDKMAN</a></li>
<li><a href="#_brew">Brew</a>
<ul class="sectlevel4">
<li><a href="#_macos">MacOS</a></li>
<li><a href="#_linux">Linux</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><a href="#_security">Security</a>
<ul class="sectlevel2">
<li><a href="#_oauth">OAuth</a>
<ul class="sectlevel3">
<li><a href="#_build">Build</a></li>
<li><a href="#_set_up_keycloak">Set up Keycloak</a></li>
<li><a href="#_retrieve_an_access_token_from_keycloak">Retrieve an access token from Keycloak</a></li>
<li><a href="#_invoke_apis_and_pass_authorization_bearer_header">Invoke APIs and pass <code>Authorization: bearer &#8230;&#8203;</code> header</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#_fineract_sdks">Fineract SDKs</a>
<ul class="sectlevel2">
<li><a href="#_generate_apache_fineract_api_client">Generate Apache Fineract API Client</a>
<ul class="sectlevel3">
<li><a href="#_fineract_sdk_java_api_client">Fineract SDK Java API Client</a></li>
<li><a href="#_generate_api_client">Generate API Client</a></li>
<li><a href="#_validate_openapi_spec_file">Validate OpenAPI Spec File</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#_testing_2">Testing</a>
<ul class="sectlevel2">
<li><a href="#_cucumber">Cucumber</a>
<ul class="sectlevel3">
<li><a href="#_introduction_2">Introduction</a></li>
<li><a href="#_tutorial">Tutorial</a></li>
<li><a href="#_cheatsheet">Cheatsheet</a></li>
</ul>
</li>
<li><a href="#_unit_testing">Unit Testing</a></li>
<li><a href="#_integration_testing">Integration Testing</a></li>
</ul>
</li>
<li><a href="#_documentation">Documentation</a>
<ul class="sectlevel2">
<li><a href="#_file_and_folder_layout">File and Folder Layout</a>
<ul class="sectlevel3">
<li><a href="#_book">Book</a></li>
<li><a href="#_chapter">Chapter</a></li>
<li><a href="#_diagrams">Diagrams</a></li>
<li><a href="#_images">Images</a></li>
</ul>
</li>
<li><a href="#_asciidoc">Asciidoc</a>
<ul class="sectlevel3">
<li><a href="#_tutorial_2">Tutorial</a></li>
<li><a href="#_cheatsheet_2">Cheatsheet</a></li>
</ul>
</li>
<li><a href="#_plantuml">PlantUML</a>
<ul class="sectlevel3">
<li><a href="#_tutorial_3">Tutorial</a></li>
<li><a href="#_cheatsheet_3">Cheatsheet</a></li>
</ul>
</li>
<li><a href="#_editor">Editor</a>
<ul class="sectlevel3">
<li><a href="#_intellij_idea">IntelliJ IDEA</a>
<ul class="sectlevel4">
<li><a href="#_asciidoc_2">Asciidoc</a></li>
<li><a href="#_plantuml_2">PlantUML</a></li>
</ul>
</li>
<li><a href="#_eclipse_2">Eclipse</a>
<ul class="sectlevel4">
<li><a href="#_asciidoc_3">Asciidoc</a></li>
<li><a href="#_plantuml_3">PlantUML</a></li>
</ul>
</li>
<li><a href="#_vscode_2">VSCode</a>
<ul class="sectlevel4">
<li><a href="#_asciidoc_4">Asciidoc</a></li>
<li><a href="#_plantuml_4">PlantUML</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#_antora">Antora</a></li>
</ul>
</li>
<li><a href="#_releases">Releases</a>
<ul class="sectlevel2">
<li><a href="#_configuration">Configuration</a>
<ul class="sectlevel3">
<li><a href="#_secrets">Secrets</a>
<ul class="sectlevel4">
<li><a href="#_infrastructure_team">Infrastructure Team</a></li>
<li><a href="#_lastpass">Lastpass</a></li>
<li><a href="#_1password">1Password</a></li>
</ul>
</li>
<li><a href="#_gpg_2">GPG</a></li>
<li><a href="#_email">Email</a>
<ul class="sectlevel4">
<li><a href="#_gmail">GMail</a></li>
</ul>
</li>
<li><a href="#_gradle_2">Gradle</a>
<ul class="sectlevel4">
<li><a href="#_user_properties">User Properties</a></li>
<li><a href="#_release_plugin">Release Plugin</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#_process">Process</a>
<ul class="sectlevel3">
<li><a href="#_step_1_heads_up_email">Step 1: Heads-Up Email</a>
<ul class="sectlevel4">
<li><a href="#_description">Description</a></li>
<li><a href="#_gradle_task">Gradle Task</a></li>
</ul>
</li>
<li><a href="#_step_2_clean_up_jira">Step 2: Clean Up JIRA</a>
<ul class="sectlevel4">
<li><a href="#_description_2">Description</a></li>
<li><a href="#_gradle_task_2">Gradle Task</a></li>
</ul>
</li>
<li><a href="#_step_3_create_release_branch">Step 3: Create Release Branch</a>
<ul class="sectlevel4">
<li><a href="#_description_3">Description</a></li>
<li><a href="#_gradle_task_3">Gradle Task</a></li>
</ul>
</li>
<li><a href="#_step_4_freeze_jira">Step 4: Freeze JIRA</a>
<ul class="sectlevel4">
<li><a href="#_description_4">Description</a></li>
<li><a href="#_gradle_task_4">Gradle Task</a></li>
</ul>
</li>
<li><a href="#_step_5_create_release_tag">Step 5: Create Release Tag</a>
<ul class="sectlevel4">
<li><a href="#_description_5">Description</a></li>
<li><a href="#_gradle_task_5">Gradle Task</a></li>
</ul>
</li>
<li><a href="#_step_6_create_distribution">Step 6: Create Distribution</a>
<ul class="sectlevel4">
<li><a href="#_description_6">Description</a></li>
<li><a href="#_gradle_task_6">Gradle Task</a></li>
</ul>
</li>
<li><a href="#_step_7_sign_distribution">Step 7: Sign Distribution</a>
<ul class="sectlevel4">
<li><a href="#_description_7">Description</a></li>
<li><a href="#_gradle_task_7">Gradle Task</a></li>
</ul>
</li>
<li><a href="#_step_8_upload_distribution_staging">Step 8: Upload Distribution Staging</a>
<ul class="sectlevel4">
<li><a href="#_description_8">Description</a></li>
<li><a href="#_gradle_task_8">Gradle Task</a></li>
</ul>
</li>
<li><a href="#_step_9_verify_distribution_staging">Step 9: Verify Distribution Staging</a>
<ul class="sectlevel4">
<li><a href="#_description_9">Description</a></li>
<li><a href="#_gradle_task_9">Gradle Task</a></li>
</ul>
</li>
<li><a href="#_step_10_start_vote">Step 10: Start Vote</a>
<ul class="sectlevel4">
<li><a href="#_description_10">Description</a></li>
<li><a href="#_gradle_task_10">Gradle Task</a></li>
</ul>
</li>
<li><a href="#_step_11_finish_vote">Step 11: Finish Vote</a>
<ul class="sectlevel4">
<li><a href="#_description_11">Description</a></li>
<li><a href="#_gradle_task_11">Gradle Task</a></li>
</ul>
</li>
<li><a href="#_step_12_upload_distribution_release">Step 12: Upload Distribution Release</a>
<ul class="sectlevel4">
<li><a href="#_description_12">Description</a></li>
<li><a href="#_gradle_task_12">Gradle Task</a></li>
</ul>
</li>
<li><a href="#_step_13_close_release_branch">Step 13: Close Release Branch</a>
<ul class="sectlevel4">
<li><a href="#_description_13">Description</a></li>
<li><a href="#_gradle_task_13">Gradle Task</a></li>
</ul>
</li>
<li><a href="#_step_14_update_website">Step 14: Update website</a>
<ul class="sectlevel4">
<li><a href="#_description_14">Description</a></li>
<li><a href="#_gradle_task_14">Gradle Task</a></li>
</ul>
</li>
<li><a href="#_step_15_announcement_email">Step 15: Announcement Email</a>
<ul class="sectlevel4">
<li><a href="#_description_15">Description</a></li>
<li><a href="#_gradle_task_15">Gradle Task</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><a href="#_frequently_asked_questions">Frequently Asked Questions</a></li>
<li><a href="#_glossary">Glossary</a></li>
<li><a href="#_index">Index</a></li>
<li><a href="#_fineract_application_properties">Appendix A: Fineract Application Properties</a>
<ul class="sectlevel2">
<li><a href="#_tenant_database_properties">Tenant Database Properties</a></li>
<li><a href="#_hikari_connection_pool_properties">Hikari Connection Pool Properties</a></li>
<li><a href="#_ssl_properties">SSL Properties</a></li>
<li><a href="#_authentication_properties">Authentication Properties</a></li>
<li><a href="#_tomcat_properties">Tomcat Properties</a></li>
</ul>
</li>
<li><a href="#_third_party_software">Appendix B: Third Party Software</a></li>
</ul>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_introduction">Introduction</h2>
<div class="sectionbody">
<div class="sect2">
<h3 id="_platform_for_digital_financial_services">Platform for Digital Financial Services</h3>
<div class="paragraph">
<p>Apache Fineract (\’fīn-,ә-,rakt\) is open source software for financial services.</p>
</div>
<div class="paragraph">
<p>Fineract provides a reliable, robust, and affordable solution for entrepreneurs, financial institutions, and service providers to offer financial services to the world’s 2 billion underbanked and unbanked. Fineract is aimed at innovative mobile and cloud-based solutions, and enables digital transaction accounts for all.</p>
</div>
<div class="paragraph">
<p>Fineract 1.x is a mature platform with open APIs, while Fineract CN is a cloud native, microservice architecture also supporting open banking APIs.</p>
</div>
</div>
<div class="sect2">
<h3 id="_about">About</h3>
<div class="paragraph">
<p>Apache Fineract can be deployed in any environment: cloud or on-premise. It can support front end interfaces on or offline, mobile or PC. It’s extensible enough to support any organizational type or delivery channel, and flexible enough to support any product, service, or lending methodology. For any organization, big or small, it provides the client data management, loan and savings portfolio management, integrated real time accounting, and social and financial reporting needed to bring digital financial services to a modern connected world.</p>
</div>
<div class="paragraph">
<p>Fineract 1.x compares well to other core banking systems and draws from requirements in credit unions, microfinance institutions, and small non-banking financial institutions. Features include flexible product configuration, KYC documentation support, business rule sets, payment transactions, and portfolio management. It includes an open API that dates to 2011 and is deployed in relatively high transaction volume environments.</p>
</div>
<div class="paragraph">
<p>Fineract CN operates on the principle that financial services are an innovative space and so each fineract microservice encapsulates a domain that can be combined with other microservices to create new platform offerings. Fineract CN microservices can be combined to create new software platforms for digital financial service providers. Fineract CN is still in its early days, but preliminary tests have shown that a simple single-instance laptop deployment of Fineract CN can process over 1000 transactions/second. Fineract CN also includes a fully Apache-licensed backoffice UI.</p>
</div>
<div class="paragraph">
<p>Fineract 1.x began incubation at Apache in December 2015 and is used by an active community of companies who build solutions for both financial inclusion and fintech innovation.</p>
</div>
</div>
<div class="sect2">
<h3 id="_contribute">Contribute</h3>
<div class="paragraph">
<p>The Apache Fineract community welcomes contributors who want to support the Fineract technology. Our community builds everything from this website, to the Fineract code to documentation and best practices information.</p>
</div>
<div class="paragraph">
<p>We especially welcome additions and corrections to the documentation, wiki, and website to improve the user experience. Bug reports and fixes and additions to the Apache Fineract code are welcome. Helping users learn best practices also earns good karma in our community.</p>
</div>
</div>
<div class="sect2">
<h3 id="_mailing_lists">Mailing Lists</h3>
<div class="paragraph">
<p>Users &amp; Developers</p>
</div>
<div class="paragraph">
<p>If you use, build on top of, deploy or are building contributions and modifications to Apache Fineract, this is the list for you.<br>
To subscribe, send a blank email to <a href="mailto:dev-subscribe@fineract.apache.org">dev-subscribe@fineract.apache.org</a>.<br>
To unsubscribe later, just send a blank email to <a href="mailto:dev-unsubscribe@fineract.apache.org">dev-unsubscribe@fineract.apache.org</a>.<br>
You can also read the archives on lists.apache.org or on MarkMail.org.<br>
Commits</p>
</div>
<div class="paragraph">
<p>This list receives an email whenever new code is contributed to Apache Fineract.<br>
To subscribe, send a blank email to <a href="mailto:commits-subscribe@fineract.apache.org">commits-subscribe@fineract.apache.org</a>.<br>
You can also read the archives.</p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_deployment">Deployment</h2>
<div class="sectionbody">
<div class="sect2">
<h3 id="_plugins">Plugins</h3>
<div class="paragraph">
<p>Apache Fineract is extensible through plugin JARs (<a href="https://issues.apache.org/jira/browse/FINERACT-1177">FINERACT-1177</a>; based on<br>
<a href="https://docs.spring.io/spring-boot/docs/current/reference/html/appendix-executable-jar-format.html">Spring Boot&#8217;s support</a>). To launch Fineract with plugin JARs in <code>libs/*.jar</code>, use:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="java">java -Dloader.path=libs/ -jar fineract-provider.jar</code></pre>
</div>
</div>
<div class="paragraph">
<p>The Fineract "Docker" container image&#8217;s <code>ENTRYPOINT</code> uses this, see our <code>Dockerfile</code>. You could therefore build your customized Fineract distribution container image with your own <code>Dockerfile</code> using e.g. <code>FROM apache/fineract:latest</code> and then drop some plugin JARs into <code>/app/libs/</code>.</p>
</div>
<div class="paragraph">
<p>The WAR distribution does not directly support such plugins, but one could "explode" the WAR and drop JARs into <code>WEB-INF/lib</code>; if you know what you are doing, and feel nostalgic of the 1990s still using WARs, instead of the recommended modern Spring Boot distribution.</p>
</div>
<div class="paragraph">
<p>Here is a list of known 3rd-party plugin projects which can be dropped into <code>libs/</code>:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><a href="https://github.com/vorburger/fineract-pentaho" class="bare">github.com/vorburger/fineract-pentaho</a></p>
</li>
</ul>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
The reporting module became our first module experiment out of necessity. We are currently developing a strategy to split up even more internals of Fineract into proper modules. Those that have an incompatible license will be hosted in a separate Git repository (probably on Github under the Mifos organisation). We&#8217;ll send out an announcement as soon as we have more to say on this topic.
</td>
</tr>
</table>
</div>
</div>
<div class="sect2">
<h3 id="_https">HTTPS</h3>
<div class="paragraph">
<p>Because Apache Fineract deals with customer sensitive personally identifiable information (PII), it very strongly encourages all developers, implementors and end-users to always only use HTTPS. This is why it does not run on HTTP even for local development and enforces use of HTTPS.</p>
</div>
<div class="paragraph">
<p>For this purpose, Fineract includes a built-in default SSL certificate. This cert is intended for development on <code>localhost</code>, only. It is not trusted by your browser (because it&#8217;s self signed).</p>
</div>
<div class="paragraph">
<p>For production deployments, we recommend running Fineract behind a modern managed cloud native web proxy which includes SSL termination with automatically rotating SSL certificates, either using your favourite cloud provider&#8217;s respective solution, or locally setting up the equivalent using e.g. something like NGINX combined with <a href="https://letsencrypt.org">Let’s Encrypt</a>.</p>
</div>
<div class="paragraph">
<p>Such products, when correctly configured, add the conventional <code>X-Forwarded-For</code> and <code>X-Forwarded-Proto</code> HTTP headers, which Fineract (or rather the Spring Framework really) correctly respects since <a href="https://issues.apache.org/jira/browse/FINERACT-914">FINERACT-914 was fixed</a>.</p>
</div>
<div class="paragraph">
<p>Alternatively, you could replace the built-in default SSL certificate with one you obtained from a Certificate Authority. We currently do not document how to do this, because we do not recommend this approach, as its cumbersome to configure and support and less secure than a managed auto rotating solution.</p>
</div>
<div class="paragraph">
<p>The Fineract API client supports an insecure mode (<code>FineractClient.Builder#insecure()</code>), and API users such as mobile apps may expose Settings to let end-users accept the self signed certificate. This should always be used for testing only, never in production.</p>
</div>
</div>
<div class="sect2">
<h3 id="_docker_compose">Docker Compose</h3>
<div class="paragraph">
<p>TBD</p>
</div>
</div>
<div class="sect2">
<h3 id="_application_server">Application Server</h3>
<div class="sect3">
<h4 id="_tomcat">Tomcat</h4>
<div class="paragraph">
<p>TBD</p>
</div>
</div>
<div class="sect3">
<h4 id="_undertow">Undertow</h4>
<div class="paragraph">
<p>TBD</p>
</div>
</div>
<div class="sect3">
<h4 id="_jetty">Jetty</h4>
<div class="paragraph">
<p>TBD</p>
</div>
</div>
<div class="sect3">
<h4 id="_jboss">JBoss</h4>
<div class="paragraph">
<p>TBD</p>
</div>
</div>
<div class="sect3">
<h4 id="_weblogic">Weblogic</h4>
<div class="paragraph">
<p>TBD</p>
</div>
</div>
<div class="sect3">
<h4 id="_payara">Payara</h4>
<div class="paragraph">
<p>TBD</p>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_kubernetes">Kubernetes</h3>
<div class="paragraph">
<p>TBD</p>
</div>
</div>
<div class="sect2">
<h3 id="_aws">AWS</h3>
<div class="paragraph">
<p>TBD</p>
</div>
</div>
<div class="sect2">
<h3 id="_google_cloud">Google Cloud</h3>
<div class="paragraph">
<p>The <a href="https://www.fineract.dev" class="bare">www.fineract.dev</a> demo server runs on Google Cloud.</p>
</div>
<div class="paragraph">
<p><a href="https://docs.google.com/presentation/d/1-VP4bNkc5kZ3B0yme_vYLiY1qpswnfz8ainnX5fp3l8/">The Running Fineract.dev, SRE style presentation</a> given at <em>ApacheCon 2020</em> has some related background.</p>
</div>
</div>
<div class="sect2">
<h3 id="_apache_software_foundation_infrastructure">Apache Software Foundation Infrastructure</h3>
<div class="paragraph">
<p>We can order a server from Apache&#8217;s infrastructure team and deploy a demo instance&#8230;&#8203;</p>
</div>
<div class="paragraph">
<p>TBD</p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_architecture">Architecture</h2>
<div class="sectionbody">
<div class="paragraph">
<p>This document captures the major architectural decisions in platform. The purpose of the document is to provide a guide to the overall structure of the platform; where it fits in the overall context of an MIS solution and its internals so that contributors can more effectively understand how changes that they are considering can be made, and the consequences of those changes.</p>
</div>
<div class="paragraph">
<p>The target audience for this report is both system integrators (who will use the document to gain an understanding of the structure of the platform and its design rationale) and platform contributors who will use the document to reason about future changes and who will update the document as the system evolves.</p>
</div>
<div class="sect2">
<h3 id="_history">History</h3>
<div class="sect3">
<h4 id="_the_idea">The Idea</h4>
<div class="paragraph">
<p>Fineract was an idea born out of a wish to create and deploy technology that allows the microfinance industry to scale. The goal is to:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Produce a gold standard management information system suitable for microfinance operations</p>
</li>
<li>
<p>Acts as the basis of a platform for microfinance</p>
</li>
<li>
<p>Open source, owned and driven by member organisations in the community</p>
</li>
<li>
<p>Enabling potential for eco-system of providers located near to MFIs</p>
</li>
</ul>
</div>
</div>
<div class="sect3">
<h4 id="_timeline">Timeline</h4>
<div class="ulist">
<ul>
<li>
<p>2006: Project intiated by Grameen Foundation</p>
</li>
<li>
<p>Late 2011: Grameen Foundation handed over full responsibility to open source community.</p>
</li>
<li>
<p>2012: Mifos X platform started. Previous members of project come together under the name of Community for Open Source Microfinance (COSM / OpenMF)</p>
</li>
<li>
<p>2013: COSM / OpenMF officially rebranded to Mifos Initiative and receive US 501c3 status.</p>
</li>
<li>
<p>2016: Fineract 1.x began incubation at Apache</p>
</li>
</ul>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_resources">Resources</h3>
<div class="ulist">
<ul>
<li>
<p>Project URL is <a href="https://github.com/apache/fineract" class="bare">github.com/apache/fineract</a></p>
</li>
<li>
<p>Issue tracker is <a href="https://issues.apache.org/jira/projects/FINERACT/summary" class="bare">issues.apache.org/jira/projects/FINERACT/summary</a></p>
</li>
<li>
<p>Download from <a href="http://fineract.apache.org/" class="bare">fineract.apache.org/</a></p>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_system_overview">System Overview</h3>
<div class="imageblock">
<div class="content">
<img src="data:image/png;base64,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5s2bW9sZS6FsXPltbNy4kfr167PPPpnpAHVhGwqipNf9jz/+yDnnnMP8+fPp06cPPXr0YN68eTz99NPUrl07zWFWLeDr3pXtc9u2bey7776lZZl2AV9HblAbHr+ky+r999/nvPPOo1u3bixcuJBDDz2Uzz//nA8//JD27dunOcyqpVhW+r0kyNdDszI57aF4m1dObPMiN2flEfdde+21nHvuuXz99dcAjBw5kqysLO655x7LkUk8SkpKeOqppzjvvPPo06cP1113HV988YXtsESsOumkk5g7dy4FBQX07duXnj178tVXX7mehIj7fJWIaAerjOOBi5rZpJ2x2NyclUfcp7HU/nbLLbdw1113ceyxxzJo0CAaNWrEKaecwqxZs2yHJmLNhg0buP/++zn22GO577772LFjB4WFhbbDEhf4amDxsGHDuOqqq8rtYL377ruMHTvW9Yt52fbnP/+Zt956i3nz5nHhhRfStWtXHnroIXbs2MGwYcNsh5dxhYWFvPjiiyxfvhwo2xm7++67LUdm37Jly/jd737Hhx9+SNu2benQoQPbt2/njTfesB2apIHGUvvbE088weeff86BBx6457FDDjmERx55hIKCAnuBiVg0dOhQ9t13X9q2bQtAly5dGDFiBDVq1KBv3752g5OM8lUioh2sMhMmTGDBggV7Lmr22Wef8emnn3LXXXeFIhHRzlhspbPyPPvss5qVJ4DuvvvucmOpzzzzzD1jqcX7mjZtSp06dco91rhxY/bdd19LEYnYN2vWLNatW7fnPLczzzyTkpISpkyZokQk4HyViGgHq7zatWszefJkqxc1s0U7Y7FpVp5gKx1LPWnSJDp06EBubi5PPPEEzZo1sx2axOGqq67irLPOYuTIkbRo0YIVK1Zw2223MXr06D3Ds9QzImHTuHFjFi1aRJcuXfY8tm7dOnJycixGJW7w1axZn3zyyZ4drKlTp/Liiy/y6KOPMnXq1KRPaPLrrFkjRoxg7ty5LFq0iAcffJC2bdty5ZVXctVVV/H73/8+7cvz4qxZy5cvZ9KkSaxatYrc3FyGDBliZWfM67NmaVYeT0p63W/YsIE777yT/v37c/zxx3PHHXfQqVMnzj777DSHWL2Ar/uMbJ/Dhg1j7ty5Vb7m888/T9vyAr6O3KBZkOKXdFlNnDiR4cOHc+6559KqVSuWLl3K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XHIJjzzyCEOHDqV3795cdNFFe71P0/eWCeP0vZW8mbVr11JUVETz5s3JzrYzCZzXEhFN3+sLSa/7KVOm8Nhjj1FYWMhZZ53F7373O3r16rVn4go3BXzdp337dByHr776igkTJvDCCy+wbt06rrzySgYOHMjxxx+fkXUY8HXkBiUi8Uu6rL766ituvfVWtm/fvuextWvXcuKJJ7o+CY+tROT7779n27Ztez1e2QHWrVu38uqrr3LeeefxwQcfsHbt2r3ed9hhh3HYYYclFYtf6g0nVZs2bXKWLl3qbNmyJa7XN2/e3Fm5cmW5x5555hln0KBBSccAZLqGSTq2qhxzzDHOuHHjnKKiIsdxTFn279/fufnmmzOyvAyVU9Lx/PDDD84RRxzh1KxZ0+nXr59z1113OQMHDnS2b9+exm8dnxTKJiPxdO7c2fn555/LPfbGG284Q4cOzcjyUvj+YZZyua9bt855+OGHnYKCAqdNmzbOa6+9loa1mRiCve7TVk7bt293xo4d63Tu3NnZd999nQEDBjgvvPCC06RJk7QtIxaCvY7ckJH1UlJS4rzzzjtOcXGx8+233zrXXnut8/TTTzslJSUZWR7u/A6Sju/EE090brvtNmfYsGHOJZdc4jz++OPOoYce6qxatSqNpRCfFMvKlRjXrVvnnHrqqc6vv/7qXH/99c6pp566123ChAlJf36KZeCapL/grl27nDfeeMN57LHHyt3mzp1b5fsysYOFTxOR/ffff08SUmrmzJlO//79M7K8DJVT0vH079/fueOOO5yFCxc6/fr1c7Zv3+4MGjTI+cc//pHGbx2fFMomI/E88MADznHHHee89NJLzgcffOA8//zzziGHHOI8+uijzsyZM52ZM2emdXkpfP8wS7ncN2zY4Dz11FPOmWee6TRt2tR57rnn0rA2E0Ow133aymnFihUO4Jx00knOjz/+6DiOSU6UiPhCRtbLDTfc4OTn5ztFRUVO165dnd/97ndO9+7dnYcffjgjy8PjiUiLFi2c4uJi58MPP3Quvvhix3EcZ+LEic6YMWPSVALxS7GsElrW6tWrnby8PGfDhg3OBRdc4OTl5e11u++++zL0TWNLsQwSYmUsy+WXX8706dPp3r17uRNyGjRowBFHHBHzfbo+Qpl+/foxZcqUctP3vv3225x88smWI3NHYWEhL774IsuX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pC1btmjQoEEKDg5u2ubzzz9XbW2thgwZokGDBmnkyJFKSUnRo48+qvj4eK1du1a5ubmaPn26vv32W0mu8DJu3Di98sorcjgcWr16dYvj5+XlKSIiQhMmTNCwYcN00003eVX3vn37VFhY2OL2q1atUvfu3bVixQplZWVp7ty5cjqdyszMVP/+/XXnnXdqwoQJXs9l//79eumllzRixAj16tVL5eXlWrNmjaZNm6arr75aU6ZMUUhIiBYsWKCKigoVFha61WS1WpWXl6eHHnpIRUVFysnJaXV+77zzjoYOHaoBAwYoJCREH3/8cbt6AQAAAFwMHQ4iISEhuv7661VcXCxJWr9+vYYMGdLitlFRUQoLC1O3bt107Ngx7dq1SxMnTlRUVJTS09MVHx+vkpISNTQ06OjRo6qoqFBMTIwef/xxjRgxosXXDA4O1i9+8QvV1tYqOTm51VqXL18uu90uu92ucePGKTY2VhkZGW7bJScna/LkyerWrZvi4+P15ZdfqqamRlFRUQoNDdXll1+unj17ejWXc8aOHasxY8YoLCxMknTfffcpMTFRw4cPV1BQkCZNmqR+/fopKSlJBw4ccKtp//79WrlypaKiotSnTx91795dmzZtcrs+55yCggJlZGTIYrEoLS3N7eNZ3vYCAAAAuBhsvniRtLQ0FRUVKT09XVu2bNH06dO1ZcuWVveprKzUFVdcofDw8KbnevfuraNHj8pms2nmzJl69tln9fzzzys9PV15eXktvk55eblWr16tUaNGaf78+as03OoAAAnDSURBVEpKSlKXLl1a3DY7O1u5ubmSpNDQUF122WUtbtfY2KiHH35Ye/fuVXx8vMf5tzaXc6655ppm+/Ts2VOSK0jFxsY2BZSgoCA1NDS4jTF37lzdfffdysrK0tixY7VixQotX768xes6du3apcrKSj311FOyWCw6ceKEqqurdfbs2aY5e9sLAAAA4GLwydf3Jicnq7S0VJs2bdLPfvYzRUZGetznyiuv1JEjR+RwOJqeq6ioUGJiourr6zVw4EC98cYbWrp0qerq6vTiiy+6vYbD4dCTTz6p0aNH69FHH1VERITy8/MvOGZISIiio6MVHR19wTfeDodDM2fOVFZWloqKivTCCy90aC7nWCyWZvv88HFrTp06pT179uiOO+5QVFSU/vCHP+iFF15Qnz59mgLM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" alt="platform systemview">
</div>
<div class="title">Figure 1. Platform System Overview</div>
</div>
<div class="paragraph">
<p>Financial institutions deliver their services to customers through a variety of means today.</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Customers can call direct into branches (teller model)</p>
</li>
<li>
<p>Customers can organise into groups (or centers) and agree to meetup at a location and time with FI staff (traditional microfinance).</p>
</li>
<li>
<p>An FI might have a public facing information portal that customers can use for variety of reasons including account management (online banking).</p>
</li>
<li>
<p>An FI might be integrated into a ATM/POS/Card services network that the customer can use.</p>
</li>
<li>
<p>An FI might be integrated with a mobile money operator and support mobile money services for customer (present/future microfinance).</p>
</li>
<li>
<p>An FI might use third party agents to sell on products/services from other banks/FIs.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>As illustrated in the above diagram, the various stakeholders leverage business apps to perform specific customer or FI related actions. The functionality contained in these business apps can be bundled up and packaged in any way. In the diagram, several of the apps may be combined into one app or any one of the blocks representing an app could be further broken up as needed.</p>
</div>
<div class="paragraph">
<p>The platform is the core engine of the MIS. It hides alot of the complexity that exists in the business and technical domains needed for an MIS in FIs behind a relatively simple API. It is this API that frees up app developers to innovate and produce apps that can be as general or as bespoke as FIs need them to be.</p>
</div>
</div>
<div class="sect2">
<h3 id="_functional_overview">Functional Overview</h3>
<div class="paragraph">
<p>As ALL capabilities of the platform are exposed through an API, The API docs are the best place to view a detailed breakdown of what the platform does. See online API Documentation.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="data:image/png;base64,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9goPD9fmzZt17733ys3NLcd17rnnHl25ckUWi8X62OnTp9WsWTPdunVLzZs317JlyzR37lwlJCRo+vTpWcqwWCx699131b9/f73++uuqVKmSZs6cmW2drq6uqly5sipXrpztC2qLxaIJEybo0Ucf1fr16/Wf//wnX31JYzKZMqyT+W97rl+/roMHD6pv375yd3fXv/71L/3nP/9RnTp1rMEkvTVr1qhnz5569dVX9corr+j999+Xu7t7hisqjmwLAAAAILcMCRgVKlRQs2bNNG3aNHXp0sWhdTw8PFSzZk3rB8QvXryoM2fOqFmzZrpx44YGDBig69evy9fXVw899JDNW4EWLlyoqKgoPf/883JyctK4ceO0ePFiHT16NM99iY2NVUxMjDp06CAnJyf9+OOPGZ53cnLK8iFse30xQqVKlVS9enXt2rVLklS9enXrrVlpn31Jc+vWLf3888/q37+/mjdvbv3x9/e3+W1SAAAAgJEM+0d7Xbp00eXLl9WpUyeH13nuuef09ttva8CAAXr66ac1ZMgQlSlTRlWqVFH79u318MMPa+jQoZo1a1aWDzWfPXtWM2fO1Kuvvqry5ctLkvUzDe+//36Gqwm5UaVKFQUEBGjAgAEaMGCAjh8/rkaNGunjjz+WJPn5+WnmzJkZvjnLXl+MMnz4cE2bNk2PP/64nn32Wb300kvy8fHRO++8k2G57du3q1KlSmrUqFGGxzt37qytW7fq5s2bhrUJAAAAyMzx+3SklIL4GtO4uDidPXtWtWrVynK7z/nz55WQkKC6desaXm9Orly5ovLly6tixYqyWCy6du2aKleuLEm6efOmypUrJyenjPnMXl+McuHCBXl6eubqFisAAAAgr8xms0P/zuB//6bClOcPeW/evDnLP9jD7aVTp07q2LFjUTcDAAAAJUieA0bHjh158QkAAAAgA8M+gwEAAAAABAwAAAAAhiFgAAAAADAMAQMAAACAYQgYAAAAAAxDwAAAAABgGAIGAAAAAMMQMAAAAAAYhoABAAAAwDAEDAAAAACGIWAAAAAAMIxLUVT60Ywv9Muv22RyddP5w9uLogkAAABAqeHV6AFZEq7pwc4dNOqFfxZoXYUaMG7dSlKX7o8qoctUWboOlmq2KszqAQAAgFLpvCRd2K2Flw8qpGsP/fLTarm4OBdIXYUaMLp0f1RxT22W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M7MKFSooNjZWhw8fliSFhoaqQoUKeS4vL8dlegXRR6Cg/PTTT+rbt6+Sk5P11ltv6bvvvpOnp6fGjh2rL7/8Mk9lLl68WFLqG38bN240sLXGyjw/ZWb03HI7yGmbAfbc1gEjJCREDz/8sGrXrq2nn35aJ0+etD63evVqtWrVSl5eXurfv7/++usvSdL+/fvVtm1bffPNNwoMDNSnn35qs+zvvvtOkvSPf/xDV65c0S+//JLh+Z9++kmtWrVSw4YNtXTpUuvje/fuVfv27TVjxgz17NlTjRs31oIFC7Ro0SI1bdpUfn5+OnTokCQpOjpay5cv19GjR3XkyBHren379lWDBg00btw4paSkZFjOXr+DgoJksVi0ZcsWvfXWW9n2dc6cOWrRooW8vb315JNPas+ePTbXz1xvWt/c3d3VqFEjzZkzR5Lstr00e/PNNyVJy5cv1zvvvKMxY8Zox44dGZ4LCAjQa6+9prffflu9evWSlHpFLCAgQHfddZdef/11vfjii+rTp48k6cCBA+ratavuuusuPfTQQ5o7d661vn79+umll17ShAkTVL9+fQ0YMEARERGSpJ9//tk6ho8eParg4GDddddd6tatm0JCQqxlZFf+3Llz9euvv0qSevToocTExAxlXrt2TUFBQfL09JSXl5cGDx6sGzdu5NiuzKpUqSJvb2/rdgoNDVXLli0zLGOvrj///FO9e/dWnTp1NHLkyAzvuJ45c0a9e/eWp6en2rdvn+WYtiV9H+31w94+AwrLa6+9JhcXF4WGhurtt9/W448/ruXLl6tnz576448/cl3eyZMnFR4erscff1zS3+fFNDExMXr22Wfl7e2tbt26Wc8JOT1n7xju1q2bhgwZYl22X79+GjhwoPV3W8egrfkpM0fmlrzOr/bWszc32JuTAgICNHbsWI0ZM0b169fX4MGDdeLECXXt2lU+Pj4Ztqe9cvKzzQB7btuAcenSJT355JMqW7asgoKCtGrVKuuLtkOHDql3796KiYnRgw8+qNWrV+uRRx6RlDqxhYaGasSIEVq9erVcXFxslp/2zk/a7SzpJ9b4+HgFBgZq37598vLy0vjx463PxcbGatu2bRozZoyuX7+uo0eP6vnnn9ewYcPk5uamnTt3auTIkZKkGzduKDQ0VOfOndP169e1bds2jRo1SleuXFFMTIwmT56srVu3ZljOXr99fHwkSW5ubqpdu7bNvh4/flzBwcEymUzq06ePVq5cqWeeecbm+unrvXr1qvz9/RUeHq6AgABFRUUpODhYy5cvt9v20uzw4cNyc3PT/fffb33My8tLDRo00IULFxQdHa3du3dr1qxZeueddxQXFydJGjFihH788Ufde++9mjdvnmbNmmUNgU8//bT27dunwMBAnT9/XoMHD9aRI0ckSeHh4fr888+1YMECeXh4aNGiRfrkk08kpYbD/fv3S5JGjhypDRs2aMSIEbp06ZKGDBlivV0iu/I9PDzk7u4uSWrQoIFMJlOGMoOCgrRgwQI1aNBA3t7emjt3roKDg3NsV2YpKSny8/OzvgjYsWNHhu2XU10vvfSSVq5cqSpVqmjVqlUKCwuTlHolIyAgQOvXr1f37t0VGRmpRx99VMePH7e7D9P30V4/7O0zoDAkJCTo4MGDatGiherWrWt9vEGDBlq5cqXefvvtXJeZdt4bPny4mjdvrpCQEN26dcv6fFBQkL788ks1b95cx44dU3BwsFauXOnQc9kdw7t27dJvv/1mrWPfvn05HoO25qfMHJlb8jq/2lsvu7khpzlp586d+vTTT7Vx40ZFRUVp7ty5atmypZKTk3X27FkNGzZMf/75Z47l5GebAfbctgFj27ZtSkxMVLly5dS9e3etWbNGAwYMkCTNmzdPFotFCxcu1KxZszRo0CDt3Lkzw6RVr149HT58WMOGDctS9rFjx7Rv3z717NlT9957r+rXr69ly5ZZJ9YtW7YoLi5OM2bM0IYNGzRx4sQsZYwePVobN25UcHCwEhIStHjxYm3fvl316tXTsWPHsu1X3759tXnzZq1YsUKS9OOPPzrc74kTJ8rJyUktWrTQ4MGDbfY1KSlJH330kVasWKFhw4bJw8PD+i5MdutL0jfffKOYmBhNmzZNCxcu1Pbt2yVJ06dPd7jtpUlcXJyio6PVsGHDLCG2adOmkqTz589bl125cqV+/vlnJSUlaf369erZs6c2bNigo0ePWm/xuXXrlp599ll9//33mjhxotq0aSNJGa7cVapUSYcOHdLWrVtVp04drVmzJkPdSUlJ2rp1q5ycnOTr66uvv/5a8+fP182bN+2W37NnT+u7fR999JHKlCljLfPChQsKCQlR586dtWnTJm3fvl1ms1mLFy/W1atXHWpXevfff79CQ0MVFxenAwcOyM/Pz6G6rly5ovXr1+vBBx/Uvn37tGHDButVtLCwMB08eFAvvviiZs6cqdmzZys+Pj7XtxPa6oe9fQYUlvPnz8tisahGjRrWxx5//HF5eXnJy8tL7dq1y3WZixcv1h133KF27dopICBAV69e1fr16yVJV65c0fLly9WjRw+tWLFCmzZtUt++fXX16lW7zzkyX9hj6xi0Nz+lZ29uyev8am89e3ODI3OSt7e39uzZoyVLlkiSnnjiCW3atEljxoxRUlKSTp065VA5+dlmQHZKZMBIG+jp3ymxWCxKTk5W2bJlJaVeRjWbzVq6dKk6dOigJ554QlFRUZJSPz8hpX5Iu0KFCpo9e7Yk6dSpU9byevXqle0HxtPuOY2Pj9dnn32mqlWrKioqSuvWrZOUem+9JHXq1EmSbN4KUb16dUnSHXfcIUm6++67JaVeHbD3eY60A75atWqSZH1XO429fmcnfV+9vb21b98+NW/eXI0aNdJff/3l0K1MaSHkgQcekCTVrVtXnp6eGW51yantpUn58uVVvXp1HThwQPHx8RmeS3tXPW1M1K9fXz179pSUegtfbGysWrduLUmqWrWqGjduLCn1uChTpoyef/551ahRQ8uWLZOkDPvvnnvuUZUqVazrZt4HLi4uGj16tP744w/169dPrVu31vr161W5cmWHyrcl89iQpLZt28pisViPuZzalZ6fn5+OHj1qfSFz3333OVTX2rVrdfXqVXXs2FEmk0n33HOPNcyl3R4yefJkVahQQQ8//LCkjHOCI2z1w94+AwqLp6enTCaTLl68aH2sRYsW8vf3182bN3Xp0qVclXfkyBEdPHhQNWvW1IwZM6y3Gadd1Ug7ptKOsbp16+qHH35QUFCQ3eccmS/syc1ckpm9uSWv86u99ezNDY7MSXfeeaekv8+ptWvXlpT6OkJKfcPIkXLys82A7JTIgFGlShXVrFlTp06dsh7cf/zxh5KTk9WwYUNJUmJiokJCQrRhwwaNGjVKN27cUHBwsGJiYqwv6tevX68TJ05Yf9J/K1XaAWpL2gT69ddfa+TIkdYXhGmPpx3kZ86ckaQME7oj7F2KdHZ2truuvX5nJ31fp06dqgULFmj8+PGKiopSs2bNHGpzWmBKOznExsbq8uXL1scdaXtp07x5c8XHx1vvc5Wk48eP68yZM7rnnntUqVIlSRn3j6+vr8qUKWM9aSQmJlq3+dGjRzVixAj5+Pjo999/t3nLQ077ICEhQUOHDtWePXs0efJkNWjQQJ999pl++OEHh8q3JfPYSP972gkyN2Pjvvvuk7Ozsz755BM1a9ZM5cqVc6iutMv8p0+ftj6X9qIq7QQ9duzYDHPClClTHG5Xdv2wt8+AwlK+fHk1aNBA+/fvt14lHz9+vN544w3Fxsbmury0N9oOHTqkkSNHaubMmZJSP1OWkJAgX19fubi4KDo6WlLqZwpnzpypHTt22H0up/mifPnyGd6UyRyM8nOesTe35HV+tbeevbnBqDnJkXI4N6MglMiAIUlms1kXLlxQ69atNXnyZHXs2NH6uCStXbtWd999t/UzBp07d1aZMmXk5OSkzp07S5K+/PJLnT9/XsHBwercubNDX7F34MABHTlyRD169NChQ4esP3feeadWrFihhIQE64dx33jjDS1cuFCvvvpqwWwEG+z1W5KcnJx05swZnThxwub6169flyS1a9dOO3bs0Pbt2zO8Q5Pd+r169ZLJZNL777+vkJAQDR06VMnJyerdu3cB9bTke++992QymTRo0CB98sknmjVrlgICAiRJkyZNsrmOu7u7OnTooK+//loTJ05U7969dfPmTUl/77vGjRvLYrFo/vz5knK+wpBeXFycGjZsqLFjx6pHjx7Wr1Z2dXXNsfy0MbZx48YMddavX18NGzbU2rVr9dlnn2natGnatGmTWrRooTp16jjctjTly5dXkyZNtGHDhgy3MORUl9lslp+fn0JCQvT5559r+PDh1vB/3333yc3NTcuWLdO5c+c0Z84cmc1mQz4nZG+fAYXp3Xff1a1bt+Tn56cxY8Zo0qRJ1s8fZjZ69Gi98MIL1p+9e/dmeP67775TuXLltGfPHut5cODAgYqJidFPP/2kypUr64EHHtD333+v1atXa9y4cXrhhRd09epVu8/lNF/4+vrq8OHD+uijj9SnTx+Hv043u/kpPXtzS17nV3vr2ZsbjJiTTCZTvspxZJsB2SmxAWPOnDlq27atdu/erXHjxunixYsaNGiQxowZIyn1mxECAwP1wQcfqF69egoLC9N7770nNzc3PfXUU3rzzTe1adMmderUSbt27dKUKVNUuXLlHOtNe9fmqaeeUuPGja0/AQEBio2N1dq1a1W7dm2NHDlSu3bt0sCBA3P9Pfn5+TCVvX5L0qBBg3Tw4MFsv1ozKCjIej/uiy++qC5duigxMdF6OTW79Zs3b66PP/5YR44c0WOPPaZFixapf//+fIWnHW3atNG8efOUmJioUaNGaejQoYqMjNSkSZP0xBNPZLte2pWFadOmqWLFimrcuLGcnZ1lNpvVrVs3TZ06VU2bNrX+r4a0DxM6okqVKnrvvfd05MgRNWvWTKNGjVKfPn0UGBiYY/m9evWSl5eXunTpkuEdRicnJ3399de64447NHLkSI0ZM0a1atXSggUL8jzW007+mV8E5FTXW2+9paSkJA0bNky//vqr9X7o6tWra/HixfLw8FDnzp01ZcoU9enTx7BvespunwGFqV+/fpo+fbqSkpI0bdo0vfnmm/L19bX5bvzcuXM1c+ZM60/6zxrs27dPx44dU/fu3dWyZUvreTDt835pV/MnTJggi8Winj17atasWRoyZIj1Fp3snsvpGH755Zfl7Oysl19+WVFRUWrQoIFDfc9ufsosu7klr/NrTutlNzcYMSeZTKZ8lePoNgNsyc3ZPSU8PDzPFZnN5gJJwDExMYqMjJSvr69cXV2zPJ+YmKjIyEjrNyClZ7FYFBERIW9vb+tnN4x06dIlpaSkZPhQXWGx1+9bt24pISHBegtOZhaLRZGRkdm+u2xv/fj4eEVERKhmzZrWW9EKg8lkUn7GpxHyOsaTkpJ08uRJ3bp1K9txnCY5OVlr1qxRtWrV1K5dO8XGxsrb21vt27e3fgPLuXPnVL169XyP6ZMnT+quu+7K0p6cyo+KilLVqlWzPJ6SkqJTp07JyclJ3t7eBfqtJPbqio+P17lz53TPPffYbMOZM2fk5uZmsw954cg+c0RxGOMoWbKbk5KSknTixAl5eXk59MZafiQmJurEiROqWbOm9XYdR56zdwwnJSXpr7/+ytO5Nbv5yVF5nV9trefo3GDUnJTXcmxtM+aj0sdsNju0z/93J1GuzvDFMmAAUvGY7AprjA8YMEBLlixRx44dtW/fPkVHR+vLL7/UoEGDCrxu5I0R+6w4jHGULJx3i7+SOp8zH5U+uQ0Ytv/JA4Bia/bs2erfv7+2b98uf39/+fv7q3379kXdLNjBPgNgC3MDblcEDKCEqVSpkgIDAxUYGFjUTYGD2GcAbGFuwO2qxH7IGwAAAEDxQ8AAAAAAYBgCBgAAAADDEDAAAAAAGIaAAQAAAMAwBAwAAAAAhiFgAAAAADAMAQMAAACAYQgYAAAAAAxDwAAAAABgGAIGAAAAAMMQMAAAAAAYhoABAAAAwDAEDAAAAACGIWAAAAAAMAwBAwAAAIBhCBgAAAAADEPAAAAAAGAYAgYAAAAAwxAwAAAAABiGgAEAAADAMAQMAAAAAIZxKayK/Pz8ZDKZCqs6lDJ+fn5F3QTGOApUcRjjKFmYk1BQmI+Qk9zMPCnh4eEF1hAAAAAAxY/ZbJYjOcBsNkuSiVukAAAAABiGgAEAAADAMAQMAAAAAIYhYAAAAAAwDAEDAAAAgGEIGAAAAAAMQ8AAAAAAYBgCBgAAAADDEDAAAAAA5JuHh8dRSXIp6oYAAAAAKNn+91+8G0pcwQAAAACQD/8LF6a0vwkYAAAAAPIkc7iQCBgAAAAA8sBWuJAIGAAAAAByKbtwIREwAAAAAOSCvXAhETAAAAAAOCincCERMAAAAAA4wJFwIREwAAAAAOTA0XDh8EKSVKVKlb3R0dEt8tooAAAAACVP+fLlr8TFxVUv6nYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAn/w8agAQAghp0/QAAAABJRU5ErkJggg==" alt="platform categories">
</div>
<div class="title">Figure 2. Platform Functional Overview</div>
</div>
<div class="paragraph">
<p>At a higher level though we see the capabilities fall into the following categories:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Infrastructure</p>
<div class="ulist">
<ul>
<li>
<p>Codes</p>
</li>
<li>
<p>Extensible Data Tables</p>
</li>
<li>
<p>Reporting</p>
</li>
</ul>
</div>
</li>
<li>
<p>User Administration</p>
<div class="ulist">
<ul>
<li>
<p>Users</p>
</li>
<li>
<p>Roles</p>
</li>
<li>
<p>Permissions</p>
</li>
</ul>
</div>
</li>
<li>
<p>Organisation Modelling</p>
<div class="ulist">
<ul>
<li>
<p>Offices</p>
</li>
<li>
<p>Staff</p>
</li>
<li>
<p>Currency</p>
</li>
</ul>
</div>
</li>
<li>
<p>Product Configuration</p>
<div class="ulist">
<ul>
<li>
<p>Charges</p>
</li>
<li>
<p>Loan Products</p>
</li>
<li>
<p>Deposit Products</p>
</li>
</ul>
</div>
</li>
<li>
<p>Client Data</p>
<div class="ulist">
<ul>
<li>
<p>Know Your Client (KYC)</p>
</li>
</ul>
</div>
</li>
<li>
<p>Portfolio Management</p>
<div class="ulist">
<ul>
<li>
<p>Loan Accounts</p>
</li>
<li>
<p>Deposit Accounts</p>
</li>
<li>
<p>Client/Groups</p>
</li>
</ul>
</div>
</li>
<li>
<p>GL Account Management</p>
<div class="ulist">
<ul>
<li>
<p>Chart of Accounts</p>
</li>
<li>
<p>General Ledger</p>
</li>
</ul>
</div>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_principles">Principles</h3>
<div class="sect3">
<h4 id="_restful_api">RESTful API</h4>
<div class="paragraph">
<p>The platform exposes all its functionality via a <strong>practically-RESTful API</strong>, that communicates using JSON.</p>
</div>
<div class="paragraph">
<p>We use the term <strong>practically-RESTful</strong> in order to make it clear we are not trying to be fully REST compliant but still maintain important RESTful attributes like:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Stateless: platform maintains no conversational or session-based state. The result of this is ability to scale horizontally with ease.</p>
</li>
<li>
<p>Resource-oriented: API is focussed around set of resources using HTTP vocabulary and conventions e.g GET, PUT, POST, DELETE, HTTP status codes. This results in a simple and consistent API for clients.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>See online API Documentation for more detail.</p>
</div>
</div>
<div class="sect3">
<h4 id="_multi_tenanted">Multi-tenanted</h4>
<div class="paragraph">
<p>The Fineract platform has been developed with support for multi-tenancy at the core of its design. This means that it is just as easy to use the platform for Software-as-a-Service (SaaS) type offerings as it is for local installations.</p>
</div>
<div class="paragraph">
<p>The platform uses an approach that isolates an FIs data per database/schema (See Separate Databases and Shared Database, Separate Schemas).</p>
</div>
</div>
<div class="sect3">
<h4 id="_extensible">Extensible</h4>
<div class="paragraph">
<p>Whilst each tenant will have a set of core tables, the platform tables can be extended in different ways for each tenant through the use of Data tables functionality.</p>
</div>
</div>
<div class="sect3">
<h4 id="_command_query_seperation">Command Query Seperation</h4>
<div class="paragraph">
<p>We seperate <strong>commands</strong> (that change data) from <strong>queries</strong> (that read data).</p>
</div>
<div class="paragraph">
<p>Why? There are numerous reasons for choosing this approach which at present is not an attempt at full blown CQRS. The main advantages at present are:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>State changing commands are persisted providing an audit of all state changes.</p>
</li>
<li>
<p>Used to support a general approach to <strong>maker-checker</strong>.</p>
</li>
<li>
<p>State changing commands use the Object-Oriented paradign (and hence ORM) whilst querys can stay in the data paradigm.</p>
</li>
</ul>
</div>
</div>
<div class="sect3">
<h4 id="_maker_checker">Maker-Checker</h4>
<div class="paragraph">
<p>Also known as <strong>four-eyes principal</strong>. Enables apps to support a maker-checker style workflow process. Commands that pass validation will be persisted. Maker-checker can be enabled/disabled at fine-grained level for any state changing API.<br>
Fine grained access control</p>
</div>
<div class="paragraph">
<p>A fine grained permission is associated with each API. Administrators have fine grained control over what roles or users have access to.</p>
</div>
</div>
<div class="sect3">
<h4 id="_package_structure">Package Structure</h4>
<div class="paragraph">
<p>The intention is for platform code to be packaged in a vertical slice way (as opposed to layers).<br>
Source code starts from <a href="https://github.com/apache/fineract/tree/develop/fineract-provider/src/main/java/org/apache/fineract" class="bare">github.com/apache/fineract/tree/develop/fineract-provider/src/main/java/org/apache/fineract</a></p>
</div>
<div class="ulist">
<ul>
<li>
<p>accounting</p>
</li>
<li>
<p>useradministration</p>
</li>
<li>
<p>infrastructure</p>
</li>
<li>
<p>portfolio</p>
<div class="ulist">
<ul>
<li>
<p>charge</p>
</li>
<li>
<p>client</p>
</li>
<li>
<p>fund</p>
</li>
<li>
<p>loanaccount</p>
</li>
</ul>
</div>
</li>
<li>
<p>accounting</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Within each vertical slice is some common packaging structure:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>api - XXXApiResource.java - REST api implementation files</p>
</li>
<li>
<p>handler - XXXCommandHandler.java - specific handlers invoked</p>
</li>
<li>
<p>service - contains read + write services for functional area</p>
</li>
<li>
<p>domain - OO concepts for the functional area</p>
</li>
<li>
<p>data - Data concepts for the area</p>
</li>
<li>
<p>serialization - ability to convert from/to API JSON for functional area</p>
</li>
</ul>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_design_overview">Design Overview</h3>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
The implementation of the platform code to process commands through handlers whilst supporting maker-checker and authorisation checks is a little bit convoluted at present and is an area pin-pointed for clean up to make it easier to on board new platform developers. In the mean time below content is used to explain its workings at present.
</td>
</tr>
</table>
</div>
<div class="imageblock">
<div class="content">
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAw4AAAHXCAYAAAAV7A2DAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEwAACxMBAJqcGAAAIABJREFUeJzs3Xlc1NX+x/HXsCMIyi7I6gbuJS6ZJi5pLml5XXLNUq+WqS1allpZ3bzZYqZW9jPLNPfSm2k3NbW0zELLpdxIERUTUBTZEeb3BzFXQphBgQF9Px+Pech3Oed8zozi9zPne84XREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREpGwYrB2AiIiIiIhcU3UgEKj9158uQBpwCjj915+XKyoYJQ43OR8fn0MJCQnh1o5DRERExFocHBz+zM7OrmXtOCzgVK1ateHVq1cfdvHixZYGg8EmICAgNyAgwBASEmLTtGlTu/3791+JjY3NO3PmjPHMmTO2RqMx19PTc8/FixcXp6enfwJklVdwShxubsbo6GhrxyAiIiJiNZGRkQU/VtrrXgcHh/7+/v5PnDlzptUDDzyQN2rUKPvmzZvj5uZmtuylS5f45Zdf+PDDD3NWrlxpGxAQsDs+Pn52dnb26rKOs9K+gXLDlDSIiIjILS0yMpLo6OiC5KHSXfe6u7s/5O3t/Vz9+vX9R44cWa1v3743XOfnn3/Ohx9+mH706NH4xMTEf126dOnjG480X6V7A6VMKGkQERGRW1pB0lDwM5XoutfX1zfEwcFhY8uWLUNWrFjhbG9vX+Zt5OTkMGjQoPTo6OjY7Ozs7mfPno270TptyiIwqVSUNIiIiMgt7eqkobIJCgqanZeXd/ijjz6K+Oyzz8olaQCwt7dnzZo11RYuXNjwypUrxwIDA9+40TqVONxclDSIiIjILa0yJw116tSJHjx48KMJCQmOnTt3rpA2u3TpQkJCgsOgQYPG16lT5+cbqavSDNnIDVPSICIiIre04pIGa9+qZDQaDS4uLmlHjx51DggIsFYYxMXF0bBhw7TU1NTqBoPBWNryduURlFQ4JQ0iIiJyS6usIw1Go9HO2dk5/fTp0/aenp5WjSUoKIjjx4+7uLi4ZBqNRheDwXClNOWVOFR9ShpERETkllaJkwYbBweHzPPnz9tWr17d2uEA4OPjw5kzZxwcHR0zjEajQ2lGHpQ4VG1KGkREROSWVomTBoOtre2VtLQ0g5OTk7XDKaRGjRokJyfb2dra5hqNRltLkwclDlWUs7NzYkZGxtUPNRERERG5pfj7+1fKpAHAx8fnxIkTJypd0lCgWrVqnDhxwuDr63sCCLGkjBKHKiojI8Orsv5DEREREakIlfUL1LCwsCVjxoypHRQUZO1QShQUFMSkSZMC3n///U+OHz8+3Nz5Wo5VRERERKSMhIeH312jRo1+Tz/9tK21Y7HE5MmT7dzd3fvXr1/f7PqwGnEQERERESkjp0+fXnfs2LHKeX9SMb788kun8PDwdUCJM7g14iAiIiIiUgaCgoJW/Otf/3L28/Ozdiil4u/vz8svv1wtMDBwaUnnKXEQEREREblBtra2nRo2bNh5woQJVfIByxMnTrSJiIjoZmdn16G4c5Q4iIiIiIjcoJo1a77z3HPPeVk7jhsxZcoUL09Pz3eKO67E4SYyYsQI2rRpQ0pKSqH9mzZtIjIyksWLFwPQo0cPYmJiAPjuu++49957+eKLL26o7aysLPr27csbb7xRaP9jjz3Gc889V+T86dOn06ZNG9q3b0+7du3o3r07b775JqmpqQD06dOHo0ePmm33+++/5/jx42XaF0tt2rSJ4cOH8/DDD7N3716z569YsYLIyEh++eWXQvvNvRcLFy7kqaeeKpc+iIiIyI2zt7dv7uHhEdq+fXtrh3JDOnbsiKura117e/sm1zquxOEmU716db799ttC+7755htq1qxp2l60aBHBwcEAbN++nfvvv5/evXvfULuOjo689NJLrFmzhj179gDw+eefExMTw5QpU65ZZtiwYezYsYOdO3eyatUqvv/++1Jf9K9bt46DBw+WaV8skZ2dzZtvvsmcOXN45JFH+OCDD8yW2bhxI40aNeLrr78ucqws3gsRERGxjuDg4H9Nnjy5mrXjKAtPP/10tZCQkFevdUyJw02mffv2bN261bSdlZXFL7/8Umid49dff51z587xn//8hx07drBu3To2btxIUlISjz/+OB06dGDw4MGmBABg7969TJgwgS5dujBlyhQuX75cpO3GjRszfPhwZsyYwR9//MHbb7/N9OnTcXNzMxt39erV6dat2zUf4pKYmMhzzz1H9+7dGTduHD/99BMAK1euJDo6mv/7v/9j1qxZFvflySefZNu2bQwfPpyYmBgmTJjAhg0bePDBBxk+fDh79uzh3//+Nz169GDy5MlkZmYWicnOzo6cnBxOnTrF/v37qV+/fon9O3nyJImJiTz11FNs2bKF3Nzc63ovREREpNJxiouLu2fUqFHWjqNM/POf/+TEiRM9AIe/H1PicJOJjIxk//79pKWlAbBr1y6aN2+Ovb296ZxDhw6RmZlJx44dad68Offeey/t27fn2WefpW7duqxfv56RI0cyefJkzp8/D+QnG0OHDuWTTz4hLy+P1atXX7P90aNH4+rqyoMPPkjXrl258847LYr76NGjbNq06Zrnr1q1Ci8vLz799FN69uzJrFmzMBqNdO/enUaNGvGPf/yDBx980OK+/PHHH7z77rv06tULf39/YmJi+Pzzz3nqqacIDw/nkUcewdHRkbfffpuTJ0+yadOmIjHZ2NgwevRonnzySbZs2cLw4SU/M+Wrr77i7rvvpkmTJjg6OrJ79+7rei9ERESkcqlVq9azjz32WJWcEF2c8ePHG2rVqlXkXnMlDjcZR0dHWrZsyY4dOwDYunUrHTt2vOa5bm5uVKtWjZo1a5KcnMy+fft46KGHcHNzo3PnztStW5edO3dy5coVLly4wMmTJ/Hx8eGFF16gV69e16zT3t6eVq1akZmZSbt27UqM9aOPPiIyMpLIyEiGDh2Kn58f3bp1K3Jeu3btGDt2LDVr1qRu3brExsaSkZGBm5sbzs7OeHh44Ovra1FfCgwZMoQBAwZQrVr+qOKoUaNo2rQpPXr0wNbWljFjxlC/fn3atGlDXFxckZj++OMPVqxYgZubG8HBwXh5efHdd98VmV9SYOPGjXTr1g2DwUCnTp2K3K5k6XshIiIilUtqaur4qrqSUnEmTpxoSE1NnfD3/XoA3E2oU6dObNmyhc6dO7Nr1y4mT57Mrl27SiwTHx9PSEgILi4upn0BAQFcuHABOzs7pk6dyuzZs5k7dy6dO3dm9OjR16wnJiaG1atXc//99/PWW2/Rpk0bnJyu/QyUwYMHM3LkSACcnZ1xcCgyIgZAbm4ukyZN4vDhw9StW9ds/0vqS4GIiIhCZXx9fYH8xMfPz8+UUNja2nLlypUibcyaNYsHHniAnj17MmTIED799FM++uija85L2LdvH/Hx8bz66qsYDAYuXbpESkoK2dnZpj5b+l6IiIhIpdKzR48exoK5ozeL4OBgevbsaVyxYkVPYEPBfo043ITatWtHdHQ03333HQ0aNKB69RIfAghAWFgYSUlJ5OXlmfadPHmSpk2bkpOTQ7NmzVi7di0ffvghWVlZzJ8/v0gdeXl5vPTSS/Tv359nn30WV1dX3n///WLbdHR0xN3dHXd392IvlPPy8pg6dSo9e/Zky5YtzJs374b6UsBgKPzFwN+3S5KamsqBAwfo27cvbm5uzJw5k3nz5hEcHGxKOK62ceNG7r33Xp5++mkmT57MK6+8gpubW6EREEveCxEREalcvLy8HujQoYOHteMoD3fddZeHl5fXA1fvU+JwE6pWrRpNmzblrbfeolOnThaV8fHxoVatWqaJ1efOnSMuLo6mTZuSlpbG4MGDSU1NpV69etx9993XvCVn2bJlJCcnM2bMGGxsbJgyZQorVqzg8OHD192XlJQULl26RPv27bGxsWHDhg2FjtvY2BSZvFxSX8qCq6sr3t7e/PzzzwB4e3ubbpEqmFtSICcnh82bN9O/f3+aNWtmenXs2PGaqyuJiIhIldLR3K3ZVdVfcy2jrt6nxOEm1alTJxITE+nQodiH/xUxcuRIXnzxRQYPHsywYcMYPXo09vb21KhRg3bt2nHPPfcwduxYFixYUGQy8OnTp3n//fd5+umncXZ2BjDNGXjllVcKfftfGjVq1KBXr14MHjyYwYMHc/ToURo2bMjbb78NQOvWrXn//fcLrSRVUl/Kyrhx43jrrbcYMGAADz30EBMnTqROnTrMmDGj0Hk//PADrq6uNGzYsND+qKgodu7cSXp6epnFJCIiIhWqelpamm+TJtd85EGV17RpU1JTU/0A14J9N9VEjluMsTyW68zIyOD06dMEBAQUue0mPj6erKwsQkNDy7xdc5KSknB2dsbFxYW8vDwuX76Mu7s7AOnp6Tg5OWFjUzgPLqkvZeXs2bP4+fmV6lYnERERKRuRkZEWLV/+17L0ZfqfdbVq1Xreeeed6zZt2nTTzhnu0qXLlZ07d96blZX1X9Dk6JvGjh07TCspyc2pffv2VPUnUoqIiNwsfH19e3fo0OGmvpa+66677E6cOHHv8ePHlTjcTHRRKSIiIlJxsrOz29/sz1y68847WbBgwV0F25rjICIiIiJSSn/++WeDWyFxSEhICC/YVuIgIiIiIlI6rRo0aJBalguvVEZOTk6EhYWlA7eDEgcRERERkdJq0LBhQ1trB1ERGjVqZAc0ACUOIiIiIiKlYmdn51WrVq3yWbKxkvH19XWysbHxBE2OvumNGzeO3bt3WzuMYrVu3fqaT6EWERERqaw8PT0Dvby8bom12H18fGy8vLyCEhISlDjc7Hbv3o3RaLR2GMXS8w9ERESkqnFxcant4eFh7TAqhIeHB9WrVw9MSEjQrUoiIiIiIqVhZ2fnd6skDp6entja2tYCzXEQERERESmVzMxM91slcfDw8CA7O9sdlDiIiIiIiJRKTk6O262SOHh6epKVlaXEQURERESktDIzM11vlcTBw8ODzMxMV1DiICIiIiJSKhkZGdVulcTB09OTjIwMF1DiICIiIiJSKs7Oztm3SuLg4eGBs7NzNihxEBEREREpleTk5Bp//vmntcOoEGfPniU5ObkGKHEQERERESm1WylxKKDEQURERESklK6+oL6ZKXEQEREREbkBGnEQERERERGzNOIgIiIiIiJm3YojDnZWjEMqQGBgIAaDwdphFCs4OJjIyEhrhyEiIiIVoHXr1syfP9/aYZQJe3t7a4dQIRwcHEw/V94rSjHHGB0dbfakyMhIjEZjBYQjIiIiUjKDwYAl1y+WioyMtKi+v76kLMvrXqODgwNZWVllWGXlZGdnR25uLoBBtyqJiIiIiJRS586d+eqrr6wdRrn68ssv6d69u2lbiYOIiIiISCndd999rFu3ztphlKv//Oc/9OnTx7StxEFEREREpJRuhcRh3bp13HfffaZtJQ4iIiIiIqXk4+NDnTp12LVrl7VDKRc//PAD9evXx8vLy7RPiYOIiIiIyHUYMmQIO3futHYY5WLnzp0MHjy40D4txyoiIiIich3GjRuHt7c3Dz30UKFv5qu6pKQkXn/9dRITEwvt14iDiIiIiMh1euedd5gwYYK1wyhTjz32GPPmzSuyX4mDiIiIiMh1GjRoELGxsTfNXIfvv/+e06dPM3DgwCLHlDiIiIiIiNyAuXPnMn78eGuHUSaKG20AJQ5SSk89O4OQhpGE3tYRg8FQZq/Q2zoS0jCSyVNfsnYXRUREREqlRYsW3HnnnaxZs8baodyQlStX0rFjR5o3b37N45ocLRbJyblCTR9/Mjq+QV77BVCrBfQxX85SsQBn9zD70EEWeNbiwrnT2NnZll0DIiIiIuVozpw5NG/enHr16tGsWTNrh1Nqe/fuZdasWezZs6fYc5Q4iEVq+viTNng7eDcsv0ZqtSC3Vgsu+zTDwy+QlKT48mvLQh07dmT79u3WDkOkRFFRUWzbts3aYYiI3PJ+/fVXatWqxS+//IKfn5+1w7HYmTNn6N27N6dPny7xPCUOYtZTz80go+Mb5Zs0XM2vORntX+GZ6S/z2svTK6bNYmzfvh2j0WjVGETMMRgM1g5BRET+cvbsWWxtbcnJycHGpvLPCsjNzSU4OJgrV66YPbfy90as7rN168nzblShbV7xbsKqtesrtE0RERGRsnDu3Dm8vb1JTU21diglSk1NxcfHhz///NOi85U4iFkGx+r5cxoqkn9LsHep2DZFREREyoCXlxfx8fHUqlWLzz//3NrhXNNnn31GrVq1iI+Pt/jhdUocxKzYX7ffUu2KiIiI3ChHR0cuX77Mp59+ypgxY6wdTiGjR49m+fLlXL58GUdHR4vLKXEQERERESknn332GS1atCA0NJQjR45YNZZDhw4RFBRE69atr2vpWE2OFhEREREpR//85z/p2rUrTz/9NKmpqTz99NNERUVVWPvbtm3jtddeo0aNGnz//fcEBgZeVz0acRARERERKWchISGsWrWK8ePHM2PGDFq1alXuD4xbs2YNLVu25OWXX+aJJ55gxYoV1500gEYcREREREQqTPfu3enevTs///wzs2bNYvny5dSsWZPOnTvTqVMnfH19r7vuc+fO8c0337B161aSk5OxsbHhvffeIzIyskxiV+IgIiIiIlLBWrZsyerVqzl58iRbtmxh/fr1PPHEE3h5edGzZ0+Cg4Px9vbG29sbHx8f08+JiYkkJiaSkJBg+vPkyZNs2LCB8+fPmxKQLl26EBwcXKYxK3EQqWSWLVtGYmIiEydOtOj8+fPn8/zzz+Pv78+5c+dwcXHh//7v/+jSpQsAtWvXZvPmzURERJRJfD4+Puzfv7/EJ2IOHTqUVatW4eDggNFopEaNGvTv358ZM2bg7u5eJnH8Xe3atfnqq69o0qRJhZYVERG5EcHBwYwcOZKRI0cC8Ntvv/Hdd99x8ODBIklCo0aN+O233wolEz4+PjRq1IjVq1fTsGH5PqxXiYNIJfH777+zdu1aZs+ezQMPPGBRmUWLFvHmm2/yww8/0KBBA4xGI59++in33Xcfhw8fpnbt2uUcdfEmTZrEq6++CsDFixdp1aoVISEhPP744+XS3g8//FBiMlNeZUVERMpSo0aNaNSoYh+8aylNjhapJGJjY0lKSiIkJMTiMv/61794/vnnadCgAQAGg4GhQ4fyxhtvcPnyZdN5mzdvpmXLloSEhPDee++Z9qelpTFq1CgCAwPp2LEjP/30k+nYmTNn6NatGx4eHvTt25d9+/YVaf+NN95g1KhR5ObmlhhnjRo1GDRoENu2bTPbbp8+fVi7di0tW7bkwIEDdO/enU8++YTWrVvTqlUrtm/fzqOPPkrt2rXp27cv6enpAEyYMIFTp04B8N1339G9e3e8vb0ZMGAAFy9eLHH/1WXPnj1Lr169cHd3p3nz5mzfvt0UW/fu3Vm3bh2RkZGEhoYyb94807Hi6hYREblZKHEQqSR69OjB7Nmz6dixo0Xnp6enc/z4cdq0aVPk2NixYwvdmrR8+XLmzJnD9OnTGT9+PBkZGQCMGTOG8+fPs2nTJsaMGcM999zDhQsXABg4cCDh4eHs27ePevXqmYZQC7z//vssXLiQmTNnYmtrW2Ks+/btY+XKlXTv3t1suwcPHmTq1Kk8+OCDhISEcODAAT744APefvttbrvtNrp06YKzszNffvklR44cYeXKlQBER0ebkojx48czadIkfvrpJ/Ly8pg/f36J+68uO3DgQJo0aUJsbCzTpk3jH//4B3/++ScABw4cYObMmXz00UdMmjSJiRMnmm1TRETkZqFblUSqqJSUFACL5gy88MILtG3blrZt2zJt2jSOHj1KUFAQK1asICYmhpCQECIiIvjggw/YuHEjrVq1YteuXWzZsgUnJydefPFFXF1dMRqNQH4iMnPmTPbs2YO3t/c125w5cyYzZ84EwMbGhs6dOzNo0CCSk5OLbXfo0KEAPPnkk4waNcpU1/Tp07njjjvIzc3l448/ZsaMGbi6utK1a1eOHj1aqN2cnBwSEhI4cuQId911F4sWLSIlJaXY/Vc7duwY33//PV9++SVubm7069ePuXPnsmHDBlPi9Morr9CkSROaNGnCq6++yrFjx2jYsKHZukVERKo6jTiIVFG+vr5Uq1aNXbt2FTm2ceNGfv/9d9P21Ws2u7i4kJGRwfHjx8nLy6NVq1b4+Pjg4+PD7t27OXfuHLGxsYSGhuLk5ASAs7Mz06dPx2AwADBr1iwyMjJISEgoNr7HH3+cpKQkkpKSSEtLY9OmTbi7u5fYboEWLVoUqqtgroaDgwNBQUG4uroCYGdnR05OTqFz7e3t+eCDD5g9ezYeHh5MnDiRnJycYvdf7cSJE4SHh+Pm5mbaFxYWVqif/v7+pp9dXV3JyMiwqG4REZGqTomDSBVlMBho1KgRW7ZsKbQ/KyuLYcOGmS76If8b/79zd3fHzs6OEydOkJCQQEJCAqdPn+aRRx4hPDychIQE09yFnJwcli5dair7xRdfMGnSJMaNG2cahfg7Z2dnPD098fT0LBRLSe1e3berXSv+4mRnZ9O2bVvT6EFGRgZTp04tdv/VGjVqxNmzZ8nLyzPtO3LkCHfccUeJsVhSt4iISFWnxEGkCti1axfR0dFF9r/88sssX77cNIE3JyeHxx9/nJYtWxIWFlZinaGhoQQEBLBs2TIATp06RaNGjThy5AhBQUGEhoaanmi5ePFi1q9fbyobGBjI008/TXx8PIsWLSpVX0pqtyykpKRw2223cenSJZo2bcrAgQO5cOFCsfuvFhAQQEhICJ999pkptmPHjtG2bdvralNERORmojkOIlXA/PnzcXd3L/Lkx27duvHcc8/Ro0cPqlevTmpqKrfffjtLliwxW6etrS2LFi2if//+zJ49m1OnTjFlyhRuu+02IP9e/sGDBzN16lRcXFxYvHhxofLOzs689tprTJgwgb59+1KzZk2L+mKu3RtV8OAcf39/WrduTVJSEm+//Xax+/9u2rRpDBs2jFdffZX4+Hief/55HBwcrqtNERGRm4nB/ClSSRmv9Q3030VGRhZ7K4mlDAYDvHBjdVyXGYYbjv1GGQzWj8ESWVlZxMTE4Ovri5eXV6nLHjlyBH9//yJls7OzSUpKKnRff1kpqd2yEBsbS0ZGRpEH3xW3/2ppaWn88ccfhIWFmeZT3Eib5a2q/D0VETEYDNccQb9ekZGRFtX31xdvZXnda7yVfu/+dQuxweIRB0dHx7NZWVm3zBOSHB0d/8zKyqpl7ThELOHo6HjdD4txdHSkadOm1zzm4OBQLkmDuXbLQnHPw7DkORkuLi7XFVtpnsEhIiJS1VicOGRlZfn1798fgFWrVpVbQNY2YMAAAFavXn3LJEkiIiIiIuaUanL0qlWr6N+/PwaDgdWrV5dXTFaxevVqDAYD/fv3v6kTIxERERGR61HqydH9+/fHaDQyYMAAVq9efVNcZBeMMtxK96qJiIiIiJTGdS/HejOMPmiUQURERETEMje0HGtVHn3QKIOIiIiIiOXK5AFwVWn0QaMMIiIiIiKlV2YPgKsKow9VbJThB+AQMBOIsXIsIiIiInKLK5MRh6tVxtGHKjrKMBd4ANhLfhLR3brhiIiIiMitrMxGHK5WmUYfqtgow9WWAw8BnYA7/trOBF4DZlsxLhERERG5BZVL4lBg1apVpm/7C0YiKsrq1asZMGDAjbZbGbKNVMAVcP/r9SowwKoRXUtOGhxaW/I5vk3zX1VIVFRUwWPWRSqtqKgoa4cgIiK3gHJNHMA6ow9lOMpg7SvGmcATV21fBtYAD1M5kpr/yU6FH94o+ZzIsVUucdi2bZu1QxARERGpFMo9cShQEaMPZTTKUJlM+evPi+RPlB5OZZ0o7eILY3+1dhQiIiIiUk4qLHGA8h19qMJzGYozE8gAUsgfYdho3XAskHcFDq+DlFMQ1B78I60dkYiIiIiUkTJfVela0tPTGTp0KDVr1qRp06Z8++23fP/992Wy8lIVXTHJEh2A6YAfVSFpAFg7HL4aD0e/hI87wC+LrB2RiIiIiJSRChlx6N27N15eXsTFxVG9enUAPvzwQ8aOHcvChQuve/ThJhxluFpbawdQKpkX4dBn8ERc/m1Lv62E72fBbQ9bOzIRERERKQPlPuKwe/dudu/ezbvvvmtKGgBGjhxJSEgIgYGBtGjRotDoQ3R0NEOHDjWdu3//fjp06EBgYCAjRozgk08+wWAw0LZtW+zt7Zk7dy5RUVGMHTuWZcuWmcqtXLmScePGlXcXBfInR1fzyk8aIP82pcxL1o1JRERERMpMuScO0dHRRERE4OHhUeRY7969+f3332nTpg2NGzc2TW5OTU3l8OHDAKSkpNC5c2f69OnDjh072LFjB88++yxGo5G77rqLL774grVr1/LMM8/QoEEDli5daqp/6dKlhIeHl3cXxeSqRagMttYLQ0RERETKXLknDklJSdSoUeOaxxo3bkxaWpppu2A1pI4dO5KcnGzaFxYWRmBgIKGhoUydOpXExERTuczMTFavXk337t3p168f27dvJy0tjfT0dLZu3Urfvn3Lu4tSIDcb4qPzX+f2w5XM/23HR8PleGtHKCIiIiLXqdznONSuXZsff/yR7OxsHBwcCh07efIkgYGBhfb179+fzZs3M2DAAAYMGEBYWBh79uxh2LBheHt7M2XKFPLy8jh//jwAISEheHp6AhAYGEizZs3YvHkzBoOB5s2bExAQUN5dlAJZKbCoXeF9V2/fNS3/JSIiIiJVTrknDq1ateLy5cvs3LmTTp06AbBkyRK6du3K0qVLef755wHIy8szlYmLiyM0NJT+/fszZcoUbr/9dn766SfT8fj4eGrVqkVSUlKR9vr378/69euB/02elgrgVhumZVo7ChEREREpJ+V+q1JI+TP6AAAgAElEQVSTJk3o0aMHzz33HKdPnwYgJiaG8PBwbGxsGDJkCMHBwZw8eZLY2Fjy8vJYsWIFkJ8EfPrppxw5coS4uDgAli1bRlRUFAbDtR/q3K9fPzZu3MjGjRvp169feXdPLHEhBra/CL98aO1IREREROQ6VchyrMuXL+ef//ynaRWltLQ0AgICSE5OZuvWrdx999106tSJiIgIQkJC6NChg+lWpDZt2jB+/Hjq1atHnTp1SEtLKzQB+u+CgoIIDg7GxcVFtylZU8Z5OLgS9i+BMz9B8F0Q9aK1oxIRERGR61QhiYObmxsrVqwwrZbk4eFBWFgY+/bt4/jx4wB88cUXnDt3Dg8PD+zt7QuVf+WVV3j88cc5c+YMERERprkSt99+O8eOHSvSnre3d6HlXKWC5GblP/xt3xI4thE868OlOHjyNLjWsnZ0IiIiInIDKiRxKODq6kpkZKRpu1mzZjRr1sy07evrW2xZLy8vvLy8Sqz/+PHjrFu3jkOHDmk1pYqWlgDzGkA1b2gyCDq/CjXD4K3aShpEREREbgIVmjiUt6ysLDIzM/n222+LjFpIObO1hxqhkHYOctIh74q1I6rSOnbsyPbt260dhkiJoqKi2LZtm7XDEBGRCnJTJQ4RERFERERYO4xbk1NNGLMXzu2DXz+GTzqDq1/+sx1SToFboNkq5H+2b9+O0Wi0dhgiJSpukQoREbk5lfuqSjehusCHwA/WDqRS8m0G3WbDk2eg0ysQ1hneqQuLO0HcTmtHJyIiIiLX6aYacShn3YHpQGPAFhhl3XAqOVsHaNAn/5WeCAeWwcVYCGpntqiIiIiIVD5KHMx7AngGcALcgVxgK7DcmkFVKdW8ofVEa0chIiIiIjdAiUPJdgHNyU8aCmQAdwO6AV1EREREbhma41CyO8gfWbh81T474DXAYOWXiIiIiEiFUeJg3sPA7eSPPlwkf/ThGatGVJmlJeTPaYD8ZVl//Qh+np+/spKIiIiIVFlKHCwTA7QFhgDnyL9d6d9Wjagy+nE2vOmf//RojLCiD2yfAYfWwvvNIeW0tSMUERERkeukxKF0NgJ+5K+udJeVY6lc0hJg2wvw8E5o/hAkHYYT22Dk9zB8CzQfAdHvWTtKEREREblOShyuz5vkj0BIgTM/QeAdULtN/nbcTqjdGqoH5G/X6QZn91ovvlvIL7/8wrBhw7j77ruZO3cuiYmJZss4OjpiMBgKvWxsSv71YDQamTt3Ljk5OcWes2vXLpo0aWK2/czMTAwGA9WqVcPV1RVXV1datGjBihUrzJa1NJbiPPXUU+zatQuArVu30rlzZ+rVq4eXlxft2rXjq6++Mp2bnp7O0KFDqVmzJk2bNsXX15fw8HB++CH/sS6JiYkYDAaSkpLMtmuurvK2YcMGnnvuuQppS0REbg5KHKRsGPPA5qpFuk7ugMCrcqvc7IqP6RZ06dIl7r77bmrVqsWsWbM4cOAADzzwgEVl9+7di9FoNL3y8vJKPD8vL48JEyaQlZVVFqEDcODAAVJTU0lOTmbWrFk8+eSTLF9ufuXj643l0KFDHDlyhDvuuIPc3Fz69evH448/zrFjx4iPj2fEiBH069fPVG/v3r25cuUKcXFx7N+/n3PnzjF58mQ6dOjAgQMHStV2WdZ1PXr27MnWrVs5ePBgubclIiI3ByUOUjYCWsKpXfDnr3D5TP48hzpd848Zc+GXRRDQ2rox3gJ+/PFHGjRowKxZs7jtttt46aWX2LZtm0XfgBsM116sa//+/XTo0IHAwEBGjBhBSkoKAPfffz8A7du3Jz09nQ0bNhAeHk5gYCATJkwgIyMDyB8NePHFFwkJCSEyMtKiC1V7e3s6d+7MlClT+Pe//zed6KuvviIqKoqgoCCGDh1q6tffYynuvL/797//zaBBgwC4ePEiycnJ1K5dGwAHBwdGjhzJ22+/TWZmJrt372b37t28++67VK9e3VTHyJEjCQkJYc6cOWb7VcCSuvbs2cPAgQNNx6Kjoxk6dKhpu7jP5fDhwwwZMoS5c+cSFRXF2LFjWbZsmancypUrGTduHADDhw/nnXfesThuERG5tSlxkLLhWgvungWL7oS3auffthTaGc7ugXnhcP4otNFD4MrbHXfcweeff27a3rFjBxEREXh5eZkt+9///pcVK1aYXjExMaSkpNC5c2f69OnDjh07cHBwYPjw4QCmC+XFixeTkJDAwIEDef3119m0aRM///yz6YL0999/5/z586xfv5769eszdepUi/vTtm1bDh06RG5uLkajkcmTJzNp0iSio6MLxXB1LE5OTsWe93f79u2jfv36AHh6etKhQwd69erFpEmT+Prrr8nIyGD06NG4u7sTHR1NREQEHh4eRerp3bs3v//+u8X9sqSu1NTUQnWmpqZy+PBhgBI/l/T0dL744gvWrl3LM888Q4MGDVi6dKmpnqVLlxIeHg5A/fr1+frrry2OW0REbm16AJyUndtHQdOhkJkMrn6AAVx88hOKut3BzslsFXJj3NzccHNzA2DZsmU89thjzJ8/36Kyy5cvx8XFxbQ9adIkLly4QFhYGE8++SQAr776Kv7+/qSlpREUFARAWFgYc+bMoUuXLtx7770AzJ07l9jYWFNMc+bMwcbGhkcffZSHH37Y4v54eHiQl5fHlStXyM3N5b333qN9+/ZkZ2dTt25dfvzxR4BCsWRmZhZ73tXy8vI4cuQIoaGhpn0bN25k1apVLFu2jPfeew97e3smTZrEtGnTSEpKokaNGteMs3HjxmzZssXift1oXatWrSr2c4H8OSOrV6/G09OTxo0bM3XqVNLS0jAYDGzdupX3338fgLp16xIXF8fly5cLjXyIiIhci8WJg4eHx68Gg6F5eQZTmXh4ePx64cIFa4dRteRdyb9FKeUUBLUH/0hwC8x/SYXJyspi8ODBHDhwgA0bNnDHHXdYVG7x4sU0b174n/iUKVM4cOAAPj4+pn15eXmcP3+egIAA077Y2FgiIiJM25GRkURGRrJr1y78/f1NE61dXFxMtzBZ4tSpUzRo0ABHR0eMRiPR0dGMHj2aS5cu4e/vj7e3d5Eyzs7OFp0XFxdHXl5eodGYatWqMWLECEaMGEF6ejpLlixh7Nix3HXXXdSuXZsff/yR7OxsHBwcCtV18uRJAgMt/3t+PXVduXLF9HNMTEyxnwtASEgInp6eAAQGBtKsWTM2b96MwWCgefPmps8uMDAQg8GgxEFERCxi8a1KFy5cuA3rPy25wl5/9VdKY+1w+Gp8fvLwcYf8eQ1Soa5cucKAAQPw8vLiwIEDFicNxXF3d6dr164kJCSYXnFxcUUubCMiIjh79qxp+9ixY+zYsQMAW1vb625/zZo13H777UD+bVevvfYaGzZs4OzZs0ycOPGa8zIsPc/Ozo7s7GySk5OB/G/xW7ZsaTperVo1xowZQ2RkJEePHqVVq1ZcvnyZnTt3ms5ZsmQJ586dY+nSpQwYMMDiflla19UT1OPi4jAajYDln0uB/v37s379er744otCcZ4/fx5HR0f8/Pwsjl1ERG5dmuMgZSPzIhz6DMb+CsO/gT6L8p8YLRVq06ZNxMTE8Prrr5Obm0t6ejrp6emmC85Vq1aRkJBgcX0dO3Zk27ZtxMXFAfm3P0VFRRVasjU9PZ1evXrxzTffcPLkSXJzc5k4cSLnzp0rdfwZGRmkp6eTmJjIG2+8wdKlS5k2bRqQP+m3WbNm1KlThytXrrBy5UpTv66OpaTzrhYQEICHhwcxMTEAtG7dmt9++63Q8quHDh3i2LFjNGvWjCZNmtCjRw+ee+45Tp/Of5hhTEwM4eHh2NjYMGTIEFO55ORkLly4YHplZmYWatuSuoKDgzl58iSxsbHk5eUVWpq2pM/lWvr168fGjRvZuHEj/fr1M+0/ceKEqU0RERFz9L+FlI3sVKjmBS6++dv+kZB5ybox3YJ27drF77//jru7Oy4uLqbXiRMnABg2bBiHDh2yuL42bdowfvx46tWrR8OGDXn22Wf58MMPAbCxsaFbt26mW1969epFeHg49erVw8HBwbTSUWk0adIEFxcXQkND2b59O2vWrKFBgwZA/rfmsbGxtGjRgsaNG9O+fXt++eUX/vOf/xSKpWfPnsWedzWDwUC7du1MiUNwcDALFixgyJAh1K1bl8aNG3Pfffcxbdo000jE8uXLCQkJISQkhNDQUN577z0CAgJIS0tj69atprrr16+Pp6en6VUwp+Bq5uoKCQmhU6dORERE0KhRI8LCwiz6XK4lKCiI4OBgGjZsWOgWs+PHj9OoUaNSf04iInJruvbXU1IVGAtWjClJZGTkNb9tLQ2DwQAvmKkj5TQsbANP5n97ysVY+KQLTIi5/oZnGG449qrKYKhcfU9KSuLMmTNEREQUuSf/4sWLpom+Fy5cwNbWFnd393KL5Y8//iA4OBg7OztSUlJwcHDAycmpSCwlnVdg/fr1LFmyhFWrVpn2ZWRkcOzYMWrUqGGadP13BSsceXh4EBYWxr59+zh+/Ph1JUvm6jp37hweHh7Y29sXKVvS5/J39957L0OHDi20xOuAAQMYNWoUXbt2LXXcUPn+nopI5WcwGLDk+sVSkZGRFtUXGRkJZXvda7yVfv/9NaJt0KpKUnZysyH+r3+8l+PhSub/tgGq++e/pMrx8vIqdknXq1cHutbyomWtTp06pp8LVpC6ViwlnVfg3nvvZd68ecTExFC3bl0gf3J106ZNS4zB1dW14D8hAJo1a0azZs0s70Qp6vL19S22bEmfS4Hjx4+zbt06Dh06RN++fQvtT09Pv+6kQUREbj1KHKTsZKXAonaF9129fde0/JdIJbJgwQISExOtHUa5ycrKIjMzk2+//bbQqEVSUhLz5s2zYmQiIlLVKHGQsuHiA/+MBp/G1o5EpFQK5hncrCIiIgotlVugVatWVohGRESqMk2OlrKRlpA/p0FEREREbkpKHERERERExCzdqiRlJzcLYv5b/HGPuvkvEREREalylDhI2cm8BOtGFH+87aT8l4iIiIhUOUocpOy4+MCkP60dhYiIiIiUA81xEBERERERs5Q4SNmxsbV2BCIiIiJSTnSrkpSdvFxrR3DTiIqKKni8u0ilFRUVZe0QRESkAilxEKmEtm3bZu0QRERERApR4iBlR8uxioiIiNy0lDhI2dFyrCIiIiI3LSUOUna0HKuIiIjITUurKomIiIiIiFlKHKRs2NqDXzNrRyEiIiIi5USJg5QNF18Y+rW1oxARERGRcqI5DlI20hJgee+Sz7l9VP5LRERERKocJQ5SNhxcCicFB1eAoxvU6/G/fbVur/i4RERERKRMKHGQsmH/t8Qh4SC4+lX5EYaOHTuyfft2a4chUuaioqL0oEERESkVJQ4iJdi+fTtGo9HaYYiUOYPBYO0QRESkitHkaBERERERMUsjDlI28q5Ayun/bWelgJ0jXIz93z6nGvkvEREREalylDhI2Uj9E+aEFt3//az//dzhBYh6scJCEhEREZGyo8RBykZ1f3j2csnn2DpUTCwiIiIiUuaUOEjZMNiAg6u1oxARERGRcqLJ0SIiIiIiYpYSBxERERERMUuJg4iIiIiImKXEQaQcff311wwYMID77ruP+fPnk5qaarbMpUuXGDRoEJ6entx+++04OTnRvXt3zp07VwERg9FoZO7cueTk5BTa37p1axwcHHBwcMBgMGBvb2/aPnjwYKnbyc3NxWAw8McffwCwdetWOnfuTL169fDy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+561SPVuBn7Ny7/BM7tx+f4F/r32VPm3JSIiIiIWUeIgFkk+dxqPWoFktH+FK15NwL9l2TcS/zO2iQdw/eEFzp89Wfb1i4iIiMh1U+IgFrGzsyUlMZ5npr/MqrXvg70Lsb9uL7P6Q5pHYchJY8A/+mikQURERKQSUuIgpfLay9N57eXp1g5DRERERCqYJkeLiIiIiIhZShxERERERMQsJQ4iIiIiImKWEgcRERERETFLiYOIiIiIiJilxEFERERERMxS4iAiIiIiImYpcRAREREREbOUOIiIiIiIiFlKHERERERExCwlDiIiIiIiYpYSBxERERERMUuJg4iIiIiImKXEQUREREREzFLiICIiIiIiZilxEBERERERs5Q4iIiIiIiIWUocRERERETELCUOIiIiIiJilhIHERERERExS4mDiIiIiIiYpcRBRERERKQC/N///R/e3t7UqVOH+vXr4+Hhweuvv47RaCyzNurUqcOvv/5aZvVdza5cahUREREREZMFCxbw8ssv89VXXxEZGQnAb7/9Rvfu3cnMzGT69OlWjtA8jTiIiIiIiJSzV199lZdeesmUNAA0atSIoUOH8tZbb5GXl0efPn1Yu3YtLVu25MCBA8THxzNo0CACAgLo2rUr33zzjansmTNn6NatGx4eHvTt25d9+/YVaTMtLY1Ro0YRGBhIx44d+emnn26oDxpxuMm1bt0ag8Fg7TBEREREaN26tbVDsIrExETi4uLo2LFjkWO9e/dm5syZnD17loMHDzJ16lQeffRRQkJCmDlzJrVq1WLv3r1s3ryZxx57jN9//x2DwcDAgQNp0aIFCxcuZN68eYwcOZLo6OhCdY8ZM4a0tDQ2bdrEvn37uOeee4iJicHDw+O6+qHE4SY3f/58a4cgIiIicktLSkoCuOYFe1hYGADp6ekAPPnkk4waNQqAnj170qxZM1xcXGjcuDGHDx8mNTWVs2fPsmvXLrZs2YKTkxMvvvgirq6uheZKJCcns2LFCmJiYggJCSEiIoIPPviAjRs3MnTo0OvqhxIHEREREZFyVLt2bQC+//57evToUejYjh07MBgMBAYGAtCiRQvTsStXrnDffffxyy+/0LhxY9P+2NhYQkNDcXJyAsDZ2bnIHInjx4+Tl5dHq1atTPvS0tLo2bPndfdDcxxERERERMpR9erVCQ8PZ9OmTUWO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pa7jaA7nz59XFhcX76+5jYkDEREREdFzKCwsjFq/fn2JruNoDhERESWFhYVRNbcxcSAiIiIiej6JSqXydmxsrK7jaFJHjhyBSqVKBpBYczsTByIiIiJ6qVlaWiZq3+v55OfnL1m9evVLNbvSypUrywsKCj5/djsTByIiIiJ6acnlcmRlZbk21/GLior2X7lypeTOnTvNVUWLSk5ORkJCQnFhYeHBZ99j4kBERERELyW5XA4AzT4PvUQiWf31118rmruelvDVV18pxGLxivre44T+Ly7VxYsXdR0DERERkc7I5XKo+z7UUklDNZFIpFIoFC/0elmVlZVo166dUqlU1rswBXsciIiIiOil0tJJAwBYWlqGbdq0qbIl62xqGzdurLSwsPha3fsvbkpE7HEgIiKiNq2+HgddJA3VjIyMSjIyMiSdOnXSRfV/Sk5ODmxtbUtKSkqk6vZhjwMRERERvRR0mTQAgFQqfX3s2LGluqr/zxg7dmypRCJ5TdM+TByIiIiI6IWn66QBAHJzc4+XlJT8FBYWpsswGm3VqlWqsrKyg7m5ub9o2o9DlV5cHKpEREREbVr1UKXWkDTUZGZm9vjixYum9vb2ug5Fq7t372LgwIGP8/LyzLTtyx4HIiIiInphtbakAQDKyspGjBo1qljXcTTEqFGjisvKykY2ZN9W1cjUcKampleePHnSV9dxEBEREemKRCLJKS0ttdB1HPUZOXLk6Pbt2/9n//797XUdizrjx48vKi4ufvPEiRNHdR0LEREREVGb5eLiEhoQEFCsaoUmT55c7OTk9P903UZERERERARg4MCBi8aPH1+q60Shptdee6100KBBn+i6bYiIiIiIqIZ+/frN9fLyKtB1wqBSqVRDhgwp7N+//zu6bhMiIiIiIqpH9+7dJ/n6+qYlJCToJGG4evWqytfXN83W1naCrtuCiIiIiIg0MDAwGGxubp4+f/78ipZMGt57770KCwuLBwYGBnJdtwERERERETWQs7PzMiMjo4rdu3c3a8Kwe/dulZGRUaWLi8s/dX3ORERERET0fNp369btREBAQMamTZtUxcVNM/lSUVGRatOmTaqAgIAMa2vr4wCkuj5RIiIiIiL687y6du26TywWV/j6+pZv375dpVQqG5UsKBQKVVRUlGrcuHHlYrG4vGvXrvsAeDV1oFwAjoiIiIioFZBIJBPMzMzmFRQUvNqlSxc4ODgYOjg4GHXr1g02NjaQyWS4e/cu0tLS8ODBA9y5c6fs9u3bFQ8fPhSZmpr+mpeX901paen+5oqPiQMRERERUeuiB6APgG6dO3d2lkgkjgqFortYLFaWl5fr6evr3y8tLb2dm5ubBCANwFUAKp1GTERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERP/z/wGc/zL1vfWiEQAAAABJRU5ErkJggg==" alt="command query">
</div>
<div class="title">Figure 3. CQRS</div>
</div>
<div class="paragraph">
<p>Taking into account example shown above for the <strong>users</strong> resource.</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Query: GET /users</p>
</li>
<li>
<p>HTTPS API: retrieveAll method on <strong>org.apache.fineract.useradministration.api.UsersApiResource</strong> invoked</p>
</li>
<li>
<p>UsersApiResource.retrieveAll: Check user has permission to access this resources data.</p>
</li>
<li>
<p>UsersApiResource.retrieveAll: Use 'read service' to fetch all users data ('read services' execute simple SQL queries against Database using JDBC)</p>
</li>
<li>
<p>UsersApiResource.retrieveAll: Data returned to coverted into JSON response</p>
</li>
<li>
<p>Command: POST /users (Note: data passed in request body)</p>
</li>
<li>
<p>HTTPS API: create method on org.apache.fineract.useradministration.api.UsersApiResource invoked</p>
</li>
</ul>
</div>
<div class="listingblock">
<div class="title">UsersApiResource.create</div>
<div class="content">
<pre class="CodeRay highlight"><code data-lang="java"> <span class="annotation">@POST</span>
<span class="annotation">@Operation</span>(summary = <span class="string"><span class="delimiter">&quot;</span><span class="content">Create a User</span><span class="delimiter">&quot;</span></span>, description = <span class="string"><span class="delimiter">&quot;</span><span class="content">Adds new application user.</span><span class="char">\n</span><span class="delimiter">&quot;</span></span> + <span class="string"><span class="delimiter">&quot;</span><span class="char">\n</span><span class="delimiter">&quot;</span></span>
+ <span class="string"><span class="delimiter">&quot;</span><span class="content">Note: Password information is not required (or processed). Password details at present are auto-generated and then sent to the email account given (which is why it can take a few seconds to complete).</span><span class="char">\n</span><span class="delimiter">&quot;</span></span>
+ <span class="string"><span class="delimiter">&quot;</span><span class="char">\n</span><span class="delimiter">&quot;</span></span> + <span class="string"><span class="delimiter">&quot;</span><span class="content">Mandatory Fields: </span><span class="char">\n</span><span class="delimiter">&quot;</span></span> + <span class="string"><span class="delimiter">&quot;</span><span class="content">username, firstname, lastname, email, officeId, roles, sendPasswordToEmail</span><span class="char">\n</span><span class="delimiter">&quot;</span></span> + <span class="string"><span class="delimiter">&quot;</span><span class="char">\n</span><span class="delimiter">&quot;</span></span>
+ <span class="string"><span class="delimiter">&quot;</span><span class="content">Optional Fields: </span><span class="char">\n</span><span class="delimiter">&quot;</span></span> + <span class="string"><span class="delimiter">&quot;</span><span class="content">staffId,passwordNeverExpires,isSelfServiceUser,clients</span><span class="delimiter">&quot;</span></span>)
<span class="annotation">@RequestBody</span>(required = <span class="predefined-constant">true</span>, content = <span class="annotation">@Content</span>(schema = <span class="annotation">@Schema</span>(implementation = UsersApiResourceSwagger.PostUsersRequest.class)))
<span class="annotation">@ApiResponses</span>({
<span class="annotation">@ApiResponse</span>(responseCode = <span class="string"><span class="delimiter">&quot;</span><span class="content">200</span><span class="delimiter">&quot;</span></span>, description = <span class="string"><span class="delimiter">&quot;</span><span class="content">OK</span><span class="delimiter">&quot;</span></span>, content = <span class="annotation">@Content</span>(schema = <span class="annotation">@Schema</span>(implementation = UsersApiResourceSwagger.PostUsersResponse.class))) })
<span class="annotation">@Consumes</span>({ MediaType.APPLICATION_JSON })
<span class="annotation">@Produces</span>({ MediaType.APPLICATION_JSON })
<span class="directive">public</span> <span class="predefined-type">String</span> create(<span class="annotation">@Parameter</span>(hidden = <span class="predefined-constant">true</span>) <span class="directive">final</span> <span class="predefined-type">String</span> apiRequestBodyAsJson) {
<span class="directive">final</span> CommandWrapper commandRequest = <span class="keyword">new</span> CommandWrapperBuilder() <span class="comment">//</span>
.createUser() <span class="comment">//</span>
.withJson(apiRequestBodyAsJson) <span class="comment">//</span>
.build();
<span class="directive">final</span> CommandProcessingResult result = <span class="local-variable">this</span>.commandsSourceWritePlatformService.logCommandSource(commandRequest);
<span class="keyword">return</span> <span class="local-variable">this</span>.toApiJsonSerializer.serialize(result);</code></pre>
</div>
</div>
<div class="listingblock">
<div class="title">Create a CommandWrapper object that represents this create user command and JSON request body. Pass off responsiblity for processing to PortfolioCommandSourceWritePlatformService.logCommandSource</div>
<div class="content">
<pre class="CodeRay highlight"><code data-lang="java"> <span class="comment">// maker checker doesnt mean anything here.</span>
isApprovedByChecker = <span class="predefined-constant">true</span>; <span class="comment">// set to true in case permissions have</span>
<span class="comment">// been maker-checker enabled by</span>
<span class="comment">// accident.</span>
} <span class="keyword">else</span> {
<span class="comment">// if not user changing their own details - check user has</span>
<span class="comment">// permission to perform specific task.</span>
<span class="local-variable">this</span>.context.authenticatedUser(wrapper).validateHasPermissionTo(wrapper.getTaskPermissionName());
}
validateIsUpdateAllowed();
<span class="directive">final</span> <span class="predefined-type">String</span> json = wrapper.getJson();
CommandProcessingResult result = <span class="predefined-constant">null</span>;
JsonCommand command = <span class="predefined-constant">null</span>;
<span class="type">int</span> numberOfRetries = <span class="integer">0</span>;
<span class="type">int</span> maxNumberOfRetries = ThreadLocalContextUtil.getTenant().getConnection().getMaxRetriesOnDeadlock();
<span class="type">int</span> maxIntervalBetweenRetries = ThreadLocalContextUtil.getTenant().getConnection().getMaxIntervalBetweenRetries();
<span class="directive">final</span> JsonElement parsedCommand = <span class="local-variable">this</span>.fromApiJsonHelper.parse(json);
command = JsonCommand.from(json, parsedCommand, <span class="local-variable">this</span>.fromApiJsonHelper, wrapper.getEntityName(), wrapper.getEntityId(),
wrapper.getSubentityId(), wrapper.getGroupId(), wrapper.getClientId(), wrapper.getLoanId(), wrapper.getSavingsId(),
wrapper.getTransactionId(), wrapper.getHref(), wrapper.getProductId(), wrapper.getCreditBureauId(),
wrapper.getOrganisationCreditBureauId());
<span class="keyword">while</span> (numberOfRetries &lt;= maxNumberOfRetries) {
<span class="keyword">try</span> {
result = <span class="local-variable">this</span>.processAndLogCommandService.processAndLogCommand(wrapper, command, isApprovedByChecker);
numberOfRetries = maxNumberOfRetries + <span class="integer">1</span>;
} <span class="keyword">catch</span> (CannotAcquireLockException | ObjectOptimisticLockingFailureException exception) {
log.info(<span class="string"><span class="delimiter">&quot;</span><span class="content">The following command {} has been retried {} time(s)</span><span class="delimiter">&quot;</span></span>, command.json(), numberOfRetries);
<span class="comment">/***
* Fail if the transaction has been retired for maxNumberOfRetries
**/</span>
<span class="keyword">if</span> (numberOfRetries &gt;= maxNumberOfRetries) {
log.warn(<span class="string"><span class="delimiter">&quot;</span><span class="content">The following command {} has been retried for the max allowed attempts of {} and will be rolled back</span><span class="delimiter">&quot;</span></span>,
command.json(), numberOfRetries);
<span class="keyword">throw</span> exception;
}
<span class="comment">/***
* Else sleep for a random time (between 1 to 10 seconds) and continue
**/</span>
<span class="keyword">try</span> {
<span class="type">int</span> randomNum = RANDOM.nextInt(maxIntervalBetweenRetries + <span class="integer">1</span>);
<span class="predefined-type">Thread</span>.sleep(<span class="integer">1000</span> + (randomNum * <span class="integer">1000</span>));
numberOfRetries = numberOfRetries + <span class="integer">1</span>;
} <span class="keyword">catch</span> (<span class="exception">InterruptedException</span> e) {
<span class="keyword">throw</span> exception;
}
} <span class="keyword">catch</span> (<span class="directive">final</span> RollbackTransactionAsCommandIsNotApprovedByCheckerException e) {
numberOfRetries = maxNumberOfRetries + <span class="integer">1</span>;
result = <span class="local-variable">this</span>.processAndLogCommandService.logCommand(e.getCommandSourceResult());
}
}
<span class="keyword">return</span> result;
}
<span class="annotation">@Override</span>
<span class="directive">public</span> CommandProcessingResult approveEntry(<span class="directive">final</span> <span class="predefined-type">Long</span> makerCheckerId) {
<span class="directive">final</span> CommandSource commandSourceInput = validateMakerCheckerTransaction(makerCheckerId);
validateIsUpdateAllowed();</code></pre>
</div>
</div>
<div class="listingblock">
<div class="title">Check user has permission for this action. if ok, a) parse the json request body, b) create a JsonCommand object to wrap the command details, c) use CommandProcessingService to handle command</div>
<div class="content">
<pre class="CodeRay highlight"><code data-lang="java"> <span class="directive">final</span> AppUser maker = <span class="local-variable">this</span>.context.authenticatedUser(wrapper);
CommandSource commandSourceResult = <span class="predefined-constant">null</span>;
<span class="keyword">if</span> (command.commandId() != <span class="predefined-constant">null</span>) {
commandSourceResult = <span class="local-variable">this</span>.commandSourceRepository.findById(command.commandId()).orElse(<span class="predefined-constant">null</span>);
commandSourceResult.markAsChecked(maker, ZonedDateTime.now(DateUtils.getDateTimeZoneOfTenant()));
} <span class="keyword">else</span> {
commandSourceResult = CommandSource.fullEntryFrom(wrapper, command, maker);
}
commandSourceResult.updateResourceId(result.resourceId());
commandSourceResult.updateForAudit(result.getOfficeId(), result.getGroupId(), result.getClientId(), result.getLoanId(),
result.getSavingsId(), result.getProductId(), result.getTransactionId());
<span class="predefined-type">String</span> changesOnlyJson = <span class="predefined-constant">null</span>;
<span class="type">boolean</span> rollBack = (rollbackTransaction || result.isRollbackTransaction()) &amp;&amp; !isApprovedByChecker;
<span class="keyword">if</span> (result.hasChanges() &amp;&amp; !rollBack) {
changesOnlyJson = <span class="local-variable">this</span>.toApiJsonSerializer.serializeResult(result.getChanges());
commandSourceResult.updateJsonTo(changesOnlyJson);
}
<span class="keyword">if</span> (!result.hasChanges() &amp;&amp; wrapper.isUpdateOperation() &amp;&amp; !wrapper.isUpdateDatatable()) {
commandSourceResult.updateJsonTo(<span class="predefined-constant">null</span>);
}
<span class="keyword">if</span> (commandSourceResult.hasJson()) {
<span class="local-variable">this</span>.commandSourceRepository.save(commandSourceResult);
}
<span class="keyword">if</span> ((rollbackTransaction || result.isRollbackTransaction()) &amp;&amp; !isApprovedByChecker) {
<span class="comment">/*
* JournalEntry will generate a new transactionId every time. Updating the transactionId with old
* transactionId, because as there are no entries are created with new transactionId, will throw an error
* when checker approves the transaction
*/</span>
commandSourceResult.updateTransaction(command.getTransactionId());
<span class="comment">/*
* Update CommandSource json data with JsonCommand json data, line 77 and 81 may update the json data
*/</span>
commandSourceResult.updateJsonTo(command.json());
<span class="keyword">throw</span> <span class="keyword">new</span> RollbackTransactionAsCommandIsNotApprovedByCheckerException(commandSourceResult);
}
result.setRollbackTransaction(<span class="predefined-constant">null</span>);
publishEvent(wrapper.entityName(), wrapper.actionName(), command, result);
<span class="keyword">return</span> result;
}
<span class="annotation">@Transactional</span>
<span class="annotation">@Override</span>
<span class="directive">public</span> CommandProcessingResult logCommand(CommandSource commandSourceResult) {
commandSourceResult.markAsAwaitingApproval();
commandSourceResult = <span class="local-variable">this</span>.commandSourceRepository.saveAndFlush(commandSourceResult);
<span class="keyword">return</span> <span class="keyword">new</span> CommandProcessingResultBuilder().withCommandId(commandSourceResult.getId())
.withEntityId(commandSourceResult.getResourceId()).build();
}
<span class="directive">private</span> NewCommandSourceHandler findCommandHandler(<span class="directive">final</span> CommandWrapper wrapper) {
NewCommandSourceHandler handler = <span class="predefined-constant">null</span>;
<span class="keyword">if</span> (wrapper.isDatatableResource()) {
<span class="keyword">if</span> (wrapper.isCreateDatatable()) {
handler = <span class="local-variable">this</span>.applicationContext.getBean(<span class="string"><span class="delimiter">&quot;</span><span class="content">createDatatableCommandHandler</span><span class="delimiter">&quot;</span></span>, NewCommandSourceHandler.class);
} <span class="keyword">else</span> <span class="keyword">if</span> (wrapper.isDeleteDatatable()) {</code></pre>
</div>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
if a RollbackTransactionAsCommandIsNotApprovedByCheckerException occurs at this point. The original transaction will of been aborted and we only log an entry for the command in the audit table setting its status as 'Pending'.
</td>
</tr>
</table>
</div>
<div class="ulist">
<ul>
<li>
<p>Check that if maker-checker configuration enabled for this action. If yes and this is not a 'checker' approving the command - rollback at the end. We rollback at the end in order to test if the command will pass 'domain validation' which requires commit to database for full check.</p>
</li>
<li>
<p>findCommandHandler - Find the correct Hanlder to process this command.</p>
</li>
<li>
<p>Process command using handler (In transactional scope).</p>
</li>
<li>
<p>CommandSource object created/updated with all details for logging to 'm_portfolio_command_source' table.</p>
</li>
<li>
<p>In update scenario, we check to see if there where really any changes/updates. If so only JSON for changes is stored in audit log.</p>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_persistence">Persistence</h3>
<div class="paragraph">
<p>TBD</p>
</div>
<div class="sect3">
<h4 id="_database_support">Database support</h4>
<div class="paragraph">
<p>Fineract supports multiple databases:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>MySQL compatible databases (e.g. MariaDB)</p>
</li>
<li>
<p>PostgreSQL</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>The platform differentiates between these database types in certain cases when there&#8217;s a need to use some database specific tooling. To do so, the platform examines the JDBC driver used for running the platform and tries to determine which database is being used.</p>
</div>
<div class="paragraph">
<p>The currently supported JDBC driver and corresponding mappings can be found below.</p>
</div>
<table class="tableblock frame-all grid-all stripes-even stretch">
<colgroup>
<col style="width: 50%;">
<col style="width: 50%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>JDBC driver class name</strong></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>Resolved database type</strong></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.mariadb.jdbc.Driver</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">MySQL</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>com.mysql.jdbc.Driver</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">MySQL</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>org.postgresql.Driver</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">PostgreSQL</p></td>
</tr>
</tbody>
</table>
<div class="paragraph">
<p>The actual code can be found in the <code>DatabaseTypeResolver</code> class.</p>
</div>
</div>
<div class="sect3">
<h4 id="_data_access_layer">Data-access layer</h4>
<div class="paragraph">
<p>The data-access layer of Fineract is implemented by using JPA (Java Persistence API) with the EclipseLink provider.<br>
Despite the fact that JPA is used quite extensively in the system, there are cases where the performance is a key element for an operation therefore you can easily find native SQLs as well.</p>
</div>
<div class="paragraph">
<p>The data-access layer of Fineract is compatible with different databases. Since a lot of the native queries are using specific database functions, a wrapper class - <code>DatabaseSpecificSQLGenerator</code> - has been introduced to handle these database specifics. Whenever there&#8217;s a need to rely on new database level functions, make sure to extend this class and implement the specific functions provided by the database.</p>
</div>
<div class="paragraph">
<p>Fineract has been developed for 10+ years by the community and unfortunately there are places where entity relationships are configured with <code>EAGER</code> fetching strategy. This must not confuse anybody. The long-term goal is to use the <code>LAZY</code> fetching strategy for every single relationship. If you&#8217;re about to introduce a new one, make sure to use <code>LAZY</code> as a fetching strategy, otherwise your PR will be rejected.</p>
</div>
</div>
<div class="sect3">
<h4 id="_database_schema_migration">Database schema migration</h4>
<div class="paragraph">
<p>As for every system, the database structure will and need to evolve over time. Fineract is no different. Originally for Fineract, Flyway was used until Fineract 1.6.x.</p>
</div>
<div class="paragraph">
<p>After 1.6.x, PostgreSQL support was added to the platform hence there was a need to make the data-access layer and the schema migration as database independent as possible. Becuase of that, from Fineract 1.7.0, Flyway is not used anymore but Liquibase is.</p>
</div>
<div class="paragraph">
<p>Some of the changesets in the Liquibase changelogs have database specifics into it but they only run for the relevant databases. This is controller by Liquibase contexts.</p>
</div>
<div class="paragraph">
<p>The currently available Liquibase contexts are:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><code>mysql</code> - only set when the database is a MySQL compatible database (e.g. MariaDB)</p>
</li>
<li>
<p><code>postgresql</code> - only set when the database is a PostgreSQL database</p>
</li>
<li>
<p>configured Spring active profiles</p>
</li>
<li>
<p><code>tenant_store_db</code> - only set when the database migration runs the Tenant Store upgrade</p>
</li>
<li>
<p><code>tenant_db</code> - only set when the database migration runs the Tenant upgrade</p>
</li>
<li>
<p><code>initial_switch</code> - this is a technical context and should <strong>NOT</strong> be used</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>The switch from Flyway (1.6.x) to Liquibase (1.7.x) was planned to be as smooth as possible so there&#8217;s no need for manual work hence the behavior is described as following:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>If the database is empty, Liquibase will create the database schema from scratch</p>
</li>
<li>
<p>If the database contains the latest Fineract 1.6.x database structure which was previously migrated with Flyway. Liquibase will seamlessly upgrade it to the latest version. Note: the Flyway related 2 database tables are left as they are and are not deleted.</p>
</li>
<li>
<p>If the database contains an earlier version of the database structure than Fineract 1.6.x. Liquibase will <strong>NOT</strong> do anything and <strong>will fail the application during startup</strong>. The proper approach in this case is to first upgrade your application version to the latest Fineract 1.6.x so that the latest Flyway changes are executed and then upgrade to the newer Fineract version where Liquibase will seamlessly take over the database upgrades.</p>
</li>
</ul>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_validation">Validation</h3>
<div class="sect3">
<h4 id="_programmatic">Programmatic</h4>
<div class="paragraph">
<p>Use the <a href="https://github.com/apache/fineract/search?q=%22class+DataValidatorBuilder%22">DataValidatorBuilder</a>, e.g. like so:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="java"><span class="keyword">new</span> DataValidatorBuilder().resource(<span class="string"><span class="delimiter">&quot;</span><span class="content">fileUpload</span><span class="delimiter">&quot;</span></span>)
.reset().parameter(<span class="string"><span class="delimiter">&quot;</span><span class="content">Content-Length</span><span class="delimiter">&quot;</span></span>).value(contentLength).notBlank().integerGreaterThanNumber(<span class="integer">0</span>)
.reset().parameter(<span class="string"><span class="delimiter">&quot;</span><span class="content">FormDataContentDisposition</span><span class="delimiter">&quot;</span></span>).value(fileDetails).notNull()
.throwValidationErrors();</code></pre>
</div>
</div>
<div class="paragraph">
<p>Such code is often encapsulated in <a href="https://github.com/apache/fineract/search?q=Validator"><code>*Validator</code></a> classes (if more than a few lines, and/or reused from several places; avoid copy/paste), like so:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> <span class="type">class</span> <span class="class">YourThingValidator</span> {
<span class="directive">public</span> <span class="type">void</span> validate(YourThing thing) {
<span class="keyword">new</span> DataValidatorBuilder().resource(<span class="string"><span class="delimiter">&quot;</span><span class="content">yourThing</span><span class="delimiter">&quot;</span></span>)
...
.throwValidationErrors();
}
}</code></pre>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_declarative">Declarative</h4>
<div class="paragraph">
<p>[FINERACT-1229](<a href="https://issues.apache.org/jira/browse/FINERACT-1229" class="bare">issues.apache.org/jira/browse/FINERACT-1229</a>) is an open issue about adopting Bean Validation for <em>declarative</em> instead of <em>programmatic</em> (as above) validation. Contributions welcome!</p>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_technology">Technology</h3>
<div class="ulist">
<ul>
<li>
<p>Java: <a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html" class="bare">www.oracle.com/technetwork/java/javase/downloads/index.html</a></p>
</li>
<li>
<p>JAX-RS using Jersey</p>
</li>
<li>
<p>JSON using Google GSON</p>
</li>
<li>
<p>Spring I/O Platform: <a href="http://spring.io/platform" class="bare">spring.io/platform</a></p>
<div class="ulist">
<ul>
<li>
<p>Spring Framework</p>
</li>
<li>
<p>Spring Boot</p>
</li>
<li>
<p>Spring Security</p>
</li>
<li>
<p>Spring Data (JPA) backed by EclipseLink</p>
</li>
</ul>
</div>
</li>
<li>
<p>MySQL: <a href="http://www.oracle.com/us/products/mysql/overview/index.html" class="bare">www.oracle.com/us/products/mysql/overview/index.html</a></p>
</li>
<li>
<p>PostgreSQL</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>TBD</p>
</div>
</div>
<div class="sect2">
<h3 id="_modules">Modules</h3>
<div class="paragraph">
<p>Currently modules are a proof of concept feature in Fineract.</p>
</div>
<div class="sect3">
<h4 id="_how_to_create_a_fineract_module">How to create a Fineract module</h4>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
At the moment the only module we have that follows these stricter guidelines is the example module we describe in detail in the next section. In the future we will try to split up Fineract&#8217;s monolithic code base and move features (like loan product, accounts etc.) to separate modules as described here. Before that happens we need to do some code cleanups first.
</td>
</tr>
</table>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Create a folder under <code>module</code> and name it <em>mymodule</em>.</p>
</li>
<li>
<p>Create a folder named <em>core</em> under <code>module/mymodule</code>.</p>
</li>
<li>
<p>Create a folder named <em>service</em> under <code>module/mymodule</code>.</p>
</li>
<li>
<p>Create a folder named <em>starter</em> under <code>module/mymodule</code>.</p>
</li>
<li>
<p>Setup folders and Gradle build files for a Java project under <code>core</code>, <code>service</code> and <code>starter</code>.</p>
</li>
<li>
<p>Create a text file called _spring.factories in folder <code>modules/mymodule/starter/src/main/resources/META-INF</code>.</p>
<div class="paragraph">
<p>The final folder and file structure should look somewhat like this:</p>
</div>
<div class="imageblock">
<div class="content">
<img src="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnIHN0YW5kYWxvbmU9J25vJz8+PHN2ZyBjb250ZW50U2NyaXB0VHlwZT0nYXBwbGljYXRpb24vZWNtYXNjcmlwdCcgY29udGVudFN0eWxlVHlwZT0ndGV4dC9jc3MnIGhlaWdodD0nNDcycHgnIHByZXNlcnZlQXNwZWN0UmF0aW89J25vbmUnIHN0eWxlPSd3aWR0aDozMjJweDtoZWlnaHQ6NDcycHg7YmFja2dyb3VuZDojRkZGRkZGOycgdmVyc2lvbj0nMS4xJyB2aWV3Qm94PScwIDAgMzIyIDQ3Micgd2lkdGg9JzMyMnB4JyB4bWxuczp4bGluaz0naHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluaycgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB6b29tQW5kUGFuPSdtYWduaWZ5Jz48ZGVmcy8+PGc+PHRleHQgZmlsbD0nIzAwMDAwMCcgZm9udC1mYW1pbHk9J3NhbnMtc2VyaWYnIGZvbnQtc2l6ZT0nMTInIGxlbmd0aEFkanVzdD0nc3BhY2luZycgdGV4dExlbmd0aD0nNDYnIHg9JzE2JyB5PScxNy4xMzg3Jz5tb2R1bGU8L3RleHQ+PHRleHQgZmlsbD0nIzAwMDAwMCcgZm9udC1mYW1pbHk9J3NhbnMtc2VyaWYnIGZvbnQtc2l6ZT0nMTInIGxlbmd0aEFkanVzdD0nc3BhY2luZycgdGV4dExlbmd0aD0nNjMnIHg9JzI2JyB5PSczMS4xMDc0Jz5teW1vZHVsZTwvdGV4dD48dGV4dCBmaWxsPScjMDAwMDAwJyBmb250LWZhbWlseT0nc2Fucy1zZXJpZicgZm9udC1zaXplPScxMicgbGVuZ3RoQWRqdXN0PSdzcGFjaW5nJyB0ZXh0TGVuZ3RoPScyOCcgeD0nMzYnIHk9JzQ1LjA3NjInPmNvcmU8L3RleHQ+PHRleHQgZmlsbD0nIzAwMDAwMCcgZm9udC1mYW1pbHk9J3NhbnMtc2VyaWYnIGZvbnQtc2l6ZT0nMTInIGxlbmd0aEFkanVzdD0nc3BhY2luZycgdGV4dExlbmd0aD0nMTknIHg9JzQ2JyB5PSc1OS4wNDQ5Jz5zcmM8L3RleHQ+PHRleHQgZmlsbD0nIzAwMDAwMCcgZm9udC1mYW1pbHk9J3NhbnMtc2VyaWYnIGZvbnQtc2l6ZT0nMTInIGxlbmd0aEFkanVzdD0nc3BhY2luZycgdGV4dExlbmd0aD0nMzAnIHg9JzU2JyB5PSc3My4wMTM3Jz5tYWluPC90ZXh0Pjx0ZXh0IGZpbGw9JyMwMDAwMDAnIGZvbnQtZmFtaWx5PSdzYW5zLXNlcmlmJyBmb250LXNpemU9JzEyJyBsZW5ndGhBZGp1c3Q9J3NwYWNpbmcnIHRleHRMZW5ndGg9JzI1JyB4PSc2NicgeT0nODYuOTgyNCc+amF2YTwvdGV4dD48dGV4dCBmaWxsPScjMDAwMDAwJyBmb250LWZhbWlseT0nc2Fucy1zZXJpZicgZm9udC1zaXplPScxMicgbGVuZ3RoQWRqdXN0PSdzcGFjaW5nJyB0ZXh0TGVuZ3RoPScyMjMnIHg9Jzc2JyB5PScxMDAuOTUxMic+b3JnLmFwYWNoZS5maW5lcmFjdC5teW1vZHVsZS5jb3JlPC90ZXh0Pjx0ZXh0IGZpbGw9JyMwMDAwMDAnIGZvbnQtZmFtaWx5PSdzYW5zLXNlcmlmJyBmb250LXNpemU9JzEyJyBsZW5ndGhBZGp1c3Q9J3NwYWNpbmcnIHRleHRMZW5ndGg9JzI5JyB4PSc4NicgeT0nMTE0LjkxOTknPmRhdGE8L3RleHQ+PHRleHQgZmlsbD0nIzAwMDAwMCcgZm9udC1mYW1pbHk9J3NhbnMtc2VyaWYnIGZvbnQtc2l6ZT0nMTInIGxlbmd0aEFkanVzdD0nc3BhY2luZycgdGV4dExlbmd0aD0nNzUnIHg9Jzk2JyB5PScxMjguODg4Nyc+TXlEYXRhLmphdmE8L3RleHQ+PHRleHQgZmlsbD0nIzAwMDAwMCcgZm9udC1mYW1pbHk9J3NhbnMtc2VyaWYnIGZvbnQtc2l6ZT0nMTInIGxlbmd0aEFkanVzdD0nc3BhY2luZycgdGV4dExlbmd0aD0nNDQnIHg9Jzg2JyB5PScxNDIuODU3NCc+c2VydmljZTwvdGV4dD48dGV4dCBmaWxsPScjMDAwMDAwJyBmb250LWZhbWlseT0nc2Fucy1zZXJpZicgZm9udC1zaXplPScxMicgbGVuZ3RoQWRqdXN0PSdzcGFjaW5nJyB0ZXh0TGVuZ3RoPSc5MCcgeD0nOTYnIHk9JzE1Ni44MjYyJz5NeVNlcnZpY2UuamF2YTwvdGV4dD48dGV4dCBmaWxsPScjMDAwMDAwJyBmb250LWZhbWlseT0nc2Fucy1zZXJpZicgZm9udC1zaXplPScxMicgbGVuZ3RoQWRqdXN0PSdzcGFjaW5nJyB0ZXh0TGVuZ3RoPSc3NCcgeD0nNDYnIHk9JzE3MC43OTQ5Jz5idWlsZC5ncmFkbGU8L3RleHQ+PHRleHQgZmlsbD0nIzAwMDAwMCcgZm9udC1mYW1pbHk9J3NhbnMtc2VyaWYnIGZvbnQtc2l6ZT0nMTInIGxlbmd0aEFkanVzdD0nc3BhY2luZycgdGV4dExlbmd0aD0nMTMzJyB4PSc0NicgeT0nMTg0Ljc2MzcnPmRlcGVuZGVuY2llcy5ncmFkbGU8L3RleHQ+PHRleHQgZmlsbD0nIzAwMDAwMCcgZm9udC1mYW1pbHk9J3NhbnMtc2VyaWYnIGZvbnQtc2l6ZT0nMTInIGxlbmd0aEFkanVzdD0nc3BhY2luZycgdGV4dExlbmd0aD0nNDQnIHg9JzM2JyB5PScxOTguNzMyNCc+c2VydmljZTwvdGV4dD48dGV4dCBmaWxsPScjMDAwMDAwJyBmb250LWZhbWlseT0nc2Fucy1zZXJpZicgZm9udC1zaXplPScxMicgbGVuZ3RoQWRqdXN0PSdzcGFjaW5nJyB0ZXh0TGVuZ3RoPScxOScgeD0nNDYnIHk9JzIxMi43MDEyJz5zcmM8L3RleHQ+PHRleHQgZmlsbD0nIzAwMDAwMCcgZm9udC1mYW1pbHk9J3NhbnMtc2VyaWYnIGZvbnQtc2l6ZT0nMTInIGxlbmd0aEFkanVzdD0nc3BhY2luZycgdGV4dExlbmd0aD0nMzAnIHg9JzU2JyB5PScyMjYuNjY5OSc+bWFpbjwvdGV4dD48dGV4dCBmaWxsPScjMDAwMDAwJyBmb250LWZhbWlseT0nc2Fucy1zZXJpZicgZm9udC1zaXplPScxMicgbGVuZ3RoQWRqdXN0PSdzcGFjaW5nJyB0ZXh0TGVuZ3RoPScyNScgeD0nNjYnIHk9JzI0MC42Mzg3Jz5qYXZhPC90ZXh0Pjx0ZXh0IGZpbGw9JyMwMDAwMDAnIGZvbnQtZmFtaWx5PSdzYW5zLXNlcmlmJyBmb250LXNpemU9JzEyJyBsZW5ndGhBZGp1c3Q9J3NwYWNpbmcnIHRleHRMZW5ndGg9JzIzOScgeD0nNzYnIHk9JzI1NC42MDc0Jz5vcmcuYXBhY2hlLmZpbmVyYWN0Lm15bW9kdWxlLnNlcnZpY2U8L3RleHQ+PHRleHQgZmlsbD0nIzAwMDAwMCcgZm9udC1mYW1pbHk9J3NhbnMtc2VyaWYnIGZvbnQtc2l6ZT0nMTInIGxlbmd0aEFkanVzdD0nc3BhY2luZycgdGV4dExlbmd0aD0nMTE1JyB4PSc4NicgeT0nMjY4LjU3NjInPk15U2VydmljZUltcGwuamF2YTwvdGV4dD48dGV4dCBmaWxsPScjMDAwMDAwJyBmb250LWZhbWlseT0nc2Fucy1zZXJpZicgZm9udC1zaXplPScxMicgbGVuZ3RoQWRqdXN0PSdzcGFjaW5nJyB0ZXh0TGVuZ3RoPSc3NCcgeD0nNDYnIHk9JzI4Mi41NDQ5Jz5idWlsZC5ncmFkbGU8L3RleHQ+PHRleHQgZmlsbD0nIzAwMDAwMCcgZm9udC1mYW1pbHk9J3NhbnMtc2VyaWYnIGZvbnQtc2l6ZT0nMTInIGxlbmd0aEFkanVzdD0nc3BhY2luZycgdGV4dExlbmd0aD0nMTMzJyB4PSc0NicgeT0nMjk2LjUxMzcnPmRlcGVuZGVuY2llcy5ncmFkbGU8L3RleHQ+PHRleHQgZmlsbD0nIzAwMDAwMCcgZm9udC1mYW1pbHk9J3NhbnMtc2VyaWYnIGZvbnQtc2l6ZT0nMTInIGxlbmd0aEFkanVzdD0nc3BhY2luZycgdGV4dExlbmd0aD0nNDMnIHg9JzM2JyB5PSczMTAuNDgyNCc+c3RhcnRlcjwvdGV4dD48dGV4dCBmaWxsPScjMDAwMDAwJyBmb250LWZhbWlseT0nc2Fucy1zZXJpZicgZm9udC1zaXplPScxMicgbGVuZ3RoQWRqdXN0PSdzcGFjaW5nJyB0ZXh0TGVuZ3RoPScxOScgeD0nNDYnIHk9JzMyNC40NTEyJz5zcmM8L3RleHQ+PHRleHQgZmlsbD0nIzAwMDAwMCcgZm9udC1mYW1pbHk9J3NhbnMtc2VyaWYnIGZvbnQtc2l6ZT0nMTInIGxlbmd0aEFkanVzdD0nc3BhY2luZycgdGV4dExlbmd0aD0nMzAnIHg9JzU2JyB5PSczMzguNDE5OSc+bWFpbjwvdGV4dD48dGV4dCBmaWxsPScjMDAwMDAwJyBmb250LWZhbWlseT0nc2Fucy1zZXJpZicgZm9udC1zaXplPScxMicgbGVuZ3RoQWRqdXN0PSdzcGFjaW5nJyB0ZXh0TGVuZ3RoPScyNScgeD0nNjYnIHk9JzM1Mi4zODg3Jz5qYXZhPC90ZXh0Pjx0ZXh0IGZpbGw9JyMwMDAwMDAnIGZvbnQtZmFtaWx5PSdzYW5zLXNlcmlmJyBmb250LXNpemU9JzEyJyBsZW5ndGhBZGp1c3Q9J3NwYWNpbmcnIHRleHRMZW5ndGg9JzIzOCcgeD0nNzYnIHk9JzM2Ni4zNTc0Jz5vcmcuYXBhY2hlLmZpbmVyYWN0Lm15bW9kdWxlLnN0YXJ0ZXI8L3RleHQ+PHRleHQgZmlsbD0nIzAwMDAwMCcgZm9udC1mYW1pbHk9J3NhbnMtc2VyaWYnIGZvbnQtc2l6ZT0nMTInIGxlbmd0aEFkanVzdD0nc3BhY2luZycgdGV4dExlbmd0aD0nMTU4JyB4PSc4NicgeT0nMzgwLjMyNjInPk15QXV0b0NvbmZpZ3VyYXRpb24uamF2YTwvdGV4dD48dGV4dCBmaWxsPScjMDAwMDAwJyBmb250LWZhbWlseT0nc2Fucy1zZXJpZicgZm9udC1zaXplPScxMicgbGVuZ3RoQWRqdXN0PSdzcGFjaW5nJyB0ZXh0TGVuZ3RoPSc2MycgeD0nNDYnIHk9JzM5NC4yOTQ5Jz5yZXNvdXJjZXM8L3RleHQ+PHRleHQgZmlsbD0nIzAwMDAwMCcgZm9udC1mYW1pbHk9J3NhbnMtc2VyaWYnIGZvbnQtc2l6ZT0nMTInIGxlbmd0aEFkanVzdD0nc3BhY2luZycgdGV4dExlbmd0aD0nNTYnIHg9JzU2JyB5PSc0MDguMjYzNyc+TUVUQS1JTkY8L3RleHQ+PHRleHQgZmlsbD0nIzAwMDAwMCcgZm9udC1mYW1pbHk9J3NhbnMtc2VyaWYnIGZvbnQtc2l6ZT0nMTInIGxlbmd0aEFkanVzdD0nc3BhY2luZycgdGV4dExlbmd0aD0nOTgnIHg9JzY2JyB5PSc0MjIuMjMyNCc+c3ByaW5nLmZhY3RvcmllczwvdGV4dD48dGV4dCBmaWxsPScjMDAwMDAwJyBmb250LWZhbWlseT0nc2Fucy1zZXJpZicgZm9udC1zaXplPScxMicgbGVuZ3RoQWRqdXN0PSdzcGFjaW5nJyB0ZXh0TGVuZ3RoPSc3NCcgeD0nNDYnIHk9JzQzNi4yMDEyJz5idWlsZC5ncmFkbGU8L3RleHQ+PHRleHQgZmlsbD0nIzAwMDAwMCcgZm9udC1mYW1pbHk9J3NhbnMtc2VyaWYnIGZvbnQtc2l6ZT0nMTInIGxlbmd0aEFkanVzdD0nc3BhY2luZycgdGV4dExlbmd0aD0nMTMzJyB4PSc0NicgeT0nNDUwLjE2OTknPmRlcGVuZGVuY2llcy5ncmFkbGU8L3RleHQ+PHRleHQgZmlsbD0nIzAwMDAwMCcgZm9udC1mYW1pbHk9J3NhbnMtc2VyaWYnIGZvbnQtc2l6ZT0nMTInIGxlbmd0aEFkanVzdD0nc3BhY2luZycgdGV4dExlbmd0aD0nNzQnIHg9JzM2JyB5PSc0NjQuMTM4Nyc+YnVpbGQuZ3JhZGxlPC90ZXh0PjxyZWN0IGZpbGw9J25vbmUnIGhlaWdodD0nMicgc3R5bGU9J3N0cm9rZTojODg4ODg4O3N0cm9rZS13aWR0aDoxLjA7JyB3aWR0aD0nMicgeD0nOScgeT0nMTEuOTg0NCcvPjxyZWN0IGZpbGw9J25vbmUnIGhlaWdodD0nMicgc3R5bGU9J3N0cm9rZTojODg4ODg4O3N0cm9rZS13aWR0aDoxLjA7JyB3aWR0aD0nMicgeD0nMTknIHk9JzI1Ljk1MzEnLz48bGluZSBzdHlsZT0nc3Ryb2tlOiM4ODg4ODg7c3Ryb2tlLXdpZHRoOjEuMDsnIHgxPScxMCcgeDI9JzEwJyB5MT0nMTQuOTg0NCcgeTI9JzI2Ljk1MzEnLz48bGluZSBzdHlsZT0nc3Ryb2tlOiM4ODg4ODg7c3Ryb2tlLXdpZHRoOjEuMDsnIHgxPScxMCcgeDI9JzE4JyB5MT0nMjYuOTUzMScgeTI9JzI2Ljk1MzEnLz48cmVjdCBmaWxsPSdub25lJyBoZWlnaHQ9JzInIHN0eWxlPSdzdHJva2U6Izg4ODg4ODtzdHJva2Utd2lkdGg6MS4wOycgd2lkdGg9JzInIHg9JzI5JyB5PSczOS45MjE5Jy8+PGxpbmUgc3R5bGU9J3N0cm9rZTojODg4ODg4O3N0cm9rZS13aWR0aDoxLjA7JyB4MT0nMjAnIHgyPScyMCcgeTE9JzI4Ljk1MzEnIHkyPSc0MC45MjE5Jy8+PGxpbmUgc3R5bGU9J3N0cm9rZTojODg4ODg4O3N0cm9rZS13aWR0aDoxLjA7JyB4MT0nMjAnIHgyPScyOCcgeTE9JzQwLjkyMTknIHkyPSc0MC45MjE5Jy8+PHJlY3QgZmlsbD0nbm9uZScgaGVpZ2h0PScyJyBzdHlsZT0nc3Ryb2tlOiM4ODg4ODg7c3Ryb2tlLXdpZHRoOjEuMDsnIHdpZHRoPScyJyB4PSczOScgeT0nNTMuODkwNicvPjxsaW5lIHN0eWxlPSdzdHJva2U6Izg4ODg4ODtzdHJva2Utd2lkdGg6MS4wOycgeDE9JzMwJyB4Mj0nMzAnIHkxPSc0Mi45MjE5JyB5Mj0nNTQuODkwNicvPjxsaW5lIHN0eWxlPSdzdHJva2U6Izg4ODg4ODtzdHJva2Utd2lkdGg6MS4wOycgeDE9JzMwJyB4Mj0nMzgnIHkxPSc1NC44OTA2JyB5Mj0nNTQuODkwNicvPjxyZWN0IGZpbGw9J25vbmUnIGhlaWdodD0nMicgc3R5bGU9J3N0cm9rZTojODg4ODg4O3N0cm9rZS13aWR0aDoxLjA7JyB3aWR0aD0nMicgeD0nNDknIHk9JzY3Ljg1OTQnLz48bGluZSBzdHlsZT0nc3Ryb2tlOiM4ODg4ODg7c3Ryb2tlLXdpZHRoOjEuMDsnIHgxPSc0MCcgeDI9JzQwJyB5MT0nNTYuODkwNicgeTI9JzY4Ljg1OTQnLz48bGluZSBzdHlsZT0nc3Ryb2tlOiM4ODg4ODg7c3Ryb2tlLXdpZHRoOjEuMDsnIHgxPSc0MCcgeDI9JzQ4JyB5MT0nNjguODU5NCcgeTI9JzY4Ljg1OTQnLz48cmVjdCBmaWxsPSdub25lJyBoZWlnaHQ9JzInIHN0eWxlPSdzdHJva2U6Izg4ODg4ODtzdHJva2Utd2lkdGg6MS4wOycgd2lkdGg9JzInIHg9JzU5JyB5PSc4MS44MjgxJy8+PGxpbmUgc3R5bGU9J3N0cm9rZTojODg4ODg4O3N0cm9rZS13aWR0aDoxLjA7JyB4MT0nNTAnIHgyPSc1MCcgeTE9JzcwLjg1OTQnIHkyPSc4Mi44MjgxJy8+PGxpbmUgc3R5bGU9J3N0cm9rZTojODg4ODg4O3N0cm9rZS13aWR0aDoxLjA7JyB4MT0nNTAnIHgyPSc1OCcgeTE9JzgyLjgyODEnIHkyPSc4Mi44MjgxJy8+PHJlY3QgZmlsbD0nbm9uZScgaGVpZ2h0PScyJyBzdHlsZT0nc3Ryb2tlOiM4ODg4ODg7c3Ryb2tlLXdpZHRoOjEuMDsnIHdpZHRoPScyJyB4PSc2OScgeT0nOTUuNzk2OScvPjxsaW5lIHN0eWxlPSdzdHJva2U6Izg4ODg4ODtzdHJva2Utd2lkdGg6MS4wOycgeDE9JzYwJyB4Mj0nNjAnIHkxPSc4NC44MjgxJyB5Mj0nOTYuNzk2OScvPjxsaW5lIHN0eWxlPSdzdHJva2U6Izg4ODg4ODtzdHJva2Utd2lkdGg6MS4wOycgeDE9JzYwJyB4Mj0nNjgnIHkxPSc5Ni43OTY5JyB5Mj0nOTYuNzk2OScvPjxyZWN0IGZpbGw9J25vbmUnIGhlaWdodD0nMicgc3R5bGU9J3N0cm9rZTojODg4ODg4O3N0cm9rZS13aWR0aDoxLjA7JyB3aWR0aD0nMicgeD0nNzknIHk9JzEwOS43NjU2Jy8+PGxpbmUgc3R5bGU9J3N0cm9rZTojODg4ODg4O3N0cm9rZS13aWR0aDoxLjA7JyB4MT0nNzAnIHgyPSc3MCcgeTE9Jzk4Ljc5NjknIHkyPScxMTAuNzY1NicvPjxsaW5lIHN0eWxlPSdzdHJva2U6Izg4ODg4ODtzdHJva2Utd2lkdGg6MS4wOycgeDE9JzcwJyB4Mj0nNzgnIHkxPScxMTAuNzY1NicgeTI9JzExMC43NjU2Jy8+PGxpbmUgc3R5bGU9J3N0cm9rZTojODg4ODg4O3N0cm9rZS13aWR0aDoxLjA7JyB4MT0nODAnIHgyPSc4MCcgeTE9JzExMi43NjU2JyB5Mj0nMTI0LjczNDQnLz48bGluZSBzdHlsZT0nc3Ryb2tlOiM4ODg4ODg7c3Ryb2tlLXdpZHRoOjEuMDsnIHgxPSc4MCcgeDI9Jzg4JyB5MT0nMTI0LjczNDQnIHkyPScxMjQuNzM0NCcvPjxyZWN0IGZpbGw9J25vbmUnIGhlaWdodD0nMicgc3R5bGU9J3N0cm9rZTojODg4ODg4O3N0cm9rZS13aWR0aDoxLjA7JyB3aWR0aD0nMicgeD0nNzknIHk9JzEzNy43MDMxJy8+PGxpbmUgc3R5bGU9J3N0cm9rZTojODg4ODg4O3N0cm9rZS13aWR0aDoxLjA7JyB4MT0nNzAnIHgyPSc3MCcgeTE9Jzk4Ljc5NjknIHkyPScxMzguNzAzMScvPjxsaW5lIHN0eWxlPSdzdHJva2U6Izg4ODg4ODtzdHJva2Utd2lkdGg6MS4wOycgeDE9JzcwJyB4Mj0nNzgnIHkxPScxMzguNzAzMScgeTI9JzEzOC43MDMxJy8+PGxpbmUgc3R5bGU9J3N0cm9rZTojODg4ODg4O3N0cm9rZS13aWR0aDoxLjA7JyB4MT0nODAnIHgyPSc4MCcgeTE9JzE0MC43MDMxJyB5Mj0nMTUyLjY3MTknLz48bGluZSBzdHlsZT0nc3Ryb2tlOiM4ODg4ODg7c3Ryb2tlLXdpZHRoOjEuMDsnIHgxPSc4MCcgeDI9Jzg4JyB5MT0nMTUyLjY3MTknIHkyPScxNTIuNjcxOScvPjxsaW5lIHN0eWxlPSdzdHJva2U6Izg4ODg4ODtzdHJva2Utd2lkdGg6MS4wOycgeDE9JzMwJyB4Mj0nMzAnIHkxPSc0Mi45MjE5JyB5Mj0nMTY2LjY0MDYnLz48bGluZSBzdHlsZT0nc3Ryb2tlOiM4ODg4ODg7c3Ryb2tlLXdpZHRoOjEuMDsnIHgxPSczMCcgeDI9JzM4JyB5MT0nMTY2LjY0MDYnIHkyPScxNjYuNjQwNicvPjxsaW5lIHN0eWxlPSdzdHJva2U6Izg4ODg4ODtzdHJva2Utd2lkdGg6MS4wOycgeDE9JzMwJyB4Mj0nMzAnIHkxPSc0Mi45MjE5JyB5Mj0nMTgwLjYwOTQnLz48bGluZSBzdHlsZT0nc3Ryb2tlOiM4ODg4ODg7c3Ryb2tlLXdpZHRoOjEuMDsnIHgxPSczMCcgeDI9JzM4JyB5MT0nMTgwLjYwOTQnIHkyPScxODAuNjA5NCcvPjxyZWN0IGZpbGw9J25vbmUnIGhlaWdodD0nMicgc3R5bGU9J3N0cm9rZTojODg4ODg4O3N0cm9rZS13aWR0aDoxLjA7JyB3aWR0aD0nMicgeD0nMjknIHk9JzE5My41NzgxJy8+PGxpbmUgc3R5bGU9J3N0cm9rZTojODg4ODg4O3N0cm9rZS13aWR0aDoxLjA7JyB4MT0nMjAnIHgyPScyMCcgeTE9JzI4Ljk1MzEnIHkyPScxOTQuNTc4MScvPjxsaW5lIHN0eWxlPSdzdHJva2U6Izg4ODg4ODtzdHJva2Utd2lkdGg6MS4wOycgeDE9JzIwJyB4Mj0nMjgnIHkxPScxOTQuNTc4MScgeTI9JzE5NC41NzgxJy8+PHJlY3QgZmlsbD0nbm9uZScgaGVpZ2h0PScyJyBzdHlsZT0nc3Ryb2tlOiM4ODg4ODg7c3Ryb2tlLXdpZHRoOjEuMDsnIHdpZHRoPScyJyB4PSczOScgeT0nMjA3LjU0NjknLz48bGluZSBzdHlsZT0nc3Ryb2tlOiM4ODg4ODg7c3Ryb2tlLXdpZHRoOjEuMDsnIHgxPSczMCcgeDI9JzMwJyB5MT0nMTk2LjU3ODEnIHkyPScyMDguNTQ2OScvPjxsaW5lIHN0eWxlPSdzdHJva2U6Izg4ODg4ODtzdHJva2Utd2lkdGg6MS4wOycgeDE9JzMwJyB4Mj0nMzgnIHkxPScyMDguNTQ2OScgeTI9JzIwOC41NDY5Jy8+PHJlY3QgZmlsbD0nbm9uZScgaGVpZ2h0PScyJyBzdHlsZT0nc3Ryb2tlOiM4ODg4ODg7c3Ryb2tlLXdpZHRoOjEuMDsnIHdpZHRoPScyJyB4PSc0OScgeT0nMjIxLjUxNTYnLz48bGluZSBzdHlsZT0nc3Ryb2tlOiM4ODg4ODg7c3Ryb2tlLXdpZHRoOjEuMDsnIHgxPSc0MCcgeDI9JzQwJyB5MT0nMjEwLjU0NjknIHkyPScyMjIuNTE1NicvPjxsaW5lIHN0eWxlPSdzdHJva2U6Izg4ODg4ODtzdHJva2Utd2lkdGg6MS4wOycgeDE9JzQwJyB4Mj0nNDgnIHkxPScyMjIuNTE1NicgeTI9JzIyMi41MTU2Jy8+PHJlY3QgZmlsbD0nbm9uZScgaGVpZ2h0PScyJyBzdHlsZT0nc3Ryb2tlOiM4ODg4ODg7c3Ryb2tlLXdpZHRoOjEuMDsnIHdpZHRoPScyJyB4PSc1OScgeT0nMjM1LjQ4NDQnLz48bGluZSBzdHlsZT0nc3Ryb2tlOiM4ODg4ODg7c3Ryb2tlLXdpZHRoOjEuMDsnIHgxPSc1MCcgeDI9JzUwJyB5MT0nMjI0LjUxNTYnIHkyPScyMzYuNDg0NCcvPjxsaW5lIHN0eWxlPSdzdHJva2U6Izg4ODg4ODtzdHJva2Utd2lkdGg6MS4wOycgeDE9JzUwJyB4Mj0nNTgnIHkxPScyMzYuNDg0NCcgeTI9JzIzNi40ODQ0Jy8+PHJlY3QgZmlsbD0nbm9uZScgaGVpZ2h0PScyJyBzdHlsZT0nc3Ryb2tlOiM4ODg4ODg7c3Ryb2tlLXdpZHRoOjEuMDsnIHdpZHRoPScyJyB4PSc2OScgeT0nMjQ5LjQ1MzEnLz48bGluZSBzdHlsZT0nc3Ryb2tlOiM4ODg4ODg7c3Ryb2tlLXdpZHRoOjEuMDsnIHgxPSc2MCcgeDI9JzYwJyB5MT0nMjM4LjQ4NDQnIHkyPScyNTAuNDUzMScvPjxsaW5lIHN0eWxlPSdzdHJva2U6Izg4ODg4ODtzdHJva2Utd2lkdGg6MS4wOycgeDE9JzYwJyB4Mj0nNjgnIHkxPScyNTAuNDUzMScgeTI9JzI1MC40NTMxJy8+PGxpbmUgc3R5bGU9J3N0cm9rZTojODg4ODg4O3N0cm9rZS13aWR0aDoxLjA7JyB4MT0nNzAnIHgyPSc3MCcgeTE9JzI1Mi40NTMxJyB5Mj0nMjY0LjQyMTknLz48bGluZSBzdHlsZT0nc3Ryb2tlOiM4ODg4ODg7c3Ryb2tlLXdpZHRoOjEuMDsnIHgxPSc3MCcgeDI9Jzc4JyB5MT0nMjY0LjQyMTknIHkyPScyNjQuNDIxOScvPjxsaW5lIHN0eWxlPSdzdHJva2U6Izg4ODg4ODtzdHJva2Utd2lkdGg6MS4wOycgeDE9JzMwJyB4Mj0nMzAnIHkxPScxOTYuNTc4MScgeTI9JzI3OC4zOTA2Jy8+PGxpbmUgc3R5bGU9J3N0cm9rZTojODg4ODg4O3N0cm9rZS13aWR0aDoxLjA7JyB4MT0nMzAnIHgyPSczOCcgeTE9JzI3OC4zOTA2JyB5Mj0nMjc4LjM5MDYnLz48bGluZSBzdHlsZT0nc3Ryb2tlOiM4ODg4ODg7c3Ryb2tlLXdpZHRoOjEuMDsnIHgxPSczMCcgeDI9JzMwJyB5MT0nMTk2LjU3ODEnIHkyPScyOTIuMzU5NCcvPjxsaW5lIHN0eWxlPSdzdHJva2U6Izg4ODg4ODtzdHJva2Utd2lkdGg6MS4wOycgeDE9JzMwJyB4Mj0nMzgnIHkxPScyOTIuMzU5NCcgeTI9JzI5Mi4zNTk0Jy8+PHJlY3QgZmlsbD0nbm9uZScgaGVpZ2h0PScyJyBzdHlsZT0nc3Ryb2tlOiM4ODg4ODg7c3Ryb2tlLXdpZHRoOjEuMDsnIHdpZHRoPScyJyB4PScyOScgeT0nMzA1LjMyODEnLz48bGluZSBzdHlsZT0nc3Ryb2tlOiM4ODg4ODg7c3Ryb2tlLXdpZHRoOjEuMDsnIHgxPScyMCcgeDI9JzIwJyB5MT0nMjguOTUzMScgeTI9JzMwNi4zMjgxJy8+PGxpbmUgc3R5bGU9J3N0cm9rZTojODg4ODg4O3N0cm9rZS13aWR0aDoxLjA7JyB4MT0nMjAnIHgyPScyOCcgeTE9JzMwNi4zMjgxJyB5Mj0nMzA2LjMyODEnLz48cmVjdCBmaWxsPSdub25lJyBoZWlnaHQ9JzInIHN0eWxlPSdzdHJva2U6Izg4ODg4ODtzdHJva2Utd2lkdGg6MS4wOycgd2lkdGg9JzInIHg9JzM5JyB5PSczMTkuMjk2OScvPjxsaW5lIHN0eWxlPSdzdHJva2U6Izg4ODg4ODtzdHJva2Utd2lkdGg6MS4wOycgeDE9JzMwJyB4Mj0nMzAnIHkxPSczMDguMzI4MScgeTI9JzMyMC4yOTY5Jy8+PGxpbmUgc3R5bGU9J3N0cm9rZTojODg4ODg4O3N0cm9rZS13aWR0aDoxLjA7JyB4MT0nMzAnIHgyPSczOCcgeTE9JzMyMC4yOTY5JyB5Mj0nMzIwLjI5NjknLz48cmVjdCBmaWxsPSdub25lJyBoZWlnaHQ9JzInIHN0eWxlPSdzdHJva2U6Izg4ODg4ODtzdHJva2Utd2lkdGg6MS4wOycgd2lkdGg9JzInIHg9JzQ5JyB5PSczMzMuMjY1NicvPjxsaW5lIHN0eWxlPSdzdHJva2U6Izg4ODg4ODtzdHJva2Utd2lkdGg6MS4wOycgeDE9JzQwJyB4Mj0nNDAnIHkxPSczMjIuMjk2OScgeTI9JzMzNC4yNjU2Jy8+PGxpbmUgc3R5bGU9J3N0cm9rZTojODg4ODg4O3N0cm9rZS13aWR0aDoxLjA7JyB4MT0nNDAnIHgyPSc0OCcgeTE9JzMzNC4yNjU2JyB5Mj0nMzM0LjI2NTYnLz48cmVjdCBmaWxsPSdub25lJyBoZWlnaHQ9JzInIHN0eWxlPSdzdHJva2U6Izg4ODg4ODtzdHJva2Utd2lkdGg6MS4wOycgd2lkdGg9JzInIHg9JzU5JyB5PSczNDcuMjM0NCcvPjxsaW5lIHN0eWxlPSdzdHJva2U6Izg4ODg4ODtzdHJva2Utd2lkdGg6MS4wOycgeDE9JzUwJyB4Mj0nNTAnIHkxPSczMzYuMjY1NicgeTI9JzM0OC4yMzQ0Jy8+PGxpbmUgc3R5bGU9J3N0cm9rZTojODg4ODg4O3N0cm9rZS13aWR0aDoxLjA7JyB4MT0nNTAnIHgyPSc1OCcgeTE9JzM0OC4yMzQ0JyB5Mj0nMzQ4LjIzNDQnLz48cmVjdCBmaWxsPSdub25lJyBoZWlnaHQ9JzInIHN0eWxlPSdzdHJva2U6Izg4ODg4ODtzdHJva2Utd2lkdGg6MS4wOycgd2lkdGg9JzInIHg9JzY5JyB5PSczNjEuMjAzMScvPjxsaW5lIHN0eWxlPSdzdHJva2U6Izg4ODg4ODtzdHJva2Utd2lkdGg6MS4wOycgeDE9JzYwJyB4Mj0nNjAnIHkxPSczNTAuMjM0NCcgeTI9JzM2Mi4yMDMxJy8+PGxpbmUgc3R5bGU9J3N0cm9rZTojODg4ODg4O3N0cm9rZS13aWR0aDoxLjA7JyB4MT0nNjAnIHgyPSc2OCcgeTE9JzM2Mi4yMDMxJyB5Mj0nMzYyLjIwMzEnLz48bGluZSBzdHlsZT0nc3Ryb2tlOiM4ODg4ODg7c3Ryb2tlLXdpZHRoOjEuMDsnIHgxPSc3MCcgeDI9JzcwJyB5MT0nMzY0LjIwMzEnIHkyPSczNzYuMTcxOScvPjxsaW5lIHN0eWxlPSdzdHJva2U6Izg4ODg4ODtzdHJva2Utd2lkdGg6MS4wOycgeDE9JzcwJyB4Mj0nNzgnIHkxPSczNzYuMTcxOScgeTI9JzM3Ni4xNzE5Jy8+PHJlY3QgZmlsbD0nbm9uZScgaGVpZ2h0PScyJyBzdHlsZT0nc3Ryb2tlOiM4ODg4ODg7c3Ryb2tlLXdpZHRoOjEuMDsnIHdpZHRoPScyJyB4PSczOScgeT0nMzg5LjE0MDYnLz48bGluZSBzdHlsZT0nc3Ryb2tlOiM4ODg4ODg7c3Ryb2tlLXdpZHRoOjEuMDsnIHgxPSczMCcgeDI9JzMwJyB5MT0nMzA4LjMyODEnIHkyPSczOTAuMTQwNicvPjxsaW5lIHN0eWxlPSdzdHJva2U6Izg4ODg4ODtzdHJva2Utd2lkdGg6MS4wOycgeDE9JzMwJyB4Mj0nMzgnIHkxPSczOTAuMTQwNicgeTI9JzM5MC4xNDA2Jy8+PHJlY3QgZmlsbD0nbm9uZScgaGVpZ2h0PScyJyBzdHlsZT0nc3Ryb2tlOiM4ODg4ODg7c3Ryb2tlLXdpZHRoOjEuMDsnIHdpZHRoPScyJyB4PSc0OScgeT0nNDAzLjEwOTQnLz48bGluZSBzdHlsZT0nc3Ryb2tlOiM4ODg4ODg7c3Ryb2tlLXdpZHRoOjEuMDsnIHgxPSc0MCcgeDI9JzQwJyB5MT0nMzkyLjE0MDYnIHkyPSc0MDQuMTA5NCcvPjxsaW5lIHN0eWxlPSdzdHJva2U6Izg4ODg4ODtzdHJva2Utd2lkdGg6MS4wOycgeDE9JzQwJyB4Mj0nNDgnIHkxPSc0MDQuMTA5NCcgeTI9JzQwNC4xMDk0Jy8+PGxpbmUgc3R5bGU9J3N0cm9rZTojODg4ODg4O3N0cm9rZS13aWR0aDoxLjA7JyB4MT0nNTAnIHgyPSc1MCcgeTE9JzQwNi4xMDk0JyB5Mj0nNDE4LjA3ODEnLz48bGluZSBzdHlsZT0nc3Ryb2tlOiM4ODg4ODg7c3Ryb2tlLXdpZHRoOjEuMDsnIHgxPSc1MCcgeDI9JzU4JyB5MT0nNDE4LjA3ODEnIHkyPSc0MTguMDc4MScvPjxsaW5lIHN0eWxlPSdzdHJva2U6Izg4ODg4ODtzdHJva2Utd2lkdGg6MS4wOycgeDE9JzMwJyB4Mj0nMzAnIHkxPSczMDguMzI4MScgeTI9JzQzMi4wNDY5Jy8+PGxpbmUgc3R5bGU9J3N0cm9rZTojODg4ODg4O3N0cm9rZS13aWR0aDoxLjA7JyB4MT0nMzAnIHgyPSczOCcgeTE9JzQzMi4wNDY5JyB5Mj0nNDMyLjA0NjknLz48bGluZSBzdHlsZT0nc3Ryb2tlOiM4ODg4ODg7c3Ryb2tlLXdpZHRoOjEuMDsnIHgxPSczMCcgeDI9JzMwJyB5MT0nMzA4LjMyODEnIHkyPSc0NDYuMDE1NicvPjxsaW5lIHN0eWxlPSdzdHJva2U6Izg4ODg4ODtzdHJva2Utd2lkdGg6MS4wOycgeDE9JzMwJyB4Mj0nMzgnIHkxPSc0NDYuMDE1NicgeTI9JzQ0Ni4wMTU2Jy8+PGxpbmUgc3R5bGU9J3N0cm9rZTojODg4ODg4O3N0cm9rZS13aWR0aDoxLjA7JyB4MT0nMjAnIHgyPScyMCcgeTE9JzI4Ljk1MzEnIHkyPSc0NTkuOTg0NCcvPjxsaW5lIHN0eWxlPSdzdHJva2U6Izg4ODg4ODtzdHJva2Utd2lkdGg6MS4wOycgeDE9JzIwJyB4Mj0nMjgnIHkxPSc0NTkuOTg0NCcgeTI9JzQ1OS45ODQ0Jy8+PC9nPjwvc3ZnPg==" alt="Diagram" width="322" height="472">
</div>
</div>
</li>
<li>
<p>Make sure that your new modules are present in settings.gradle:</p>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="groovy">rootProject.name=<span class="string"><span class="delimiter">'</span><span class="content">fineract</span><span class="delimiter">'</span></span>
include <span class="string"><span class="delimiter">'</span><span class="content">:module:mymodule:core</span><span class="delimiter">'</span></span> <i class="conum" data-value="1"></i><b>(1)</b>
include <span class="string"><span class="delimiter">'</span><span class="content">:module:mymodule:service</span><span class="delimiter">'</span></span>
include <span class="string"><span class="delimiter">'</span><span class="content">:module:mymodule:starter</span><span class="delimiter">'</span></span>
include <span class="string"><span class="delimiter">'</span><span class="content">:fineract-provider</span><span class="delimiter">'</span></span>
include <span class="string"><span class="delimiter">'</span><span class="content">:fineract-war</span><span class="delimiter">'</span></span>
include <span class="string"><span class="delimiter">'</span><span class="content">:integration-tests</span><span class="delimiter">'</span></span>
include <span class="string"><span class="delimiter">'</span><span class="content">:twofactor-tests</span><span class="delimiter">'</span></span>
include <span class="string"><span class="delimiter">'</span><span class="content">:oauth2-tests</span><span class="delimiter">'</span></span>
include <span class="string"><span class="delimiter">'</span><span class="content">:fineract-client</span><span class="delimiter">'</span></span>
include <span class="string"><span class="delimiter">'</span><span class="content">:fineract-doc</span><span class="delimiter">'</span></span></code></pre>
</div>
</div>
<div class="colist arabic">
<table>
<tr>
<td><i class="conum" data-value="1"></i><b>1</b></td>
<td>The <code>settings.gradle</code> file should contain something like this (and following).</td>
</tr>
</table>
</div>
</li>
</ol>
</div>
</div>
<div class="sect3">
<h4 id="_how_to_replace_an_existing_fineract_service">How to replace an existing Fineract service</h4>
<div class="paragraph">
<p>Creating customizations for Fineract services is easy. The method described here will work both with our future module guidelines (aka "clean room" modules) and with the intermediary solution we will put in place to avoid major refactorings.</p>
</div>
<div class="paragraph">
<p>You can of course choose whatever folder/project structure you like for your custom modules. But we&#8217;ll describe here some best practices to avoid merge conflicts when fetching updates from Fineract&#8217;s upstream Git repository. For the time being we suggest to create your custom modules in the same folder as Fineract in a forked Git repo.</p>
</div>
<div class="paragraph">
<p>As soon as we can publish Fineract module JARs to Maven Central you&#8217;ll have more freedom to setup your projects (including to setup separate Git repos).</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Create a folder under <code>custom</code> and name it <em>mycustom</em>.</p>
</li>
<li>
<p>Create a folder named <em>service</em> under <code>custom/mycustom</code>.</p>
</li>
<li>
<p>Setup folders and Gradle build files for a Java project under <code>service</code>.</p>
</li>
<li>
<p>Create a text file called _spring.factories in folder <code>modules/mymodule/starter/src/main/resources/META-INF</code>:</p>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="properties">org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.apache.fineract.mymodule.starter.MyAutoConfiguration</code></pre>
</div>
</div>
<div class="paragraph">
<p>The final folder and file structure should look somewhat like this:</p>
</div>
<div class="imageblock">
<div class="content">
<img src="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnIHN0YW5kYWxvbmU9J25vJz8+PHN2ZyBjb250ZW50U2NyaXB0VHlwZT0nYXBwbGljYXRpb24vZWNtYXNjcmlwdCcgY29udGVudFN0eWxlVHlwZT0ndGV4dC9jc3MnIGhlaWdodD0nMTY1cHgnIHByZXNlcnZlQXNwZWN0UmF0aW89J25vbmUnIHN0eWxlPSd3aWR0aDozMjJweDtoZWlnaHQ6MTY1cHg7YmFja2dyb3VuZDojRkZGRkZGOycgdmVyc2lvbj0nMS4xJyB2aWV3Qm94PScwIDAgMzIyIDE2NScgd2lkdGg9JzMyMnB4JyB4bWxuczp4bGluaz0naHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluaycgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB6b29tQW5kUGFuPSdtYWduaWZ5Jz48ZGVmcy8+PGc+PHRleHQgZmlsbD0nIzAwMDAwMCcgZm9udC1mYW1pbHk9J3NhbnMtc2VyaWYnIGZvbnQtc2l6ZT0nMTInIGxlbmd0aEFkanVzdD0nc3BhY2luZycgdGV4dExlbmd0aD0nNDYnIHg9JzE2JyB5PScxNy4xMzg3Jz5jdXN0b208L3RleHQ+PHRleHQgZmlsbD0nIzAwMDAwMCcgZm9udC1mYW1pbHk9J3NhbnMtc2VyaWYnIGZvbnQtc2l6ZT0nMTInIGxlbmd0aEFkanVzdD0nc3BhY2luZycgdGV4dExlbmd0aD0nNjMnIHg9JzI2JyB5PSczMS4xMDc0Jz5teWN1c3RvbTwvdGV4dD48dGV4dCBmaWxsPScjMDAwMDAwJyBmb250LWZhbWlseT0nc2Fucy1zZXJpZicgZm9udC1zaXplPScxMicgbGVuZ3RoQWRqdXN0PSdzcGFjaW5nJyB0ZXh0TGVuZ3RoPSc0NCcgeD0nMzYnIHk9JzQ1LjA3NjInPnNlcnZpY2U8L3RleHQ+PHRleHQgZmlsbD0nIzAwMDAwMCcgZm9udC1mYW1pbHk9J3NhbnMtc2VyaWYnIGZvbnQtc2l6ZT0nMTInIGxlbmd0aEFkanVzdD0nc3BhY2luZycgdGV4dExlbmd0aD0nMTknIHg9JzQ2JyB5PSc1OS4wNDQ5Jz5zcmM8L3RleHQ+PHRleHQgZmlsbD0nIzAwMDAwMCcgZm9udC1mYW1pbHk9J3NhbnMtc2VyaWYnIGZvbnQtc2l6ZT0nMTInIGxlbmd0aEFkanVzdD0nc3BhY2luZycgdGV4dExlbmd0aD0nMzAnIHg9JzU2JyB5PSc3My4wMTM3Jz5tYWluPC90ZXh0Pjx0ZXh0IGZpbGw9JyMwMDAwMDAnIGZvbnQtZmFtaWx5PSdzYW5zLXNlcmlmJyBmb250LXNpemU9JzEyJyBsZW5ndGhBZGp1c3Q9J3NwYWNpbmcnIHRleHRMZW5ndGg9JzI1JyB4PSc2NicgeT0nODYuOTgyNCc+amF2YTwvdGV4dD48dGV4dCBmaWxsPScjMDAwMDAwJyBmb250LWZhbWlseT0nc2Fucy1zZXJpZicgZm9udC1zaXplPScxMicgbGVuZ3RoQWRqdXN0PSdzcGFjaW5nJyB0ZXh0TGVuZ3RoPScyMzknIHg9Jzc2JyB5PScxMDAuOTUxMic+b3JnLmFwYWNoZS5maW5lcmFjdC5teW1vZHVsZS5zZXJ2aWNlPC90ZXh0Pjx0ZXh0IGZpbGw9JyMwMDAwMDAnIGZvbnQtZmFtaWx5PSdzYW5zLXNlcmlmJyBmb250LXNpemU9JzEyJyBsZW5ndGhBZGp1c3Q9J3NwYWNpbmcnIHRleHRMZW5ndGg9JzExNScgeD0nODYnIHk9JzExNC45MTk5Jz5NeVNlcnZpY2VJbXBsLmphdmE8L3RleHQ+PHRleHQgZmlsbD0nIzAwMDAwMCcgZm9udC1mYW1pbHk9J3NhbnMtc2VyaWYnIGZvbnQtc2l6ZT0nMTInIGxlbmd0aEFkanVzdD0nc3BhY2luZycgdGV4dExlbmd0aD0nNzQnIHg9JzQ2JyB5PScxMjguODg4Nyc+YnVpbGQuZ3JhZGxlPC90ZXh0Pjx0ZXh0IGZpbGw9JyMwMDAwMDAnIGZvbnQtZmFtaWx5PSdzYW5zLXNlcmlmJyBmb250LXNpemU9JzEyJyBsZW5ndGhBZGp1c3Q9J3NwYWNpbmcnIHRleHRMZW5ndGg9JzEzMycgeD0nNDYnIHk9JzE0Mi44NTc0Jz5kZXBlbmRlbmNpZXMuZ3JhZGxlPC90ZXh0Pjx0ZXh0IGZpbGw9JyMwMDAwMDAnIGZvbnQtZmFtaWx5PSdzYW5zLXNlcmlmJyBmb250LXNpemU9JzEyJyBsZW5ndGhBZGp1c3Q9J3NwYWNpbmcnIHRleHRMZW5ndGg9Jzc0JyB4PSczNicgeT0nMTU2LjgyNjInPmJ1aWxkLmdyYWRsZTwvdGV4dD48cmVjdCBmaWxsPSdub25lJyBoZWlnaHQ9JzInIHN0eWxlPSdzdHJva2U6Izg4ODg4ODtzdHJva2Utd2lkdGg6MS4wOycgd2lkdGg9JzInIHg9JzknIHk9JzExLjk4NDQnLz48cmVjdCBmaWxsPSdub25lJyBoZWlnaHQ9JzInIHN0eWxlPSdzdHJva2U6Izg4ODg4ODtzdHJva2Utd2lkdGg6MS4wOycgd2lkdGg9JzInIHg9JzE5JyB5PScyNS45NTMxJy8+PGxpbmUgc3R5bGU9J3N0cm9rZTojODg4ODg4O3N0cm9rZS13aWR0aDoxLjA7JyB4MT0nMTAnIHgyPScxMCcgeTE9JzE0Ljk4NDQnIHkyPScyNi45NTMxJy8+PGxpbmUgc3R5bGU9J3N0cm9rZTojODg4ODg4O3N0cm9rZS13aWR0aDoxLjA7JyB4MT0nMTAnIHgyPScxOCcgeTE9JzI2Ljk1MzEnIHkyPScyNi45NTMxJy8+PHJlY3QgZmlsbD0nbm9uZScgaGVpZ2h0PScyJyBzdHlsZT0nc3Ryb2tlOiM4ODg4ODg7c3Ryb2tlLXdpZHRoOjEuMDsnIHdpZHRoPScyJyB4PScyOScgeT0nMzkuOTIxOScvPjxsaW5lIHN0eWxlPSdzdHJva2U6Izg4ODg4ODtzdHJva2Utd2lkdGg6MS4wOycgeDE9JzIwJyB4Mj0nMjAnIHkxPScyOC45NTMxJyB5Mj0nNDAuOTIxOScvPjxsaW5lIHN0eWxlPSdzdHJva2U6Izg4ODg4ODtzdHJva2Utd2lkdGg6MS4wOycgeDE9JzIwJyB4Mj0nMjgnIHkxPSc0MC45MjE5JyB5Mj0nNDAuOTIxOScvPjxyZWN0IGZpbGw9J25vbmUnIGhlaWdodD0nMicgc3R5bGU9J3N0cm9rZTojODg4ODg4O3N0cm9rZS13aWR0aDoxLjA7JyB3aWR0aD0nMicgeD0nMzknIHk9JzUzLjg5MDYnLz48bGluZSBzdHlsZT0nc3Ryb2tlOiM4ODg4ODg7c3Ryb2tlLXdpZHRoOjEuMDsnIHgxPSczMCcgeDI9JzMwJyB5MT0nNDIuOTIxOScgeTI9JzU0Ljg5MDYnLz48bGluZSBzdHlsZT0nc3Ryb2tlOiM4ODg4ODg7c3Ryb2tlLXdpZHRoOjEuMDsnIHgxPSczMCcgeDI9JzM4JyB5MT0nNTQuODkwNicgeTI9JzU0Ljg5MDYnLz48cmVjdCBmaWxsPSdub25lJyBoZWlnaHQ9JzInIHN0eWxlPSdzdHJva2U6Izg4ODg4ODtzdHJva2Utd2lkdGg6MS4wOycgd2lkdGg9JzInIHg9JzQ5JyB5PSc2Ny44NTk0Jy8+PGxpbmUgc3R5bGU9J3N0cm9rZTojODg4ODg4O3N0cm9rZS13aWR0aDoxLjA7JyB4MT0nNDAnIHgyPSc0MCcgeTE9JzU2Ljg5MDYnIHkyPSc2OC44NTk0Jy8+PGxpbmUgc3R5bGU9J3N0cm9rZTojODg4ODg4O3N0cm9rZS13aWR0aDoxLjA7JyB4MT0nNDAnIHgyPSc0OCcgeTE9JzY4Ljg1OTQnIHkyPSc2OC44NTk0Jy8+PHJlY3QgZmlsbD0nbm9uZScgaGVpZ2h0PScyJyBzdHlsZT0nc3Ryb2tlOiM4ODg4ODg7c3Ryb2tlLXdpZHRoOjEuMDsnIHdpZHRoPScyJyB4PSc1OScgeT0nODEuODI4MScvPjxsaW5lIHN0eWxlPSdzdHJva2U6Izg4ODg4ODtzdHJva2Utd2lkdGg6MS4wOycgeDE9JzUwJyB4Mj0nNTAnIHkxPSc3MC44NTk0JyB5Mj0nODIuODI4MScvPjxsaW5lIHN0eWxlPSdzdHJva2U6Izg4ODg4ODtzdHJva2Utd2lkdGg6MS4wOycgeDE9JzUwJyB4Mj0nNTgnIHkxPSc4Mi44MjgxJyB5Mj0nODIuODI4MScvPjxyZWN0IGZpbGw9J25vbmUnIGhlaWdodD0nMicgc3R5bGU9J3N0cm9rZTojODg4ODg4O3N0cm9rZS13aWR0aDoxLjA7JyB3aWR0aD0nMicgeD0nNjknIHk9Jzk1Ljc5NjknLz48bGluZSBzdHlsZT0nc3Ryb2tlOiM4ODg4ODg7c3Ryb2tlLXdpZHRoOjEuMDsnIHgxPSc2MCcgeDI9JzYwJyB5MT0nODQuODI4MScgeTI9Jzk2Ljc5NjknLz48bGluZSBzdHlsZT0nc3Ryb2tlOiM4ODg4ODg7c3Ryb2tlLXdpZHRoOjEuMDsnIHgxPSc2MCcgeDI9JzY4JyB5MT0nOTYuNzk2OScgeTI9Jzk2Ljc5NjknLz48bGluZSBzdHlsZT0nc3Ryb2tlOiM4ODg4ODg7c3Ryb2tlLXdpZHRoOjEuMDsnIHgxPSc3MCcgeDI9JzcwJyB5MT0nOTguNzk2OScgeTI9JzExMC43NjU2Jy8+PGxpbmUgc3R5bGU9J3N0cm9rZTojODg4ODg4O3N0cm9rZS13aWR0aDoxLjA7JyB4MT0nNzAnIHgyPSc3OCcgeTE9JzExMC43NjU2JyB5Mj0nMTEwLjc2NTYnLz48bGluZSBzdHlsZT0nc3Ryb2tlOiM4ODg4ODg7c3Ryb2tlLXdpZHRoOjEuMDsnIHgxPSczMCcgeDI9JzMwJyB5MT0nNDIuOTIxOScgeTI9JzEyNC43MzQ0Jy8+PGxpbmUgc3R5bGU9J3N0cm9rZTojODg4ODg4O3N0cm9rZS13aWR0aDoxLjA7JyB4MT0nMzAnIHgyPSczOCcgeTE9JzEyNC43MzQ0JyB5Mj0nMTI0LjczNDQnLz48bGluZSBzdHlsZT0nc3Ryb2tlOiM4ODg4ODg7c3Ryb2tlLXdpZHRoOjEuMDsnIHgxPSczMCcgeDI9JzMwJyB5MT0nNDIuOTIxOScgeTI9JzEzOC43MDMxJy8+PGxpbmUgc3R5bGU9J3N0cm9rZTojODg4ODg4O3N0cm9rZS13aWR0aDoxLjA7JyB4MT0nMzAnIHgyPSczOCcgeTE9JzEzOC43MDMxJyB5Mj0nMTM4LjcwMzEnLz48bGluZSBzdHlsZT0nc3Ryb2tlOiM4ODg4ODg7c3Ryb2tlLXdpZHRoOjEuMDsnIHgxPScyMCcgeDI9JzIwJyB5MT0nMjguOTUzMScgeTI9JzE1Mi42NzE5Jy8+PGxpbmUgc3R5bGU9J3N0cm9rZTojODg4ODg4O3N0cm9rZS13aWR0aDoxLjA7JyB4MT0nMjAnIHgyPScyOCcgeTE9JzE1Mi42NzE5JyB5Mj0nMTUyLjY3MTknLz48L2c+PC9zdmc+" alt="Diagram" width="322" height="165">
</div>
</div>
<div class="paragraph">
<p>Please make sure that your <code>service</code> module&#8217;s build.gradle file has a unique group:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="groovy">description = <span class="string"><span class="delimiter">'</span><span class="content">My Company: Fineract My Custom Service</span><span class="delimiter">'</span></span>
group = <span class="string"><span class="delimiter">'</span><span class="content">com.mycompany.fineract.custom.service</span><span class="delimiter">'</span></span> <i class="conum" data-value="1"></i><b>(1)</b>
apply <span class="key">from</span>: <span class="string"><span class="delimiter">'</span><span class="content">dependencies.gradle</span><span class="delimiter">'</span></span></code></pre>
</div>
</div>
<div class="colist arabic">
<table>
<tr>
<td><i class="conum" data-value="1"></i><b>1</b></td>
<td>The best choice here is to name it like you would name your JAR artifact on Maven Central.</td>
</tr>
</table>
</div>
</li>
<li>
<p>Make sure that your custom modules are present in settings.gradle: :</p>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="groovy">rootProject.name=<span class="string"><span class="delimiter">'</span><span class="content">fineract</span><span class="delimiter">'</span></span>
include <span class="string"><span class="delimiter">'</span><span class="content">:custom:mycustom:service</span><span class="delimiter">'</span></span> <i class="conum" data-value="1"></i><b>(1)</b>
include <span class="string"><span class="delimiter">'</span><span class="content">:fineract-provider</span><span class="delimiter">'</span></span>
include <span class="string"><span class="delimiter">'</span><span class="content">:fineract-war</span><span class="delimiter">'</span></span>
include <span class="string"><span class="delimiter">'</span><span class="content">:integration-tests</span><span class="delimiter">'</span></span>
include <span class="string"><span class="delimiter">'</span><span class="content">:twofactor-tests</span><span class="delimiter">'</span></span>
include <span class="string"><span class="delimiter">'</span><span class="content">:oauth2-tests</span><span class="delimiter">'</span></span>
include <span class="string"><span class="delimiter">'</span><span class="content">:fineract-client</span><span class="delimiter">'</span></span>
include <span class="string"><span class="delimiter">'</span><span class="content">:fineract-doc</span><span class="delimiter">'</span></span></code></pre>
</div>
</div>
<div class="colist arabic">
<table>
<tr>
<td><i class="conum" data-value="1"></i><b>1</b></td>
<td>The <code>settings.gradle</code> file should contain something like this.</td>
</tr>
</table>
</div>
</li>
<li>
<p>The dependency.gradle file could look something like this:</p>
</li>
</ol>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="java">dependencies {
implementation(project(<span class="string"><span class="delimiter">'</span><span class="content">:module:mymodule:core</span><span class="delimiter">'</span></span>), <i class="conum" data-value="1"></i><b>(1)</b>
<span class="string"><span class="delimiter">'</span><span class="content">org.springframework:spring-context</span><span class="delimiter">'</span></span>)
compileOnly project(<span class="string"><span class="delimiter">'</span><span class="content">:fineract-provider</span><span class="delimiter">'</span></span>) <i class="conum" data-value="2"></i><b>(2)</b>
}</code></pre>
</div>
</div>
<div class="colist arabic">
<table>
<tr>
<td><i class="conum" data-value="1"></i><b>1</b></td>
<td>If you are replacing a "clean room" module then you just need to include a dependency on the modules <code>core</code> library.</td>
</tr>
<tr>
<td><i class="conum" data-value="2"></i><b>2</b></td>
<td>If you are replacing a service that is not yet extracted from <code>fineract-provider</code> then you need to add a dependency on it (only needed during compilation).
<div class="olist arabic">
<ol class="arabic">
<li>
<p>When the custom module is built then you can add the JAR in your Fineract&#8217;s libs folder (or in Tomcat&#8217;s libs folder if you are deploying as a WAR app).</p>
</li>
</ol>
</div></td>
</tr>
</table>
</div>
<div class="admonitionblock important">
<table>
<tr>
<td class="icon">
<i class="fa icon-important" title="Important"></i>
</td>
<td class="content">
Do not include your custom module in `fineract-provider&#8217;s dependency.gradle file. This creates a circular dependency and will fail your build. Instead you have to add your JAR file e. g. to the Docker image (in Fineract&#8217;s libs folder; similar like we do it with Pentaho reporting). This setup will give you the best developer experience for now with proper source references until we have separate JAR files ready on Maven Central. In the next section we describe the "clean room" (read: where we want to go) type of modules and their customization/replacement; so don&#8217;t be confused if you see the dependency appearing in `fineract-provider&#8217;s dependency.gradle, in the future you&#8217;ll be able to do that.
</td>
</tr>
</table>
</div>
</div>
<div class="sect3">
<h4 id="_example">Example</h4>
<div class="sect4">
<h5 id="_dummy_module_structure">Dummy Module Structure</h5>
<div class="paragraph">
<p>We&#8217;ve created a demonstration how modules are supposed to be used. A module has usually at least two sub-modules:</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>a <em>core</em> module that contains mostly Java interfaces of the services and/or other components that we&#8217;d like to make replacable. The <em>core</em> module could also contain data (DTO) or domain (entity) classes if necessary.</p>
</li>
<li>
<p>a <em>service</em> module</p>
</li>
</ol>
</div>
<div class="admonitionblock important">
<table>
<tr>
<td class="icon">
<i class="fa icon-important" title="Important"></i>
</td>
<td class="content">
Replacing parts of the existing REST API and extending it with custom endpoints is at the moment out of scope. Probably we&#8217;ll need to cleanup and improve the REST layer quite a bit (remove boilerplate code as much as possible, use Jackson for JSON de-/serialization instead of the manual GSON mappers/helper everywhere) before this can happen. For now we&#8217;ll concentrate primarily on service classes.
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>Let&#8217;s assume we have a service <code>DummyService</code> in our system. The service is outlined as a Java interface in module folder <code>module/dummy/core</code>.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="java"><span class="keyword">package</span> <span class="namespace">org.apache.fineract.dummy.core.service</span>;
<span class="keyword">import</span> <span class="include">org.apache.fineract.dummy.core.data.DummyMessage</span>;
<span class="directive">public</span> <span class="type">interface</span> <span class="class">DummyService</span> {
DummyMessage getMessage();
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>To make it a little bit more interesting the service&#8217;s only function returns a simple data object that has one string attribute:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="java"><span class="keyword">package</span> <span class="namespace">org.apache.fineract.dummy.core.data</span>;
<span class="directive">public</span> <span class="type">class</span> <span class="class">DummyMessage</span> {
<span class="directive">private</span> <span class="predefined-type">String</span> message;
<span class="directive">public</span> DummyMessage(<span class="predefined-type">String</span> message) {
<span class="local-variable">this</span>.message = message;
}
<span class="directive">public</span> <span class="predefined-type">String</span> getMessage() {
<span class="keyword">return</span> message;
}
<span class="directive">public</span> <span class="type">void</span> setMessage(<span class="predefined-type">String</span> message) {
<span class="local-variable">this</span>.message = message;
}
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>A default implementation of <code>DummyService</code> is provided with <code>DummyServiceImpl</code>:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="java"><span class="keyword">package</span> <span class="namespace">org.apache.fineract.dummy.service</span>;
<span class="keyword">import</span> <span class="include">org.apache.fineract.dummy.core.data.DummyMessage</span>;
<span class="keyword">import</span> <span class="include">org.apache.fineract.dummy.core.service.DummyService</span>;
<span class="directive">public</span> <span class="type">class</span> <span class="class">DummyServiceImpl</span> <span class="directive">implements</span> DummyService {
<span class="annotation">@Override</span>
<span class="directive">public</span> DummyMessage getMessage() {
<span class="keyword">return</span> <span class="keyword">new</span> DummyMessage(<span class="string"><span class="delimiter">&quot;</span><span class="content">Hello: DEFAULT DUMMY!</span><span class="delimiter">&quot;</span></span>);
}
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>As you can see there are no annotations like <code>@Service</code> or <code>@Component</code>. To have full control over the instantiation and dependency injection we provide a so called <em>starter</em> module. This module just contains one or more (auto-) configuration classes. In this case it&#8217;s just one configuration class. This is basically a very simple Spring Java configuration class annotated with <code>@Configuration</code> containing one method that instantiates our default service implementation (annotated with <code>@Bean</code>):</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="java"><span class="keyword">package</span> <span class="namespace">org.apache.fineract.dummy.starter</span>;
<span class="keyword">import</span> <span class="include">org.apache.fineract.dummy.core.service.DummyService</span>;
<span class="keyword">import</span> <span class="include">org.apache.fineract.dummy.service.DummyServiceImpl</span>;
<span class="keyword">import</span> <span class="include">org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean</span>;
<span class="keyword">import</span> <span class="include">org.springframework.context.annotation.Bean</span>;
<span class="keyword">import</span> <span class="include">org.springframework.context.annotation.Configuration</span>;
<span class="annotation">@Configuration</span>
<span class="annotation">@ConditionalOnMissingBean</span>(DummyService.class)
<span class="directive">public</span> <span class="type">class</span> <span class="class">DummyAutoConfiguration</span> {
<span class="annotation">@Bean</span>
<span class="directive">public</span> DummyService dummyService() {
<span class="keyword">return</span> <span class="keyword">new</span> DummyServiceImpl();
}
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>The interesting part is this line:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="java"><span class="annotation">@ConditionalOnMissingBean</span>(DummyService.class)</code></pre>
</div>
</div>
<div class="paragraph">
<p>This annotation ensures that our default implementation is only instantiated if no other implementation for <code>DummyService</code> is provided. There&#8217;s only one piece missing to make auto configuration work seamlessly and without any explicit configuration in <code>fineract-provider</code>:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="properties">org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.apache.fineract.dummy.starter.DummyAutoConfiguration</code></pre>
</div>
</div>
<div class="paragraph">
<p>This means if we would only include the following dependencies in our main project (e. g. <code>fineract-provider</code>)&#8230;&#8203;</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="groovy">dependencies {
implementation project(<span class="string"><span class="delimiter">'</span><span class="content">:module:dummy:core</span><span class="delimiter">'</span></span>)
implementation project(<span class="string"><span class="delimiter">'</span><span class="content">:module:dummy:service</span><span class="delimiter">'</span></span>)
implementation project(<span class="string"><span class="delimiter">'</span><span class="content">:module:dummy:starter</span><span class="delimiter">'</span></span>)
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>... then the message object would contain</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="text">Hello: DEFAULT DUMMY!</code></pre>
</div>
</div>
</div>
<div class="sect4">
<h5 id="_replace_the_default_implementation_of_dummyservice">Replace the default implementation of DummyService</h5>
<div class="paragraph">
<p>This is why we created module <code>foo</code> in folder <code>module/foo</code>. There&#8217;s only only one sub-module that contains an implementation of <code>DummyService</code> that will replace the default implementation:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="java"><span class="keyword">package</span> <span class="namespace">com.acmecorp.fineract.foo.service</span>;
<span class="keyword">import</span> <span class="include">org.apache.fineract.dummy.core.data.DummyMessage</span>;
<span class="keyword">import</span> <span class="include">org.apache.fineract.dummy.core.service.DummyService</span>;
<span class="keyword">import</span> <span class="include">org.springframework.stereotype.Service</span>;
<span class="annotation">@Service</span>
<span class="directive">public</span> <span class="type">class</span> <span class="class">FooDummyServiceImpl</span> <span class="directive">implements</span> DummyService {
<span class="annotation">@Override</span>
<span class="directive">public</span> DummyMessage getMessage() {
<span class="keyword">return</span> <span class="keyword">new</span> DummyMessage(<span class="string"><span class="delimiter">&quot;</span><span class="content">Hello: FOO!</span><span class="delimiter">&quot;</span></span>);
}
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>As you can see we have no other sub-modules (e. g. there&#8217;s no starter module) and this implementation contains the well known <code>@Service</code> annotation. If we add this dependency to our main project&#8230;&#8203;</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="groovy">dependencies {
implementation project(<span class="string"><span class="delimiter">'</span><span class="content">:module:dummy:core</span><span class="delimiter">'</span></span>)
implementation project(<span class="string"><span class="delimiter">'</span><span class="content">:module:dummy:service</span><span class="delimiter">'</span></span>)
implementation project(<span class="string"><span class="delimiter">'</span><span class="content">:module:dummy:starter</span><span class="delimiter">'</span></span>)
implementation project(<span class="string"><span class="delimiter">'</span><span class="content">:custom:foo:service</span><span class="delimiter">'</span></span>)
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>... then the expected behavior is that we&#8217;ll get the message</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="text">Hello: Foo!</code></pre>
</div>
</div>
</div>
<div class="sect4">
<h5 id="_testing">Testing</h5>
<div class="paragraph">
<p>There&#8217;s a simple unit test in <code>fineract-provider</code> that demonstrates both scenarios (without any override of the default implementation and with an overriding alternative implementation)</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="gherkin">Feature: Example Modules
@modules
Scenario Outline: Verify that the dummy service returns the correct message
Given A dummy service configuration &lt;configurationClass&gt;
When The user gets the dummy service message
Then The dummy service message should match &lt;message&gt;
Examples:
| configurationClass | message |
| org.apache.fineract.module.example.TestDefaultConfiguration | Hello: DEFAULT DUMMY! |
| org.apache.fineract.module.example.TestFooConfiguration | Hello: FOO! |</code></pre>
</div>
</div>
<div class="paragraph">
<p>Here&#8217;s the Spring Java configuration that does <strong>NOT</strong> load the <code>foo</code> module:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="java"><span class="keyword">package</span> <span class="namespace">org.apache.fineract.module.example</span>;
<span class="keyword">import</span> <span class="include">org.apache.fineract.infrastructure.core.config.FineractProperties</span>;
<span class="keyword">import</span> <span class="include">org.springframework.boot.context.properties.EnableConfigurationProperties</span>;
<span class="annotation">@EnableConfigurationProperties</span>({ FineractProperties.class })
<span class="directive">public</span> <span class="type">class</span> <span class="class">TestDefaultConfiguration</span> {}</code></pre>
</div>
</div>
<div class="paragraph">
<p>... and here&#8217;s the configuration that loads the <code>foo</code> module (and overrides the deefault implementation)</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="java"><span class="keyword">package</span> <span class="namespace">org.apache.fineract.module.example</span>;
<span class="keyword">import</span> <span class="include">org.apache.fineract.infrastructure.core.config.FineractProperties</span>;
<span class="keyword">import</span> <span class="include">org.springframework.boot.context.properties.EnableConfigurationProperties</span>;
<span class="keyword">import</span> <span class="include">org.springframework.context.annotation.ComponentScan</span>;
<span class="annotation">@EnableConfigurationProperties</span>({ FineractProperties.class })
<span class="annotation">@ComponentScan</span>(<span class="string"><span class="delimiter">&quot;</span><span class="content">com.acmecorp.fineract.foo</span><span class="delimiter">&quot;</span></span>)
<span class="directive">public</span> <span class="type">class</span> <span class="class">TestFooConfiguration</span> {}</code></pre>
</div>
</div>
<div class="paragraph">
<p>The important part in the <code>foo</code> configuration is this line:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="java"><span class="annotation">@ComponentScan</span>(<span class="string"><span class="delimiter">&quot;</span><span class="content">com.acmecorp.fineract.foo</span><span class="delimiter">&quot;</span></span>)</code></pre>
</div>
</div>
</div>
<div class="sect4">
<h5 id="_deployment_2">Deployment</h5>
<div class="paragraph">
<p>Modules (better: the JAR files) only need to be dropped in Fineract&#8217;s <code>libs</code> folder. Dynamic loading of external JARs is provided since Fineract version 1.5.0.</p>
</div>
</div>
<div class="sect4">
<h5 id="_how_can_i_start_replacing_services_now">How can I start replacing services now</h5>
<div class="paragraph">
<p>As said the "clean room" modules will take a while to arrive. In the meanwhile we&#8217;ll prepare the existing monolithic code base for pluggability. As a proof of concept the services <code>org.apache.fineract.portfolio.note.service.NoteReadPlatformService</code> and <code>org.apache.fineract.portfolio.note.service.NoteWritePlatformService</code> can be replaced/overriden by custom implementations. We&#8217;ll add more shortly and will list them here. Reach out on the mailing list if you need a specific service to be replaceable.</p>
</div>
</div>
<div class="sect4">
<h5 id="_outlook">Outlook</h5>
<div class="paragraph">
<p>If this proof of concept is accepted we could refactor Fineract&#8217;s services one by one and rearrange them in the proposed module structure. As discussed at ApacheCon 2021 there will be most likely some work to do to properly extract those modules (loan product, client, savings account etc.) from the monolithic code base. The main challenge are cross-dependencies between the <em>modules</em>, but there are major benefits if we split up the code like this. One - as demonstrated - is the replacement of existing default functionality. But with modules we&#8217;ll also be able to finally publish Fineract JAR files to Maven Central. Those JAR files can be used to write extensions and customizations <strong>WITHOUT</strong> forking the whole Fineract Github repository. With modules users will also be able to create custom Fineract distributions, e. g. slimmed down to contain only the bare minimum needed in production.</p>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_fineract_development_environment">Fineract Development Environment</h2>
<div class="sectionbody">
<div class="paragraph">
<p>TBD</p>
</div>
<div class="sect2">
<h3 id="_git">Git</h3>
<div class="paragraph">
<p>TBD</p>
</div>
</div>
<div class="sect2">
<h3 id="_gpg">GPG</h3>
<div class="paragraph">
<p>TBD</p>
</div>
</div>
<div class="sect2">
<h3 id="_docker">Docker</h3>
<div class="paragraph">
<p>TBD</p>
</div>
<div class="sect3">
<h4 id="_docker_compose_2">Docker Compose</h4>
<div class="paragraph">
<p>TBD</p>
</div>
</div>
<div class="sect3">
<h4 id="_podman">Podman</h4>
<div class="paragraph">
<p>TBD</p>
</div>
</div>
<div class="sect3">
<h4 id="_rancher_docker_desktop">Rancher Docker Desktop</h4>
<div class="paragraph">
<p>TBD</p>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_gradle">Gradle</h3>
<div class="paragraph">
<p>TBD</p>
</div>
</div>
<div class="sect2">
<h3 id="_ide">IDE</h3>
<div class="paragraph">
<p>TBD</p>
</div>
<div class="sect3">
<h4 id="_intellij">IntelliJ</h4>
<div class="paragraph">
<p>TBD</p>
</div>
</div>
<div class="sect3">
<h4 id="_eclipse">Eclipse</h4>
<div class="paragraph">
<p>TBD</p>
</div>
</div>
<div class="sect3">
<h4 id="_vscode">VSCode</h4>
<div class="paragraph">
<p>TBD</p>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_kubernetes_2">Kubernetes</h3>
<div class="paragraph">
<p>TBD</p>
</div>
<div class="sect3">
<h4 id="_minikube">Minikube</h4>
<div class="paragraph">
<p>TBD</p>
</div>
</div>
<div class="sect3">
<h4 id="_microk8s">Microk8s</h4>
<div class="paragraph">
<p>TBD</p>
</div>
</div>
<div class="sect3">
<h4 id="_k3d">K3d</h4>
<div class="paragraph">
<p>TBD</p>
</div>
</div>
<div class="sect3">
<h4 id="_helm_charts">Helm Charts</h4>
<div class="paragraph">
<p>TBD</p>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_tools">Tools</h3>
<div class="paragraph">
<p>TBD</p>
</div>
<div class="sect3">
<h4 id="_sdkman">SDKMAN</h4>
<div class="paragraph">
<p>We recommend using SKDMAN to manage the following developer tools:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>JDK</p>
</li>
<li>
<p>Spring Boot CLI</p>
</li>
<li>
<p>Gradle (if you need a global installation)</p>
</li>
<li>
<p>AsciidoctorJ</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>TBD</p>
</div>
</div>
<div class="sect3">
<h4 id="_brew">Brew</h4>
<div class="sect4">
<h5 id="_macos">MacOS</h5>
<div class="paragraph">
<p>TBD</p>
</div>
</div>
<div class="sect4">
<h5 id="_linux">Linux</h5>
<div class="paragraph">
<p>TBD</p>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_security">Security</h2>
<div class="sectionbody">
<div class="paragraph">
<p>TBD</p>
</div>
<div class="sect2">
<h3 id="_oauth">OAuth</h3>
<div class="paragraph">
<p>Fineract has a (basic) OAuth2 support based on Spring Boot Security. Here&#8217;s how to use it:</p>
</div>
<div class="sect3">
<h4 id="_build">Build</h4>
<div class="paragraph">
<p>You must re-build the distribution JAR (or WAR) using the special <code>-Psecurity=oauth</code> flag:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="java">./gradlew bootRun -Psecurity=oauth</code></pre>
</div>
</div>
<div class="paragraph">
<p>Downloads from <a href="https://fineract.apache.org" class="bare">fineract.apache.org</a>, or using e.g. the <a href="https://hub.docker.com/r/apache/fineract" class="bare">hub.docker.com/r/apache/fineract</a> container image, or on <a href="https://www.fineract.dev" class="bare">www.fineract.dev</a>, this will not work, because they have not been built using this flag.</p>
</div>
<div class="paragraph">
<p>Previous versions of Fineract included a built-in authorisation server for issuing OAuth tokens. However, as the spring-security-oauth2 package was deprecated and replaced by built-in OAuth support in Spring Security, this is no longer supported as part of the package. Instead, you need to run a separate OAuth authorization server (e.g. <a href="https://github.com/spring-projects/spring-authorization-server" class="bare">github.com/spring-projects/spring-authorization-server</a>) or use a 3rd-party OAuth authorization provider (<a href="https://en.wikipedia.org/wiki/List_of_OAuth_providers" class="bare">en.wikipedia.org/wiki/List_of_OAuth_providers</a>)</p>
</div>
<div class="paragraph">
<p>This instruction describes how to get Fineract OAuth working with a Keycloak (<a href="http://keycloak.org" class="bare">keycloak.org</a>) based authentication provider running in a Docker container. The steps required for other OAuth providers will be similar.</p>
</div>
</div>
<div class="sect3">
<h4 id="_set_up_keycloak">Set up Keycloak</h4>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>From terminal, run: 'docker run -p 9000:8080 -e KEYCLOAK_USER=admin -e KEYCLOAK_PASSWORD=admin quay.io/keycloak/keycloak:15.0.2'</p>
</li>
<li>
<p>Go to URL 'http://localhost:9000/auth/admin' and login with admin/admin</p>
</li>
<li>
<p>Hover your mouse over text "Master" and click on "Add realm"</p>
</li>
<li>
<p>Enter name "fineract" for your realm</p>
</li>
<li>
<p>Click on tab "Users" on the left, then "Add user" and create user with username "mifos"</p>
</li>
<li>
<p>Click on tab "Credentials" at the top, and set password to "password", turning "temporary" setting to off</p>
</li>
<li>
<p>Click on tab "Clients" on the left, and create client with ID 'community-app'</p>
</li>
<li>
<p>In settings tab, set 'access-type' to 'confidential' and enter 'localhost' in the valid redirect URIs.</p>
</li>
<li>
<p>In credentials tab, copy string in field 'secret' as this will be needed in the step to request the access token</p>
</li>
</ol>
</div>
<div class="paragraph">
<p>Finally we need to change Keycloak configuration so that it uses the username as a subject of the token:</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Choose client 'community-app' in the tab 'Clients'</p>
</li>
<li>
<p>Go to tab 'Mappers' and click on 'Create'</p>
</li>
<li>
<p>Enter 'usernameInSub' as 'Name'</p>
</li>
<li>
<p>Choose mapper type 'User Property'</p>
</li>
<li>
<p>Enter 'username' into the field 'Property' and 'sub' into the field 'Token Claim Name'. Choose 'String' as 'Claim JSON Type'</p>
</li>
</ol>
</div>
<div class="paragraph">
<p>You are now ready to test out OAuth:</p>
</div>
</div>
<div class="sect3">
<h4 id="_retrieve_an_access_token_from_keycloak">Retrieve an access token from Keycloak</h4>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="java">curl --location --request POST \
<span class="string"><span class="delimiter">'</span><span class="content">http://localhost:9000/auth/realms/fineract/protocol/openid-connect/token</span><span class="delimiter">'</span></span> \
--header <span class="string"><span class="delimiter">'</span><span class="content">Content-Type: application/x-www-form-urlencoded</span><span class="delimiter">'</span></span> \
--data-urlencode <span class="string"><span class="delimiter">'</span><span class="content">username=mifos</span><span class="delimiter">'</span></span> \
--data-urlencode <span class="string"><span class="delimiter">'</span><span class="content">password=password</span><span class="delimiter">'</span></span> \
--data-urlencode <span class="string"><span class="delimiter">'</span><span class="content">client_id=community-app</span><span class="delimiter">'</span></span> \
--data-urlencode <span class="string"><span class="delimiter">'</span><span class="content">grant_type=password</span><span class="delimiter">'</span></span> \
--data-urlencode <span class="string"><span class="delimiter">'</span><span class="content">client_secret=&lt;enter the client secret from credentials tab&gt;</span><span class="delimiter">'</span></span></code></pre>
</div>
</div>
<div class="paragraph">
<p>The reply should contain a field 'access_token'. Copy the field&#8217;s value and use it in the API call below:</p>
</div>
</div>
<div class="sect3">
<h4 id="_invoke_apis_and_pass_authorization_bearer_header">Invoke APIs and pass <code>Authorization: bearer &#8230;&#8203;</code> header</h4>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="java">curl --location --request GET \
<span class="string"><span class="delimiter">'</span><span class="content">https://localhost:8443/fineract-provider/api/v1/offices</span><span class="delimiter">'</span></span> \
--header <span class="string"><span class="delimiter">'</span><span class="content">Fineract-Platform-TenantId: default</span><span class="delimiter">'</span></span> \
--header <span class="string"><span class="delimiter">'</span><span class="content">Authorization: bearer &lt;enter the value of the access_token field&gt;</span><span class="delimiter">'</span></span></code></pre>
</div>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
See also <a href="https://demo.fineract.dev/fineract-provider/api-docs/apiLive.htm#authentication_oauth" class="bare">demo.fineract.dev/fineract-provider/api-docs/apiLive.htm#authentication_oauth</a>
</td>
</tr>
</table>
</div>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_fineract_sdks">Fineract SDKs</h2>
<div class="sectionbody">
<div class="paragraph">
<p>TBD</p>
</div>
<div class="sect2">
<h3 id="_generate_apache_fineract_api_client">Generate Apache Fineract API Client</h3>
<div class="paragraph">
<p>Apache Fineract supports client code generation using <a href="https://openapi-generator.tech">OpenAPI Generator</a>. It uses <a href="https://swagger.io/specification/">OpenAPI Specification Version 3.0.3</a>.</p>
</div>
<div class="sect3">
<h4 id="_fineract_sdk_java_api_client">Fineract SDK Java API Client</h4>
<div class="paragraph">
<p>The <code>fineract-client.jar</code> will eventually be available on Maven Central (watch <a href="https://issues.apache.org/jira/browse/FINERACT-1102">FINERACT-1102</a>). Until it is, you can quite easily build the latest and greatest version locally from source, see below.</p>
</div>
<div class="paragraph">
<p>The <a href="https://github.com/apache/fineract/search?q=FineractClient.java"><code>FineractClient</code></a> is the entry point to the <em>Fineract SDK Java API Client</em>. <a href="https://github.com/apache/fineract/search?q=Calls.java"><code>Calls</code></a> is a convenient and recommended utility to simplify the use of the <a href="https://square.github.io/retrofit/2.x/retrofit/retrofit2/Call.html"><code>retrofit2.Call</code></a> type which all API operations return. This permits you to use the API like the <a href="https://github.com/search?l=&amp;q=repo%3Aapache%2Ffineract+filename%3AFineractClientDemo.java&amp;type=code"><code>FineractClientDemo</code></a> illustrates:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="java"><span class="keyword">import</span> <span class="include">org.apache.fineract.client.util.FineractClient</span>;
<span class="keyword">import</span> <span class="include">static</span> <span class="include">org.apache.fineract.client.util.Calls.ok</span>;
FineractClient fineract = FineractClient.builder().baseURL(<span class="string"><span class="delimiter">&quot;</span><span class="content">https://demo.fineract.dev/fineract-provider/api/v1/</span><span class="delimiter">&quot;</span></span>).tenant(<span class="string"><span class="delimiter">&quot;</span><span class="content">default</span><span class="delimiter">&quot;</span></span>)
.basicAuth(<span class="string"><span class="delimiter">&quot;</span><span class="content">mifos</span><span class="delimiter">&quot;</span></span>, <span class="string"><span class="delimiter">&quot;</span><span class="content">password</span><span class="delimiter">&quot;</span></span>).build();
<span class="predefined-type">List</span>&lt;RetrieveOneResponse&gt; staff = Calls.ok(fineract.staff.retrieveAll16(<span class="integer">1L</span>, <span class="predefined-constant">true</span>, <span class="predefined-constant">false</span>, <span class="string"><span class="delimiter">&quot;</span><span class="content">ACTIVE</span><span class="delimiter">&quot;</span></span>));
<span class="predefined-type">String</span> name = staff.get(<span class="integer">0</span>).getDisplayName();</code></pre>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_generate_api_client">Generate API Client</h4>
<div class="paragraph">
<p>The API client is built as part of the standard overall Fineract Gradle build. The client JAR can be found in <code>fineract-client/build/libs</code> as <code>fineract-client.jar</code>.</p>
</div>
<div class="paragraph">
<p>If you need to save time to incrementally work on making small changes to Swagger annotations in an IDE, you can execute e.g. the following line in root directory of the project to exclude non-require Gradle tasks:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="java">./gradlew -x compileJava -x compileTest -x spotlessJava -x enhance resolve prepareInputYaml :fineract-client:buildJavaSdk</code></pre>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_validate_openapi_spec_file">Validate OpenAPI Spec File</h4>
<div class="paragraph">
<p>The <code>resolve</code> task in <a href="https://github.com/apache/fineract/blob/develop/fineract-provider/build.gradle#L80">build.gradle</a> file will generate the OpenAPI Spec File for the project. To make sure Swagger Codegen generates a correct library, it is important for the OpenAPI Spec file to be valid. Validation is done automatically by the OpenAPI code generator Gradle plugin. If you still have problems during code generation please use <a href="https://validator.swagger.io/">Swagger OpenAPI Validator</a> to validate the spec file.</p>
</div>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_testing_2">Testing</h2>
<div class="sectionbody">
<div class="paragraph">
<p>TBD</p>
</div>
<div class="sect2">
<h3 id="_cucumber">Cucumber</h3>
<div class="paragraph">
<p>TBD</p>
</div>
<div class="sect3">
<h4 id="_introduction_2">Introduction</h4>
<div class="paragraph">
<p>TBD</p>
</div>
</div>
<div class="sect3">
<h4 id="_tutorial">Tutorial</h4>
<div class="paragraph">
<p>TBD</p>
</div>
</div>
<div class="sect3">
<h4 id="_cheatsheet">Cheatsheet</h4>
<div class="paragraph">
<p>TBD</p>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_unit_testing">Unit Testing</h3>
<div class="paragraph">
<p>TBD</p>
</div>
</div>
<div class="sect2">
<h3 id="_integration_testing">Integration Testing</h3>
<div class="paragraph">
<p>TBD</p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_documentation">Documentation</h2>
<div class="sectionbody">
<div class="paragraph">
<p>We try to assemble all Fineract related documentation in this document. We use Asciidoc&#8230;&#8203;</p>
</div>
<div class="paragraph">
<p>TBD</p>
</div>
<div class="sect2">
<h3 id="_file_and_folder_layout">File and Folder Layout</h3>
<div class="paragraph">
<p>TBD</p>
</div>
<div class="sect3">
<h4 id="_book">Book</h4>
<div class="paragraph">
<p>TBD</p>
</div>
</div>
<div class="sect3">
<h4 id="_chapter">Chapter</h4>
<div class="paragraph">
<p>TBD</p>
</div>
</div>
<div class="sect3">
<h4 id="_diagrams">Diagrams</h4>
<div class="paragraph">
<p>TBD</p>
</div>
</div>
<div class="sect3">
<h4 id="_images">Images</h4>
<div class="paragraph">
<p>TBD</p>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_asciidoc">Asciidoc</h3>
<div class="paragraph">
<p>See: <a href="https://asciidoctor.org/" class="bare">asciidoctor.org/</a></p>
</div>
<div class="paragraph">
<p>TBD</p>
</div>
<div class="sect3">
<h4 id="_tutorial_2">Tutorial</h4>
<div class="paragraph">
<p>See: <a href="https://www.vogella.com/tutorials/AsciiDoc/article.html" class="bare">www.vogella.com/tutorials/AsciiDoc/article.html</a></p>
</div>
<div class="paragraph">
<p>TBD</p>
</div>
</div>
<div class="sect3">
<h4 id="_cheatsheet_2">Cheatsheet</h4>
<div class="paragraph">
<p>TBD</p>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_plantuml">PlantUML</h3>
<div class="paragraph">
<p>See: <a href="https://plantuml.com/" class="bare">plantuml.com/</a></p>
</div>
<div class="paragraph">
<p>TBD</p>
</div>
<div class="sect3">
<h4 id="_tutorial_3">Tutorial</h4>
<div class="paragraph">
<p>TBD</p>
</div>
</div>
<div class="sect3">
<h4 id="_cheatsheet_3">Cheatsheet</h4>
<div class="paragraph">
<p>TBD</p>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_editor">Editor</h3>
<div class="paragraph">
<p>TBD</p>
</div>
<div class="sect3">
<h4 id="_intellij_idea">IntelliJ IDEA</h4>
<div class="sect4">
<h5 id="_asciidoc_2">Asciidoc</h5>
<div class="paragraph">
<p>See: <a href="https://plugins.jetbrains.com/plugin/7391-asciidoc" class="bare">plugins.jetbrains.com/plugin/7391-asciidoc</a></p>
</div>
</div>
<div class="sect4">
<h5 id="_plantuml_2">PlantUML</h5>
<div class="paragraph">
<p>See: <a href="https://plugins.jetbrains.com/plugin/7017-plantuml-integration" class="bare">plugins.jetbrains.com/plugin/7017-plantuml-integration</a></p>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_eclipse_2">Eclipse</h4>
<div class="sect4">
<h5 id="_asciidoc_3">Asciidoc</h5>
<div class="paragraph">
<p>See: <a href="https://marketplace.eclipse.org/content/asciidoctor-editor" class="bare">marketplace.eclipse.org/content/asciidoctor-editor</a></p>
</div>
</div>
<div class="sect4">
<h5 id="_plantuml_3">PlantUML</h5>
<div class="paragraph">
<p>See: <a href="https://plantuml.com/eclipse" class="bare">plantuml.com/eclipse</a></p>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_vscode_2">VSCode</h4>
<div class="sect4">
<h5 id="_asciidoc_4">Asciidoc</h5>
<div class="paragraph">
<p>See: <a href="https://marketplace.visualstudio.com/items?itemName=asciidoctor.asciidoctor-vscode" class="bare">marketplace.visualstudio.com/items?itemName=asciidoctor.asciidoctor-vscode</a></p>
</div>
</div>
<div class="sect4">
<h5 id="_plantuml_4">PlantUML</h5>
<div class="paragraph">
<p>See: <a href="https://marketplace.visualstudio.com/items?itemName=jebbs.plantuml" class="bare">marketplace.visualstudio.com/items?itemName=jebbs.plantuml</a></p>
</div>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_antora">Antora</h3>
<div class="paragraph">
<p>See: <a href="https://antora.org/" class="bare">antora.org/</a></p>
</div>
<div class="paragraph">
<p>TBD</p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_releases">Releases</h2>
<div class="sectionbody">
<div class="paragraph">
<p><a href="https://cwiki.apache.org/confluence/x/DRwIB">How to Release Apache Fineract</a> documents the process how we make the source code that is available here in this Git repository into a binary release tar.gz available on <a href="http://fineract.apache.org" class="bare">fineract.apache.org</a>.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnIHN0YW5kYWxvbmU9J25vJz8+PHN2ZyBjb250ZW50U2NyaXB0VHlwZT0nYXBwbGljYXRpb24vZWNtYXNjcmlwdCcgY29udGVudFN0eWxlVHlwZT0ndGV4dC9jc3MnIGhlaWdodD0nMTM0cHgnIHByZXNlcnZlQXNwZWN0UmF0aW89J25vbmUnIHN0eWxlPSd3aWR0aDo0MjRweDtoZWlnaHQ6MTM0cHg7YmFja2dyb3VuZDojRkZGRkZGOycgdmVyc2lvbj0nMS4xJyB2aWV3Qm94PScwIDAgNDI0IDEzNCcgd2lkdGg9JzQyNHB4JyB4bWxuczp4bGluaz0naHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluaycgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB6b29tQW5kUGFuPSdtYWduaWZ5Jz48ZGVmcy8+PGc+PGxpbmUgc3R5bGU9J3N0cm9rZTojQzBDMEMwO3N0cm9rZS13aWR0aDoxLjA7JyB4MT0nMCcgeDI9JzAnIHkxPScwJyB5Mj0nMTE2LjgyODEnLz48bGluZSBzdHlsZT0nc3Ryb2tlOiNDMEMwQzA7c3Ryb2tlLXdpZHRoOjEuMDsnIHgxPScxNicgeDI9JzE2JyB5MT0nMCcgeTI9JzExNi44MjgxJy8+PGxpbmUgc3R5bGU9J3N0cm9rZTojQzBDMEMwO3N0cm9rZS13aWR0aDoxLjA7JyB4MT0nMzInIHgyPSczMicgeTE9JzAnIHkyPScxMTYuODI4MScvPjxsaW5lIHN0eWxlPSdzdHJva2U6I0MwQzBDMDtzdHJva2Utd2lkdGg6MS4wOycgeDE9JzQ4JyB4Mj0nNDgnIHkxPScwJyB5Mj0nMTE2LjgyODEnLz48bGluZSBzdHlsZT0nc3Ryb2tlOiNDMEMwQzA7c3Ryb2tlLXdpZHRoOjEuMDsnIHgxPSc2NCcgeDI9JzY0JyB5MT0nMCcgeTI9JzExNi44MjgxJy8+PGxpbmUgc3R5bGU9J3N0cm9rZTojQzBDMEMwO3N0cm9rZS13aWR0aDoxLjA7JyB4MT0nODAnIHgyPSc4MCcgeTE9JzAnIHkyPScxMTYuODI4MScvPjxsaW5lIHN0eWxlPSdzdHJva2U6I0MwQzBDMDtzdHJva2Utd2lkdGg6MS4wOycgeDE9Jzk2JyB4Mj0nOTYnIHkxPScwJyB5Mj0nMTE2LjgyODEnLz48bGluZSBzdHlsZT0nc3Ryb2tlOiNDMEMwQzA7c3Ryb2tlLXdpZHRoOjEuMDsnIHgxPScxMTInIHgyPScxMTInIHkxPScwJyB5Mj0nMTE2LjgyODEnLz48bGluZSBzdHlsZT0nc3Ryb2tlOiNDMEMwQzA7c3Ryb2tlLXdpZHRoOjEuMDsnIHgxPScxMjgnIHgyPScxMjgnIHkxPScwJyB5Mj0nMTE2LjgyODEnLz48bGluZSBzdHlsZT0nc3Ryb2tlOiNDMEMwQzA7c3Ryb2tlLXdpZHRoOjEuMDsnIHgxPScxNDQnIHgyPScxNDQnIHkxPScwJyB5Mj0nMTE2LjgyODEnLz48bGluZSBzdHlsZT0nc3Ryb2tlOiNDMEMwQzA7c3Ryb2tlLXdpZHRoOjEuMDsnIHgxPScxNjAnIHgyPScxNjAnIHkxPScwJyB5Mj0nMTE2LjgyODEnLz48bGluZSBzdHlsZT0nc3Ryb2tlOiNDMEMwQzA7c3Ryb2tlLXdpZHRoOjEuMDsnIHgxPScxNzYnIHgyPScxNzYnIHkxPScwJyB5Mj0nMTE2LjgyODEnLz48bGluZSBzdHlsZT0nc3Ryb2tlOiNDMEMwQzA7c3Ryb2tlLXdpZHRoOjEuMDsnIHgxPScxOTInIHgyPScxOTInIHkxPScwJyB5Mj0nMTE2LjgyODEnLz48bGluZSBzdHlsZT0nc3Ryb2tlOiNDMEMwQzA7c3Ryb2tlLXdpZHRoOjEuMDsnIHgxPScyMDgnIHgyPScyMDgnIHkxPScwJyB5Mj0nMTE2LjgyODEnLz48bGluZSBzdHlsZT0nc3Ryb2tlOiNDMEMwQzA7c3Ryb2tlLXdpZHRoOjEuMDsnIHgxPScyMjQnIHgyPScyMjQnIHkxPScwJyB5Mj0nMTE2LjgyODEnLz48bGluZSBzdHlsZT0nc3Ryb2tlOiNDMEMwQzA7c3Ryb2tlLXdpZHRoOjEuMDsnIHgxPScyNDAnIHgyPScyNDAnIHkxPScwJyB5Mj0nMTE2LjgyODEnLz48bGluZSBzdHlsZT0nc3Ryb2tlOiNDMEMwQzA7c3Ryb2tlLXdpZHRoOjEuMDsnIHgxPScyNTYnIHgyPScyNTYnIHkxPScwJyB5Mj0nMTE2LjgyODEnLz48bGluZSBzdHlsZT0nc3Ryb2tlOiNDMEMwQzA7c3Ryb2tlLXdpZHRoOjEuMDsnIHgxPScyNzInIHgyPScyNzInIHkxPScwJyB5Mj0nMTE2LjgyODEnLz48dGV4dCBmaWxsPScjMDAwMDAwJyBmb250LWZhbWlseT0nU2VyaWYnIGZvbnQtc2l6ZT0nMTAnIGxlbmd0aEFkanVzdD0nc3BhY2luZycgdGV4dExlbmd0aD0nNicgeD0nNScgeT0nOS4yODIyJz4xPC90ZXh0Pjx0ZXh0IGZpbGw9JyMwMDAwMDAnIGZvbnQtZmFtaWx5PSdTZXJpZicgZm9udC1zaXplPScxMCcgbGVuZ3RoQWRqdXN0PSdzcGFjaW5nJyB0ZXh0TGVuZ3RoPSc2JyB4PScyMScgeT0nOS4yODIyJz4yPC90ZXh0Pjx0ZXh0IGZpbGw9JyMwMDAwMDAnIGZvbnQtZmFtaWx5PSdTZXJpZicgZm9udC1zaXplPScxMCcgbGVuZ3RoQWRqdXN0PSdzcGFjaW5nJyB0ZXh0TGVuZ3RoPSc2JyB4PSczNycgeT0nOS4yODIyJz4zPC90ZXh0Pjx0ZXh0IGZpbGw9JyMwMDAwMDAnIGZvbnQtZmFtaWx5PSdTZXJpZicgZm9udC1zaXplPScxMCcgbGVuZ3RoQWRqdXN0PSdzcGFjaW5nJyB0ZXh0TGVuZ3RoPSc2JyB4PSc1MycgeT0nOS4yODIyJz40PC90ZXh0Pjx0ZXh0IGZpbGw9JyMwMDAwMDAnIGZvbnQtZmFtaWx5PSdTZXJpZicgZm9udC1zaXplPScxMCcgbGVuZ3RoQWRqdXN0PSdzcGFjaW5nJyB0ZXh0TGVuZ3RoPSc2JyB4PSc2OScgeT0nOS4yODIyJz41PC90ZXh0Pjx0ZXh0IGZpbGw9JyMwMDAwMDAnIGZvbnQtZmFtaWx5PSdTZXJpZicgZm9udC1zaXplPScxMCcgbGVuZ3RoQWRqdXN0PSdzcGFjaW5nJyB0ZXh0TGVuZ3RoPSc2JyB4PSc4NScgeT0nOS4yODIyJz42PC90ZXh0Pjx0ZXh0IGZpbGw9JyMwMDAwMDAnIGZvbnQtZmFtaWx5PSdTZXJpZicgZm9udC1zaXplPScxMCcgbGVuZ3RoQWRqdXN0PSdzcGFjaW5nJyB0ZXh0TGVuZ3RoPSc2JyB4PScxMDEnIHk9JzkuMjgyMic+NzwvdGV4dD48dGV4dCBmaWxsPScjMDAwMDAwJyBmb250LWZhbWlseT0nU2VyaWYnIGZvbnQtc2l6ZT0nMTAnIGxlbmd0aEFkanVzdD0nc3BhY2luZycgdGV4dExlbmd0aD0nNicgeD0nMTE3JyB5PSc5LjI4MjInPjg8L3RleHQ+PHRleHQgZmlsbD0nIzAwMDAwMCcgZm9udC1mYW1pbHk9J1NlcmlmJyBmb250LXNpemU9JzEwJyBsZW5ndGhBZGp1c3Q9J3NwYWNpbmcnIHRleHRMZW5ndGg9JzYnIHg9JzEzMycgeT0nOS4yODIyJz45PC90ZXh0Pjx0ZXh0IGZpbGw9JyMwMDAwMDAnIGZvbnQtZmFtaWx5PSdTZXJpZicgZm9udC1zaXplPScxMCcgbGVuZ3RoQWRqdXN0PSdzcGFjaW5nJyB0ZXh0TGVuZ3RoPScxMicgeD0nMTQ2JyB5PSc5LjI4MjInPjEwPC90ZXh0Pjx0ZXh0IGZpbGw9JyMwMDAwMDAnIGZvbnQtZmFtaWx5PSdTZXJpZicgZm9udC1zaXplPScxMCcgbGVuZ3RoQWRqdXN0PSdzcGFjaW5nJyB0ZXh0TGVuZ3RoPScxMicgeD0nMTYyJyB5PSc5LjI4MjInPjExPC90ZXh0Pjx0ZXh0IGZpbGw9JyMwMDAwMDAnIGZvbnQtZmFtaWx5PSdTZXJpZicgZm9udC1zaXplPScxMCcgbGVuZ3RoQWRqdXN0PSdzcGFjaW5nJyB0ZXh0TGVuZ3RoPScxMicgeD0nMTc4JyB5PSc5LjI4MjInPjEyPC90ZXh0Pjx0ZXh0IGZpbGw9JyMwMDAwMDAnIGZvbnQtZmFtaWx5PSdTZXJpZicgZm9udC1zaXplPScxMCcgbGVuZ3RoQWRqdXN0PSdzcGFjaW5nJyB0ZXh0TGVuZ3RoPScxMicgeD0nMTk0JyB5PSc5LjI4MjInPjEzPC90ZXh0Pjx0ZXh0IGZpbGw9JyMwMDAwMDAnIGZvbnQtZmFtaWx5PSdTZXJpZicgZm9udC1zaXplPScxMCcgbGVuZ3RoQWRqdXN0PSdzcGFjaW5nJyB0ZXh0TGVuZ3RoPScxMicgeD0nMjEwJyB5PSc5LjI4MjInPjE0PC90ZXh0Pjx0ZXh0IGZpbGw9JyMwMDAwMDAnIGZvbnQtZmFtaWx5PSdTZXJpZicgZm9udC1zaXplPScxMCcgbGVuZ3RoQWRqdXN0PSdzcGFjaW5nJyB0ZXh0TGVuZ3RoPScxMicgeD0nMjI2JyB5PSc5LjI4MjInPjE1PC90ZXh0Pjx0ZXh0IGZpbGw9JyMwMDAwMDAnIGZvbnQtZmFtaWx5PSdTZXJpZicgZm9udC1zaXplPScxMCcgbGVuZ3RoQWRqdXN0PSdzcGFjaW5nJyB0ZXh0TGVuZ3RoPScxMicgeD0nMjQyJyB5PSc5LjI4MjInPjE2PC90ZXh0Pjx0ZXh0IGZpbGw9JyMwMDAwMDAnIGZvbnQtZmFtaWx5PSdTZXJpZicgZm9udC1zaXplPScxMCcgbGVuZ3RoQWRqdXN0PSdzcGFjaW5nJyB0ZXh0TGVuZ3RoPScxMicgeD0nMjU4JyB5PSc5LjI4MjInPjE3PC90ZXh0PjxsaW5lIHN0eWxlPSdzdHJva2U6I0MwQzBDMDtzdHJva2Utd2lkdGg6MS4wOycgeDE9JzAnIHgyPScyNzInIHkxPScwJyB5Mj0nMCcvPjxsaW5lIHN0eWxlPSdzdHJva2U6I0MwQzBDMDtzdHJva2Utd2lkdGg6MS4wOycgeDE9JzAnIHgyPScyNzInIHkxPScxMycgeTI9JzEzJy8+PGxpbmUgc3R5bGU9J3N0cm9rZTojQTgwMDM2O3N0cm9rZS13aWR0aDoxLjU7JyB4MT0nNycgeDI9JzcnIHkxPSczMC44MDQ3JyB5Mj0nNDEuMjA3Jy8+PGxpbmUgc3R5bGU9J3N0cm9rZTojQTgwMDM2O3N0cm9rZS13aWR0aDoxLjU7JyB4MT0nNycgeDI9JzE1JyB5MT0nNDEuMjA3JyB5Mj0nNDEuMjA3Jy8+PHBvbHlnb24gZmlsbD0nI0E4MDAzNicgcG9pbnRzPScxMSwzNy4yMDcsMTEsNDEuMjA3LDExLDQ1LjIwNywxNSw0MS4yMDcnIHN0eWxlPSdzdHJva2U6I0E4MDAzNjtzdHJva2Utd2lkdGg6MS41OycvPjxsaW5lIHN0eWxlPSdzdHJva2U6I0E4MDAzNjtzdHJva2Utd2lkdGg6MS41OycgeDE9JzExOScgeDI9JzExOScgeTE9JzQ3LjYwOTQnIHkyPSc1OC4wMTE3Jy8+PGxpbmUgc3R5bGU9J3N0cm9rZTojQTgwMDM2O3N0cm9rZS13aWR0aDoxLjU7JyB4MT0nMTE5JyB4Mj0nMTI3JyB5MT0nNTguMDExNycgeTI9JzU4LjAxMTcnLz48cG9seWdvbiBmaWxsPScjQTgwMDM2JyBwb2ludHM9JzEyMyw1NC4wMTE3LDEyMyw1OC4wMTE3LDEyMyw2Mi4wMTE3LDEyNyw1OC4wMTE3JyBzdHlsZT0nc3Ryb2tlOiNBODAwMzY7c3Ryb2tlLXdpZHRoOjEuNTsnLz48bGluZSBzdHlsZT0nc3Ryb2tlOiNBODAwMzY7c3Ryb2tlLXdpZHRoOjEuNTsnIHgxPScxNTEnIHgyPScxNTEnIHkxPSc2NC40MTQxJyB5Mj0nNzQuODE2NCcvPjxsaW5lIHN0eWxlPSdzdHJva2U6I0E4MDAzNjtzdHJva2Utd2lkdGg6MS41OycgeDE9JzE1MScgeDI9JzE1OScgeTE9Jzc0LjgxNjQnIHkyPSc3NC44MTY0Jy8+PHBvbHlnb24gZmlsbD0nI0E4MDAzNicgcG9pbnRzPScxNTUsNzAuODE2NCwxNTUsNzQuODE2NCwxNTUsNzguODE2NCwxNTksNzQuODE2NCcgc3R5bGU9J3N0cm9rZTojQTgwMDM2O3N0cm9rZS13aWR0aDoxLjU7Jy8+PGxpbmUgc3R5bGU9J3N0cm9rZTojQTgwMDM2O3N0cm9rZS13aWR0aDoxLjU7JyB4MT0nMTk5JyB4Mj0nMTk5JyB5MT0nODEuMjE4OCcgeTI9JzkxLjYyMTEnLz48bGluZSBzdHlsZT0nc3Ryb2tlOiNBODAwMzY7c3Ryb2tlLXdpZHRoOjEuNTsnIHgxPScxOTknIHgyPScyMDcnIHkxPSc5MS42MjExJyB5Mj0nOTEuNjIxMScvPjxwb2x5Z29uIGZpbGw9JyNBODAwMzYnIHBvaW50cz0nMjAzLDg3LjYyMTEsMjAzLDkxLjYyMTEsMjAzLDk1LjYyMTEsMjA3LDkxLjYyMTEnIHN0eWxlPSdzdHJva2U6I0E4MDAzNjtzdHJva2Utd2lkdGg6MS41OycvPjxsaW5lIHN0eWxlPSdzdHJva2U6I0E4MDAzNjtzdHJva2Utd2lkdGg6MS41OycgeDE9JzIzMScgeDI9JzIzMScgeTE9Jzk4LjAyMzQnIHkyPScxMDguNDI1OCcvPjxsaW5lIHN0eWxlPSdzdHJva2U6I0E4MDAzNjtzdHJva2Utd2lkdGg6MS41OycgeDE9JzIzMScgeDI9JzIzOScgeTE9JzEwOC40MjU4JyB5Mj0nMTA4LjQyNTgnLz48cG9seWdvbiBmaWxsPScjQTgwMDM2JyBwb2ludHM9JzIzNSwxMDQuNDI1OCwyMzUsMTA4LjQyNTgsMjM1LDExMi40MjU4LDIzOSwxMDguNDI1OCcgc3R5bGU9J3N0cm9rZTojQTgwMDM2O3N0cm9rZS13aWR0aDoxLjU7Jy8+PHJlY3QgZmlsbD0nI0ZFRkVDRScgaGVpZ2h0PScxMi44MDQ3JyBzdHlsZT0nc3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEuMDsnIHdpZHRoPScxMicgeD0nMicgeT0nMTgnLz48bGluZSBzdHlsZT0nc3Ryb2tlOiNBODAwMzY7c3Ryb2tlLXdpZHRoOjEuMDsnIHgxPScyJyB4Mj0nMTQnIHkxPScxOCcgeTI9JzE4Jy8+PGxpbmUgc3R5bGU9J3N0cm9rZTojQTgwMDM2O3N0cm9rZS13aWR0aDoxLjA7JyB4MT0nMicgeDI9JzE0JyB5MT0nMzAuODA0NycgeTI9JzMwLjgwNDcnLz48bGluZSBzdHlsZT0nc3Ryb2tlOiNBODAwMzY7c3Ryb2tlLXdpZHRoOjEuMDsnIHgxPScyJyB4Mj0nMicgeTE9JzE4JyB5Mj0nMzAuODA0NycvPjxsaW5lIHN0eWxlPSdzdHJva2U6I0E4MDAzNjtzdHJva2Utd2lkdGg6MS4wOycgeDE9JzE0JyB4Mj0nMTQnIHkxPScxOCcgeTI9JzMwLjgwNDcnLz48cmVjdCBmaWxsPScjRkVGRUNFJyBoZWlnaHQ9JzEyLjgwNDcnIHN0eWxlPSdzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS4wOycgd2lkdGg9JzEwOCcgeD0nMTgnIHk9JzM0LjgwNDcnLz48bGluZSBzdHlsZT0nc3Ryb2tlOiNBODAwMzY7c3Ryb2tlLXdpZHRoOjEuMDsnIHgxPScxOCcgeDI9JzEyNicgeTE9JzM0LjgwNDcnIHkyPSczNC44MDQ3Jy8+PGxpbmUgc3R5bGU9J3N0cm9rZTojQTgwMDM2O3N0cm9rZS13aWR0aDoxLjA7JyB4MT0nMTgnIHgyPScxMjYnIHkxPSc0Ny42MDk0JyB5Mj0nNDcuNjA5NCcvPjxsaW5lIHN0eWxlPSdzdHJva2U6I0E4MDAzNjtzdHJva2Utd2lkdGg6MS4wOycgeDE9JzE4JyB4Mj0nMTgnIHkxPSczNC44MDQ3JyB5Mj0nNDcuNjA5NCcvPjxsaW5lIHN0eWxlPSdzdHJva2U6I0E4MDAzNjtzdHJva2Utd2lkdGg6MS4wOycgeDE9JzEyNicgeDI9JzEyNicgeTE9JzM0LjgwNDcnIHkyPSc0Ny42MDk0Jy8+PHJlY3QgZmlsbD0nI0ZFRkVDRScgaGVpZ2h0PScxMi44MDQ3JyBzdHlsZT0nc3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEuMDsnIHdpZHRoPScyOCcgeD0nMTMwJyB5PSc1MS42MDk0Jy8+PGxpbmUgc3R5bGU9J3N0cm9rZTojQTgwMDM2O3N0cm9rZS13aWR0aDoxLjA7JyB4MT0nMTMwJyB4Mj0nMTU4JyB5MT0nNTEuNjA5NCcgeTI9JzUxLjYwOTQnLz48bGluZSBzdHlsZT0nc3Ryb2tlOiNBODAwMzY7c3Ryb2tlLXdpZHRoOjEuMDsnIHgxPScxMzAnIHgyPScxNTgnIHkxPSc2NC40MTQxJyB5Mj0nNjQuNDE0MScvPjxsaW5lIHN0eWxlPSdzdHJva2U6I0E4MDAzNjtzdHJva2Utd2lkdGg6MS4wOycgeDE9JzEzMCcgeDI9JzEzMCcgeTE9JzUxLjYwOTQnIHkyPSc2NC40MTQxJy8+PGxpbmUgc3R5bGU9J3N0cm9rZTojQTgwMDM2O3N0cm9rZS13aWR0aDoxLjA7JyB4MT0nMTU4JyB4Mj0nMTU4JyB5MT0nNTEuNjA5NCcgeTI9JzY0LjQxNDEnLz48cmVjdCBmaWxsPScjRkVGRUNFJyBoZWlnaHQ9JzEyLjgwNDcnIHN0eWxlPSdzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS4wOycgd2lkdGg9JzQ0JyB4PScxNjInIHk9JzY4LjQxNDEnLz48bGluZSBzdHlsZT0nc3Ryb2tlOiNBODAwMzY7c3Ryb2tlLXdpZHRoOjEuMDsnIHgxPScxNjInIHgyPScyMDYnIHkxPSc2OC40MTQxJyB5Mj0nNjguNDE0MScvPjxsaW5lIHN0eWxlPSdzdHJva2U6I0E4MDAzNjtzdHJva2Utd2lkdGg6MS4wOycgeDE9JzE2MicgeDI9JzIwNicgeTE9JzgxLjIxODgnIHkyPSc4MS4yMTg4Jy8+PGxpbmUgc3R5bGU9J3N0cm9rZTojQTgwMDM2O3N0cm9rZS13aWR0aDoxLjA7JyB4MT0nMTYyJyB4Mj0nMTYyJyB5MT0nNjguNDE0MScgeTI9JzgxLjIxODgnLz48bGluZSBzdHlsZT0nc3Ryb2tlOiNBODAwMzY7c3Ryb2tlLXdpZHRoOjEuMDsnIHgxPScyMDYnIHgyPScyMDYnIHkxPSc2OC40MTQxJyB5Mj0nODEuMjE4OCcvPjxyZWN0IGZpbGw9JyNGRUZFQ0UnIGhlaWdodD0nMTIuODA0Nycgc3R5bGU9J3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxLjA7JyB3aWR0aD0nMjgnIHg9JzIxMCcgeT0nODUuMjE4OCcvPjxsaW5lIHN0eWxlPSdzdHJva2U6I0E4MDAzNjtzdHJva2Utd2lkdGg6MS4wOycgeDE9JzIxMCcgeDI9JzIzOCcgeTE9Jzg1LjIxODgnIHkyPSc4NS4yMTg4Jy8+PGxpbmUgc3R5bGU9J3N0cm9rZTojQTgwMDM2O3N0cm9rZS13aWR0aDoxLjA7JyB4MT0nMjEwJyB4Mj0nMjM4JyB5MT0nOTguMDIzNCcgeTI9Jzk4LjAyMzQnLz48bGluZSBzdHlsZT0nc3Ryb2tlOiNBODAwMzY7c3Ryb2tlLXdpZHRoOjEuMDsnIHgxPScyMTAnIHgyPScyMTAnIHkxPSc4NS4yMTg4JyB5Mj0nOTguMDIzNCcvPjxsaW5lIHN0eWxlPSdzdHJva2U6I0E4MDAzNjtzdHJva2Utd2lkdGg6MS4wOycgeDE9JzIzOCcgeDI9JzIzOCcgeTE9Jzg1LjIxODgnIHkyPSc5OC4wMjM0Jy8+PHJlY3QgZmlsbD0nI0ZFRkVDRScgaGVpZ2h0PScxMi44MDQ3JyBzdHlsZT0nc3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEuMDsnIHdpZHRoPScyOCcgeD0nMjQyJyB5PScxMDIuMDIzNCcvPjxsaW5lIHN0eWxlPSdzdHJva2U6I0E4MDAzNjtzdHJva2Utd2lkdGg6MS4wOycgeDE9JzI0MicgeDI9JzI3MCcgeTE9JzEwMi4wMjM0JyB5Mj0nMTAyLjAyMzQnLz48bGluZSBzdHlsZT0nc3Ryb2tlOiNBODAwMzY7c3Ryb2tlLXdpZHRoOjEuMDsnIHgxPScyNDInIHgyPScyNzAnIHkxPScxMTQuODI4MScgeTI9JzExNC44MjgxJy8+PGxpbmUgc3R5bGU9J3N0cm9rZTojQTgwMDM2O3N0cm9rZS13aWR0aDoxLjA7JyB4MT0nMjQyJyB4Mj0nMjQyJyB5MT0nMTAyLjAyMzQnIHkyPScxMTQuODI4MScvPjxsaW5lIHN0eWxlPSdzdHJva2U6I0E4MDAzNjtzdHJva2Utd2lkdGg6MS4wOycgeDE9JzI3MCcgeDI9JzI3MCcgeTE9JzEwMi4wMjM0JyB5Mj0nMTE0LjgyODEnLz48dGV4dCBmaWxsPScjMDAwMDAwJyBmb250LWZhbWlseT0nc2Fucy1zZXJpZicgZm9udC1zaXplPScxMScgbGVuZ3RoQWRqdXN0PSdzcGFjaW5nJyB0ZXh0TGVuZ3RoPSc4OScgeD0nMTgnIHk9JzI4LjIxMDQnPkhlYWRzIHVwIGVtYWlsPC90ZXh0Pjx0ZXh0IGZpbGw9JyMwMDAwMDAnIGZvbnQtZmFtaWx5PSdzYW5zLXNlcmlmJyBmb250LXNpemU9JzExJyBsZW5ndGhBZGp1c3Q9J3NwYWNpbmcnIHRleHRMZW5ndGg9JzEyMCcgeD0nMTMwJyB5PSc0NS4wMTUxJz5PcGVuIHJlbGVhc2UgYnJhbmNoPC90ZXh0Pjx0ZXh0IGZpbGw9JyMwMDAwMDAnIGZvbnQtZmFtaWx5PSdzYW5zLXNlcmlmJyBmb250LXNpemU9JzExJyBsZW5ndGhBZGp1c3Q9J3NwYWNpbmcnIHRleHRMZW5ndGg9JzE3OScgeD0nMTYyJyB5PSc2MS44MTk4Jz5QcmVwYXJlIGRpc3RyaWJ1dGlvbiBmb3Igc3RhZ2luZzwvdGV4dD48dGV4dCBmaWxsPScjMDAwMDAwJyBmb250LWZhbWlseT0nc2Fucy1zZXJpZicgZm9udC1zaXplPScxMScgbGVuZ3RoQWRqdXN0PSdzcGFjaW5nJyB0ZXh0TGVuZ3RoPScxNzcnIHg9JzIxMCcgeT0nNzguNjI0NSc+Vm90ZSBmb3IgZGlzdHJpYnV0aW9uIG9uIHN0YWdpbmc8L3RleHQ+PHRleHQgZmlsbD0nIzAwMDAwMCcgZm9udC1mYW1pbHk9J3NhbnMtc2VyaWYnIGZvbnQtc2l6ZT0nMTEnIGxlbmd0aEFkanVzdD0nc3BhY2luZycgdGV4dExlbmd0aD0nMTgwJyB4PScyNDInIHk9Jzk1LjQyOTInPlByZXBhcmUgZGlzdHJpYnV0aW9uIGZvciByZWxlYXNlPC90ZXh0Pjx0ZXh0IGZpbGw9JyMwMDAwMDAnIGZvbnQtZmFtaWx5PSdzYW5zLXNlcmlmJyBmb250LXNpemU9JzExJyBsZW5ndGhBZGp1c3Q9J3NwYWNpbmcnIHRleHRMZW5ndGg9JzEwMicgeD0nMjc0JyB5PScxMTIuMjMzOSc+QW5ub3VuY2UgcmVsZWFzZTwvdGV4dD48bGluZSBzdHlsZT0nc3Ryb2tlOiNDMEMwQzA7c3Ryb2tlLXdpZHRoOjEuMDsnIHgxPScwJyB4Mj0nMCcgeTE9JzExNi44MjgxJyB5Mj0nMTMyLjgyODEnLz48bGluZSBzdHlsZT0nc3Ryb2tlOiNDMEMwQzA7c3Ryb2tlLXdpZHRoOjEuMDsnIHgxPScxNicgeDI9JzE2JyB5MT0nMTE2LjgyODEnIHkyPScxMzIuODI4MScvPjxsaW5lIHN0eWxlPSdzdHJva2U6I0MwQzBDMDtzdHJva2Utd2lkdGg6MS4wOycgeDE9JzMyJyB4Mj0nMzInIHkxPScxMTYuODI4MScgeTI9JzEzMi44MjgxJy8+PGxpbmUgc3R5bGU9J3N0cm9rZTojQzBDMEMwO3N0cm9rZS13aWR0aDoxLjA7JyB4MT0nNDgnIHgyPSc0OCcgeTE9JzExNi44MjgxJyB5Mj0nMTMyLjgyODEnLz48bGluZSBzdHlsZT0nc3Ryb2tlOiNDMEMwQzA7c3Ryb2tlLXdpZHRoOjEuMDsnIHgxPSc2NCcgeDI9JzY0JyB5MT0nMTE2LjgyODEnIHkyPScxMzIuODI4MScvPjxsaW5lIHN0eWxlPSdzdHJva2U6I0MwQzBDMDtzdHJva2Utd2lkdGg6MS4wOycgeDE9JzgwJyB4Mj0nODAnIHkxPScxMTYuODI4MScgeTI9JzEzMi44MjgxJy8+PGxpbmUgc3R5bGU9J3N0cm9rZTojQzBDMEMwO3N0cm9rZS13aWR0aDoxLjA7JyB4MT0nOTYnIHgyPSc5NicgeTE9JzExNi44MjgxJyB5Mj0nMTMyLjgyODEnLz48bGluZSBzdHlsZT0nc3Ryb2tlOiNDMEMwQzA7c3Ryb2tlLXdpZHRoOjEuMDsnIHgxPScxMTInIHgyPScxMTInIHkxPScxMTYuODI4MScgeTI9JzEzMi44MjgxJy8+PGxpbmUgc3R5bGU9J3N0cm9rZTojQzBDMEMwO3N0cm9rZS13aWR0aDoxLjA7JyB4MT0nMTI4JyB4Mj0nMTI4JyB5MT0nMTE2LjgyODEnIHkyPScxMzIuODI4MScvPjxsaW5lIHN0eWxlPSdzdHJva2U6I0MwQzBDMDtzdHJva2Utd2lkdGg6MS4wOycgeDE9JzE0NCcgeDI9JzE0NCcgeTE9JzExNi44MjgxJyB5Mj0nMTMyLjgyODEnLz48bGluZSBzdHlsZT0nc3Ryb2tlOiNDMEMwQzA7c3Ryb2tlLXdpZHRoOjEuMDsnIHgxPScxNjAnIHgyPScxNjAnIHkxPScxMTYuODI4MScgeTI9JzEzMi44MjgxJy8+PGxpbmUgc3R5bGU9J3N0cm9rZTojQzBDMEMwO3N0cm9rZS13aWR0aDoxLjA7JyB4MT0nMTc2JyB4Mj0nMTc2JyB5MT0nMTE2LjgyODEnIHkyPScxMzIuODI4MScvPjxsaW5lIHN0eWxlPSdzdHJva2U6I0MwQzBDMDtzdHJva2Utd2lkdGg6MS4wOycgeDE9JzE5MicgeDI9JzE5MicgeTE9JzExNi44MjgxJyB5Mj0nMTMyLjgyODEnLz48bGluZSBzdHlsZT0nc3Ryb2tlOiNDMEMwQzA7c3Ryb2tlLXdpZHRoOjEuMDsnIHgxPScyMDgnIHgyPScyMDgnIHkxPScxMTYuODI4MScgeTI9JzEzMi44MjgxJy8+PGxpbmUgc3R5bGU9J3N0cm9rZTojQzBDMEMwO3N0cm9rZS13aWR0aDoxLjA7JyB4MT0nMjI0JyB4Mj0nMjI0JyB5MT0nMTE2LjgyODEnIHkyPScxMzIuODI4MScvPjxsaW5lIHN0eWxlPSdzdHJva2U6I0MwQzBDMDtzdHJva2Utd2lkdGg6MS4wOycgeDE9JzI0MCcgeDI9JzI0MCcgeTE9JzExNi44MjgxJyB5Mj0nMTMyLjgyODEnLz48bGluZSBzdHlsZT0nc3Ryb2tlOiNDMEMwQzA7c3Ryb2tlLXdpZHRoOjEuMDsnIHgxPScyNTYnIHgyPScyNTYnIHkxPScxMTYuODI4MScgeTI9JzEzMi44MjgxJy8+PGxpbmUgc3R5bGU9J3N0cm9rZTojQzBDMEMwO3N0cm9rZS13aWR0aDoxLjA7JyB4MT0nMjcyJyB4Mj0nMjcyJyB5MT0nMTE2LjgyODEnIHkyPScxMzIuODI4MScvPjx0ZXh0IGZpbGw9JyMwMDAwMDAnIGZvbnQtZmFtaWx5PSdTZXJpZicgZm9udC1zaXplPScxMCcgbGVuZ3RoQWRqdXN0PSdzcGFjaW5nJyB0ZXh0TGVuZ3RoPSc2JyB4PSc1JyB5PScxMjkuMTEwNCc+MTwvdGV4dD48dGV4dCBmaWxsPScjMDAwMDAwJyBmb250LWZhbWlseT0nU2VyaWYnIGZvbnQtc2l6ZT0nMTAnIGxlbmd0aEFkanVzdD0nc3BhY2luZycgdGV4dExlbmd0aD0nNicgeD0nMjEnIHk9JzEyOS4xMTA0Jz4yPC90ZXh0Pjx0ZXh0IGZpbGw9JyMwMDAwMDAnIGZvbnQtZmFtaWx5PSdTZXJpZicgZm9udC1zaXplPScxMCcgbGVuZ3RoQWRqdXN0PSdzcGFjaW5nJyB0ZXh0TGVuZ3RoPSc2JyB4PSczNycgeT0nMTI5LjExMDQnPjM8L3RleHQ+PHRleHQgZmlsbD0nIzAwMDAwMCcgZm9udC1mYW1pbHk9J1NlcmlmJyBmb250LXNpemU9JzEwJyBsZW5ndGhBZGp1c3Q9J3NwYWNpbmcnIHRleHRMZW5ndGg9JzYnIHg9JzUzJyB5PScxMjkuMTEwNCc+NDwvdGV4dD48dGV4dCBmaWxsPScjMDAwMDAwJyBmb250LWZhbWlseT0nU2VyaWYnIGZvbnQtc2l6ZT0nMTAnIGxlbmd0aEFkanVzdD0nc3BhY2luZycgdGV4dExlbmd0aD0nNicgeD0nNjknIHk9JzEyOS4xMTA0Jz41PC90ZXh0Pjx0ZXh0IGZpbGw9JyMwMDAwMDAnIGZvbnQtZmFtaWx5PSdTZXJpZicgZm9udC1zaXplPScxMCcgbGVuZ3RoQWRqdXN0PSdzcGFjaW5nJyB0ZXh0TGVuZ3RoPSc2JyB4PSc4NScgeT0nMTI5LjExMDQnPjY8L3RleHQ+PHRleHQgZmlsbD0nIzAwMDAwMCcgZm9udC1mYW1pbHk9J1NlcmlmJyBmb250LXNpemU9JzEwJyBsZW5ndGhBZGp1c3Q9J3NwYWNpbmcnIHRleHRMZW5ndGg9JzYnIHg9JzEwMScgeT0nMTI5LjExMDQnPjc8L3RleHQ+PHRleHQgZmlsbD0nIzAwMDAwMCcgZm9udC1mYW1pbHk9J1NlcmlmJyBmb250LXNpemU9JzEwJyBsZW5ndGhBZGp1c3Q9J3NwYWNpbmcnIHRleHRMZW5ndGg9JzYnIHg9JzExNycgeT0nMTI5LjExMDQnPjg8L3RleHQ+PHRleHQgZmlsbD0nIzAwMDAwMCcgZm9udC1mYW1pbHk9J1NlcmlmJyBmb250LXNpemU9JzEwJyBsZW5ndGhBZGp1c3Q9J3NwYWNpbmcnIHRleHRMZW5ndGg9JzYnIHg9JzEzMycgeT0nMTI5LjExMDQnPjk8L3RleHQ+PHRleHQgZmlsbD0nIzAwMDAwMCcgZm9udC1mYW1pbHk9J1NlcmlmJyBmb250LXNpemU9JzEwJyBsZW5ndGhBZGp1c3Q9J3NwYWNpbmcnIHRleHRMZW5ndGg9JzEyJyB4PScxNDYnIHk9JzEyOS4xMTA0Jz4xMDwvdGV4dD48dGV4dCBmaWxsPScjMDAwMDAwJyBmb250LWZhbWlseT0nU2VyaWYnIGZvbnQtc2l6ZT0nMTAnIGxlbmd0aEFkanVzdD0nc3BhY2luZycgdGV4dExlbmd0aD0nMTInIHg9JzE2MicgeT0nMTI5LjExMDQnPjExPC90ZXh0Pjx0ZXh0IGZpbGw9JyMwMDAwMDAnIGZvbnQtZmFtaWx5PSdTZXJpZicgZm9udC1zaXplPScxMCcgbGVuZ3RoQWRqdXN0PSdzcGFjaW5nJyB0ZXh0TGVuZ3RoPScxMicgeD0nMTc4JyB5PScxMjkuMTEwNCc+MTI8L3RleHQ+PHRleHQgZmlsbD0nIzAwMDAwMCcgZm9udC1mYW1pbHk9J1NlcmlmJyBmb250LXNpemU9JzEwJyBsZW5ndGhBZGp1c3Q9J3NwYWNpbmcnIHRleHRMZW5ndGg9JzEyJyB4PScxOTQnIHk9JzEyOS4xMTA0Jz4xMzwvdGV4dD48dGV4dCBmaWxsPScjMDAwMDAwJyBmb250LWZhbWlseT0nU2VyaWYnIGZvbnQtc2l6ZT0nMTAnIGxlbmd0aEFkanVzdD0nc3BhY2luZycgdGV4dExlbmd0aD0nMTInIHg9JzIxMCcgeT0nMTI5LjExMDQnPjE0PC90ZXh0Pjx0ZXh0IGZpbGw9JyMwMDAwMDAnIGZvbnQtZmFtaWx5PSdTZXJpZicgZm9udC1zaXplPScxMCcgbGVuZ3RoQWRqdXN0PSdzcGFjaW5nJyB0ZXh0TGVuZ3RoPScxMicgeD0nMjI2JyB5PScxMjkuMTEwNCc+MTU8L3RleHQ+PHRleHQgZmlsbD0nIzAwMDAwMCcgZm9udC1mYW1pbHk9J1NlcmlmJyBmb250LXNpemU9JzEwJyBsZW5ndGhBZGp1c3Q9J3NwYWNpbmcnIHRleHRMZW5ndGg9JzEyJyB4PScyNDInIHk9JzEyOS4xMTA0Jz4xNjwvdGV4dD48dGV4dCBmaWxsPScjMDAwMDAwJyBmb250LWZhbWlseT0nU2VyaWYnIGZvbnQtc2l6ZT0nMTAnIGxlbmd0aEFkanVzdD0nc3BhY2luZycgdGV4dExlbmd0aD0nMTInIHg9JzI1OCcgeT0nMTI5LjExMDQnPjE3PC90ZXh0PjxsaW5lIHN0eWxlPSdzdHJva2U6I0MwQzBDMDtzdHJva2Utd2lkdGg6MS4wOycgeDE9JzAnIHgyPScyNzInIHkxPScxMTkuODI4MScgeTI9JzExOS44MjgxJy8+PC9nPjwvc3ZnPg==" alt="Diagram" width="424" height="134">
</div>
<div class="title">Figure 4. Release Schedule</div>
</div>
<div class="sect2">
<h3 id="_configuration">Configuration</h3>
<div class="paragraph">
<p>Before you can start using the Fineract release plugin to create releases you have to configure and setup a couple of things first.</p>
</div>
<div class="ulist">
<ul>
<li>
<p>All official communication concerning releases happens on the <a href="mailto:dev@fineract.apache.org">mailing list</a>. Every release manager needs to be a member of and engaging on the mailing list for credibility.</p>
</li>
<li>
<p>Make sure you have edit permissions on the <a href="https://cwiki.apache.org/confluence/display/FINERACT">Apache Confluence Wiki</a></p>
</li>
<li>
<p>You need full permissions on <a href="https://issues.apache.org/jira">Apache JIRA</a> to be able to move issues to the next release</p>
</li>
<li>
<p>Git committer privileges to be allowed to create tags and the release branch</p>
</li>
<li>
<p>Familiarity with building Fineract locally and creating release distributions is required</p>
</li>
<li>
<p>You need to be a member of the PMC to be able to upload release artifacts; this task can be delegated though</p>
</li>
<li>
<p>A general Familiarity with PGP/GPG is recommended (at least to setup your keypairs), but the release plugin does most of the heavy lifting</p>
</li>
<li>
<p>Make sure to read the release plugin documentation for troubleshooting</p>
</li>
</ul>
</div>
<div class="sect3">
<h4 id="_secrets">Secrets</h4>
<div class="paragraph">
<p>TBD</p>
</div>
<div class="sect4">
<h5 id="_infrastructure_team">Infrastructure Team</h5>
<div class="paragraph">
<p>A couple of secrets for third party services are automatically configured by the infrastructure team at The Apache Foundation for the Fineract Github account. At the moment this includes environment variables for:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Github token (e. g. to publish Github Pages, use the Github API in Github Actions)</p>
</li>
<li>
<p>Docker Hub token (to publish our Docker images)</p>
</li>
<li>
<p>Sonar Cloud token (for our code quality reports)</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>See also:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><a href="https://infra.apache.org/github-pages.html" class="bare">infra.apache.org/github-pages.html</a></p>
</li>
<li>
<p><a href="https://cwiki.apache.org/confluence/display/INFRA/Github+Actions+to+DockerHub" class="bare">cwiki.apache.org/confluence/display/INFRA/Github+Actions+to+DockerHub</a></p>
</li>
<li>
<p><a href="https://github.com/apache/jmeter-site-preview" class="bare">github.com/apache/jmeter-site-preview</a></p>
</li>
<li>
<p><a href="https://github.com/apache/fineract-site" class="bare">github.com/apache/fineract-site</a></p>
</li>
<li>
<p><a href="https://github.com/apache/systemds-website/blob/main/.asf.yaml" class="bare">github.com/apache/systemds-website/blob/main/.asf.yaml</a></p>
</li>
</ul>
</div>
</div>
<div class="sect4">
<h5 id="_lastpass">Lastpass</h5>
<div class="paragraph">
<p>It seems that Apache has some kind of org account or similar. Popped up a couple of times in the infrastructure documentation.</p>
</div>
<div class="paragraph">
<p>TBD</p>
</div>
</div>
<div class="sect4">
<h5 id="_1password">1Password</h5>
<div class="paragraph">
<p>Other Fineract development related secrets, e. g. for deployments of demo systems on Google Cloud, AWS etc. are managed in a team account at 1Password. At the moment the following committers are members of the 1Password team account:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><a href="mailto:edcable@apache.org">Ed Cable</a></p>
</li>
<li>
<p><a href="mailto:vorburger@apache.org">Michael Vorburger</a></p>
</li>
<li>
<p><a href="mailto:ptuomola@apache.org">Petri Tuomola</a></p>
</li>
<li>
<p><a href="mailto:arnold@apache.org">Arnold Galovics</a></p>
</li>
<li>
<p><a href="mailto:aleks@apache.org">Aleksandar Vidakovic</a></p>
</li>
</ul>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
If you need access or have any questions related to those secrets then please reach out to one of the team members.
</td>
</tr>
</table>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_gpg_2">GPG</h4>
<div class="paragraph">
<p>Generate GPG key pairs if you don&#8217;t already have them and publish them. Please use your Apache email address when creating your GPG keypair. If you already have configured GPG and associated your keypair with a non-Apache email address then please consider creating a separate one just for all things related to Fineract (or Apache in general).</p>
</div>
<div class="paragraph">
<p>Instructions:</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Check your GPG version:</p>
<div class="listingblock">
<div class="title">Input GPG version</div>
<div class="content">
<pre class="CodeRay highlight"><code data-lang="bash">gpg --version</code></pre>
</div>
</div>
<div class="listingblock">
<div class="title">Output GPG version</div>
<div class="content">
<pre class="CodeRay highlight"><code data-lang="bash">gpg (GnuPG) 2.2.27
libgcrypt 1.9.4
Copyright (C) 2021 Free Software Foundation, Inc.
License GNU GPL-3.0-or-later &lt;https://gnu.org/licenses/gpl.html&gt;
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Home: /home/aleks/.gnupg
Supported algorithms:
Pubkey: RSA, ELG, DSA, ECDH, ECDSA, EDDSA
Cipher: IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH,
CAMELLIA128, CAMELLIA192, CAMELLIA256
Hash: SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224
Compression: Uncompressed, ZIP, ZLIB, BZIP2</code></pre>
</div>
</div>
<div class="admonitionblock caution">
<table>
<tr>
<td class="icon">
<i class="fa icon-caution" title="Caution"></i>
</td>
<td class="content">
The insecure hash algorithm SHA1 is still supported in version 2.2.27. SHA1 is obsolete and you don&#8217;t want to use it to generate your signature.
</td>
</tr>
</table>
</div>
</li>
<li>
<p>Generate your GPG key pair:</p>
<div class="listingblock">
<div class="title">Input generate GPG key pair</div>
<div class="content">
<pre class="CodeRay highlight"><code data-lang="bash">gpg --full-gen-key</code></pre>
</div>
</div>
<div class="listingblock">
<div class="title">Output generate GPG key pair (step 1: key type selection)</div>
<div class="content">
<pre class="CodeRay highlight"><code data-lang="bash">gpg (GnuPG) 2.2.27; Copyright (C) 2021 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Please select what kind of key you want:
(1) RSA and RSA (default)
(2) DSA and Elgamal
(3) DSA (sign only)
(4) RSA (sign only)
(14) Existing key from card
Your selection?</code></pre>
</div>
</div>
<div class="paragraph">
<p>There are four options. The default is to use RSA to create the key pair. Good enough for us.</p>
</div>
<div class="listingblock">
<div class="title">Output generate GPG key pair (step 2: key length selection)</div>
<div class="content">
<pre class="CodeRay highlight"><code data-lang="bash">RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048)</code></pre>
</div>
</div>
<div class="paragraph">
<p>The default key length is 2048 bits. 1024 is obsolete and a longer 4096 RSA key will not provide more security than 2048 RSA key. Use the default.</p>
</div>
<div class="listingblock">
<div class="title">Output generate GPG key pair (step 3: validity selection)</div>
<div class="content">
<pre class="CodeRay highlight"><code data-lang="bash">Requested keysize is 2048 bits
Please specify how long the key should be valid.
0 = key does not expire
&lt;n&gt; = key expires in n days
&lt;n&gt;w = key expires in n weeks
&lt;n&gt;m = key expires in n months
&lt;n&gt;y = key expires in n years
Key is valid for? (0)2y</code></pre>
</div>
</div>
<div class="paragraph">
<p>2 years for the validity of your keys should be fine. You can always update the expiration time later on.</p>
</div>
<div class="listingblock">
<div class="title">Output generate GPG key pair (step 4: confirmation)</div>
<div class="content">
<pre class="CodeRay highlight"><code data-lang="bash">Key expires at Sun 16 Apr 2024 08:10:24 PM UTC
Is this correct? (y/N)y</code></pre>
</div>
</div>
<div class="paragraph">
<p>Confirm if everything is correct.</p>
</div>
<div class="listingblock">
<div class="title">Output generate GPG key pair (step 5: provide user details)</div>
<div class="content">
<pre class="CodeRay highlight"><code data-lang="bash">GnuPG needs to construct a user ID to identify your key.
Real name: Aleksandar Vidakovic
Email address: aleks@apache.org
Comment:</code></pre>
</div>
</div>
<div class="paragraph">
<p>Provide your user details for the key. This is important because this information will be included in our key. It&#8217;s one way of indicating who is owner of this key. The email address is a unique identifier for a person. You can leave Comment blank.</p>
</div>
<div class="listingblock">
<div class="title">Output generate GPG key pair (step 6: user ID selection)</div>
<div class="content">
<pre class="CodeRay highlight"><code data-lang="bash">You selected this USER-ID:
&quot;Aleksandar Vidakovic &lt;aleks@apache.org&gt;&quot;
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O</code></pre>
</div>
</div>
<div class="paragraph">
<p>Select <code>Okay</code>.</p>
</div>
<div class="paragraph">
<p>After the selection of your user ID GPG will ask for a passphrase to protect your private key. Maybe time to open your password manager and generate a secure one and save it in your vault. Once you&#8217;ve confirmed your password GPG will start to generate your keys.</p>
</div>
<div class="admonitionblock caution">
<table>
<tr>
<td class="icon">
<i class="fa icon-caution" title="Caution"></i>
</td>
<td class="content">
Don&#8217;t lose your private key password. You won&#8217;t be able to unlock and use your private key without it.
</td>
</tr>
</table>
</div>
<div class="listingblock">
<div class="title">Output generate GPG key pair (step 7: gpg key pair generation)</div>
<div class="content">
<pre class="CodeRay highlight"><code data-lang="bash">We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.</code></pre>
</div>
</div>
<div class="paragraph">
<p>Generating the GPG keys will take a while.</p>
</div>
<div class="listingblock">
<div class="title">Output generate GPG key pair (step 8: gpg key pair finished)</div>
<div class="content">
<pre class="CodeRay highlight"><code data-lang="bash">gpg: key 7890ABCD marked as ultimately trusted <i class="conum" data-value="1"></i><b>(1)</b>
gpg: directory '/home/aleks/.gnupg/openpgp-revocs.d' created
gpg: revocation certificate stored as '/home/aleks/.gnupg/openpgp-revocs.d/ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890ABCD.rev' <i class="conum" data-value="2"></i><b>(2)</b>
public and secret key created and signed.
gpg: checking the trustdb
gpg: marginals needed: 3 completes needed: 1 trust model: PGP
gpg: depth: 0 valid: 1 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 1u
gpg: next trustdb check due at 2024-04-16
pub rsa2048/7890ABCD 2022-04-16 [S] [expires: 2024-04-16] <i class="conum" data-value="3"></i><b>(3)</b>
Key fingerprint = ABCD EFGH IJKL MNOP QRST UVWX YZ12 3456 7890 ABCD <i class="conum" data-value="4"></i><b>(4)</b>
uid [ultimate] Aleksandar Vidakovic &lt;aleks@apache.org&gt; <i class="conum" data-value="5"></i><b>(5)</b>
sub rsa2048/4FGHIJ56 2022-04-16 [] [expires: 2024-04-16]</code></pre>
</div>
</div>
<div class="colist arabic">
<table>
<tr>
<td><i class="conum" data-value="1"></i><b>1</b></td>
<td>GPG created a unique identifier in HEX format for your public key. When someone wants to download your public key, they can refer to it either with your email address or this HEX value.</td>
</tr>
<tr>
<td><i class="conum" data-value="2"></i><b>2</b></td>
<td>GPG created a revocation certificate and its directory. You should never share your private key. If your private key is compromised, you need to use your revocation certificate to revoke your key.</td>
</tr>
<tr>
<td><i class="conum" data-value="3"></i><b>3</b></td>
<td>The public key is 2048 bits using RSA algorithm and shows the expiration date of 16 Apr 2024. The public key ID <code>7890ABCD</code> matches the last 8 bits of key fingerprint.</td>
</tr>
<tr>
<td><i class="conum" data-value="4"></i><b>4</b></td>
<td>The key fingerprint (<code>ABCD EFGH IJKL MNOP QRST UVWX YZ12 3456 7890 ABCD</code>) is a hash of your public key.</td>
</tr>
<tr>
<td><i class="conum" data-value="5"></i><b>5</b></td>
<td>Your name and your email address are shown with information about the subkey.</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>Now you can find that there are two files created under ~/.gnupg/private-keys-v1.d/ directory. These two files are binary files with .key extension.</p>
</div>
</li>
<li>
<p>Export your public key:</p>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="bash">gpg --armor --export aleks@apache.org &gt; pubkey.asc</code></pre>
</div>
</div>
</li>
<li>
<p>Export Your Private Key:</p>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="bash">gpg --export-secret-keys --armor aleks@apache.org &gt; privkey.asc</code></pre>
</div>
</div>
</li>
<li>
<p>Protect Your Private Key and Revocation Certificate</p>
<div class="paragraph">
<p>Your private key should be kept in a safe place, like an encrypted flash drive. Treat it like your house key. Only you can have it and don&#8217;t lose it. And you must remember your passphrase, otherwise you can&#8217;t unlock your private key.</p>
</div>
<div class="paragraph">
<p>You should protect your revocation certificate. Anyone in posession of your revocation certificate, could immediately revoke your public/private key pair and generate fake ones.</p>
</div>
</li>
</ol>
</div>
<div class="admonitionblock important">
<table>
<tr>
<td class="icon">
<i class="fa icon-important" title="Important"></i>
</td>
<td class="content">
Please contact a PMC member to add your GPG public key in Fineract&#8217;s Subversion repository. This is necessary to be able to validate published releases.
</td>
</tr>
</table>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Upload your GPG key to a keyserver:</p>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="bash">gpg --send-keys 7890ABCD</code></pre>
</div>
</div>
<div class="paragraph">
<p>Before doing this, make sure that your default keyserver is hkps://keys.openpgp.org/. You can do this by changing the default keyserver in ~/.gnupg/dirmngr.conf:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="bash">keyserver hkps://keys.openpgp.org/</code></pre>
</div>
</div>
</li>
</ol>
</div>
</div>
<div class="sect3">
<h4 id="_email">Email</h4>
<div class="paragraph">
<p>Official communication related to releases needs to be done with an Apache email address. The Apache Foundation doesn&#8217;t provide any real email inboxes anymore and just relays emails to your configured private account (GMail etc.).</p>
</div>
<div class="admonitionblock important">
<table>
<tr>
<td class="icon">
<i class="fa icon-important" title="Important"></i>
</td>
<td class="content">
At the moment we are supporting only GMail accounts. Please let us know if you have other configuration recipes for other email providers.
</td>
</tr>
</table>
</div>
<div class="sect4">
<h5 id="_gmail">GMail</h5>
<div class="paragraph">
<p>You can configure your GMail account and add another profile to use the Apache relay server if you need to send official messages. Please follow these instructions:</p>
</div>
<div class="paragraph">
<p>TBD.</p>
</div>
<div class="paragraph">
<p>See also: <a href="https://gmail.googleblog.com/2009/07/send-mail-from-another-address-without.html">Send mail from another address without "on behalf of"</a></p>
</div>
<div class="paragraph">
<p>To be able to send emails via SMTP with your GMail account you probably need to create an app password. Please follow these instructions:</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Go to your Google Account.</p>
</li>
<li>
<p>Select Security.</p>
</li>
<li>
<p>Under "Signing in to Google," select App Passwords. You may need to sign in. If you don&#8217;t have this option, it might be because:</p>
</li>
<li>
<p>2-Step Verification is not set up for your account.</p>
</li>
<li>
<p>2-Step Verification is only set up for security keys.</p>
</li>
<li>
<p>Your account is through work, school, or other organization.</p>
</li>
<li>
<p>You turned on Advanced Protection.</p>
</li>
<li>
<p>At the bottom, choose Select app and choose the app you using and then Select device and choose the device you&#8217;re using and then Generate.</p>
</li>
<li>
<p>Follow the instructions to enter the App Password. The App Password is the 16-character code in the yellow bar on your device.</p>
</li>
<li>
<p>Tap Done.</p>
</li>
</ol>
</div>
<div class="paragraph">
<p>See also: <a href="https://support.google.com/accounts/answer/185833?p=InvalidSecondFactor&amp;visit_id=637856439524128323-869822459&amp;rd=1">Google Support: Sign in with App Passwords</a> for more details.</p>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_gradle_2">Gradle</h4>
<div class="paragraph">
<p>TBD</p>
</div>
<div class="sect4">
<h5 id="_user_properties">User Properties</h5>
<div class="paragraph">
<p>There are a couple of properties that contain committer/release manager related secrets. Please add the following properties to your personal global Gradle properties (you will find them at <code>~/.gradle/gradle.properties</code> in your home folder).</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="properties">fineract.config.gnupg.keyName=ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890ABCD<i class="conum" data-value="1"></i><b>(1)</b>
fineract.config.gnupg.password=******
fineract.config.gnupg.publicKeyring=~/.gnupg/pubring.kbx<i class="conum" data-value="2"></i><b>(2)</b>
fineract.config.gnupg.secretKeyring=~/.gnupg/secring.gpg
fineract.config.smtp.username=aleks@gmail.com <i class="conum" data-value="3"></i><b>(3)</b>
fineract.config.smtp.password=******
fineract.config.name=Aleksandar Vidakovic
fineract.config.email=aleks@apache.org
fineract.config.username=aleks <i class="conum" data-value="4"></i><b>(4)</b>
fineract.config.password=******</code></pre>
</div>
</div>
<div class="colist arabic">
<table>
<tr>
<td><i class="conum" data-value="1"></i><b>1</b></td>
<td>Make sure you use the full GPG key name (you can list yours via <code>gpg --list-secret-keys --keyid-format=long</code>)</td>
</tr>
<tr>
<td><i class="conum" data-value="2"></i><b>2</b></td>
<td>GnuPG has it&#8217;s own kbx format to store the public key ring. At the moment we are only supporting this format</td>
</tr>
<tr>
<td><i class="conum" data-value="3"></i><b>3</b></td>
<td>Currently we only have instructions for GMail</td>
</tr>
<tr>
<td><i class="conum" data-value="4"></i><b>4</b></td>
<td>Apache committer credentials</td>
</tr>
</table>
</div>
<div class="admonitionblock caution">
<table>
<tr>
<td class="icon">
<i class="fa icon-caution" title="Caution"></i>
</td>
<td class="content">
<strong>Never</strong> add any personal secrets in the project gradle.properties. Double check that you are not accidentally committing them to Git!
</td>
</tr>
</table>
</div>
</div>
<div class="sect4">
<h5 id="_release_plugin">Release Plugin</h5>
<div class="paragraph">
<p>Creating Apache Fineract releases was a very manual and tedious procedure before we created the Gradle release plugin. It was easy - even with documentation - to forget a detail. Some ideas are borrowed from the excellent <a href="https://jreleaser.org">JReleaser</a> tool. Unfortunately at the moment we can&#8217;t use it for the full release process. Being an Apache project we have certain requirements that are not fully covered by <a href="https://jreleaser.org">JReleaser</a>.</p>
</div>
<div class="sect5">
<h6 id="_release_plugin_configuration">Release Plugin Configuration</h6>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="groovy"> directory = <span class="string"><span class="delimiter">&quot;</span><span class="inline"><span class="inline-delimiter">${</span><span class="predefined-type">System</span>.getProperty(<span class="string"><span class="delimiter">&quot;</span><span class="content">java.io.tmpdir</span><span class="delimiter">&quot;</span></span>)<span class="inline-delimiter">}</span></span><span class="content">/fineract-site</span><span class="delimiter">&quot;</span></span>
branch = <span class="string"><span class="delimiter">&quot;</span><span class="content">asf-site</span><span class="delimiter">&quot;</span></span>
}
git {
dir = <span class="string"><span class="delimiter">&quot;</span><span class="inline"><span class="inline-delimiter">${</span>projectDir.absolutePath<span class="inline-delimiter">}</span></span><span class="content">/.git</span><span class="delimiter">&quot;</span></span>
sections = [
[
<span class="key">section</span>: <span class="string"><span class="delimiter">&quot;</span><span class="content">user</span><span class="delimiter">&quot;</span></span>,
<span class="key">name</span>: <span class="string"><span class="delimiter">&quot;</span><span class="content">name</span><span class="delimiter">&quot;</span></span>,
<span class="key">value</span>: <span class="string"><span class="delimiter">&quot;</span><span class="inline"><span class="inline-delimiter">${</span>findProperty(<span class="string"><span class="delimiter">'</span><span class="content">fineract.config.name</span><span class="delimiter">'</span></span>)<span class="inline-delimiter">}</span></span><span class="delimiter">&quot;</span></span>,
],
[
<span class="key">section</span>: <span class="string"><span class="delimiter">&quot;</span><span class="content">user</span><span class="delimiter">&quot;</span></span>,
<span class="key">name</span>: <span class="string"><span class="delimiter">&quot;</span><span class="content">email</span><span class="delimiter">&quot;</span></span>,
<span class="key">value</span>: <span class="string"><span class="delimiter">&quot;</span><span class="inline"><span class="inline-delimiter">${</span>findProperty(<span class="string"><span class="delimiter">'</span><span class="content">fineract.config.email</span><span class="delimiter">'</span></span>)<span class="inline-delimiter">}</span></span><span class="delimiter">&quot;</span></span>,
],
[
<span class="key">section</span>: <span class="string"><span class="delimiter">&quot;</span><span class="content">user</span><span class="delimiter">&quot;</span></span>,
<span class="key">name</span>: <span class="string"><span class="delimiter">&quot;</span><span class="content">signkey</span><span class="delimiter">&quot;</span></span>,
<span class="key">value</span>: <span class="string"><span class="delimiter">&quot;</span><span class="inline"><span class="inline-delimiter">${</span>findProperty(<span class="string"><span class="delimiter">'</span><span class="content">fineract.config.gnupg.keyName</span><span class="delimiter">'</span></span>)<span class="inline-delimiter">}</span></span><span class="delimiter">&quot;</span></span>,
],
[
<span class="key">section</span>: <span class="string"><span class="delimiter">&quot;</span><span class="content">commit</span><span class="delimiter">&quot;</span></span>,
<span class="key">name</span>: <span class="string"><span class="delimiter">&quot;</span><span class="content">gpgsign</span><span class="delimiter">&quot;</span></span>,
<span class="key">value</span>: <span class="string"><span class="delimiter">&quot;</span><span class="content">true</span><span class="delimiter">&quot;</span></span>,
],
]
}
template {
templateDir = <span class="string"><span class="delimiter">&quot;</span><span class="inline"><span class="inline-delimiter">${</span>projectDir<span class="inline-delimiter">}</span></span><span class="content">/buildSrc/src/main/resources</span><span class="delimiter">&quot;</span></span>
}
gpg {
keyName = <span class="string"><span class="delimiter">&quot;</span><span class="inline"><span class="inline-delimiter">${</span>findProperty(<span class="string"><span class="delimiter">'</span><span class="content">fineract.config.gnupg.keyName</span><span class="delimiter">'</span></span>)<span class="inline-delimiter">}</span></span><span class="delimiter">&quot;</span></span>
publicKeyring = <span class="string"><span class="delimiter">&quot;</span><span class="inline"><span class="inline-delimiter">${</span>findProperty(<span class="string"><span class="delimiter">'</span><span class="content">fineract.config.gnupg.publicKeyring</span><span class="delimiter">'</span></span>)<span class="inline-delimiter">}</span></span><span class="delimiter">&quot;</span></span>
secretKeyring = <span class="string"><span class="delimiter">&quot;</span><span class="inline"><span class="inline-delimiter">${</span>findProperty(<span class="string"><span class="delimiter">'</span><span class="content">fineract.config.gnupg.secretKeyring</span><span class="delimiter">'</span></span>)<span class="inline-delimiter">}</span></span><span class="delimiter">&quot;</span></span>
password = <span class="string"><span class="delimiter">&quot;</span><span class="inline"><span class="inline-delimiter">${</span>findProperty(<span class="string"><span class="delimiter">'</span><span class="content">fineract.config.gnupg.password</span><span class="delimiter">'</span></span>)<span class="inline-delimiter">}</span></span><span class="delimiter">&quot;</span></span>
}
smtp {
host = <span class="string"><span class="delimiter">'</span><span class="content">smtp.gmail.com</span><span class="delimiter">'</span></span>
username = <span class="string"><span class="delimiter">&quot;</span><span class="inline"><span class="inline-delimiter">${</span>findProperty(<span class="string"><span class="delimiter">'</span><span class="content">fineract.config.smtp.username</span><span class="delimiter">'</span></span>)<span class="inline-delimiter">}</span></span><span class="delimiter">&quot;</span></span>
password = <span class="string"><span class="delimiter">&quot;</span><span class="inline"><span class="inline-delimiter">${</span>findProperty(<span class="string"><span class="delimiter">'</span><span class="content">fineract.config.smtp.password</span><span class="delimiter">'</span></span>)<span class="inline-delimiter">}</span></span><span class="delimiter">&quot;</span></span>
tls = <span class="predefined-constant">true</span>
ssl = <span class="predefined-constant">true</span>
}
subversion {
username = <span class="string"><span class="delimiter">&quot;</span><span class="inline"><span class="inline-delimiter">${</span>findProperty(<span class="string"><span class="delimiter">'</span><span class="content">fineract.config.username</span><span class="delimiter">'</span></span>)<span class="inline-delimiter">}</span></span><span class="delimiter">&quot;</span></span>
password = <span class="string"><span class="delimiter">&quot;</span><span class="inline"><span class="inline-delimiter">${</span>findProperty(<span class="string"><span class="delimiter">'</span><span class="content">fineract.config.password</span><span class="delimiter">'</span></span>)<span class="inline-delimiter">}</span></span><span class="delimiter">&quot;</span></span>
revision = <span class="string"><span class="delimiter">'</span><span class="content">HEAD</span><span class="delimiter">'</span></span>
}
jira {
url = <span class="string"><span class="delimiter">'</span><span class="content">https://issues.apache.org/jira</span><span class="delimiter">'</span></span>
username = <span class="string"><span class="delimiter">&quot;</span><span class="inline"><span class="inline-delimiter">${</span>findProperty(<span class="string"><span class="delimiter">'</span><span class="content">fineract.config.username</span><span class="delimiter">'</span></span>)<span class="inline-delimiter">}</span></span><span class="delimiter">&quot;</span></span>
password = <span class="string"><span class="delimiter">&quot;</span><span class="inline"><span class="inline-delimiter">${</span>findProperty(<span class="string"><span class="delimiter">'</span><span class="content">fineract.config.password</span><span class="delimiter">'</span></span>)<span class="inline-delimiter">}</span></span><span class="delimiter">&quot;</span></span>
}
confluence {
url = <span class="string"><span class="delimiter">'</span><span class="content">https://cwiki.apache.org/confluence</span><span class="delimiter">'</span></span>
username = <span class="string"><span class="delimiter">&quot;</span><span class="inline"><span class="inline-delimiter">${</span>findProperty(<span class="string"><span class="delimiter">'</span><span class="content">fineract.config.username</span><span class="delimiter">'</span></span>)<span class="inline-delimiter">}</span></span><span class="delimiter">&quot;</span></span>
password = <span class="string"><span class="delimiter">&quot;</span><span class="inline"><span class="inline-delimiter">${</span>findProperty(<span class="string"><span class="delimiter">'</span><span class="content">fineract.config.password</span><span class="delimiter">'</span></span>)<span class="inline-delimiter">}</span></span><span class="delimiter">&quot;</span></span>
}
}
steps = [
<span class="key">test</span>: [
<span class="key">order</span>: <span class="integer">0</span>,
<span class="key">description</span>: <span class="string"><span class="delimiter">'</span><span class="content">Test</span><span class="delimiter">'</span></span>,
<span class="key">email</span>: [
<span class="key">from</span>: <span class="string"><span class="delimiter">&quot;</span><span class="inline"><span class="inline-delimiter">${</span>findProperty(<span class="string"><span class="delimiter">'</span><span class="content">fineract.config.email</span><span class="delimiter">'</span></span>)<span class="inline-delimiter">}</span></span><span class="delimiter">&quot;</span></span>,
<span class="key">to</span>: <span class="string"><span class="delimiter">'</span><span class="content">cheetah@monkeysintown.com</span><span class="delimiter">'</span></span>,
<span class="comment">// cc: 'cheetah@monkeysintown.com',</span>
<span class="key">mime</span>: <span class="string"><span class="delimiter">'</span><span class="content">text/plain</span><span class="delimiter">'</span></span>,
<span class="key">subject</span>: <span class="string"><span class="delimiter">&quot;</span><span class="content">[FINERACT] [TEST] 📣 🏁 🗳️ 🚀 📈 Propose new release </span><span class="inline"><span class="inline-delimiter">${</span>version<span class="inline-delimiter">}</span></span><span class="delimiter">&quot;</span></span>,
<span class="key">messageTemplate</span>: [
<span class="key">templateFile</span>: <span class="string"><span class="delimiter">&quot;</span><span class="inline"><span class="inline-delimiter">${</span>projectDir<span class="inline-delimiter">}</span></span><span class="content">/buildSrc/src/main/resources/email/release.step01.headsup.message.tpl</span><span class="delimiter">&quot;</span></span>
]</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_process">Process</h3>
<div class="paragraph">
<p>TBD</p>
</div>
<div class="imageblock">
<div class="content">
<img src="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnIHN0YW5kYWxvbmU9J25vJz8+PHN2ZyBjb250ZW50U2NyaXB0VHlwZT0nYXBwbGljYXRpb24vZWNtYXNjcmlwdCcgY29udGVudFN0eWxlVHlwZT0ndGV4dC9jc3MnIGhlaWdodD0nMTU2OXB4JyBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSdub25lJyBzdHlsZT0nd2lkdGg6NDIzcHg7aGVpZ2h0OjE1NjlweDtiYWNrZ3JvdW5kOiNGRkZGRkY7JyB2ZXJzaW9uPScxLjEnIHZpZXdCb3g9JzAgMCA0MjMgMTU2OScgd2lkdGg9JzQyM3B4JyB4bWxuczp4bGluaz0naHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluaycgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB6b29tQW5kUGFuPSdtYWduaWZ5Jz48ZGVmcz48ZmlsdGVyIGhlaWdodD0nMzAwJScgaWQ9J2ZyZ3YzZWlyN3FmOTcnIHdpZHRoPSczMDAlJyB4PSctMScgeT0nLTEnPjxmZUdhdXNzaWFuQmx1ciByZXN1bHQ9J2JsdXJPdXQnIHN0ZERldmlhdGlvbj0nMi4wJy8+PGZlQ29sb3JNYXRyaXggaW49J2JsdXJPdXQnIHJlc3VsdD0nYmx1ck91dDInIHR5cGU9J21hdHJpeCcgdmFsdWVzPScwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAuNCAwJy8+PGZlT2Zmc2V0IGR4PSc0LjAnIGR5PSc0LjAnIGluPSdibHVyT3V0MicgcmVzdWx0PSdibHVyT3V0MycvPjxmZUJsZW5kIGluPSdTb3VyY2VHcmFwaGljJyBpbjI9J2JsdXJPdXQzJyBtb2RlPSdub3JtYWwnLz48L2ZpbHRlcj48L2RlZnM+PGc+PHRleHQgZmlsbD0nIzAwMDAwMCcgZm9udC1mYW1pbHk9J3NhbnMtc2VyaWYnIGZvbnQtc2l6ZT0nMTgnIGxlbmd0aEFkanVzdD0nc3BhY2luZycgdGV4dExlbmd0aD0nMjE4JyB4PSc5NicgeT0nMTYuNzA4Jz5GaW5lcmFjdCBSZWxlYXNlIFByb2Nlc3M8L3RleHQ+PGVsbGlwc2UgY3g9JzIwOCcgY3k9JzM2Ljk1MzEnIGZpbGw9JyMwMDAwMDAnIGZpbHRlcj0ndXJsKCNmcmd2M2VpcjdxZjk3KScgcng9JzEwJyByeT0nMTAnIHN0eWxlPSdzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS4wOycvPjxyZWN0IGZpbGw9JyNGRUZFQ0UnIGZpbHRlcj0ndXJsKCNmcmd2M2VpcjdxZjk3KScgaGVpZ2h0PSczMy45Njg4JyByeD0nMTIuNScgcnk9JzEyLjUnIHN0eWxlPSdzdHJva2U6I0E4MDAzNjtzdHJva2Utd2lkdGg6MS41Oycgd2lkdGg9JzIxOScgeD0nOTguNScgeT0nMTI5Ljk1MzEnLz48dGV4dCBmaWxsPScjMDAwMDAwJyBmb250LWZhbWlseT0nc2Fucy1zZXJpZicgZm9udC1zaXplPScxMicgbGVuZ3RoQWRqdXN0PSdzcGFjaW5nJyB0ZXh0TGVuZ3RoPScxOTknIHg9JzEwOC41JyB5PScxNTEuMDkxOCc+U3RlcCAwOiBTZWxlY3QgcmVsZWFzZSBtYW5hZ2VyPC90ZXh0PjxyZWN0IGZpbGw9JyNGRUZFQ0UnIGZpbHRlcj0ndXJsKCNmcmd2M2VpcjdxZjk3KScgaGVpZ2h0PSczMy45Njg4JyByeD0nMTIuNScgcnk9JzEyLjUnIHN0eWxlPSdzdHJva2U6I0E4MDAzNjtzdHJva2Utd2lkdGg6MS41Oycgd2lkdGg9JzMxNCcgeD0nNTEnIHk9JzIwNC45NTMxJy8+PHRleHQgZmlsbD0nIzAwMDAwMCcgZm9udC1mYW1pbHk9J3NhbnMtc2VyaWYnIGZvbnQtc2l6ZT0nMTInIGxlbmd0aEFkanVzdD0nc3BhY2luZycgdGV4dExlbmd0aD0nMjk0JyB4PSc2MScgeT0nMjI2LjA5MTgnPlN0ZXAgMTogU2VuZCBoZWFkcy11cCBlbWFpbCB0byBkZXYgbWFpbGluZyBsaXN0PC90ZXh0PjxyZWN0IGZpbGw9JyNGRUZFQ0UnIGZpbHRlcj0ndXJsKCNmcmd2M2VpcjdxZjk3KScgaGVpZ2h0PSczMy45Njg4JyByeD0nMTIuNScgcnk9JzEyLjUnIHN0eWxlPSdzdHJva2U6I0E4MDAzNjtzdHJva2Utd2lkdGg6MS41Oycgd2lkdGg9JzE1MCcgeD0nMTMzJyB5PScyNzkuOTUzMScvPjx0ZXh0IGZpbGw9JyMwMDAwMDAnIGZvbnQtZmFtaWx5PSdzYW5zLXNlcmlmJyBmb250LXNpemU9JzEyJyBsZW5ndGhBZGp1c3Q9J3NwYWNpbmcnIHRleHRMZW5ndGg9JzEzMCcgeD0nMTQzJyB5PSczMDEuMDkxOCc+U3RlcCAyOiBDbGVhbiB1cCBKSVJBPC90ZXh0PjxyZWN0IGZpbGw9JyNGRUZFQ0UnIGZpbHRlcj0ndXJsKCNmcmd2M2VpcjdxZjk3KScgaGVpZ2h0PSczMy45Njg4JyByeD0nMTIuNScgcnk9JzEyLjUnIHN0eWxlPSdzdHJva2U6I0E4MDAzNjtzdHJva2Utd2lkdGg6MS41Oycgd2lkdGg9JzIyMicgeD0nOTcnIHk9JzM1NC45NTMxJy8+PHRleHQgZmlsbD0nIzAwMDAwMCcgZm9udC1mYW1pbHk9J3NhbnMtc2VyaWYnIGZvbnQtc2l6ZT0nMTInIGxlbmd0aEFkanVzdD0nc3BhY2luZycgdGV4dExlbmd0aD0nMjAyJyB4PScxMDcnIHk9JzM3Ni4wOTE4Jz5TdGVwIDM6IENyZWF0ZSBhIHJlbGVhc2UgYnJhbmNoPC90ZXh0PjxyZWN0IGZpbGw9JyNGRUZFQ0UnIGZpbHRlcj0ndXJsKCNmcmd2M2VpcjdxZjk3KScgaGVpZ2h0PSczMy45Njg4JyByeD0nMTIuNScgcnk9JzEyLjUnIHN0eWxlPSdzdHJva2U6I0E4MDAzNjtzdHJva2Utd2lkdGg6MS41Oycgd2lkdGg9JzE4NScgeD0nMTE1LjUnIHk9JzQyOS45NTMxJy8+PHRleHQgZmlsbD0nIzAwMDAwMCcgZm9udC1mYW1pbHk9J3NhbnMtc2VyaWYnIGZvbnQtc2l6ZT0nMTInIGxlbmd0aEFkanVzdD0nc3BhY2luZycgdGV4dExlbmd0aD0nMTY1JyB4PScxMjUuNScgeT0nNDUxLjA5MTgnPlN0ZXAgNDogRnJlZXplIEpJUkEgdmVyc2lvbjwvdGV4dD48cmVjdCBmaWxsPScjRkVGRUNFJyBmaWx0ZXI9J3VybCgjZnJndjNlaXI3cWY5NyknIGhlaWdodD0nMzMuOTY4OCcgcng9JzEyLjUnIHJ5PScxMi41JyBzdHlsZT0nc3Ryb2tlOiNBODAwMzY7c3Ryb2tlLXdpZHRoOjEuNTsnIHdpZHRoPSczMTcnIHg9JzQ5LjUnIHk9JzUwNC45NTMxJy8+PHRleHQgZmlsbD0nIzAwMDAwMCcgZm9udC1mYW1pbHk9J3NhbnMtc2VyaWYnIGZvbnQtc2l6ZT0nMTInIGxlbmd0aEFkanVzdD0nc3BhY2luZycgdGV4dExlbmd0aD0nMjk3JyB4PSc1OS41JyB5PSc1MjYuMDkxOCc+Q29udGludWUgd2l0aCBkZXZlbG9wbWVudCBvbiAnZGV2ZWxvcCcgYnJhbmNoPC90ZXh0PjxyZWN0IGZpbGw9JyNGRUZFQ0UnIGZpbHRlcj0ndXJsKCNmcmd2M2VpcjdxZjk3KScgaGVpZ2h0PSczMy45Njg4JyByeD0nMTIuNScgcnk9JzEyLjUnIHN0eWxlPSdzdHJva2U6I0E4MDAzNjtzdHJva2Utd2lkdGg6MS41Oycgd2lkdGg9JzE4NycgeD0nMTE0LjUnIHk9JzU5Mi45NTMxJy8+PHRleHQgZmlsbD0nIzAwMDAwMCcgZm9udC1mYW1pbHk9J3NhbnMtc2VyaWYnIGZvbnQtc2l6ZT0nMTInIGxlbmd0aEFkanVzdD0nc3BhY2luZycgdGV4dExlbmd0aD0nMTY3JyB4PScxMjQuNScgeT0nNjE0LjA5MTgnPlN0ZXAgNTogQ3JlYXRlIHJlbGVhc2UgdGFnPC90ZXh0PjxyZWN0IGZpbGw9JyNGRUZFQ0UnIGZpbHRlcj0ndXJsKCNmcmd2M2VpcjdxZjk3KScgaGVpZ2h0PSczMy45Njg4JyByeD0nMTIuNScgcnk9JzEyLjUnIHN0eWxlPSdzdHJva2U6I0E4MDAzNjtzdHJva2Utd2lkdGg6MS41Oycgd2lkdGg9JzE5OCcgeD0nMTA5JyB5PSc2NjcuOTUzMScvPjx0ZXh0IGZpbGw9JyMwMDAwMDAnIGZvbnQtZmFtaWx5PSdzYW5zLXNlcmlmJyBmb250LXNpemU9JzEyJyBsZW5ndGhBZGp1c3Q9J3NwYWNpbmcnIHRleHRMZW5ndGg9JzE3OCcgeD0nMTE5JyB5PSc2ODkuMDkxOCc+U3RlcCA2OiBDcmVhdGUgYSBkaXN0cmlidXRpb248L3RleHQ+PHJlY3QgZmlsbD0nI0ZFRkVDRScgZmlsdGVyPSd1cmwoI2ZyZ3YzZWlyN3FmOTcpJyBoZWlnaHQ9JzMzLjk2ODgnIHJ4PScxMi41JyByeT0nMTIuNScgc3R5bGU9J3N0cm9rZTojQTgwMDM2O3N0cm9rZS13aWR0aDoxLjU7JyB3aWR0aD0nMjUyJyB4PSc4MicgeT0nNzQyLjk1MzEnLz48dGV4dCBmaWxsPScjMDAwMDAwJyBmb250LWZhbWlseT0nc2Fucy1zZXJpZicgZm9udC1zaXplPScxMicgbGVuZ3RoQWRqdXN0PSdzcGFjaW5nJyB0ZXh0TGVuZ3RoPScyMzInIHg9JzkyJyB5PSc3NjQuMDkxOCc+U3RlcCA3OiBTaWduIHRoZSBkaXN0cmlidXRpb24gYXJ0aWZhY3RzPC90ZXh0PjxyZWN0IGZpbGw9JyNGRUZFQ0UnIGZpbHRlcj0ndXJsKCNmcmd2M2VpcjdxZjk3KScgaGVpZ2h0PSczMy45Njg4JyByeD0nMTIuNScgcnk9JzEyLjUnIHN0eWxlPSdzdHJva2U6I0E4MDAzNjtzdHJva2Utd2lkdGg6MS41Oycgd2lkdGg9JzM5NCcgeD0nMTEnIHk9JzgxNy45NTMxJy8+PHRleHQgZmlsbD0nIzAwMDAwMCcgZm9udC1mYW1pbHk9J3NhbnMtc2VyaWYnIGZvbnQtc2l6ZT0nMTInIGxlbmd0aEFkanVzdD0nc3BhY2luZycgdGV4dExlbmd0aD0nMzc0JyB4PScyMScgeT0nODM5LjA5MTgnPlN0ZXAgODogVXBsb2FkIGRpc3RyaWJ1dGlvbiBhcnRpZmFjdHMgdG8gc3RhZ2luZyBlbnZpcm9ubWVudDwvdGV4dD48cmVjdCBmaWxsPScjRkVGRUNFJyBmaWx0ZXI9J3VybCgjZnJndjNlaXI3cWY5NyknIGhlaWdodD0nMzMuOTY4OCcgcng9JzEyLjUnIHJ5PScxMi41JyBzdHlsZT0nc3Ryb2tlOiNBODAwMzY7c3Ryb2tlLXdpZHRoOjEuNTsnIHdpZHRoPSczMjYnIHg9JzQ1JyB5PSc4OTIuOTUzMScvPjx0ZXh0IGZpbGw9JyMwMDAwMDAnIGZvbnQtZmFtaWx5PSdzYW5zLXNlcmlmJyBmb250LXNpemU9JzEyJyBsZW5ndGhBZGp1c3Q9J3NwYWNpbmcnIHRleHRMZW5ndGg9JzMwNicgeD0nNTUnIHk9JzkxNC4wOTE4Jz5TdGVwIDk6IFZlcmlmeSBkaXN0cmlidXRpb24gaW4gc3RhZ2luZyBlbnZpcm9ubWVudDwvdGV4dD48cmVjdCBmaWxsPScjRkVGRUNFJyBmaWx0ZXI9J3VybCgjZnJndjNlaXI3cWY5NyknIGhlaWdodD0nMzMuOTY4OCcgcng9JzEyLjUnIHJ5PScxMi41JyBzdHlsZT0nc3Ryb2tlOiNBODAwMzY7c3Ryb2tlLXdpZHRoOjEuNTsnIHdpZHRoPScyOTEnIHg9JzYyLjUnIHk9Jzk2Ny45NTMxJy8+PHRleHQgZmlsbD0nIzAwMDAwMCcgZm9udC1mYW1pbHk9J3NhbnMtc2VyaWYnIGZvbnQtc2l6ZT0nMTInIGxlbmd0aEFkanVzdD0nc3BhY2luZycgdGV4dExlbmd0aD0nMjcxJyB4PSc3Mi41JyB5PSc5ODkuMDkxOCc+U3RlcCAxMDogU3RhcnQgdm90aW5nIG9uIHRoZSBkZXYgbWFpbGluZyBsaXN0PC90ZXh0Pjxwb2x5Z29uIGZpbGw9JyNGRUZFQ0UnIGZpbHRlcj0ndXJsKCNmcmd2M2VpcjdxZjk3KScgcG9pbnRzPScyMDgsMTA0Mi45NTMxLDIyMCwxMDU0Ljk1MzEsMjA4LDEwNjYuOTUzMSwxOTYsMTA1NC45NTMxLDIwOCwxMDQyLjk1MzEnIHN0eWxlPSdzdHJva2U6I0E4MDAzNjtzdHJva2Utd2lkdGg6MS41OycvPjxyZWN0IGZpbGw9JyNGRUZFQ0UnIGZpbHRlcj0ndXJsKCNmcmd2M2VpcjdxZjk3KScgaGVpZ2h0PSczMy45Njg4JyByeD0nMTIuNScgcnk9JzEyLjUnIHN0eWxlPSdzdHJva2U6I0E4MDAzNjtzdHJva2Utd2lkdGg6MS41Oycgd2lkdGg9JzMzMycgeD0nNDEuNScgeT0nMTEyMC45NTMxJy8+PHRleHQgZmlsbD0nIzAwMDAwMCcgZm9udC1mYW1pbHk9J3NhbnMtc2VyaWYnIGZvbnQtc2l6ZT0nMTInIGxlbmd0aEFkanVzdD0nc3BhY2luZycgdGV4dExlbmd0aD0nMzEzJyB4PSc1MS41JyB5PScxMTQyLjA5MTgnPlN0ZXAgMTE6IENvbmNsdWRlIHRoZSB2b3RlIGFuZCBhbm5vdW5jZSByZXN1bHRzPC90ZXh0PjxyZWN0IGZpbGw9JyNGRUZFQ0UnIGZpbHRlcj0ndXJsKCNmcmd2M2VpcjdxZjk3KScgaGVpZ2h0PSczMy45Njg4JyByeD0nMTIuNScgcnk9JzEyLjUnIHN0eWxlPSdzdHJva2U6I0E4MDAzNjtzdHJva2Utd2lkdGg6MS41Oycgd2lkdGg9JzQwMicgeD0nNycgeT0nMTE5NS45NTMxJy8+PHRleHQgZmlsbD0nIzAwMDAwMCcgZm9udC1mYW1pbHk9J3NhbnMtc2VyaWYnIGZvbnQtc2l6ZT0nMTInIGxlbmd0aEFkanVzdD0nc3BhY2luZycgdGV4dExlbmd0aD0nMzgyJyB4PScxNycgeT0nMTIxNy4wOTE4Jz5TdGVwIDEyOiBVcGxvYWQgZGlzdHJpYnV0aW9uIGFydGlmYWN0cyB0byByZWxlYXNlIGVudmlyb25tZW50PC90ZXh0PjxyZWN0IGZpbGw9JyNGRUZFQ0UnIGZpbHRlcj0ndXJsKCNmcmd2M2VpcjdxZjk3KScgaGVpZ2h0PSczMy45Njg4JyByeD0nMTIuNScgcnk9JzEyLjUnIHN0eWxlPSdzdHJva2U6I0E4MDAzNjtzdHJva2Utd2lkdGg6MS41Oycgd2lkdGg9JzM1OCcgeD0nMjknIHk9JzEyNzAuOTUzMScvPjx0ZXh0IGZpbGw9JyMwMDAwMDAnIGZvbnQtZmFtaWx5PSdzYW5zLXNlcmlmJyBmb250LXNpemU9JzEyJyBsZW5ndGhBZGp1c3Q9J3NwYWNpbmcnIHRleHRMZW5ndGg9JzMzOCcgeD0nMzknIHk9JzEyOTIuMDkxOCc+U3RlcCAxMzogQ2xvc2UgcmVsZWFzZSBicmFuY2ggYW5kIG1lcmdlIHRvICdkZXZlbG9wJzwvdGV4dD48cmVjdCBmaWxsPScjRkVGRUNFJyBmaWx0ZXI9J3VybCgjZnJndjNlaXI3cWY5NyknIGhlaWdodD0nMzMuOTY4OCcgcng9JzEyLjUnIHJ5PScxMi41JyBzdHlsZT0nc3Ryb2tlOiNBODAwMzY7c3Ryb2tlLXdpZHRoOjEuNTsnIHdpZHRoPSczMDYnIHg9JzU1JyB5PScxMzQ1Ljk1MzEnLz48dGV4dCBmaWxsPScjMDAwMDAwJyBmb250LWZhbWlseT0nc2Fucy1zZXJpZicgZm9udC1zaXplPScxMicgbGVuZ3RoQWRqdXN0PSdzcGFjaW5nJyB0ZXh0TGVuZ3RoPScyODYnIHg9JzY1JyB5PScxMzY3LjA5MTgnPlN0ZXAgMTQ6IFVwZGF0ZSB3ZWJzaXRlIChub3QgeWV0IGF1dG9tYXRlZCk8L3RleHQ+PHJlY3QgZmlsbD0nI0ZFRkVDRScgZmlsdGVyPSd1cmwoI2ZyZ3YzZWlyN3FmOTcpJyBoZWlnaHQ9JzMzLjk2ODgnIHJ4PScxMi41JyByeT0nMTIuNScgc3R5bGU9J3N0cm9rZTojQTgwMDM2O3N0cm9rZS13aWR0aDoxLjU7JyB3aWR0aD0nMzMyJyB4PSc0MicgeT0nMTQyMC45NTMxJy8+PHRleHQgZmlsbD0nIzAwMDAwMCcgZm9udC1mYW1pbHk9J3NhbnMtc2VyaWYnIGZvbnQtc2l6ZT0nMTInIGxlbmd0aEFkanVzdD0nc3BhY2luZycgdGV4dExlbmd0aD0nMzEyJyB4PSc1MicgeT0nMTQ0Mi4wOTE4Jz5TdGVwIDE1OiBTZW5kIGVtYWlsIHRvIGFubm91bmNlbWVudCBtYWlsaW5nIGxpc3Q8L3RleHQ+PGVsbGlwc2UgY3g9JzIwOCcgY3k9JzE1NDcuOTUzMScgZmlsdGVyPSd1cmwoI2ZyZ3YzZWlyN3FmOTcpJyByeD0nMTAnIHJ5PScxMCcgc3R5bGU9J3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoxLjA7ZmlsbDpub25lOycvPjxlbGxpcHNlIGN4PScyMDguNScgY3k9JzE1NDguNDUzMScgZmlsbD0nIzAwMDAwMCcgcng9JzYnIHJ5PSc2JyBzdHlsZT0nc3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEuMDsnLz48cGF0aCBkPSdNMjA4LDQ3LjE2MzEgQzIwOCw2NC4yMzMxIDIwOCwxMDEuMjAzMSAyMDgsMTI0Ljc1MzEgJyBmaWxsPSdub25lJyBpZD0nc3RhcnQtdG8tU3RlcCAwOiBTZWxlY3QgcmVsZWFzZSBtYW5hZ2VyJyBzdHlsZT0nc3Ryb2tlOiNBODAwMzY7c3Ryb2tlLXdpZHRoOjEuMDsnLz48cG9seWdvbiBmaWxsPScjQTgwMDM2JyBwb2ludHM9JzIwOCwxMjkuODUzMSwyMTIsMTIwLjg1MzEsMjA4LDEyNC44NTMxLDIwNCwxMjAuODUzMSwyMDgsMTI5Ljg1MzEnIHN0eWxlPSdzdHJva2U6I0E4MDAzNjtzdHJva2Utd2lkdGg6MS4wOycvPjxwYXRoIGQ9J00yMDgsMTY0LjE1MzEgQzIwOCwxNzQuNjQzMSAyMDgsMTg4LjQxMzEgMjA4LDE5OS43NzMxICcgZmlsbD0nbm9uZScgaWQ9J1N0ZXAgMDogU2VsZWN0IHJlbGVhc2UgbWFuYWdlci10by1TdGVwIDE6IFNlbmQgaGVhZHMtdXAgZW1haWwgdG8gZGV2IG1haWxpbmcgbGlzdCcgc3R5bGU9J3N0cm9rZTojQTgwMDM2O3N0cm9rZS13aWR0aDoxLjA7Jy8+PHBvbHlnb24gZmlsbD0nI0E4MDAzNicgcG9pbnRzPScyMDgsMjA0Ljc5MzEsMjEyLDE5NS43OTMxLDIwOCwxOTkuNzkzMSwyMDQsMTk1Ljc5MzEsMjA4LDIwNC43OTMxJyBzdHlsZT0nc3Ryb2tlOiNBODAwMzY7c3Ryb2tlLXdpZHRoOjEuMDsnLz48cGF0aCBkPSdNMjA4LDIzOS4xNTMxIEMyMDgsMjQ5LjY0MzEgMjA4LDI2My40MTMxIDIwOCwyNzQuNzczMSAnIGZpbGw9J25vbmUnIGlkPSdTdGVwIDE6IFNlbmQgaGVhZHMtdXAgZW1haWwgdG8gZGV2IG1haWxpbmcgbGlzdC10by1TdGVwIDI6IENsZWFuIHVwIEpJUkEnIHN0eWxlPSdzdHJva2U6I0E4MDAzNjtzdHJva2Utd2lkdGg6MS4wOycvPjxwb2x5Z29uIGZpbGw9JyNBODAwMzYnIHBvaW50cz0nMjA4LDI3OS43OTMxLDIxMiwyNzAuNzkzMSwyMDgsMjc0Ljc5MzEsMjA0LDI3MC43OTMxLDIwOCwyNzkuNzkzMScgc3R5bGU9J3N0cm9rZTojQTgwMDM2O3N0cm9rZS13aWR0aDoxLjA7Jy8+PHBhdGggZD0nTTIwOCwzMTQuMTUzMSBDMjA4LDMyNC42NDMxIDIwOCwzMzguNDEzMSAyMDgsMzQ5Ljc3MzEgJyBmaWxsPSdub25lJyBpZD0nU3RlcCAyOiBDbGVhbiB1cCBKSVJBLXRvLVN0ZXAgMzogQ3JlYXRlIGEgcmVsZWFzZSBicmFuY2gnIHN0eWxlPSdzdHJva2U6I0E4MDAzNjtzdHJva2Utd2lkdGg6MS4wOycvPjxwb2x5Z29uIGZpbGw9JyNBODAwMzYnIHBvaW50cz0nMjA4LDM1NC43OTMxLDIxMiwzNDUuNzkzMSwyMDgsMzQ5Ljc5MzEsMjA0LDM0NS43OTMxLDIwOCwzNTQuNzkzMScgc3R5bGU9J3N0cm9rZTojQTgwMDM2O3N0cm9rZS13aWR0aDoxLjA7Jy8+PHBhdGggZD0nTTIwOCwzODkuMTUzMSBDMjA4LDM5OS42NDMxIDIwOCw0MTMuNDEzMSAyMDgsNDI0Ljc3MzEgJyBmaWxsPSdub25lJyBpZD0nU3RlcCAzOiBDcmVhdGUgYSByZWxlYXNlIGJyYW5jaC10by1TdGVwIDQ6IEZyZWV6ZSBKSVJBIHZlcnNpb24nIHN0eWxlPSdzdHJva2U6I0E4MDAzNjtzdHJva2Utd2lkdGg6MS4wOycvPjxwb2x5Z29uIGZpbGw9JyNBODAwMzYnIHBvaW50cz0nMjA4LDQyOS43OTMxLDIxMiw0MjAuNzkzMSwyMDgsNDI0Ljc5MzEsMjA0LDQyMC43OTMxLDIwOCw0MjkuNzkzMScgc3R5bGU9J3N0cm9rZTojQTgwMDM2O3N0cm9rZS13aWR0aDoxLjA7Jy8+PHBhdGggZD0nTTIwOCw0NjQuMTUzMSBDMjA4LDQ3NC42NDMxIDIwOCw0ODguNDEzMSAyMDgsNDk5Ljc3MzEgJyBmaWxsPSdub25lJyBpZD0nU3RlcCA0OiBGcmVlemUgSklSQSB2ZXJzaW9uLXRvLUNvbnRpbnVlIHdpdGggZGV2ZWxvcG1lbnQgb24gJmFwb3M7ZGV2ZWxvcCZhcG9zOyBicmFuY2gnIHN0eWxlPSdzdHJva2U6I0E4MDAzNjtzdHJva2Utd2lkdGg6MS4wOycvPjxwb2x5Z29uIGZpbGw9JyNBODAwMzYnIHBvaW50cz0nMjA4LDUwNC43OTMxLDIxMiw0OTUuNzkzMSwyMDgsNDk5Ljc5MzEsMjA0LDQ5NS43OTMxLDIwOCw1MDQuNzkzMScgc3R5bGU9J3N0cm9rZTojQTgwMDM2O3N0cm9rZS13aWR0aDoxLjA7Jy8+PHBhdGggZD0nTTIwOCw1MzkuMTMzMSBDMjA4LDU1Mi44MjMxIDIwOCw1NzIuNTYzMSAyMDgsNTg3LjU2MzEgJyBmaWxsPSdub25lJyBpZD0nQ29udGludWUgd2l0aCBkZXZlbG9wbWVudCBvbiAmYXBvcztkZXZlbG9wJmFwb3M7IGJyYW5jaC10by1TdGVwIDU6IENyZWF0ZSByZWxlYXNlIHRhZycgc3R5bGU9J3N0cm9rZTojQTgwMDM2O3N0cm9rZS13aWR0aDoxLjA7Jy8+PHBvbHlnb24gZmlsbD0nI0E4MDAzNicgcG9pbnRzPScyMDgsNTkyLjg1MzEsMjEyLDU4My44NTMxLDIwOCw1ODcuODUzMSwyMDQsNTgzLjg1MzEsMjA4LDU5Mi44NTMxJyBzdHlsZT0nc3Ryb2tlOiNBODAwMzY7c3Ryb2tlLXdpZHRoOjEuMDsnLz48dGV4dCBmaWxsPScjMDAwMDAwJyBmb250LWZhbWlseT0nc2Fucy1zZXJpZicgZm9udC1zaXplPScxMScgbGVuZ3RoQWRqdXN0PSdzcGFjaW5nJyB0ZXh0TGVuZ3RoPSc1OCcgeD0nMjA5JyB5PSc1NzAuMTYzNic+MS0yIHdlZWtzPC90ZXh0PjxwYXRoIGQ9J00yMDgsNjI3LjE1MzEgQzIwOCw2MzcuNjQzMSAyMDgsNjUxLjQxMzEgMjA4LDY2Mi43NzMxICcgZmlsbD0nbm9uZScgaWQ9J1N0ZXAgNTogQ3JlYXRlIHJlbGVhc2UgdGFnLXRvLVN0ZXAgNjogQ3JlYXRlIGEgZGlzdHJpYnV0aW9uJyBzdHlsZT0nc3Ryb2tlOiNBODAwMzY7c3Ryb2tlLXdpZHRoOjEuMDsnLz48cG9seWdvbiBmaWxsPScjQTgwMDM2JyBwb2ludHM9JzIwOCw2NjcuNzkzMSwyMTIsNjU4Ljc5MzEsMjA4LDY2Mi43OTMxLDIwNCw2NTguNzkzMSwyMDgsNjY3Ljc5MzEnIHN0eWxlPSdzdHJva2U6I0E4MDAzNjtzdHJva2Utd2lkdGg6MS4wOycvPjxwYXRoIGQ9J00yMDgsNzAyLjE1MzEgQzIwOCw3MTIuNjQzMSAyMDgsNzI2LjQxMzEgMjA4LDczNy43NzMxICcgZmlsbD0nbm9uZScgaWQ9J1N0ZXAgNjogQ3JlYXRlIGEgZGlzdHJpYnV0aW9uLXRvLVN0ZXAgNzogU2lnbiB0aGUgZGlzdHJpYnV0aW9uIGFydGlmYWN0cycgc3R5bGU9J3N0cm9rZTojQTgwMDM2O3N0cm9rZS13aWR0aDoxLjA7Jy8+PHBvbHlnb24gZmlsbD0nI0E4MDAzNicgcG9pbnRzPScyMDgsNzQyLjc5MzEsMjEyLDczMy43OTMxLDIwOCw3MzcuNzkzMSwyMDQsNzMzLjc5MzEsMjA4LDc0Mi43OTMxJyBzdHlsZT0nc3Ryb2tlOiNBODAwMzY7c3Ryb2tlLXdpZHRoOjEuMDsnLz48cGF0aCBkPSdNMjA4LDc3Ny4xNTMxIEMyMDgsNzg3LjY0MzEgMjA4LDgwMS40MTMxIDIwOCw4MTIuNzczMSAnIGZpbGw9J25vbmUnIGlkPSdTdGVwIDc6IFNpZ24gdGhlIGRpc3RyaWJ1dGlvbiBhcnRpZmFjdHMtdG8tU3RlcCA4OiBVcGxvYWQgZGlzdHJpYnV0aW9uIGFydGlmYWN0cyB0byBzdGFnaW5nIGVudmlyb25tZW50JyBzdHlsZT0nc3Ryb2tlOiNBODAwMzY7c3Ryb2tlLXdpZHRoOjEuMDsnLz48cG9seWdvbiBmaWxsPScjQTgwMDM2JyBwb2ludHM9JzIwOCw4MTcuNzkzMSwyMTIsODA4Ljc5MzEsMjA4LDgxMi43OTMxLDIwNCw4MDguNzkzMSwyMDgsODE3Ljc5MzEnIHN0eWxlPSdzdHJva2U6I0E4MDAzNjtzdHJva2Utd2lkdGg6MS4wOycvPjxwYXRoIGQ9J00yMDgsODUyLjE1MzEgQzIwOCw4NjIuNjQzMSAyMDgsODc2LjQxMzEgMjA4LDg4Ny43NzMxICcgZmlsbD0nbm9uZScgaWQ9J1N0ZXAgODogVXBsb2FkIGRpc3RyaWJ1dGlvbiBhcnRpZmFjdHMgdG8gc3RhZ2luZyBlbnZpcm9ubWVudC10by1TdGVwIDk6IFZlcmlmeSBkaXN0cmlidXRpb24gaW4gc3RhZ2luZyBlbnZpcm9ubWVudCcgc3R5bGU9J3N0cm9rZTojQTgwMDM2O3N0cm9rZS13aWR0aDoxLjA7Jy8+PHBvbHlnb24gZmlsbD0nI0E4MDAzNicgcG9pbnRzPScyMDgsODkyLjc5MzEsMjEyLDg4My43OTMxLDIwOCw4ODcuNzkzMSwyMDQsODgzLjc5MzEsMjA4LDg5Mi43OTMxJyBzdHlsZT0nc3Ryb2tlOiNBODAwMzY7c3Ryb2tlLXdpZHRoOjEuMDsnLz48cGF0aCBkPSdNMjA4LDkyNy4xNTMxIEMyMDgsOTM3LjY0MzEgMjA4LDk1MS40MTMxIDIwOCw5NjIuNzczMSAnIGZpbGw9J25vbmUnIGlkPSdTdGVwIDk6IFZlcmlmeSBkaXN0cmlidXRpb24gaW4gc3RhZ2luZyBlbnZpcm9ubWVudC10by1TdGVwIDEwOiBTdGFydCB2b3Rpbmcgb24gdGhlIGRldiBtYWlsaW5nIGxpc3QnIHN0eWxlPSdzdHJva2U6I0E4MDAzNjtzdHJva2Utd2lkdGg6MS4wOycvPjxwb2x5Z29uIGZpbGw9JyNBODAwMzYnIHBvaW50cz0nMjA4LDk2Ny43OTMxLDIxMiw5NTguNzkzMSwyMDgsOTYyLjc5MzEsMjA0LDk1OC43OTMxLDIwOCw5NjcuNzkzMScgc3R5bGU9J3N0cm9rZTojQTgwMDM2O3N0cm9rZS13aWR0aDoxLjA7Jy8+PHBhdGggZD0nTTIwOCwxMDAyLjA3MzEgQzIwOCwxMDEyLjg3MzEgMjA4LDEwMjcuMDMzMSAyMDgsMTAzNy44MzMxICcgZmlsbD0nbm9uZScgaWQ9J1N0ZXAgMTA6IFN0YXJ0IHZvdGluZyBvbiB0aGUgZGV2IG1haWxpbmcgbGlzdC10by0jNjcnIHN0eWxlPSdzdHJva2U6I0E4MDAzNjtzdHJva2Utd2lkdGg6MS4wOycvPjxwb2x5Z29uIGZpbGw9JyNBODAwMzYnIHBvaW50cz0nMjA4LDEwNDIuODQzMSwyMTIsMTAzMy44NDMxLDIwOCwxMDM3Ljg0MzEsMjA0LDEwMzMuODQzMSwyMDgsMTA0Mi44NDMxJyBzdHlsZT0nc3Ryb2tlOiNBODAwMzY7c3Ryb2tlLXdpZHRoOjEuMDsnLz48dGV4dCBmaWxsPScjMDAwMDAwJyBmb250LWZhbWlseT0nc2Fucy1zZXJpZicgZm9udC1zaXplPScxMScgbGVuZ3RoQWRqdXN0PSdzcGFjaW5nJyB0ZXh0TGVuZ3RoPScxNDMnIHg9JzQ0Ljg5MDYnIHk9JzEwMzYuMDczMyc+NzIgaG91cnMgb3IgMyB5ZXMgdm90ZXM/PC90ZXh0PjxwYXRoIGQ9J00yMDgsMTA2Ny4yMTMxIEMyMDgsMTA3OS43MTMxIDIwOCwxMTAwLjE2MzEgMjA4LDExMTUuNjkzMSAnIGZpbGw9J25vbmUnIGlkPScjNjctdG8tU3RlcCAxMTogQ29uY2x1ZGUgdGhlIHZvdGUgYW5kIGFubm91bmNlIHJlc3VsdHMnIHN0eWxlPSdzdHJva2U6I0E4MDAzNjtzdHJva2Utd2lkdGg6MS4wOycvPjxwb2x5Z29uIGZpbGw9JyNBODAwMzYnIHBvaW50cz0nMjA4LDExMjAuNzUzMSwyMTIsMTExMS43NTMxLDIwOCwxMTE1Ljc1MzEsMjA0LDExMTEuNzUzMSwyMDgsMTEyMC43NTMxJyBzdHlsZT0nc3Ryb2tlOiNBODAwMzY7c3Ryb2tlLXdpZHRoOjEuMDsnLz48dGV4dCBmaWxsPScjMDAwMDAwJyBmb250LWZhbWlseT0nc2Fucy1zZXJpZicgZm9udC1zaXplPScxMScgbGVuZ3RoQWRqdXN0PSdzcGFjaW5nJyB0ZXh0TGVuZ3RoPScyMCcgeD0nMjA5JyB5PScxMDk4LjE2MzYnPnllczwvdGV4dD48cGF0aCBkPSdNMjA4LDExNTUuMTUzMSBDMjA4LDExNjUuNjQzMSAyMDgsMTE3OS40MTMxIDIwOCwxMTkwLjc3MzEgJyBmaWxsPSdub25lJyBpZD0nU3RlcCAxMTogQ29uY2x1ZGUgdGhlIHZvdGUgYW5kIGFubm91bmNlIHJlc3VsdHMtdG8tU3RlcCAxMjogVXBsb2FkIGRpc3RyaWJ1dGlvbiBhcnRpZmFjdHMgdG8gcmVsZWFzZSBlbnZpcm9ubWVudCcgc3R5bGU9J3N0cm9rZTojQTgwMDM2O3N0cm9rZS13aWR0aDoxLjA7Jy8+PHBvbHlnb24gZmlsbD0nI0E4MDAzNicgcG9pbnRzPScyMDgsMTE5NS43OTMxLDIxMiwxMTg2Ljc5MzEsMjA4LDExOTAuNzkzMSwyMDQsMTE4Ni43OTMxLDIwOCwxMTk1Ljc5MzEnIHN0eWxlPSdzdHJva2U6I0E4MDAzNjtzdHJva2Utd2lkdGg6MS4wOycvPjxwYXRoIGQ9J00yMDgsMTIzMC4xNTMxIEMyMDgsMTI0MC42NDMxIDIwOCwxMjU0LjQxMzEgMjA4LDEyNjUuNzczMSAnIGZpbGw9J25vbmUnIGlkPSdTdGVwIDEyOiBVcGxvYWQgZGlzdHJpYnV0aW9uIGFydGlmYWN0cyB0byByZWxlYXNlIGVudmlyb25tZW50LXRvLVN0ZXAgMTM6IENsb3NlIHJlbGVhc2UgYnJhbmNoIGFuZCBtZXJnZSB0byAmYXBvcztkZXZlbG9wJmFwb3M7JyBzdHlsZT0nc3Ryb2tlOiNBODAwMzY7c3Ryb2tlLXdpZHRoOjEuMDsnLz48cG9seWdvbiBmaWxsPScjQTgwMDM2JyBwb2ludHM9JzIwOCwxMjcwLjc5MzEsMjEyLDEyNjEuNzkzMSwyMDgsMTI2NS43OTMxLDIwNCwxMjYxLjc5MzEsMjA4LDEyNzAuNzkzMScgc3R5bGU9J3N0cm9rZTojQTgwMDM2O3N0cm9rZS13aWR0aDoxLjA7Jy8+PHBhdGggZD0nTTIwOCwxMzA1LjE1MzEgQzIwOCwxMzE1LjY0MzEgMjA4LDEzMjkuNDEzMSAyMDgsMTM0MC43NzMxICcgZmlsbD0nbm9uZScgaWQ9J1N0ZXAgMTM6IENsb3NlIHJlbGVhc2UgYnJhbmNoIGFuZCBtZXJnZSB0byAmYXBvcztkZXZlbG9wJmFwb3M7LXRvLVN0ZXAgMTQ6IFVwZGF0ZSB3ZWJzaXRlIChub3QgeWV0IGF1dG9tYXRlZCknIHN0eWxlPSdzdHJva2U6I0E4MDAzNjtzdHJva2Utd2lkdGg6MS4wOycvPjxwb2x5Z29uIGZpbGw9JyNBODAwMzYnIHBvaW50cz0nMjA4LDEzNDUuNzkzMSwyMTIsMTMzNi43OTMxLDIwOCwxMzQwLjc5MzEsMjA0LDEzMzYuNzkzMSwyMDgsMTM0NS43OTMxJyBzdHlsZT0nc3Ryb2tlOiNBODAwMzY7c3Ryb2tlLXdpZHRoOjEuMDsnLz48cGF0aCBkPSdNMjA4LDEzODAuMTUzMSBDMjA4LDEzOTAuNjQzMSAyMDgsMTQwNC40MTMxIDIwOCwxNDE1Ljc3MzEgJyBmaWxsPSdub25lJyBpZD0nU3RlcCAxNDogVXBkYXRlIHdlYnNpdGUgKG5vdCB5ZXQgYXV0b21hdGVkKS10by1TdGVwIDE1OiBTZW5kIGVtYWlsIHRvIGFubm91bmNlbWVudCBtYWlsaW5nIGxpc3QnIHN0eWxlPSdzdHJva2U6I0E4MDAzNjtzdHJva2Utd2lkdGg6MS4wOycvPjxwb2x5Z29uIGZpbGw9JyNBODAwMzYnIHBvaW50cz0nMjA4LDE0MjAuNzkzMSwyMTIsMTQxMS43OTMxLDIwOCwxNDE1Ljc5MzEsMjA0LDE0MTEuNzkzMSwyMDgsMTQyMC43OTMxJyBzdHlsZT0nc3Ryb2tlOiNBODAwMzY7c3Ryb2tlLXdpZHRoOjEuMDsnLz48cGF0aCBkPSdNMjA4LDE0NTUuMzUzMSBDMjA4LDE0NzYuMzkzMSAyMDgsMTUxMi41NDMxIDIwOCwxNTMyLjU1MzEgJyBmaWxsPSdub25lJyBpZD0nU3RlcCAxNTogU2VuZCBlbWFpbCB0byBhbm5vdW5jZW1lbnQgbWFpbGluZyBsaXN0LXRvLWVuZCcgc3R5bGU9J3N0cm9rZTojQTgwMDM2O3N0cm9rZS13aWR0aDoxLjA7Jy8+PHBvbHlnb24gZmlsbD0nI0E4MDAzNicgcG9pbnRzPScyMDgsMTUzNy43NTMxLDIxMiwxNTI4Ljc1MzEsMjA4LDE1MzIuNzUzMSwyMDQsMTUyOC43NTMxLDIwOCwxNTM3Ljc1MzEnIHN0eWxlPSdzdHJva2U6I0E4MDAzNjtzdHJva2Utd2lkdGg6MS4wOycvPjwvZz48L3N2Zz4=" alt="Diagram" width="423" height="1569">
</div>
<div class="title">Figure 5. Release Process Diagram</div>
</div>
<div class="sect3">
<h4 id="_step_1_heads_up_email">Step 1: Heads-Up Email</h4>
<div class="sect4">
<h5 id="_description">Description</h5>
<div class="paragraph">
<p>The RM should, if one doesn&#8217;t already exist, first create a new release umbrella issue in JIRA. This issue is dedicated to tracking (a summary of) any discussion related to the planned new release. An example of such an issue is FINERACT-873 - Release Apache Fineract v1.4.0 RESOLVED.</p>
</div>
<div class="paragraph">
<p>The RM then creates an list of resolved issues &amp; features through an initial check in JIRA for already resolved issues for the release, and then setup a timeline for release branch point. The time for the day the issue list is created to the release branch point must be at least two weeks in order to give the community a chance to prioritize and commit any last minute features and issues they would like to see in the upcoming release.</p>
</div>
<div class="paragraph">
<p>The RM must then send the pointer to the umbrella issue along with the tentative timeline for branch point to the developer lists. Any work identified as release related that needs to be completed should be added as a sub tasks of the umbrella issue to allow all developers and users to see the overall release progress in one place. The umbrella issue shall also link to any issues still requiring clarification whether or not they will make it into the release.</p>
</div>
<div class="paragraph">
<p>The RM should then inform users when the git branch is planned to be created, by sending an email based on this template:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="text">[ANNOUNCE] 🚀 Fineract $RELEASE release branch
Hello everyone,
Based on our &quot;How to Release Apache Fineract&quot; process documented at https://cwiki.apache.org/confluence/x/DRwIB :
I will create a ${project.version} branch off develop in our git repository at https://github.com/apache/fineract on ${project['fineract.release.date']}.
The release tracking umbrella issue for tracking all activity in JIRA is FINERACT-${project['fineract.release.issue']!'0000'} for this Fineract ${project.version}.
If you have any work in progress that you like to see included in this release, please add &quot;blocking&quot; links to the release JIRA issue.
I am the release manager for this release.
Thanks,
${project['fineract.config.name']}</code></pre>
</div>
</div>
</div>
<div class="sect4">
<h5 id="_gradle_task">Gradle Task</h5>
<div class="listingblock">
<div class="title">Input</div>
<div class="content">
<pre class="CodeRay highlight"><code data-lang="bash">% ./gradlew fineractReleaseStep1</code></pre>
</div>
</div>
<div class="listingblock">
<div class="title">Output</div>
<div class="content">
<pre class="CodeRay highlight"><code data-lang="bash">% echo &quot;Hello, World!&quot;</code></pre>
</div>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_step_2_clean_up_jira">Step 2: Clean Up JIRA</h4>
<div class="sect4">
<h5 id="_description_2">Description</h5>
<div class="paragraph">
<p>Before a release is done, make sure that any issues that are fixed have their fix version setup correctly.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="text">project = FINERACT and resolution = fixed and fixVersion is empty</code></pre>
</div>
</div>
<div class="paragraph">
<p>Move all unresolved JIRA issues which have this release as Fix Version to the next release</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="text">project = FINERACT and fixVersion = 1.6.1-134-feature_fineract_1470 and status not in ( Resolved, Done, Accepted, Closed )</code></pre>
</div>
</div>
<div class="paragraph">
<p>You can also run the following query to make sure that the issues fixed for the to-be-released version look accurate:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="text">project = FINERACT and fixVersion = '1.6.1-134-feature_fineract_1470'</code></pre>
</div>
</div>
<div class="paragraph">
<p>Finally, check out the output of the JIRA release note tool to see which tickets are included in the release, in order to do a sanity check.</p>
</div>
</div>
<div class="sect4">
<h5 id="_gradle_task_2">Gradle Task</h5>
<div class="listingblock">
<div class="title">Input</div>
<div class="content">
<pre class="CodeRay highlight"><code data-lang="bash">% ./gradlew fineractReleaseStep2</code></pre>
</div>
</div>
<div class="listingblock">
<div class="title">Output</div>
<div class="content">
<pre class="CodeRay highlight"><code data-lang="bash">% echo &quot;Hello, World!&quot;</code></pre>
</div>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_step_3_create_release_branch">Step 3: Create Release Branch</h4>
<div class="sect4">
<h5 id="_description_3">Description</h5>
<div class="paragraph">
<p>Communicate with the community. You do not need to start a new email thread on the developer mailing list to notify that you are about to branch, just do it ca. 2 weeks after the initial email, or later, based on the discussion on the initial email.</p>
</div>
<div class="paragraph">
<p>You do not need to ask committers to hold off any commits until you have branched finished, as it&#8217;s always possible to fast-forward the branch to latest develop, or cherry-pick last minute changes to it. People should be able to continue working on the develop branch on bug fixes and great new features for the next release while the release process for the current release is being worked through.</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Clone fresh repository copy</p>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="bash">% git clone git@github.com:apache/fineract.git
% cd fineract</code></pre>
</div>
</div>
</li>
<li>
<p>Check that current HEAD points to commit on which you want to base new release branch. Checkout a particular earlier commit if not.</p>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="bash">% git log <i class="conum" data-value="1"></i><b>(1)</b></code></pre>
</div>
</div>
<div class="colist arabic">
<table>
<tr>
<td><i class="conum" data-value="1"></i><b>1</b></td>
<td>Check current branch history. HEAD should point to commit that you want to be base for your release branch</td>
</tr>
</table>
</div>
</li>
<li>
<p>Create a new release branch with name "$Version"</p>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="bash">% git checkout -b 1.6.1-134-feature_fineract_1470</code></pre>
</div>
</div>
</li>
<li>
<p>Push new branch to Apache Fineract repository</p>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="bash">% git push origin 1.6.1-134-feature_fineract_1470</code></pre>
</div>
</div>
</li>
<li>
<p>Add new release notes in Release Folders. The change list can be swiped from the JIRA release note tool (use the "text" format for the change log). See JIRA Cleanup above to ensure that the release notes generated by this tool are what you are expecting.</p>
</li>
<li>
<p>Send en email announcing the new release branch on the earlier email thread</p>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="text">Re: Fineract $RELEASE release branch
As previously announced, I've just created the release branch for our upcoming $RELEASE release.
You can continue working and merging PRs to the develop branch for future releases, as always.
The DRAFT release notes are on https://cwiki.apache.org/confluence/display/FINERACT/$RELEASE+-+Apache+Fineract. Does anyone see anything missing?
Does anyone have any last minutes changes they would like to see cherry-picked to branch $RELEASE, or are we good go and actually cut the release based on this branch as it is?
I'll initial the final stage of actually creating the release in 3 days if nobody objects.
Thanks,
$RM</code></pre>
</div>
</div>
</li>
</ol>
</div>
</div>
<div class="sect4">
<h5 id="_gradle_task_3">Gradle Task</h5>
<div class="listingblock">
<div class="title">Input</div>
<div class="content">
<pre class="CodeRay highlight"><code data-lang="bash">% ./gradlew fineractReleaseStep3</code></pre>
</div>
</div>
<div class="listingblock">
<div class="title">Output</div>
<div class="content">
<pre class="CodeRay highlight"><code data-lang="bash">% echo &quot;Hello, World!&quot;</code></pre>
</div>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_step_4_freeze_jira">Step 4: Freeze JIRA</h4>
<div class="sect4">
<h5 id="_description_4">Description</h5>
<div class="paragraph">
<p>You first need to close the release in JIRA so that the about to be released version cannot be used as "fixVersion" for new bugs anymore. Go to JIRA "Administer project" page and follow "Versions" in left menu. Table with list of all releases should appear, click on additional menu on the right of your release and choose "Release" option. Submit release date and you&#8217;re done.</p>
</div>
</div>
<div class="sect4">
<h5 id="_gradle_task_4">Gradle Task</h5>
<div class="listingblock">
<div class="title">Input</div>
<div class="content">
<pre class="CodeRay highlight"><code data-lang="bash">% ./gradlew fineractReleaseStep4</code></pre>
</div>
</div>
<div class="listingblock">
<div class="title">Output</div>
<div class="content">
<pre class="CodeRay highlight"><code data-lang="bash">% echo &quot;Hello, World!&quot;</code></pre>
</div>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_step_5_create_release_tag">Step 5: Create Release Tag</h4>
<div class="sect4">
<h5 id="_description_5">Description</h5>
<div class="paragraph">
<p>Next, you create a git tag from the HEAD of the release&#8217;s git branch.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="bash">% git checkout 1.6.1-134-feature_fineract_1470
% ./gradlew clean integrationTests <1>
% git tag -a 1.6.1-134-feature_fineract_1470 -m "Fineract $RELEASE release"
% git push origin 1.6.1-134-feature_fineract_1470</code></pre>
</div>
</div>
<div class="colist arabic">
<table>
<tr>
<td><i class="conum" data-value="1"></i><b>1</b></td>
<td>Run additonally manual tests with the community app.</td>
</tr>
</table>
</div>
<div class="admonitionblock caution">
<table>
<tr>
<td class="icon">
<i class="fa icon-caution" title="Caution"></i>
</td>
<td class="content">
Lightweight vs annotated tags!
</td>
</tr>
</table>
</div>
</div>
<div class="sect4">
<h5 id="_gradle_task_5">Gradle Task</h5>
<div class="listingblock">
<div class="title">Input</div>
<div class="content">
<pre class="CodeRay highlight"><code data-lang="bash">% ./gradlew fineractReleaseStep5</code></pre>
</div>
</div>
<div class="listingblock">
<div class="title">Output</div>
<div class="content">
<pre class="CodeRay highlight"><code data-lang="bash">% echo &quot;Hello, World!&quot;</code></pre>
</div>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_step_6_create_distribution">Step 6: Create Distribution</h4>
<div class="sect4">
<h5 id="_description_6">Description</h5>
<div class="paragraph">
<p>Create source and binary artifacts. Make sure to do some sanity checks. The tar and the release branch should match.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="bash">% cd /fineract-release-preparations <1>
% tar -xvf apache-fineract-1.6.1-134-feature_fineract_1470-src.tar.gz
% git clone https://git-wip-us.apache.org/repos/asf/fineract.git
% cd fineract/
% git checkout tags/1.6.1-134-feature_fineract_1470
% cd ..
% diff -r fineract apache-fineract-1.6.1-134-feature_fineract_1470-src</code></pre>
</div>
</div>
<div class="colist arabic">
<table>
<tr>
<td><i class="conum" data-value="1"></i><b>1</b></td>
<td>Do a fresh clone of the tag.</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>Make sure code compiles and tests pass on the uncompressed source.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="bash">% cd apache-fineract-1.6.1-134-feature_fineract_1470-src/fineract-provider <1>
% gradlew clean integrationTest <2>
% gradlew clean build <3>
% gradlew rat <4></code></pre>
</div>
</div>
<div class="colist arabic">
<table>
<tr>
<td><i class="conum" data-value="1"></i><b>1</b></td>
<td>Make sure prerequisites are met before running these commands.</td>
</tr>
<tr>
<td><i class="conum" data-value="2"></i><b>2</b></td>
<td>For running integration tests</td>
</tr>
<tr>
<td><i class="conum" data-value="3"></i><b>3</b></td>
<td>For building deploy able war</td>
</tr>
<tr>
<td><i class="conum" data-value="4"></i><b>4</b></td>
<td>For RAT checks</td>
</tr>
</table>
</div>
</div>
<div class="sect4">
<h5 id="_gradle_task_6">Gradle Task</h5>
<div class="listingblock">
<div class="title">Input</div>
<div class="content">
<pre class="CodeRay highlight"><code data-lang="bash">% ./gradlew fineractReleaseStep6</code></pre>
</div>
</div>
<div class="listingblock">
<div class="title">Output</div>
<div class="content">
<pre class="CodeRay highlight"><code data-lang="bash">% echo &quot;Hello, World!&quot;</code></pre>
</div>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_step_7_sign_distribution">Step 7: Sign Distribution</h4>
<div class="sect4">
<h5 id="_description_7">Description</h5>
<div class="paragraph">
<p>All release artifacts must be signed. In order to sign a release you will need a PGP key. You should get your key signed by a few other people. You will also need to receive their keys from a public key server. See the Apache release signing page for more details. Please follow the steps defined in Release Sign.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="bash">% gpg --armor --output apache-fineract-1.6.1-134-feature_fineract_1470-src.tar.gz.asc --detach-sig apache-fineract-1.6.1-134-feature_fineract_1470-src.tar.gz
% gpg --print-md MD5 apache-fineract-1.6.1-134-feature_fineract_1470-src.tar.gz > apache-fineract-1.6.1-134-feature_fineract_1470-src.tar.gz.md5
% gpg --print-md SHA512 apache-fineract-1.6.1-134-feature_fineract_1470-src.tar.gz > apache-fineract-1.6.1-134-feature_fineract_1470-src.tar.gz.sha512
% gpg --armor --output apache-fineract-1.6.1-134-feature_fineract_1470--binary.tar.gz.asc --detach-sig apache-fineract-1.6.1-134-feature_fineract_1470-binary.tar.gz
% gpg --print-md MD5 apache-fineract-1.6.1-134-feature_fineract_1470-binary.tar.gz > apache-fineract-1.6.1-134-feature_fineract_1470-binary.tar.gz.md5
% gpg --print-md SHA512 apache-fineract-1.6.1-134-feature_fineract_1470-binary.tar.gz > apache-fineract-1.6.1-134-feature_fineract_1470-binary.tar.gz.sha512</code></pre>
</div>
</div>
</div>
<div class="sect4">
<h5 id="_gradle_task_7">Gradle Task</h5>
<div class="listingblock">
<div class="title">Input</div>
<div class="content">
<pre class="CodeRay highlight"><code data-lang="bash">% ./gradlew fineractReleaseStep7</code></pre>
</div>
</div>
<div class="listingblock">
<div class="title">Output</div>
<div class="content">
<pre class="CodeRay highlight"><code data-lang="bash">% echo &quot;Hello, World!&quot;</code></pre>
</div>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_step_8_upload_distribution_staging">Step 8: Upload Distribution Staging</h4>
<div class="sect4">
<h5 id="_description_8">Description</h5>
<div class="paragraph">
<p>Finally create a directory with release name (1.6.1-134-feature_fineract_1470 in this example) in <a href="https://dist.apache.org/repos/dist/dev/fineract" class="bare">dist.apache.org/repos/dist/dev/fineract</a> and add the following files in this new directory:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>apache-fineract-1.6.1-134-feature_fineract_1470-binary.tar.gz.sha</p>
</li>
<li>
<p>apache-fineract-1.6.1-134-feature_fineract_1470-binary.tar.gz</p>
</li>
<li>
<p>apache-fineract-1.6.1-134-feature_fineract_1470-binary.tar.gz.asc</p>
</li>
<li>
<p>apache-fineract-1.6.1-134-feature_fineract_1470-binary.tar.gz.md5</p>
</li>
<li>
<p>apache-fineract-1.6.1-134-feature_fineract_1470-src.tar.gz.sha</p>
</li>
<li>
<p>apache-fineract-1.6.1-134-feature_fineract_1470-src.tar.gz</p>
</li>
<li>
<p>apache-fineract-1.6.1-134-feature_fineract_1470-src.tar.gz.asc</p>
</li>
<li>
<p>apache-fineract-1.6.1-134-feature_fineract_1470-src.tar.gz.md5</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Upload binary and source archives to ASF&#8217;s distribution dev (staging) area:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="bash">% svn co https://dist.apache.org/repos/dist/dev/fineract/ fineract-dist-dev
% mkdir fineract-dist-dev/1.6.1-134-feature_fineract_1470
% cp fineract/build/distributions/* fineract-dist-dev/1.6.1-134-feature_fineract_1470/
% svn commit</code></pre>
</div>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
You will need your ASF Committer credentials to be able to access the Subversion host <a href="https://dist.apache.org" class="bare">dist.apache.org</a> via.
</td>
</tr>
</table>
</div>
</div>
<div class="sect4">
<h5 id="_gradle_task_8">Gradle Task</h5>
<div class="listingblock">
<div class="title">Input</div>
<div class="content">
<pre class="CodeRay highlight"><code data-lang="bash">% ./gradlew fineractReleaseStep8</code></pre>
</div>
</div>
<div class="listingblock">
<div class="title">Output</div>
<div class="content">
<pre class="CodeRay highlight"><code data-lang="bash">% echo &quot;Hello, World!&quot;</code></pre>
</div>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_step_9_verify_distribution_staging">Step 9: Verify Distribution Staging</h4>
<div class="sect4">
<h5 id="_description_9">Description</h5>
<div class="paragraph">
<p>Following are the typical things we need to verify before voting on a release candidate. And the release manager should verify them too before calling out a vote.</p>
</div>
<div class="paragraph">
<p>Make sure release artifacts are hosted at <a href="https://dist.apache.org/repos/dist/dev/fineract" class="bare">dist.apache.org/repos/dist/dev/fineract</a></p>
</div>
<div class="ulist">
<ul>
<li>
<p>Release candidates should be in format apache-fineract-1.6.1-134-feature_fineract_1470-binary.tar.gz</p>
</li>
<li>
<p>Verify signatures and hashes. You may have to import the public key of the release manager to verify the signatures. (<code>gpg --recv-key &lt;key id&gt;</code>)</p>
</li>
<li>
<p>Git tag matches the released bits (diff -rf)</p>
</li>
<li>
<p>Can compile successfully from source</p>
</li>
<li>
<p>Verify DISCLAIMER, NOTICE and LICENSE (year etc)</p>
</li>
<li>
<p>All files have correct headers (Rat check should be clean - gradlew rat)</p>
</li>
<li>
<p>No jar files in the source artifacts</p>
</li>
<li>
<p>Integration tests should work</p>
</li>
</ul>
</div>
</div>
<div class="sect4">
<h5 id="_gradle_task_9">Gradle Task</h5>
<div class="listingblock">
<div class="title">Input</div>
<div class="content">
<pre class="CodeRay highlight"><code data-lang="bash">% ./gradlew fineractReleaseStep9</code></pre>
</div>
</div>
<div class="listingblock">
<div class="title">Output</div>
<div class="content">
<pre class="CodeRay highlight"><code data-lang="bash">% echo &quot;Hello, World!&quot;</code></pre>
</div>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_step_10_start_vote">Step 10: Start Vote</h4>
<div class="sect4">
<h5 id="_description_10">Description</h5>
<div class="paragraph">
<p>Voting has to be done on <a href="mailto:dev@fineract.apache.org">dev@fineract.apache.org</a>. You can close the vote after voting period expires (72 hours) and you accumulate sufficient votes (minimum 3 x +1 PMC votes).</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="text">[VOTE] [APACHE FINERACT] $RELEASE for release
Hello,
We have created Apache Fineract $RELEASE release, with the artifacts below up for a vote.
It fixes the following issues: https://cwiki.apache.org/confluence/display/FINERACT/$RELEASE+-+Apache+Fineract
Source &amp; Binary files : https://dist.apache.org/repos/dist/dev/fineract/$RELEASE/
Tag to be voted on (rc#): https://git-wip-us.apache.org/repos/asf?p=fineract.git;a=commit;h=refs/heads/$RELEASE
Fineract's KEYS containing the PGP key we used to sign the release: https://dist.apache.org/repos/dist/dev/fineract/KEYS
Note that this release contains source and binary artifacts.
This vote will be open for 72 hours:
[ ] +1 approve
[ ] +0 no opinion
[ ] -1 disapprove (and reason why)
Thanks,
$RM</code></pre>
</div>
</div>
</div>
<div class="sect4">
<h5 id="_gradle_task_10">Gradle Task</h5>
<div class="listingblock">
<div class="title">Input</div>
<div class="content">
<pre class="CodeRay highlight"><code data-lang="bash">% ./gradlew fineractReleaseStep10</code></pre>
</div>
</div>
<div class="listingblock">
<div class="title">Output</div>
<div class="content">
<pre class="CodeRay highlight"><code data-lang="bash">% echo &quot;Hello, World!&quot;</code></pre>
</div>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_step_11_finish_vote">Step 11: Finish Vote</h4>
<div class="sect4">
<h5 id="_description_11">Description</h5>
<div class="paragraph">
<p>Upon receiving 3 x +1 from the PMC, or after 72 hours (whichever one comes first), reply to the voting thread and add the prefix "[RESULT]" to the subject line with the results, as follows:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="text">[RESULT][VOTE] [APACHE FINERACT] $RELEASE for release
Voting is now closed and has passed with the following tally,
Binding +1s: Myrle Krantz, Avik Ganguly, Ed Cable
Non binding +1s: Friendly new contributor, Friendly well-wisher, Friendly dude off the street.
Thanks to everyone who voted! I'll now continue with the rest of the release process.
$RM</code></pre>
</div>
</div>
</div>
<div class="sect4">
<h5 id="_gradle_task_11">Gradle Task</h5>
<div class="listingblock">
<div class="title">Input</div>
<div class="content">
<pre class="CodeRay highlight"><code data-lang="bash">% ./gradlew fineractReleaseStep11</code></pre>
</div>
</div>
<div class="listingblock">
<div class="title">Output</div>
<div class="content">
<pre class="CodeRay highlight"><code data-lang="bash">% echo &quot;Hello, World!&quot;</code></pre>
</div>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_step_12_upload_distribution_release">Step 12: Upload Distribution Release</h4>
<div class="sect4">
<h5 id="_description_12">Description</h5>
<div class="paragraph">
<p>In order to release you have to checkout release repository located on <a href="https://dist.apache.org/repos/dist/release/fineract" class="bare">dist.apache.org/repos/dist/release/fineract</a> and add release artifacts there.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="bash">% svn co https://dist.apache.org/repos/dist/release/fineract fineract-release
% mkdir fineract-release/1.6.1-134-feature_fineract_1470/
% cp fineract-dist-dev/1.6.1-134-feature_fineract_1470/* fineract-release/1.6.1-134-feature_fineract_1470/
% svn add fineract-release/1.6.1-134-feature_fineract_1470/
% svn commit -m "Fineract Release 1.6.1-134-feature_fineract_1470" fineract-release/1.6.1-134-feature_fineract_1470/</code></pre>
</div>
</div>
<div class="paragraph">
<p>You will now get an automated email from the Apache Reporter Service (<a href="mailto:no-reply@reporter.apache.org">no-reply@reporter.apache.org</a>), subject "Please add your release data for 'fineract'" to add the release data (version and date) to the database on <a href="https://reporter.apache.org/addrelease.html?fineract" class="bare">reporter.apache.org/addrelease.html?fineract</a> (requires PMC membership).</p>
</div>
</div>
<div class="sect4">
<h5 id="_gradle_task_12">Gradle Task</h5>
<div class="listingblock">
<div class="title">Input</div>
<div class="content">
<pre class="CodeRay highlight"><code data-lang="bash">% ./gradlew fineractReleaseStep12</code></pre>
</div>
</div>
<div class="listingblock">
<div class="title">Output</div>
<div class="content">
<pre class="CodeRay highlight"><code data-lang="bash">% echo &quot;Hello, World!&quot;</code></pre>
</div>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_step_13_close_release_branch">Step 13: Close Release Branch</h4>
<div class="sect4">
<h5 id="_description_13">Description</h5>
<div class="paragraph">
<p>As discussed in <a href="https://issues.apache.org/jira/browse/FINERACT-1154">FINERACT-1154</a>, now that everything is final, please do the following to remove the release branch (and just keep the tag), and make sure that everything on the release tag is merged to develop and that e.g. git describe works:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="bash">% git checkout develop
% git branch -D 1.6.1-134-feature_fineract_1470
% git push origin :1.6.1-134-feature_fineract_1470
% git checkout develop
% git checkout -b merge-1.6.1-134-feature_fineract_1470
% git merge -s recursive -Xignore-all-space 1.6.1-134-feature_fineract_1470 <1>
% git commit
% git push $USER
% hub pull-request</code></pre>
</div>
</div>
<div class="colist arabic">
<table>
<tr>
<td><i class="conum" data-value="1"></i><b>1</b></td>
<td>Manually resolve merge conflicts, if any</td>
</tr>
</table>
</div>
</div>
<div class="sect4">
<h5 id="_gradle_task_13">Gradle Task</h5>
<div class="listingblock">
<div class="title">Input</div>
<div class="content">
<pre class="CodeRay highlight"><code data-lang="bash">% ./gradlew fineractReleaseStep13</code></pre>
</div>
</div>
<div class="listingblock">
<div class="title">Output</div>
<div class="content">
<pre class="CodeRay highlight"><code data-lang="bash">% echo &quot;Hello, World!&quot;</code></pre>
</div>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_step_14_update_website">Step 14: Update website</h4>
<div class="sect4">
<h5 id="_description_14">Description</h5>
<div class="paragraph">
<p>Finally update the <a href="https://fineract.apache.org" class="bare">fineract.apache.org</a> website with the latest release details. The website&#8217;s HTML source code is available at <a href="https://github.com/apache/fineract-site" class="bare">github.com/apache/fineract-site</a>.</p>
</div>
<div class="admonitionblock caution">
<table>
<tr>
<td class="icon">
<i class="fa icon-caution" title="Caution"></i>
</td>
<td class="content">
This step is not yet updated. We are working on a static site generator setup.
</td>
</tr>
</table>
</div>
</div>
<div class="sect4">
<h5 id="_gradle_task_14">Gradle Task</h5>
<div class="listingblock">
<div class="title">Input</div>
<div class="content">
<pre class="CodeRay highlight"><code data-lang="bash">% ./gradlew fineractReleaseStep14 <i class="conum" data-value="1"></i><b>(1)</b></code></pre>
</div>
</div>
<div class="colist arabic">
<table>
<tr>
<td><i class="conum" data-value="1"></i><b>1</b></td>
<td>Currently doing nothing. Will trigger in the future the static site generator and publish on Github.</td>
</tr>
</table>
</div>
<div class="listingblock">
<div class="title">Output</div>
<div class="content">
<pre class="CodeRay highlight"><code data-lang="bash">% echo &quot;Hello, World!&quot;</code></pre>
</div>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_step_15_announcement_email">Step 15: Announcement Email</h4>
<div class="sect4">
<h5 id="_description_15">Description</h5>
<div class="paragraph">
<p>Send an email to <a href="mailto:announce@apache.org">announce@apache.org</a> (sender address must be @apache.org):</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="text">[ANNOUNCE] Apache Fineract $RELEASE Release
The Apache Fineract project is pleased to announce
the release of Apache Fineract $RELEASE.
The release is available for download from
https://fineract.apache.org/#downloads
Fineract provides a reliable, robust, and affordable solution for entrepreneurs,
financial institutions, and service providers to offer financial services to the
world’s 2 billion underbanked and unbanked. Fineract is aimed at innovative mobile
and cloud-based solutions, and enables digital transaction accounts for all.
This release addressed 250 issues.
Readme: https://github.com/apache/fineract/blob/$RELEASE/README.md
Release page: https://cwiki.apache.org/confluence/display/FINERACT/$RELEASE+-+Apache+Fineract
List of fixed issues:
https://issues.apache.org/jira/secure/ReleaseNote.jspa?version=12344606&amp;styleName=Html&amp;projectId=12319420
For more information on Apache Fineract please visit
project home page: https://fineract.apache.org
The Apache Fineract Team</code></pre>
</div>
</div>
</div>
<div class="sect4">
<h5 id="_gradle_task_15">Gradle Task</h5>
<div class="listingblock">
<div class="title">Input</div>
<div class="content">
<pre class="CodeRay highlight"><code data-lang="bash">% ./gradlew fineractReleaseStep15</code></pre>
</div>
</div>
<div class="listingblock">
<div class="title">Output</div>
<div class="content">
<pre class="CodeRay highlight"><code data-lang="bash">% echo &quot;Hello, World!&quot;</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_frequently_asked_questions">Frequently Asked Questions</h2>
<div class="sectionbody">
<div class="paragraph">
<p>TBD</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_glossary">Glossary</h2>
<div class="sectionbody">
<div class="paragraph">
<p>TBD</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_index">Index</h2>
<div class="sectionbody">
<div class="paragraph">
<p>TBD</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_fineract_application_properties">Appendix A: Fineract Application Properties</h2>
<div class="sectionbody">
<div class="paragraph">
<p>TBD</p>
</div>
<div class="sect2">
<h3 id="_tenant_database_properties">Tenant Database Properties</h3>
<table class="tableblock frame-all grid-all stripes-even stretch">
<caption class="title">Table 3. Tenant Database Properties</caption>
<colgroup>
<col style="width: 25%;">
<col style="width: 25%;">
<col style="width: 25%;">
<col style="width: 25%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Name</th>
<th class="tableblock halign-left valign-top">Env Variable</th>
<th class="tableblock halign-left valign-top">Default Value</th>
<th class="tableblock halign-left valign-top">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">fineract.tenant.host</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">FINERACT_DEFAULT_TENANTDB_HOSTNAME</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">localhost</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">TBD</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">fineract.tenant.port</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">FINERACT_DEFAULT_TENANTDB_PORT</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">3306</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">TBD</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">fineract.tenant.username</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">FINERACT_DEFAULT_TENANTDB_UID</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">root</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">TBD</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">fineract.tenant.password</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">FINERACT_DEFAULT_TENANTDB_PWD</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">mysql</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">TBD</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">fineract.tenant.parameters</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">FINERACT_DEFAULT_TENANTDB_CONN_PARAMS</p></td>
<td class="tableblock halign-left valign-top"></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">TBD</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">fineract.tenant.timezone</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">FINERACT_DEFAULT_TENANTDB_TIMEZONE</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Asia/Kolkata</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">TBD</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">fineract.tenant.identifier</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">FINERACT_DEFAULT_TENANTDB_IDENTIFIER</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">default</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">TBD</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">fineract.tenant.name</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">FINERACT_DEFAULT_TENANTDB_NAME</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">fineract_default</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">TBD</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">fineract.tenant.description</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">FINERACT_DEFAULT_TENANTDB_DESCRIPTION</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Default Demo Tenant</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">TBD</p></td>
</tr>
</tbody>
</table>
</div>
<div class="sect2">
<h3 id="_hikari_connection_pool_properties">Hikari Connection Pool Properties</h3>
<table class="tableblock frame-all grid-all stripes-even stretch">
<caption class="title">Table 4. Hikari Connection Pool Properties</caption>
<colgroup>
<col style="width: 25%;">
<col style="width: 25%;">
<col style="width: 25%;">
<col style="width: 25%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Name</th>
<th class="tableblock halign-left valign-top">Env Variable</th>
<th class="tableblock halign-left valign-top">Default Value</th>
<th class="tableblock halign-left valign-top">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">spring.datasource.hikari.driverClassName</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">FINERACT_HIKARI_DRIVER_SOURCE_CLASS_NAME</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">org.mariadb.jdbc.Driver</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">TBD</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">spring.datasource.hikari.jdbcUrl</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">FINERACT_HIKARI_JDBC_URL</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">jdbc:mariadb://localhost:3306/fineract_tenants</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">TBD</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">spring.datasource.hikari.username</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">FINERACT_HIKARI_USERNAME</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">root</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">TBD</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">spring.datasource.hikari.password</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">FINERACT_HIKARI_PASSWORD</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">mysql</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">TBD</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">spring.datasource.hikari.minimumIdle</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">FINERACT_HIKARI_MINIMUM_IDLE</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">3</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">TBD</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">spring.datasource.hikari.maximumPoolSize</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">FINERACT_HIKARI_MAXIMUM_POOL_SIZE</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">10</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">TBD</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">spring.datasource.hikari.idleTimeout</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">FINERACT_HIKARI_IDLE_TIMEOUT</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">60000</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">TBD</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">spring.datasource.hikari.connectionTimeout</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">FINERACT_HIKARI_CONNECTION_TIMEOUT</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">20000</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">TBD</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">spring.datasource.hikari.connectionTestquery</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">FINERACT_HIKARI_TEST_QUERY</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">SELECT 1</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">TBD</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">spring.datasource.hikari.autoCommit</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">FINERACT_HIKARI_AUTO_COMMIT</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">true</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">TBD</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">spring.datasource.hikari.dataSourceProperties['cachePrepStmts']</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">FINERACT_HIKARI_DS_PROPERTIES_CACHE_PREP_STMTS</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">true</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">TBD</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">spring.datasource.hikari.dataSourceProperties['prepStmtCacheSize']</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">FINERACT_HIKARI_DS_PROPERTIES_PREP_STMT_CACHE_SIZE</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">250</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">TBD</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">spring.datasource.hikari.dataSourceProperties['prepStmtCacheSqlLimit']</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">FINERACT_HIKARI_DS_PROPERTIES_PREP_STMT_CACHE_SQL_LIMIT</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">2048</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">TBD</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">spring.datasource.hikari.dataSourceProperties['useServerPrepStmts']</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">FINERACT_HIKARI_DS_PROPERTIES_USE_SERVER_PREP_STMTS</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">true</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">TBD</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">spring.datasource.hikari.dataSourceProperties['useLocalSessionState']</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">FINERACT_HIKARI_DS_PROPERTIES_USE_LOCAL_SESSION_STATE</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">true</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">TBD</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">spring.datasource.hikari.dataSourceProperties['rewriteBatchedStatements']</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">FINERACT_HIKARI_DS_PROPERTIES_REWRITE_BATCHED_STATEMENTS</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">true</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">TBD</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">spring.datasource.hikari.dataSourceProperties['cacheResultSetMetadata']</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">FINERACT_HIKARI_DS_PROPERTIES_CACHE_RESULT_SET_METADATA</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">true</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">TBD</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">spring.datasource.hikari.dataSourceProperties['cacheServerConfiguration']</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">FINERACT_HIKARI_DS_PROPERTIES_CACHE_SERVER_CONFIGURATION</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">true</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">TBD</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">spring.datasource.hikari.dataSourceProperties['elideSetAutoCommits']</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">FINERACT_HIKARI_DS_PROPERTIES_ELIDE_SET_AUTO_COMMITS</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">true</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">TBD</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">spring.datasource.hikari.dataSourceProperties['maintainTimeStats']</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">FINERACT_HIKARI_DS_PROPERTIES_MAINTAIN_TIME_STATS</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">false</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">TBD</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">spring.datasource.hikari.dataSourceProperties['logSlowQueries']</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">FINERACT_HIKARI_DS_PROPERTIES_LOG_SLOW_QUERIES</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">true</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">TBD</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">spring.datasource.hikari.dataSourceProperties['dumpQueriesOnException']</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">FINERACT_HIKARI_DS_PROPERTIES_DUMP_QUERIES_IN_EXCEPTION</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">true</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">TBD</p></td>
</tr>
</tbody>
</table>
</div>
<div class="sect2">
<h3 id="_ssl_properties">SSL Properties</h3>
<table class="tableblock frame-all grid-all stripes-even stretch">
<caption class="title">Table 5. SSL Properties</caption>
<colgroup>
<col style="width: 25%;">
<col style="width: 25%;">
<col style="width: 25%;">
<col style="width: 25%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Name</th>
<th class="tableblock halign-left valign-top">Env Variable</th>
<th class="tableblock halign-left valign-top">Default Value</th>
<th class="tableblock halign-left valign-top">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">server.ssl.enabled</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">FINERACT_SERVER_SSL_ENABLED</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">true</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">TBD</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">server.ssl.protocol</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">FINERACT_SERVER_SSL_PROTOCOL</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">TLS</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">TBD</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">server.ssl.ciphers</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">FINERACT_SERVER_SSL_CIPHERS</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">TLS_RSA_WITH_AES_128_CBC_SHA256</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">TBD</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">server.ssl.enabled-protocols</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">FINERACT_SERVER_SSL_PROTOCOLS</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">TLSv1.2</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">TBD</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">server.ssl.key-store</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">FINERACT_SERVER_SSL_KEY_STORE</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">classpath:keystore.jks</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">TBD</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">server.ssl.key-store-password</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">FINERACT_SERVER_SSL_KEY_STORE_PASSWORD</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">openmf</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">TBD</p></td>
</tr>
</tbody>
</table>
</div>
<div class="sect2">
<h3 id="_authentication_properties">Authentication Properties</h3>
<table class="tableblock frame-all grid-all stripes-even stretch">
<caption class="title">Table 6. Authentication Properties</caption>
<colgroup>
<col style="width: 25%;">
<col style="width: 25%;">
<col style="width: 25%;">
<col style="width: 25%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Name</th>
<th class="tableblock halign-left valign-top">Env Variable</th>
<th class="tableblock halign-left valign-top">Default Value</th>
<th class="tableblock halign-left valign-top">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">fineract.security.basicauth.enabled</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">FINERACT_SECURITY_BASICAUTH_ENABLED</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">true</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">TBD</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">fineract.security.oauth.enabled</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">FINERACT_SECURITY_OAUTH_ENABLED</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">false</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">TBD</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">fineract.security.2fa.enabled</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">FINERACT_SECURITY_2FA_ENABLED</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">false</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">TBD</p></td>
</tr>
</tbody>
</table>
</div>
<div class="sect2">
<h3 id="_tomcat_properties">Tomcat Properties</h3>
<table class="tableblock frame-all grid-all stripes-even stretch">
<caption class="title">Table 7. Tomcat Properties</caption>
<colgroup>
<col style="width: 25%;">
<col style="width: 25%;">
<col style="width: 25%;">
<col style="width: 25%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Name</th>
<th class="tableblock halign-left valign-top">Env Variable</th>
<th class="tableblock halign-left valign-top">Default Value</th>
<th class="tableblock halign-left valign-top">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">server.tomcat.accept-count</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">FINERACT_SERVER_TOMCAT_ACCEPT_COUNT</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">100</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">TBD</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">server.tomcat.accesslog.enabled</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">FINERACT_SERVER_TOMCAT_ACCESSLOG_ENABLED</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">false</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">TBD</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">server.tomcat.max-connections</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">FINERACT_SERVER_TOMCAT_MAX_CONNECTIONS</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">8192</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">TBD</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">server.tomcat.max-http-form-post-size</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">FINERACT_SERVER_TOMCAT_MAX_HTTP_FORM_POST_SIZE</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">2MB</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">TBD</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">server.tomcat.max-keep-alive-requests</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">FINERACT_SERVER_TOMCAT_MAX_KEEP_ALIVE_REQUESTS</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">100</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">TBD</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">server.tomcat.threads.max</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">FINERACT_SERVER_TOMCAT_THREADS_MAX</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">200</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">TBD</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">server.tomcat.threads.min-spare</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">FINERACT_SERVER_TOMCAT_THREADS_MIN_SPARE</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">10</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">TBD</p></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_third_party_software">Appendix B: Third Party Software</h2>
<div class="sectionbody">
<div class="paragraph">
<p>TBD</p>
</div>
</div>
</div>
</div>
<div id="footer">
<div id="footer-text">
Version 1.6.1-134-feature_fineract_1470<br>
Last updated 2022-04-17 11:34:26 +0200
</div>
</div>
</body>
</html>