From b3c35867c09aaaf7bada3b9dcac0c6e9123943bf Mon Sep 17 00:00:00 2001 From: Faheem Ahmad Date: Wed, 2 Aug 2023 19:18:44 +0500 Subject: [PATCH 01/14] renamed transactionProcessingStrategyId to transactionProcessingStrategyCode --- .../controllers/product/CreateLoanProductController.js | 5 +++-- .../controllers/product/EditLoanProductController.js | 6 +++--- app/views/products/createloanproduct.html | 8 ++++---- app/views/products/editloanproduct.html | 6 +++--- 4 files changed, 13 insertions(+), 12 deletions(-) diff --git a/app/scripts/controllers/product/CreateLoanProductController.js b/app/scripts/controllers/product/CreateLoanProductController.js index 2171dd9a..fe0bdb95 100755 --- a/app/scripts/controllers/product/CreateLoanProductController.js +++ b/app/scripts/controllers/product/CreateLoanProductController.js @@ -64,7 +64,7 @@ scope.formData.amortizationType = scope.product.amortizationType.id; scope.formData.interestType = scope.product.interestType.id; scope.formData.interestCalculationPeriodType = scope.product.interestCalculationPeriodType.id; - scope.formData.transactionProcessingStrategyId = scope.product.transactionProcessingStrategyOptions[0].id; + scope.formData.transactionProcessingStrategyCode = scope.product.transactionProcessingStrategyOptions[0].code; scope.formData.principalVariationsForBorrowerCycle = scope.product.principalVariationsForBorrowerCycle; scope.formData.interestRateVariationsForBorrowerCycle = scope.product.interestRateVariationsForBorrowerCycle; scope.formData.numberOfRepaymentVariationsForBorrowerCycle = scope.product.numberOfRepaymentVariationsForBorrowerCycle; @@ -360,7 +360,7 @@ scope.selectedConfigurableAttributes = {amortizationType:scope.amortization, interestType:scope.interestMethod, - transactionProcessingStrategyId:scope.transactionProcessingStrategy, + transactionProcessingStrategyCode:scope.transactionProcessingStrategy, interestCalculationPeriodType:scope.interestCalcPeriod, inArrearsTolerance:scope.arrearsTolerance, repaymentEvery:scope.repaymentFrequency, @@ -377,6 +377,7 @@ this.formData.startDate = reqFirstDate; this.formData.closeDate = reqSecondDate; this.formData.rates = scope.rates; + this.formData.transactionProcessingStrategyCode = scope.formData.transactionProcessingStrategyCode; //Interest recalculation data if (this.formData.isInterestRecalculationEnabled) { diff --git a/app/scripts/controllers/product/EditLoanProductController.js b/app/scripts/controllers/product/EditLoanProductController.js index 6d8e7a28..b9c54d50 100755 --- a/app/scripts/controllers/product/EditLoanProductController.js +++ b/app/scripts/controllers/product/EditLoanProductController.js @@ -77,7 +77,7 @@ interestCalculationPeriodType: scope.product.interestCalculationPeriodType.id, allowPartialPeriodInterestCalcualtion:scope.product.allowPartialPeriodInterestCalcualtion, inArrearsTolerance: scope.product.inArrearsTolerance, - transactionProcessingStrategyId: scope.product.transactionProcessingStrategyId, + transactionProcessingStrategyCode: scope.product.transactionProcessingStrategyCode, graceOnPrincipalPayment: scope.product.graceOnPrincipalPayment, graceOnInterestPayment: scope.product.graceOnInterestPayment, graceOnInterestCharged: scope.product.graceOnInterestCharged, @@ -143,7 +143,7 @@ scope.interestMethod = scope.product.allowAttributeOverrides.interestType; scope.graceOnPrincipalAndInterest = scope.product.allowAttributeOverrides.graceOnPrincipalAndInterestPayment; scope.repaymentFrequency = scope.product.allowAttributeOverrides.repaymentEvery; - scope.transactionProcessingStrategy = scope.product.allowAttributeOverrides.transactionProcessingStrategyId; + scope.transactionProcessingStrategy = scope.product.allowAttributeOverrides.transactionProcessingStrategyCode; } if(scope.amortization || scope.arrearsTolerance || scope.graceOnArrearsAgeing || scope.interestCalcPeriod || scope.interestMethod || scope.graceOnPrincipalAndInterest || @@ -512,7 +512,7 @@ scope.selectedConfigurableAttributes = {amortizationType:scope.amortization, interestType:scope.interestMethod, - transactionProcessingStrategyId:scope.transactionProcessingStrategy, + transactionProcessingStrategyCode:scope.transactionProcessingStrategy, interestCalculationPeriodType:scope.interestCalcPeriod, inArrearsTolerance:scope.arrearsTolerance, repaymentEvery:scope.repaymentFrequency, diff --git a/app/views/products/createloanproduct.html b/app/views/products/createloanproduct.html index 0c86d612..8151aa3b 100755 --- a/app/views/products/createloanproduct.html +++ b/app/views/products/createloanproduct.html @@ -698,11 +698,11 @@
- + ng-options="transactionProcessingStrategy.code as transactionProcessingStrategy.name for transactionProcessingStrategy in product.transactionProcessingStrategyOptions" + ng-change = "loanproduct.transactionProcessingStrategy.name = formValue(product.transactionProcessingStrategyOptions,formData.transactionProcessingStrategyCode,'code','name')" + value="{{transactionProcessingStrategy.code}}">
diff --git a/app/views/products/editloanproduct.html b/app/views/products/editloanproduct.html index c100540a..254a1f97 100755 --- a/app/views/products/editloanproduct.html +++ b/app/views/products/editloanproduct.html @@ -549,10 +549,10 @@

{{ 'label.heading.settings' | translate }}

class="required">*
- + class="form-control" is-open="opened" min="minDate()" max="restrictDate"/>
From a1bdc8e2f07cf7c4e458ce97e50a54edaa294db2 Mon Sep 17 00:00:00 2001 From: Napho Date: Mon, 14 Aug 2023 15:21:26 +0300 Subject: [PATCH 03/14] TSS-75 Add demo deployment pipeline --- .github/workflows/demo_deployment.yaml | 59 ++++++++++++++++++++++++++ .project | 33 ++++++++++++++ Dockerfile | 6 +-- 3 files changed, 95 insertions(+), 3 deletions(-) create mode 100644 .github/workflows/demo_deployment.yaml diff --git a/.github/workflows/demo_deployment.yaml b/.github/workflows/demo_deployment.yaml new file mode 100644 index 00000000..16d946c9 --- /dev/null +++ b/.github/workflows/demo_deployment.yaml @@ -0,0 +1,59 @@ +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 + tar -czvf app.tar.gz dist/community-app + + - name: Copy file using SCP + run: | + HOST=${{ secrets.FITER_DEMO_SERVER_URL }} + USER=${{ secrets.FITER_DEMO_SERVER_USERNAME }} + SOURCE_FILE=app.tar.gz + DESTINATION_DIR="/home/ubuntu/mifos/" + echo "${{ secrets.FITER_DEMO_SERVER_SSH_KEY }}" > key.pem + chmod 400 key.pem + scp -i key.pem -o StrictHostKeyChecking=no $SOURCE_FILE $USER@$HOST:$DESTINATION_DIR + + - name: Build image on server and deploy + run: ssh -i key.pem -o StrictHostKeyChecking=no -l ${{ secrets.FITER_DEMO_SERVER_USERNAME }} ${{ secrets.FITER_DEMO_SERVER_URL }} '/home/ubuntu/mifos/deploy.sh' + + diff --git a/.project b/.project index 73874d78..b2262910 100644 --- a/.project +++ b/.project @@ -5,7 +5,40 @@ + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.wst.common.project.facet.core.builder + + + + + org.eclipse.wst.validation.validationbuilder + + + + + org.eclipse.buildship.core.gradleprojectbuilder + + + + org.eclipse.jdt.core.javanature + org.eclipse.buildship.core.gradleprojectnature + + + 1691994312407 + + 30 + + org.eclipse.core.resources.regexFilterMatcher + node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__ + + + diff --git a/Dockerfile b/Dockerfile index 8e724ad8..f9d71fe7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -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;"] From 33a020af5da7dfa21f6938048d8db364d801370d Mon Sep 17 00:00:00 2001 From: Faheem Ahmad Date: Fri, 1 Sep 2023 17:21:29 +0500 Subject: [PATCH 04/14] TSS-120 --- .../controllers/loanAccount/EditLoanAccAppController.js | 2 +- .../controllers/loanAccount/NewLoanAccAppController.js | 5 +++-- app/views/loans/editloanaccount.html | 6 +++--- app/views/loans/newloanaccount.html | 6 +++--- 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/app/scripts/controllers/loanAccount/EditLoanAccAppController.js b/app/scripts/controllers/loanAccount/EditLoanAccAppController.js index 14bad683..195c3655 100755 --- a/app/scripts/controllers/loanAccount/EditLoanAccAppController.js +++ b/app/scripts/controllers/loanAccount/EditLoanAccAppController.js @@ -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; diff --git a/app/scripts/controllers/loanAccount/NewLoanAccAppController.js b/app/scripts/controllers/loanAccount/NewLoanAccAppController.js index 16675f35..adf3ad0f 100755 --- a/app/scripts/controllers/loanAccount/NewLoanAccAppController.js +++ b/app/scripts/controllers/loanAccount/NewLoanAccAppController.js @@ -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; @@ -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; diff --git a/app/views/loans/editloanaccount.html b/app/views/loans/editloanaccount.html index fa9a7447..e8130353 100755 --- a/app/views/loans/editloanaccount.html +++ b/app/views/loans/editloanaccount.html @@ -281,9 +281,9 @@ -  {{ 'label.heading.savingsLinkage' | translate}} - From b5fb1ef35791e948a6031b20da1f68f346f5bdab Mon Sep 17 00:00:00 2001 From: Leonardo Hildt Date: Sat, 9 Sep 2023 16:20:07 -0300 Subject: [PATCH 05/14] Feature TSS-105 Limit login re-tries --- app/global-translations/locale-en.json | 7 +++- app/global-translations/locale-es.json | 6 +++ .../controllers/user/ViewUserController.js | 41 +++++++++++++++++++ .../services/ResourceFactoryProvider.js | 3 +- app/views/administration/viewuser.html | 34 +++++++++++++++ 5 files changed, 89 insertions(+), 2 deletions(-) diff --git a/app/global-translations/locale-en.json b/app/global-translations/locale-en.json index bce40a1f..d9d0ae64 100644 --- a/app/global-translations/locale-en.json +++ b/app/global-translations/locale-en.json @@ -4414,6 +4414,11 @@ "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", - + "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.", "----End---": "--End of file--- " } diff --git a/app/global-translations/locale-es.json b/app/global-translations/locale-es.json index fdfb3e77..301af2dc 100644 --- a/app/global-translations/locale-es.json +++ b/app/global-translations/locale-es.json @@ -4040,5 +4040,11 @@ "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.", "----End---": "---Fin del archivo---" } diff --git a/app/scripts/controllers/user/ViewUserController.js b/app/scripts/controllers/user/ViewUserController.js index 157d24e3..ef14ee13 100644 --- a/app/scripts/controllers/user/ViewUserController.js +++ b/app/scripts/controllers/user/ViewUserController.js @@ -18,6 +18,19 @@ controller: UserDeleteCtrl }); }; + scope.blockuser = function (blockdays) { + $uibModal.open({ + templateUrl: 'blockuser.html', + controller: UserBlockCtrl + }); + }; + + scope.unblockuser = function () { + $uibModal.open({ + templateUrl: 'unblockuser.html', + controller: UserUnblockCtrl + }); + }; var ModalInstanceCtrl = function ($scope, $uibModalInstance) { $scope.save = function (staffId) { resourceFactory.userListResource.update({'userId': routeParams.id}, this.formData, function (data) { @@ -48,6 +61,34 @@ }; }; + var UserBlockCtrl = function ($scope, $uibModalInstance) { + $scope.data = { + blockDays: 1, + locale: scope.optlang.code + }; + $scope.block = function () { + resourceFactory.userListResource.blockOrUnblock({'userId': routeParams.id, command: 'block'}, $scope.data, function (data) { + $uibModalInstance.close('block'); + route.reload(); + }); + }; + $scope.cancel = function () { + $uibModalInstance.dismiss('cancel'); + }; + }; + + var UserUnblockCtrl = function ($scope, $uibModalInstance) { + $scope.unblock = function () { + resourceFactory.userListResource.blockOrUnblock({'userId': routeParams.id, command: 'unblock'}, {}, function (data) { + $uibModalInstance.close('unblock'); + route.reload(); + }); + }; + $scope.cancel = function () { + $uibModalInstance.dismiss('cancel'); + }; + } + } }); mifosX.ng.application.controller('ViewUserController', ['$scope', '$routeParams', '$route', '$location', 'ResourceFactory', '$uibModal', mifosX.controllers.ViewUserController]).run(function ($log) { diff --git a/app/scripts/services/ResourceFactoryProvider.js b/app/scripts/services/ResourceFactoryProvider.js index 76b07667..75531c6c 100755 --- a/app/scripts/services/ResourceFactoryProvider.js +++ b/app/scripts/services/ResourceFactoryProvider.js @@ -263,7 +263,8 @@ }), userListResource: defineResource(apiVer + "/users/:userId", {userId: '@userId'}, { getAllUsers: {method: 'GET', params: {}, isArray: true}, - update: { method: 'PUT' } + update: { method: 'PUT' }, + blockOrUnblock: {method: 'POST', params: {userId: '@userId',command: '@command', blockDays: '@blockDays'}} }), userTemplateResource: defineResource(apiVer + "/users/template", {}, { get: {method: 'GET', params: {}} diff --git a/app/views/administration/viewuser.html b/app/views/administration/viewuser.html index fccd61e5..ea9e6c6e 100644 --- a/app/views/administration/viewuser.html +++ b/app/views/administration/viewuser.html @@ -43,9 +43,43 @@

{{'label.heading.delete' | translate}}

+ +
+ + {{'label.button.edit' | translate}} +
+ + diff --git a/app/scripts/controllers/main/LoginFormController.js b/app/scripts/controllers/main/LoginFormController.js index 68dd7035..52727c45 100644 --- a/app/scripts/controllers/main/LoginFormController.js +++ b/app/scripts/controllers/main/LoginFormController.js @@ -4,6 +4,8 @@ scope.loginCredentials = {}; scope.passwordDetails = {}; scope.authenticationFailed = false; + scope.forgotPasswordFailure = false; + scope.forgotPasswordSuccess = false; scope.load = false; scope.twoFactorRequired = false; @@ -13,6 +15,7 @@ scope.otpToken = null; scope.selectedDeliveryMethodName = null; scope.twofactorRememberMe = false; + scope.isforgotpassword = false; scope.login = function () { scope.authenticationFailed = false; @@ -111,7 +114,32 @@ } scope.otpTokenError = true; }); + scope.forgotpassword = function () { + authenticationService.forgotPassword(scope.loginCredentials); + delete scope.loginCredentials.username; + }; + scope.$on("UserForgotPasswordFailureEvent", function (event, data, status) { + scope.forgotPasswordFailure = true; + scope.forgotPasswordSuccess = false; + scope.authenticationFailed = false; + scope.load = false; + if(status == 404) { + scope.forgotPasswordMessage = 'error.msg.username.not.found'; + } else { + scope.forgotPasswordMessage = 'error.connection.failed'; + } + }); + + scope.$on("UserForgotPasswordSuccessEvent", function (event, data) { + scope.load = false; + scope.forgotPasswordSuccess = true; + scope.forgotPasswordFailure = false; + scope.authenticationFailed = false; + scope.forgotPasswordMessage = 'success.forgot.password.reset'; + scope.loginCredentials.username=''; + scope.load = false; + }); } }); diff --git a/app/scripts/services/AuthenticationService.js b/app/scripts/services/AuthenticationService.js index 99286b4e..982be8fe 100644 --- a/app/scripts/services/AuthenticationService.js +++ b/app/scripts/services/AuthenticationService.js @@ -154,6 +154,24 @@ httpService.post(apiVer + "/twofactor/invalidate", '{"token": "' + twoFactorAccessToken + '"}'); }); + + this.forgotPassword = function (credentials) { + httpService.post(apiVer + "/password/forgot-password", { "username": credentials.username}) + .then(onForgotPasswordSuccess) + .catch(onForgotPasswordFailure); + }; + + + var onForgotPasswordSuccess = function (response) { + var data = response.data; + scope.$broadcast("UserForgotPasswordSuccessEvent", data); + }; + + var onForgotPasswordFailure = function (response) { + var data = response.data; + var status = response.status; + scope.$broadcast("UserForgotPasswordFailureEvent", data, status); + }; } }); mifosX.ng.services.service('AuthenticationService', ['$rootScope', 'HttpService', 'SECURITY', 'localStorageService','$timeout','webStorage', mifosX.services.AuthenticationService]).run(function ($log) { From 927061e6d40ea339d815a0df1812a81a61bdb646 Mon Sep 17 00:00:00 2001 From: Mwesigye John Bosco Date: Mon, 11 Sep 2023 18:52:25 +0300 Subject: [PATCH 08/14] TSS 104 prohibit password --- app/global-translations/locale-en.json | 1 + 1 file changed, 1 insertion(+) diff --git a/app/global-translations/locale-en.json b/app/global-translations/locale-en.json index bce40a1f..88d7c090 100644 --- a/app/global-translations/locale-en.json +++ b/app/global-translations/locale-en.json @@ -2948,6 +2948,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.", From e3e432196040c3b81e36f22d1f6240f5f24afbee Mon Sep 17 00:00:00 2001 From: Naphlin Peter Date: Tue, 19 Sep 2023 10:11:23 +0300 Subject: [PATCH 09/14] TSS-110 Signed-off-by: Naphlin Peter --- .github/workflows/demo_deployment.yaml | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/.github/workflows/demo_deployment.yaml b/.github/workflows/demo_deployment.yaml index 16d946c9..a4114f30 100644 --- a/.github/workflows/demo_deployment.yaml +++ b/.github/workflows/demo_deployment.yaml @@ -41,19 +41,15 @@ jobs: npm install -g grunt-cli bundle install grunt prod - tar -czvf app.tar.gz dist/community-app - name: Copy file using SCP run: | HOST=${{ secrets.FITER_DEMO_SERVER_URL }} USER=${{ secrets.FITER_DEMO_SERVER_USERNAME }} - SOURCE_FILE=app.tar.gz - DESTINATION_DIR="/home/ubuntu/mifos/" + SOURCE_FILE='dist/community-app/*' + DESTINATION_DIR="/home/$USER/mifos/html/" echo "${{ secrets.FITER_DEMO_SERVER_SSH_KEY }}" > key.pem chmod 400 key.pem - scp -i key.pem -o StrictHostKeyChecking=no $SOURCE_FILE $USER@$HOST:$DESTINATION_DIR + 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 - - name: Build image on server and deploy - run: ssh -i key.pem -o StrictHostKeyChecking=no -l ${{ secrets.FITER_DEMO_SERVER_USERNAME }} ${{ secrets.FITER_DEMO_SERVER_URL }} '/home/ubuntu/mifos/deploy.sh' - - From d20aadaff05eae5937ab8ac70a923a0f00abff04 Mon Sep 17 00:00:00 2001 From: Faheem Ahmad Date: Sun, 24 Sep 2023 22:57:14 +0500 Subject: [PATCH 10/14] TSS-133 --- .../client/EditClientController.js | 30 +++++++++---------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/app/scripts/controllers/client/EditClientController.js b/app/scripts/controllers/client/EditClientController.js index 1f148d91..f3f564c6 100755 --- a/app/scripts/controllers/client/EditClientController.js +++ b/app/scripts/controllers/client/EditClientController.js @@ -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){ @@ -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) { @@ -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) { From 5d3781321853e2fa2e47a510f30c99bae18e9702 Mon Sep 17 00:00:00 2001 From: Leonardo Hildt <108893281+leonardohildt@users.noreply.github.com> Date: Mon, 2 Oct 2023 19:29:48 -0300 Subject: [PATCH 11/14] TSS-128 Enhancement - Error message for blocked user (#121) --- app/global-translations/locale-en.json | 1 + app/global-translations/locale-es.json | 1 + app/scripts/controllers/main/LoginFormController.js | 5 ++++- 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/app/global-translations/locale-en.json b/app/global-translations/locale-en.json index 1d1a56b7..72c24109 100644 --- a/app/global-translations/locale-en.json +++ b/app/global-translations/locale-en.json @@ -4424,5 +4424,6 @@ "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--- " } diff --git a/app/global-translations/locale-es.json b/app/global-translations/locale-es.json index 301af2dc..f42d8356 100644 --- a/app/global-translations/locale-es.json +++ b/app/global-translations/locale-es.json @@ -4046,5 +4046,6 @@ "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---" } diff --git a/app/scripts/controllers/main/LoginFormController.js b/app/scripts/controllers/main/LoginFormController.js index 52727c45..6d4c696d 100644 --- a/app/scripts/controllers/main/LoginFormController.js +++ b/app/scripts/controllers/main/LoginFormController.js @@ -27,7 +27,10 @@ scope.$on("UserAuthenticationFailureEvent", function (event, data, status) { delete scope.loginCredentials.password; scope.authenticationFailed = true; - if(status != 401) { + if(status == 403) { + scope.authenticationErrorMessage = 'error.msg.user.locked.out'; + scope.load = false; + } else if(status != 401) { scope.authenticationErrorMessage = 'error.connection.failed'; scope.load = false; } else { From d7e2d8ea8be37263ef88995b6ee5ad8ab81d271e Mon Sep 17 00:00:00 2001 From: Napho Date: Sat, 9 Sep 2023 17:51:49 +0300 Subject: [PATCH 12/14] TSS-102 Format reset password page --- app/index.html | 46 ++++++++++++++++++++++++---------------------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/app/index.html b/app/index.html index 7e535a3c..1c7c0351 100755 --- a/app/index.html +++ b/app/index.html @@ -46,28 +46,6 @@
-
-
- - -
- -
-
- -
- -
-
- @@ -85,6 +63,30 @@
+
+
+
+ + +
+ +
+
+ +
+ +
+
+
+
From 53ff25b0f4ad3c756fcb31ea3ba3cddd5ba7b216 Mon Sep 17 00:00:00 2001 From: Faheem Ahmad Date: Mon, 30 Oct 2023 17:21:14 +0500 Subject: [PATCH 13/14] TSS-147 branding updated to match fiter --- app/images/fiter.png | Bin 0 -> 6023 bytes app/index.html | 2 +- app/styles/styles.css | 24 ++++++++++++------------ app/views/_topnavbar.html | 2 +- app/views/private/home_default.html | 2 +- app/views/private/home_superuser.html | 4 ++-- 6 files changed, 17 insertions(+), 17 deletions(-) create mode 100644 app/images/fiter.png diff --git a/app/images/fiter.png b/app/images/fiter.png new file mode 100644 index 0000000000000000000000000000000000000000..5d27bbdd4e89a9fa90665722ab6c3992c0df5d06 GIT binary patch literal 6023 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 Z02%quC$fcXZ~t@B(>8is^T;Xk{{hIosZam_ literal 0 HcmV?d00001 diff --git a/app/index.html b/app/index.html index 1c7c0351..35c76250 100755 --- a/app/index.html +++ b/app/index.html @@ -55,7 +55,7 @@
- Mifos X
diff --git a/app/styles/styles.css b/app/styles/styles.css index f1cddb92..76347dc2 100644 --- a/app/styles/styles.css +++ b/app/styles/styles.css @@ -4519,8 +4519,8 @@ a.btn.disabled, fieldset[disabled] a.btn { /* line 71, ../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_buttons.scss */ .btn-primary { color: #fff; - background-color: #4f99ed; - border-color: #388ceb; + background-color: #f2132c; + border-color: #f2132c; } /* line 11, ../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_buttons.scss */ .btn-primary:focus, .btn-primary.focus { @@ -4531,8 +4531,8 @@ a.btn.disabled, fieldset[disabled] a.btn { /* line 17, ../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_buttons.scss */ .btn-primary:hover { color: #fff; - background-color: #217ee8; - border-color: #156dd0; + background-color: #d91127; + border-color: #d91127; } /* line 22, ../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_buttons.scss */ .btn-primary:active, .btn-primary.active, .open > .btn-primary.dropdown-toggle { @@ -10518,12 +10518,12 @@ textarea { /* line 48, ../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_scaffolding.scss */ a { - color: #4f99ed; + color: #f2132c; text-decoration: none; } /* line 52, ../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_scaffolding.scss */ a:hover, a:focus { - color: #1672d9; + color: #d91127; text-decoration: underline; } /* line 58, ../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_scaffolding.scss */ @@ -13062,8 +13062,8 @@ a.btn.disabled, fieldset[disabled] a.btn { /* line 71, ../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_buttons.scss */ .btn-primary { color: #fff; - background-color: #4f99ed; - border-color: #388ceb; + background-color: #f2132c; + border-color: #f2132c; } /* line 11, ../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_buttons.scss */ .btn-primary:focus, .btn-primary.focus { @@ -13074,8 +13074,8 @@ a.btn.disabled, fieldset[disabled] a.btn { /* line 17, ../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_buttons.scss */ .btn-primary:hover { color: #fff; - background-color: #217ee8; - border-color: #156dd0; + background-color: #d91127; + border-color: #d91127; } /* line 22, ../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_buttons.scss */ .btn-primary:active, .btn-primary.active, .open > .btn-primary.dropdown-toggle { @@ -19717,7 +19717,7 @@ body { /* line 20, ../styles-dev/main/components/_content.scss */ ul.nav-tabs > li.active > a { - border-top: solid 3px #428bca !important; + border-top: solid 3px #f2132c !important; } /* line 27, ../styles-dev/main/components/_content.scss */ @@ -20441,7 +20441,7 @@ span.required { /* line 9, ../styles-dev/main/components/_layout.scss */ .navbar-default .navbar-nav .open .dropdown-menu > li > a, .navbar-default .navbar-nav > li > a { - color: #4f99ed !important; + color: #f2132c !important; } /* line 13, ../styles-dev/main/components/_layout.scss */ diff --git a/app/views/_topnavbar.html b/app/views/_topnavbar.html index 889ed9be..332fa085 100644 --- a/app/views/_topnavbar.html +++ b/app/views/_topnavbar.html @@ -11,7 +11,7 @@ - Mifos X + Mifos X
- MifosX + MifosX MifosX
diff --git a/app/views/private/home_superuser.html b/app/views/private/home_superuser.html index 3e0d550b..b514b0fe 100644 --- a/app/views/private/home_superuser.html +++ b/app/views/private/home_superuser.html @@ -17,8 +17,8 @@

{{'label.heading.navigation.guide' | translate}}:

{{'label.heading.top.menu' | translate}}    {{'label.heading.right.search' | translate}}
-
- MifosX +
+ MifosX MifosX
From b1c6d687ad28ea20f76ff13212191523ce071f12 Mon Sep 17 00:00:00 2001 From: Faheem Ahmad Date: Mon, 30 Oct 2023 21:09:45 +0500 Subject: [PATCH 14/14] TSS-145 update date format --- app/views/loans/viewloanaccountdetails.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/loans/viewloanaccountdetails.html b/app/views/loans/viewloanaccountdetails.html index 6d72a187..1cb16756 100755 --- a/app/views/loans/viewloanaccountdetails.html +++ b/app/views/loans/viewloanaccountdetails.html @@ -823,7 +823,7 @@

{{'label.heading.currentBalance' | translate}}: {{loandetails.currency.displ {{'label.heading.interestrate' | translate}} - {{period.fromDate}} + {{period.fromDate | DateFormat}} {{period.effectiveInterestRate}}