Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
b3c3586
renamed transactionProcessingStrategyId to transactionProcessingStrat…
Aug 2, 2023
691e347
TSS-65 restrict employee joining date to be after office opening date
Aug 3, 2023
a1bdc8e
TSS-75 Add demo deployment pipeline
Napho Aug 14, 2023
5402a9a
Merge pull request #108 from FITER1/TSS-65
Napho Aug 16, 2023
e67f9de
Merge pull request #109 from FITER1/TSS-68-Loan-product-editing
Napho Aug 16, 2023
33a020a
TSS-120
Sep 1, 2023
31bc729
Merge pull request #112 from FITER1/TSS-120
faheem205 Sep 5, 2023
b5fb1ef
Feature TSS-105 Limit login re-tries
leonardohildt Sep 9, 2023
290d03b
TSS-105 Limit login re-tries
leonardohildt Sep 9, 2023
64360c6
TSS-123 forgot password feature
tabrez-fiter Sep 10, 2023
02099cf
Merge pull request #115 from FITER1/TSS-105
MageziArthur Sep 10, 2023
927061e
TSS 104 prohibit password
hero78 Sep 11, 2023
0c6ca8e
Merge pull request #117 from FITER1/TSS-104-Prohibit-password-reuse
hero78 Sep 12, 2023
e3e4321
TSS-110
Napho Sep 19, 2023
eaa706b
Merge branch 'demo' into TSS-123
Napho Sep 19, 2023
6f65a3f
Merge pull request #116 from FITER1/TSS-123
Napho Sep 19, 2023
1541872
Merge branch 'develop' into demo
Sep 19, 2023
d20aada
TSS-133
Sep 24, 2023
c036048
Merge pull request #119 from FITER1/TSS-133
faheem205 Sep 25, 2023
5d37813
TSS-128 Enhancement - Error message for blocked user (#121)
leonardohildt Oct 2, 2023
d7e2d8e
TSS-102 Format reset password page
Napho Sep 9, 2023
387fecf
Merge pull request #122 from FITER1/TSS-102
Napho Oct 4, 2023
53ff25b
TSS-147 branding updated to match fiter
Oct 30, 2023
b1c6d68
TSS-145 update date format
Oct 30, 2023
9475d72
Merge pull request #125 from FITER1/TSS-147
faheem205 Nov 7, 2023
8fb0a78
Merge pull request #126 from FITER1/TSS-145
faheem205 Nov 7, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 55 additions & 0 deletions .github/workflows/demo_deployment.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
name: Build for demo

on:
push:
branches: [ demo ]

jobs:

deploy:

name: Deploy archive to ubuntu server
runs-on: ubuntu-latest

steps:
- name: Check out code
uses: actions/checkout@v2

- uses: kamiazya/setup-graphviz@v1
with:
graphviz-version: '2.44.1'

- name: Setup Node.js and Ruby
uses: actions/setup-node@v3
with:
node-version: '16.13.1'


- uses: actions/checkout@v3
- uses: ruby/setup-ruby@ec02537da5712d66d4d50a0f33b7eb52773b5ed1
with:
ruby-version: '2.7'

- name: Install Bower dependencies
run: |
npm install -g bower
bower --allow-root install

- name: Build and archive app package
run: |
npm install --legacy-peer-deps
npm install -g grunt-cli
bundle install
grunt prod

- name: Copy file using SCP
run: |
HOST=${{ secrets.FITER_DEMO_SERVER_URL }}
USER=${{ secrets.FITER_DEMO_SERVER_USERNAME }}
SOURCE_FILE='dist/community-app/*'
DESTINATION_DIR="/home/$USER/mifos/html/"
echo "${{ secrets.FITER_DEMO_SERVER_SSH_KEY }}" > key.pem
chmod 400 key.pem
ssh -i key.pem -o StrictHostKeyChecking=no -l ${{ secrets.FITER_DEMO_SERVER_USERNAME }} ${{ secrets.FITER_DEMO_SERVER_URL }} 'rm -rf /home/$USER/mifos/html/*'
scp -r -i key.pem -o StrictHostKeyChecking=no $SOURCE_FILE $USER@$HOST:$DESTINATION_DIR

33 changes: 33 additions & 0 deletions .project
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,40 @@
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.wst.common.project.facet.core.builder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.wst.validation.validationbuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.buildship.core.gradleprojectbuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.eclipse.buildship.core.gradleprojectnature</nature>
</natures>
<filteredResources>
<filter>
<id>1691994312407</id>
<name></name>
<type>30</type>
<matcher>
<id>org.eclipse.core.resources.regexFilterMatcher</id>
<arguments>node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__</arguments>
</matcher>
</filter>
</filteredResources>
</projectDescription>
6 changes: 3 additions & 3 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@ COPY . /usr/src/app
RUN bower --allow-root install
RUN npm install
RUN bundle install
RUN grunt prod
RUN grunt prod

FROM nginx:1.19.3
FROM nginx:1.25.1
COPY --from=builder /usr/src/app/dist/community-app /usr/share/nginx/html
EXPOSE 80
EXPOSE 80 443
CMD ["nginx", "-g", "daemon off;"]
12 changes: 11 additions & 1 deletion app/global-translations/locale-en.json
Original file line number Diff line number Diff line change
Expand Up @@ -423,6 +423,7 @@
"error.msg.parameter.unsupported": "The parameter `{{params[0].value}}` has been passed and is not supported for this request.",
"error.msg.column.mandatory": "Mandatory field not provided.",
"error.msg.header": "You have the following errors:",
"error.msg.username.not.found": "Username not found in the system.",
"validation.msg.validation.errors.exist": "Validation errors exist.",
"validation.msg.productivecollectionsheet.staffId.cannot.be.blank": "Staff is mandatory.",
"validation.msg.domain.rule.violation": "Errors contain reason for domain rule violation.",
Expand Down Expand Up @@ -625,6 +626,7 @@
"label.anchor.advsearch": "Advanced search",
"label.anchor.keyboardshortcut": "Keyboard Shortcuts",
"label.anchor.save": "Save",
"label.anchor.forgotpassword": "Forgot Password",
"#Inputs": "..",
"label.input.searchbyuser": "Search by user",
"label.input.clienttemplate": "Client Template",
Expand Down Expand Up @@ -2948,6 +2950,7 @@
"error.msg.duplicate.entity.mapping": "Duplicate mapping, EntityMapping already exist",
"error.msg.invalid.endDate": "End date cannot be before start date",
"error.msg.password.reset.days.value.must.be.greater.than.zero": "For enabling 'Force Password Reset Days' configuration , the value (number of days after which a user is forced to reset his password) must be set to a number greater than 0.",
"error.msg.restrict.reuse.password.value.must.be.greater.than.zero": "For enabling 'Restrict-re-use-of-password' configuration , the value (number of previous password/s to reuse) must be set to a number greater than 0.",
"#tool tip for global configuration": "..",
"label.tooltip.global.allow-transactions-on-holiday": "Determines if transactions will be permitted on holidays.",
"label.tooltip.global.allow-transactions-on-non_workingday": "Determines if transactions will be permitted on non-working days, such as weekends.",
Expand Down Expand Up @@ -4414,6 +4417,13 @@
"label.tooltip.fixed.pricipal.percentage.per.installment" : "Principal portion of the instalments except the last installment will be fixed to this value.",
"label.input.change.fixed.principal.percentage.per.installment" : "Change Fixed Principal % per instalment",
"label.input.new.fixed.principal.percentage.per.installment" : "New Fixed Principal % per instalment",

"success.forgot.password.reset":"Password reset Successfully! Check your email.",
"label.button.blockuser": "Block",
"label.button.unblockuser": "Unblock",
"label.heading.blockuser": "Confirm Block?",
"label.heading.unblockuser": "Confirm Unblock?",
"label.input.blockdays": "Block Days",
"validation.msg.user.blockDays.not.greater.than.zero": "Block days should be greater than zero.",
"error.msg.user.locked.out": "Your account has been blocked. Please contact admin for assistance.",
"----End---": "--End of file--- "
}
7 changes: 7 additions & 0 deletions app/global-translations/locale-es.json
Original file line number Diff line number Diff line change
Expand Up @@ -4040,5 +4040,12 @@
"label.anchor.editrate": "Editar Tasa",
"label.error.rate.already.exist": "Tasa ya existe.",
"label.selectrate": "Seleccione Tasa",
"label.button.blockuser": "Bloquear",
"label.button.unblockuser": "Desbloquear",
"label.heading.blockuser": "¿Confirmar el bloqueo?",
"label.heading.unblockuser": "¿Confirmar el desbloqueo?",
"label.input.blockdays": "Días de bloqueo",
"validation.msg.user.blockDays.not.greater.than.zero": "El nro. de días de bloqueo debe ser mayor a cero.",
"error.msg.user.locked.out": "Su cuenta de usuario ha sido bloqueada. Por favor contacte al administrador.",
"----End---": "---Fin del archivo---"
}
Binary file added app/images/fiter.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
82 changes: 54 additions & 28 deletions app/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -46,28 +46,6 @@
</div>
</div>

<div ng-show="resetPassword">
<form class="form-inline pull-right" role="form">
<label><strong>{{ 'label.message.password.expired' | translate }}</strong></label>

<div class="form-group">
<input type="password" data-ng-model="passwordDetails.password"
placeholder="{{ 'label.input.password' | translate }}" class="input-sm form-control"
required
id="password">
</div>
<div class="form-group">
<input type="password" data-ng-model="passwordDetails.repeatPassword"
placeholder="{{ 'label.input.repeatpassword' | translate }}"
class="input-sm form-control"
required id="repeatPassword">
</div>
<button class="btn btn-success" type="submit" data-ng-click="updatePassword()"
id="updatepassword-button">{{ 'label.button.resetPassword' | translate }}
</button>
</form>
</div>

</div>


Expand All @@ -77,48 +55,96 @@
<div class="col-xs-12">
<div class="row">
<div class="col-sm-4 col-sm-offset-4 text-center">
<img src="images/mifos-logo-flat.png" alt="Mifos X" style="width:80%; margin:auto;"
<img src="images/fiter.png" alt="Mifos X" style="width:80%; margin:auto; background-color:red"
class=" text-center img-responsive"/>
</div>
</div>
<hr>

<div data-ng-form="loginForm">

<div class="row" ng-show="resetPassword">
<div class="col-sm-4 col-sm-offset-4">
<form class="form" role="form">
<label><strong>{{ 'label.message.password.expired' | translate }}</strong></label>

<div class="form-group">
<input type="password" data-ng-model="passwordDetails.password"
placeholder="{{ 'label.input.password' | translate }}" class="input-sm form-control"
required
id="password">
</div>
<div class="form-group">
<input type="password" data-ng-model="passwordDetails.repeatPassword"
placeholder="{{ 'label.input.repeatpassword' | translate }}"
class="input-sm form-control"
required id="repeatPassword">
</div>
<button class="btn btn-success" type="submit" data-ng-click="updatePassword()"
id="updatepassword-button">{{ 'label.button.resetPassword' | translate }}
</button>
</form>
</div>
</div>

<div class="row" ng-hide="resetPassword || twoFactorRequired">
<div class="col-sm-4 col-sm-offset-4">

<div class="alert alert-danger" ng-show="authenticationFailed">
{{ authenticationErrorMessage | translate }}
</div>
<div class="alert alert-success" ng-show="forgotPasswordSuccess">
{{ forgotPasswordMessage | translate }}
</div>
<div class="alert alert-danger" ng-show="forgotPasswordFailure">
{{ forgotPasswordMessage | translate }}
</div>

<form class="form">

<div class="form-group">
<div class="form-group" >
<label for="uid">{{ 'label.input.username' | translate | uppercase }}</label>
<input type="text" name="username" id="uid" class="form-control"
ng-model="loginCredentials.username"
placeholder="{{ 'label.input.username' | translate |lowercase }}"
required/>
</div>

<div class="form-group">
<div class="form-group" ng-hide="isforgotpassword">
<label for="pwd">{{ 'label.input.password' | translate | uppercase }}</label>
<input type="password" name="password" id="pwd" class="form-control"
ng-model="loginCredentials.password" autocomplete="new-password"
placeholder="{{ 'label.input.password' | translate | lowercase }}"
required/>
ng-required="!isforgotpassword"/>
</div>

<div class="form-group">
<button class="btn btn-block btn-primary" type="submit" data-ng-show="!load" data-ng-click="login()"
<div class="form-group" >
<button ng-hide="isforgotpassword" class="btn btn-block btn-primary" type="submit" data-ng-show="!load" data-ng-click="login()"
id="login-button">
{{'label.button.signin' | translate }}
</button>
<button ng-show="isforgotpassword" class="btn btn-block btn-primary" type="submit" data-ng-show="!load" data-ng-click="forgotpassword()"
id="login-button">
{{'label.button.submit' | translate }}
</button>
<button class="btn btn-block btn-primary" type="submit" data-ng-show="load">
<img data-ng-src="images/ring.svg" alt=""> <b>loading...</b>
</button>
</div>

<div class="form-group">
<ul class="list-unstyled">
<li><a target="#"
data-ng-click="isforgotpassword = !isforgotpassword">
<p ng-show="!isforgotpassword">
{{ 'label.anchor.forgotpassword' | translate }}
</p>
<p ng-show="isforgotpassword">
{{ 'label.button.back' | translate }}
</p>
</a></li>
</ul>
</div>

</form>

Expand Down
30 changes: 14 additions & 16 deletions app/scripts/controllers/client/EditClientController.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,19 +25,13 @@
firstname: data.firstname,
lastname: data.lastname,
middlename: data.middlename,
active: data.active,
accountNo: data.accountNo,
staffId: data.staffId,
externalId: data.externalId,
isStaff:data.isStaff,
mobileNo: data.mobileNo,
savingsProductId: data.savingsProductId,
genderId: data.gender.id,
fullname: data.fullname,
clientNonPersonDetails : {
incorpNumber: data.clientNonPersonDetails.incorpNumber,
remarks: data.clientNonPersonDetails.remarks
}
};

if(data.gender){
Expand All @@ -56,13 +50,22 @@
scope.displayPersonOrNonPersonOptions(data.legalForm.id);
scope.formData.legalFormId = data.legalForm.id;
}
if (data.clientNonPersonDetails) {
scope.formData.clientNonPersonDetails.incorpNumber = data.clientNonPersonDetails.incorpNumber;
scope.formData.clientNonPersonDetails.remarks = data.clientNonPersonDetails.remarks;

if(data.clientNonPersonDetails.constitution){
scope.formData.clientNonPersonDetails.constitutionId = data.clientNonPersonDetails.constitution.id;
}
if(data.clientNonPersonDetails.constitution){
scope.formData.clientNonPersonDetails.constitutionId = data.clientNonPersonDetails.constitution.id;
}

if(data.clientNonPersonDetails.mainBusinessLine){
scope.formData.clientNonPersonDetails.mainBusinessLineId = data.clientNonPersonDetails.mainBusinessLine.id;
}

if(data.clientNonPersonDetails.mainBusinessLine){
scope.formData.clientNonPersonDetails.mainBusinessLineId = data.clientNonPersonDetails.mainBusinessLine.id;
if (data.clientNonPersonDetails.incorpValidityTillDate) {
var incorpValidityTillDate = dateFilter(data.clientNonPersonDetails.incorpValidityTillDate, scope.df);
scope.date.incorpValidityTillDate = new Date(incorpValidityTillDate);
}
}

if (data.savingsProductId != null) {
Expand All @@ -77,11 +80,6 @@
scope.date.dateOfBirth = new Date(dobDate);
}

if (data.clientNonPersonDetails.incorpValidityTillDate) {
var incorpValidityTillDate = dateFilter(data.clientNonPersonDetails.incorpValidityTillDate, scope.df);
scope.date.incorpValidityTillDate = new Date(incorpValidityTillDate);
}

var actDate = dateFilter(data.activationDate, scope.df);
scope.date.activationDate = new Date(actDate);
if (data.active) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,7 @@
scope.formData.graceOnPrincipalPayment = scope.loanaccountinfo.graceOnPrincipalPayment;
scope.formData.graceOnInterestPayment = scope.loanaccountinfo.graceOnInterestPayment;
scope.formData.graceOnArrearsAgeing = scope.loanaccountinfo.graceOnArrearsAgeing;
scope.formData.transactionProcessingStrategyId = scope.loanaccountinfo.transactionProcessingStrategyId;
scope.formData.transactionProcessingStrategyCode = scope.loanaccountinfo.transactionProcessingStrategyCode;
scope.formData.graceOnInterestCharged = scope.loanaccountinfo.graceOnInterestCharged;
scope.formData.syncDisbursementWithMeeting = scope.loanaccountinfo.syncDisbursementWithMeeting;
scope.formData.fixedEmiAmount = scope.loanaccountinfo.fixedEmiAmount;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -150,8 +150,8 @@
scope.formData.syncRepaymentsWithMeeting = true;
scope.formData.syncDisbursementWithMeeting = true;
}
scope.multiDisburseLoan = scope.loanaccountinfo.multiDisburseLoan;
scope.formData.productId = scope.loanaccountinfo.loanProductId;
scope.multiDisburseLoan = scope.loanaccountinfo.product.multiDisburseLoan;
scope.formData.productId = scope.loanaccountinfo.product.id;
scope.formData.fundId = scope.loanaccountinfo.fundId;
scope.formData.principal = scope.loanaccountinfo.principal;
scope.formData.loanTermFrequency = scope.loanaccountinfo.termFrequency;
Expand All @@ -176,6 +176,7 @@
scope.formData.graceOnInterestPayment = scope.loanaccountinfo.graceOnInterestPayment;
scope.formData.graceOnArrearsAgeing = scope.loanaccountinfo.graceOnArrearsAgeing;
scope.formData.transactionProcessingStrategyId = scope.loanaccountinfo.transactionProcessingStrategyId;
scope.formData.transactionProcessingStrategyCode = scope.loanaccountinfo.product.transactionProcessingStrategyCode;
scope.loandetails.transactionProcessingStrategyValue = scope.formValue(scope.loanaccountinfo.transactionProcessingStrategyOptions,scope.formData.transactionProcessingStrategyId,'id','name');
scope.formData.graceOnInterestCharged = scope.loanaccountinfo.graceOnInterestCharged;
scope.formData.fixedEmiAmount = scope.loanaccountinfo.fixedEmiAmount;
Expand Down
Loading