From d0973f7468b81ecdaab09b206d8b38f810aeeeeb Mon Sep 17 00:00:00 2001 From: GopalaKrishnan P Date: Fri, 24 Nov 2017 10:06:05 +0530 Subject: [PATCH] Entity Datatable UI & Wizard Screens (#2417) --- app/global-translations/locale-en.json | 6 +- .../client/ClientActionsController.js | 143 +- .../groups/CreateGroupController.js | 8 +- .../controllers/groups/EditGroupController.js | 141 + .../LoanAccountActionsController.js | 187 +- .../loanAccount/NewLoanAccAppController.js | 41 +- .../loanAccount/ViewLoanDetailsController.js | 1 + .../CreateFixedDepositProductController.js | 14 + .../product/CreateLoanProductController.js | 20 +- ...CreateRecurringDepositProductController.js | 14 +- .../product/CreateSavingProductController.js | 21 +- .../product/CreateShareProductController.js | 17 +- .../savings/CreateSavingAccountController.js | 32 +- .../savings/SavingAccountActionsController.js | 171 +- .../shares/CreateShareAccountController.js | 17 + .../directives/ApiValidationDirective.js | 4 +- app/scripts/mifosXComponents.js | 1 + app/scripts/modules/angular-wizard.js | 421 +- app/styles-dev/main/_custom_mixins.scss | 11 + app/styles-dev/main/components/_content.scss | 187 +- app/styles-dev/main/components/_report.scss | 27 + .../main/components/_variables.scss | 18 + app/styles/styles.css | 181 +- app/views/clients/clientactions.html | 95 +- app/views/clients/createclient.html | 8 +- app/views/groups/creategroup.html | 98 +- app/views/groups/editgroup.html | 102 +- app/views/loans/loanaccountactions.html | 153 +- app/views/loans/newloanaccount.html | 1651 +++++--- .../entitydatatablechecks.html | 5 +- .../products/createfixeddepositproduct.html | 1865 +++++---- app/views/products/createloanproduct.html | 3492 ++++++++++------- .../createrecurringdepositproduct.html | 1889 +++++---- app/views/products/createsavingproduct.html | 1535 +++++--- app/views/products/createshareproduct.html | 955 +++-- app/views/products/viewsavingproduct.html | 2 +- .../new_saving_account_application.html | 846 ++-- app/views/savings/saving_account_actions.html | 132 +- app/views/shares/createshareaccount.html | 563 ++- 39 files changed, 10220 insertions(+), 4854 deletions(-) diff --git a/app/global-translations/locale-en.json b/app/global-translations/locale-en.json index fb6284a2..1dce2fc5 100644 --- a/app/global-translations/locale-en.json +++ b/app/global-translations/locale-en.json @@ -1801,7 +1801,7 @@ "label.heading.routingcode": "Routing Code", "label.heading.receiptnumber": "Receipt#", "label.heading.banknumber": "Bank#", - "label.heading.savingapplication": "Saving Application", + "label.heading.savingapplication": "New Saving Application", "label.heading.repaymentsevery": "Repayments Every", "label.heading.fieldofficer": "Field Officer", "label.heading.accountdetail": "Account Detail", @@ -1840,7 +1840,7 @@ "label.heading.withholdtax": "Is withhold tax Applicable", "label.heading.withholdtaxgroup": "Withhold Tax group", "label.heading.marketprice": "Market Price", - "label.heading.shareapplication": "Shares Application", + "label.heading.shareapplication": "New Shares Application", "label.heading.approveshareaccount": "Approve Share Account", "label.heading.rejectshareaccount": "Reject Share Account", "label.heading.activateshareaccount": "Activate Share Account", @@ -2955,7 +2955,7 @@ "label.anchor.savingproducts": "Savings Products", "label.anchor.shareproducts": "Share Products", "label.anchor.createshareproduct": "Create Share Product", - "label.anchor.editshareproduct": "Edit Share Prodct", + "label.anchor.editshareproduct": "Edit Share Product", "label.anchor.dividends": "Dividends", "label.anchor.dividendlisting": "Dividend Details", "label.anchor.createsavingproduct": "Create Savings Product", diff --git a/app/scripts/controllers/client/ClientActionsController.js b/app/scripts/controllers/client/ClientActionsController.js index 91ef930a..9194b68d 100644 --- a/app/scripts/controllers/client/ClientActionsController.js +++ b/app/scripts/controllers/client/ClientActionsController.js @@ -5,8 +5,52 @@ scope.action = routeParams.action || ""; scope.clientId = routeParams.id; scope.formData = {}; + scope.entityformData = {}; + scope.entityformData.datatables = {}; scope.restrictDate = new Date(); scope.taskPermissionName = 'ALL_FUNCTIONS'; + scope.submittedDatatables = []; + var submitStatus = []; + + scope.RequestEntities = function(entity,status){ + resourceFactory.entityDatatableChecksResource.getAll({limit:-1},function (response) { + scope.entityDatatableChecks = _.filter(response.pageItems , function(datatable){ + var AllTables = (datatable.entity == entity && datatable.status.value == status); + return AllTables; + }); + scope.entityDatatableChecks = _.pluck(scope.entityDatatableChecks,'datatableName'); + scope.datatables = []; + var k=0; + _.each(scope.entityDatatableChecks,function(entitytable) { + resourceFactory.DataTablesResource.getTableDetails({datatablename:entitytable,entityId: routeParams.id, genericResultSet: 'true'}, function (data) { + data.registeredTableName = entitytable; + var colName = data.columnHeaders[0].columnName; + if (colName == 'id') { + data.columnHeaders.splice(0, 1); + } + + colName = data.columnHeaders[0].columnName; + if (colName == 'client_id' || colName == 'office_id' || colName == 'group_id' || colName == 'center_id' || colName == 'loan_id' || colName == 'savings_account_id') { + data.columnHeaders.splice(0, 1); + scope.isCenter = (colName == 'center_id') ? true : false; + } + + data.noData = (data.data.length == 0); + if(data.noData){ + scope.datatables.push(data); + scope.entityformData.datatables[k] = {data:{}}; + submitStatus[k] = "save"; + _.each(data.columnHeaders,function(Header){ + scope.entityformData.datatables[k].data[Header.columnName] = ""; + }); + k++; + scope.isEntityDatatables = true; + } + }); + }); + + }); + }; // Transaction UI Related @@ -24,6 +68,7 @@ scope.showActivationDateField = true; scope.showDateField = false; scope.taskPermissionName = 'ACTIVATE_CLIENT'; + scope.RequestEntities('m_client','ACTIVATE'); break; case "assignstaff": scope.breadcrumbName = 'label.anchor.assignstaff'; @@ -50,6 +95,7 @@ scope.formData.reasonId = scope.narrations[0].id; }); scope.taskPermissionName = 'CLOSE_CLIENT'; + scope.RequestEntities('m_client','CLOSE'); break; case "delete": scope.breadcrumbName = 'label.anchor.delete'; @@ -170,9 +216,104 @@ break; } + + function asyncLoop(iterations, func, callback) { + var index = 0; + var done = false; + var loop = { + next: function() { + if (done) { + return; + } + + if (index < iterations) { + index++; + func(loop); + + } else { + done = true; + callback(); + } + }, + + iteration: function() { + return index - 1; + }, + + break: function() { + done = true; + } + }; + loop.next(); + return loop; + } + + scope.fieldType = function (type) { + var fieldType = ""; + if (type) { + if (type == 'CODELOOKUP' || type == 'CODEVALUE') { + fieldType = 'SELECT'; + } else if (type == 'DATE') { + fieldType = 'DATE'; + } else if (type == 'DATETIME') { + fieldType = 'DATETIME'; + } else if (type == 'BOOLEAN') { + fieldType = 'BOOLEAN'; + } else { + fieldType = 'TEXT'; + } + } + return fieldType; + }; + + scope.submitDatatable = function(){ + if(scope.datatables) { + asyncLoop(Object.keys(scope.entityformData.datatables).length,function(loop){ + var cnt = loop.iteration(); + var formData = scope.entityformData.datatables[cnt]; + formData.registeredTableName = scope.datatables[cnt].registeredTableName; + + var params = { + datatablename: formData.registeredTableName, + entityId: routeParams.id, + genericResultSet: 'true' + }; + + angular.extend(formData.data,{dateFormat: scope.df, locale: scope.optlang.code}); + + _.each(formData.data, function (columnHeader) { + if (columnHeader.dateType) { + columnHeader = dateFilter(columnHeader.dateType.date, params.dateFormat); + } + else if (columnHeader.dateTimeType) { + columnHeader = dateFilter(columnHeader.columnName.date, scope.df) + " " + dateFilter(columnHeader.columnName.time, scope.tf); + } + }); + + var action = submitStatus[cnt]; + resourceFactory.DataTablesResource[action](params, formData.data, function (data) { + + submitStatus[cnt] = "update"; + scope.submittedDatatables.push(scope.datatables[cnt].registeredTableName); + loop.next(); + + },function(){ + rootScope.errorDetails[0].push({datatable:scope.datatables[cnt].registeredTableName}); + loop.break(); + }); + + },function(){ + scope.submit(); + }); + } + else{ + scope.submit(); + } + }; + scope.cancel = function () { location.path('/viewclient/' + routeParams.id); - } + }; scope.submit = function () { this.formData.locale = scope.optlang.code; diff --git a/app/scripts/controllers/groups/CreateGroupController.js b/app/scripts/controllers/groups/CreateGroupController.js index 5108a8e9..a6a24e59 100644 --- a/app/scripts/controllers/groups/CreateGroupController.js +++ b/app/scripts/controllers/groups/CreateGroupController.js @@ -159,10 +159,10 @@ }; scope.submit = function () { - if (WizardHandler.wizard().getCurrentStep() != scope.noOfTabs) { - WizardHandler.wizard().next(); - return; - } + // if (WizardHandler.wizard().getCurrentStep() != scope.noOfTabs) { + // WizardHandler.wizard().next(); + // return; + // } for (var i in scope.addedClients) { scope.formData.clientMembers[i] = scope.addedClients[i].id; } diff --git a/app/scripts/controllers/groups/EditGroupController.js b/app/scripts/controllers/groups/EditGroupController.js index 669eb77a..f1ea1916 100644 --- a/app/scripts/controllers/groups/EditGroupController.js +++ b/app/scripts/controllers/groups/EditGroupController.js @@ -4,6 +4,102 @@ scope.first = {}; scope.managecode = routeParams.managecode; scope.restrictDate = new Date(); + scope.entityformData = {}; + scope.entityformData.datatables={}; + scope.submittedDatatables = []; + var submitStatus = []; + + scope.RequestEntities = function(entity,status){ + resourceFactory.entityDatatableChecksResource.getAll({limit:-1},function (response) { + scope.entityDatatableChecks = _.filter(response.pageItems , function(datatable){ + var AllTables = (datatable.entity == entity && datatable.status.value == status); + return AllTables; + }); + scope.entityDatatableChecks = _.pluck(scope.entityDatatableChecks,'datatableName'); + scope.datatables = []; + var k=0; + _.each(scope.entityDatatableChecks,function(entitytable) { + resourceFactory.DataTablesResource.getTableDetails({datatablename:entitytable,entityId: routeParams.id, genericResultSet: 'true'}, function (data) { + data.registeredTableName = entitytable; + var colName = data.columnHeaders[0].columnName; + if (colName == 'id') { + data.columnHeaders.splice(0, 1); + } + + colName = data.columnHeaders[0].columnName; + if (colName == 'client_id' || colName == 'office_id' || colName == 'group_id' || colName == 'center_id' || colName == 'loan_id' || colName == 'savings_account_id') { + data.columnHeaders.splice(0, 1); + scope.isCenter = (colName == 'center_id') ? true : false; + } + + data.noData = (data.data.length == 0); + if(data.noData){ + scope.datatables.push(data); + scope.entityformData.datatables[k] = {data:{}}; + submitStatus[k] = "save"; + _.each(data.columnHeaders,function(Header){ + scope.entityformData.datatables[k].data[Header.columnName] = ""; + }); + k++; + scope.isEntityDatatables = true; + } + }); + }); + + }); + }; + + function asyncLoop(iterations, func, callback) { + var index = 0; + var done = false; + var loop = { + next: function() { + if (done) { + return; + } + + if (index < iterations) { + index++; + func(loop); + + } else { + done = true; + callback(); + } + }, + + iteration: function() { + return index - 1; + }, + + break: function() { + done = true; + } + }; + loop.next(); + return loop; + } + + scope.fieldType = function (type) { + var fieldType = ""; + if (type) { + if (type == 'CODELOOKUP' || type == 'CODEVALUE') { + fieldType = 'SELECT'; + } else if (type == 'DATE') { + fieldType = 'DATE'; + } else if (type == 'DATETIME') { + fieldType = 'DATETIME'; + } else if (type == 'BOOLEAN') { + fieldType = 'BOOLEAN'; + } else { + fieldType = 'TEXT'; + } + } + return fieldType; + }; + + scope.RequestEntities('m_group','ACTIVATE'); + resourceFactory.groupResource.get({groupId: routeParams.id, associations: 'clientMembers', template: 'true',staffInSelectedOfficeOnly:true}, function (data) { scope.editGroup = data; scope.formData = { @@ -34,6 +130,51 @@ }); }; + scope.submitDatatable = function(){ + if(scope.datatables) { + asyncLoop(Object.keys(scope.entityformData.datatables).length,function(loop){ + var cnt = loop.iteration(); + var formData = scope.entityformData.datatables[cnt]; + formData.registeredTableName = scope.datatables[cnt].registeredTableName; + + var params = { + datatablename: formData.registeredTableName, + entityId: routeParams.id, + genericResultSet: 'true' + }; + + angular.extend(formData.data,{dateFormat: scope.df, locale: scope.optlang.code}); + + _.each(formData.data, function (columnHeader) { + if (columnHeader.dateType) { + columnHeader = dateFilter(columnHeader.dateType.date, params.dateFormat); + } + else if (columnHeader.dateTimeType) { + columnHeader = dateFilter(columnHeader.columnName.date, scope.df) + " " + dateFilter(columnHeader.columnName.time, scope.tf); + } + }); + + var action = submitStatus[cnt]; + resourceFactory.DataTablesResource[action](params, formData.data, function (data) { + + submitStatus[cnt] = "update"; + scope.submittedDatatables.push(scope.datatables[cnt].registeredTableName); + loop.next(); + + },function(){ + rootScope.errorDetails[0].push({datatable:scope.datatables[cnt].registeredTableName}); + loop.break(); + }); + + },function(){ + scope.activate(); + }); + } + else{ + scope.activate(); + } + }; + scope.activate = function () { var reqDate = dateFilter(scope.first.date, scope.df); var newActivation = new Object(); diff --git a/app/scripts/controllers/loanAccount/LoanAccountActionsController.js b/app/scripts/controllers/loanAccount/LoanAccountActionsController.js index bd79057b..a0a0f15f 100755 --- a/app/scripts/controllers/loanAccount/LoanAccountActionsController.js +++ b/app/scripts/controllers/loanAccount/LoanAccountActionsController.js @@ -1,10 +1,11 @@ (function (module) { mifosX.controllers = _.extend(module, { - LoanAccountActionsController: function (scope, resourceFactory, location, routeParams, dateFilter) { + LoanAccountActionsController: function (scope, rootScope, resourceFactory, location, routeParams, dateFilter) { scope.action = routeParams.action || ""; scope.accountId = routeParams.id; scope.formData = {}; + scope.entityformData = {datatables:{}}; scope.showDateField = true; scope.showNoteField = true; scope.showAmountField = false; @@ -13,10 +14,101 @@ scope.isTransaction = false; scope.showPaymentDetails = false; scope.paymentTypes = []; - scope.expectedDisbursementDate = []; + scope.form = {}; + scope.form.expectedDisbursementDate = []; scope.disbursementDetails = []; scope.showTrancheAmountTotal = 0; scope.processDate = false; + scope.submittedDatatables = []; + var submitStatus = []; + + rootScope.RequestEntities = function(entity,status,productId){ + resourceFactory.entityDatatableChecksResource.getAll({limit:-1},function (response) { + scope.entityDatatableChecks = _.filter(response.pageItems , function(datatable){ + var specificProduct = (datatable.entity == entity && datatable.status.value == status && datatable.productId == productId); + var AllProducts = (datatable.entity == entity && datatable.status.value == status); + return (datatable.productId?specificProduct:AllProducts); + }); + scope.entityDatatableChecks = _.pluck(scope.entityDatatableChecks,'datatableName'); + scope.datatables = []; + var k=0; + _.each(scope.entityDatatableChecks,function(entitytable) { + resourceFactory.DataTablesResource.getTableDetails({datatablename:entitytable,entityId: routeParams.id, genericResultSet: 'true'}, function (data) { + data.registeredTableName = entitytable; + var colName = data.columnHeaders[0].columnName; + if (colName == 'id') { + data.columnHeaders.splice(0, 1); + } + + colName = data.columnHeaders[0].columnName; + if (colName == 'client_id' || colName == 'office_id' || colName == 'group_id' || colName == 'center_id' || colName == 'loan_id' || colName == 'savings_account_id') { + data.columnHeaders.splice(0, 1); + scope.isCenter = (colName == 'center_id') ? true : false; + } + + + data.noData = (data.data.length == 0); + if(data.noData){ + scope.datatables.push(data); + scope.entityformData.datatables[k] = {data:{}}; + submitStatus[k] = "save"; + _.each(data.columnHeaders,function(Header){ + scope.entityformData.datatables[k].data[Header.columnName] = ""; + }); + k++; + scope.isEntityDatatables = true; + } + }); + + + }); + + }); + }; + + scope.fetchEntities = function(entity,status,productId){ + if(!productId){ + resourceFactory.LoanAccountResource.getLoanAccountDetails({loanId: routeParams.id}, function (data) { + scope.productId = data.loanProductId; + rootScope.RequestEntities(entity,status,scope.productId); + }); + } + else{ + rootScope.RequestEntities(entity,status,productId); + } + }; + + //Stack overflow + function asyncLoop(iterations, func, callback) { + var index = 0; + var done = false; + var loop = { + next: function() { + if (done) { + return; + } + + if (index < iterations) { + index++; + func(loop); + + } else { + done = true; + callback(); + } + }, + + iteration: function() { + return index - 1; + }, + + break: function() { + done = true; + } + }; + loop.next(); + return loop; + } switch (scope.action) { case "approve": @@ -31,7 +123,8 @@ scope.formData.approvedLoanAmount = data.approvalAmount; }); resourceFactory.LoanAccountResource.getLoanAccountDetails({loanId: routeParams.id, associations: 'multiDisburseDetails'}, function (data) { - scope.expectedDisbursementDate = new Date(data.timeline.expectedDisbursementDate); + scope.form.expectedDisbursementDate = new Date(data.timeline.expectedDisbursementDate); + scope.productId = data.loanProductId; if(data.disbursementDetails != ""){ scope.disbursementDetails = data.disbursementDetails; scope.approveTranches = true; @@ -41,6 +134,7 @@ scope.disbursementDetails[i].principal = data.disbursementDetails[i].principal; scope.showTrancheAmountTotal += Number(data.disbursementDetails[i].principal) ; } + scope.fetchEntities('m_loan','APPROVE',scope.productId); }); break; case "reject": @@ -49,6 +143,7 @@ scope.modelName = 'rejectedOnDate'; scope.formData[scope.modelName] = new Date(); scope.taskPermissionName = 'REJECT_LOAN'; + scope.fetchEntities('m_loan','REJECTED'); break; case "withdrawnByApplicant": scope.title = 'label.heading.withdrawloanaccount'; @@ -56,6 +151,7 @@ scope.modelName = 'withdrawnOnDate'; scope.formData[scope.modelName] = new Date(); scope.taskPermissionName = 'WITHDRAW_LOAN'; + scope.fetchEntities('m_loan','WITHDRAWN'); break; case "undoapproval": scope.title = 'label.heading.undoapproveloanaccount'; @@ -86,6 +182,7 @@ scope.isTransaction = true; scope.showAmountField = true; scope.taskPermissionName = 'DISBURSE_LOAN'; + scope.fetchEntities('m_loan','DISBURSE'); break; case "disbursetosavings": scope.modelName = 'actualDisbursementDate'; @@ -167,6 +264,7 @@ scope.title = 'label.heading.writeoffloanaccount'; scope.labelName = 'label.input.writeoffondate'; scope.taskPermissionName = 'WRITEOFF_LOAN'; + scope.fetchEntities('m_loan','WRITE_OFF'); break; case "close-rescheduled": scope.modelName = 'transactionDate'; @@ -289,7 +387,7 @@ resourceFactory.LoanAccountResource.getLoanAccountDetails({loanId: routeParams.id, associations: 'multiDisburseDetails'}, function (data) { scope.showEditDisburseDate = true; scope.formData.approvedLoanAmount = data.approvedPrincipal; - scope.expectedDisbursementDate = new Date(data.timeline.expectedDisbursementDate); + scope.form.expectedDisbursementDate = new Date(data.timeline.expectedDisbursementDate); for(var i in data.disbursementDetails){ if(routeParams.disbursementId == data.disbursementDetails[i].id){ scope.formData.updatedExpectedDisbursementDate = new Date(data.disbursementDetails[i].expectedDisbursementDate); @@ -324,7 +422,7 @@ resourceFactory.LoanAccountResource.getLoanAccountDetails({loanId: routeParams.id, associations: 'multiDisburseDetails'}, function (data) { scope.addDisburseDetails = true; scope.formData.approvedLoanAmount = data.approvedPrincipal; - scope.expectedDisbursementDate = new Date(data.timeline.expectedDisbursementDate); + scope.form.expectedDisbursementDate = new Date(data.timeline.expectedDisbursementDate); if(data.disbursementDetails != ""){ scope.disbursementDetails = data.disbursementDetails; @@ -347,7 +445,7 @@ resourceFactory.LoanAccountResource.getLoanAccountDetails({loanId: routeParams.id, associations: 'multiDisburseDetails'}, function (data) { scope.deleteDisburseDetails = true; scope.formData.approvedLoanAmount = data.approvedPrincipal; - scope.expectedDisbursementDate = new Date(data.timeline.expectedDisbursementDate); + scope.form.expectedDisbursementDate = new Date(data.timeline.expectedDisbursementDate); if(data.disbursementDetails != ""){ scope.disbursementDetails = data.disbursementDetails; } @@ -392,7 +490,7 @@ params.command = "recoverGuarantees"; } if(scope.action == "approve"){ - this.formData.expectedDisbursementDate = dateFilter(scope.expectedDisbursementDate, scope.df); + this.formData.expectedDisbursementDate = dateFilter(scope.form.expectedDisbursementDate, scope.df); if(scope.disbursementDetails != null) { this.formData.disbursementData = []; for (var i in scope.disbursementDetails) { @@ -403,6 +501,7 @@ loanChargeId : scope.disbursementDetails[i].loanChargeId }); } + console.log("DISBURSEMENT DATA", this.formData.expectedDisbursementDate); } if(scope.formData.approvedLoanAmount == null){ scope.formData.approvedLoanAmount = scope.showTrancheAmountTotal; @@ -454,7 +553,7 @@ } this.formData.disbursementData = []; this.formData.updatedExpectedDisbursementDate = dateFilter(scope.formData.updatedExpectedDisbursementDate, scope.df); - this.formData.expectedDisbursementDate = dateFilter(scope.expectedDisbursementDate, scope.df); + this.formData.expectedDisbursementDate = dateFilter(scope.form.expectedDisbursementDate, scope.df); for (var i in scope.disbursementDetails) { this.formData.disbursementData.push({ @@ -478,7 +577,7 @@ }); } - this.formData.expectedDisbursementDate = dateFilter(scope.expectedDisbursementDate, scope.df); + this.formData.expectedDisbursementDate = dateFilter(scope.form.expectedDisbursementDate, scope.df); resourceFactory.LoanAddTranchesResource.update({loanId: routeParams.id}, this.formData, function (data) { location.path('/viewloanaccount/' + data.loanId); }); @@ -490,15 +589,83 @@ } else { params.loanId = scope.accountId; resourceFactory.LoanAccountResource.save(params, this.formData, function (data) { + location.path('/viewloanaccount/' + data.loanId); }); } }; + scope.submitDatatable = function(){ + if(scope.datatables) { + asyncLoop(Object.keys(scope.entityformData.datatables).length,function(loop){ + var cnt = loop.iteration(); + var formData = scope.entityformData.datatables[cnt]; + formData.registeredTableName = scope.datatables[cnt].registeredTableName; + + var params = { + datatablename: formData.registeredTableName, + entityId: routeParams.id, + genericResultSet: 'true' + }; + + angular.extend(formData.data,{dateFormat: scope.df, locale: scope.optlang.code}); + + _.each(formData.data, function (columnHeader) { + if (columnHeader.dateType) { + columnHeader = dateFilter(columnHeader.dateType.date, params.dateFormat); + } + else if (columnHeader.dateTimeType) { + columnHeader = dateFilter(columnHeader.columnName.date, scope.df) + " " + dateFilter(columnHeader.columnName.time, scope.tf); + } + }); + + var action = submitStatus[cnt]; + resourceFactory.DataTablesResource[action](params, formData.data, function (data) { + + submitStatus[cnt] = "update"; + scope.submittedDatatables.push(scope.datatables[cnt].registeredTableName); + loop.next(); + + },function(){ + rootScope.errorDetails[0].push({datatable:scope.datatables[cnt].registeredTableName}); + loop.break(); + }); + + },function(){ + scope.submit(); + }); + } + else{ + scope.submit(); + } + }; + scope.$watch('formData.transactionDate',function(){ scope.onDateChange(); }); + + + scope.fieldType = function (type) { + var fieldType = ""; + if (type) { + if (type == 'CODELOOKUP' || type == 'CODEVALUE') { + fieldType = 'SELECT'; + } else if (type == 'DATE') { + fieldType = 'DATE'; + } else if (type == 'DATETIME') { + fieldType = 'DATETIME'; + } else if (type == 'BOOLEAN') { + fieldType = 'BOOLEAN'; + } else { + fieldType = 'TEXT'; + } + } + return fieldType; + }; + + + scope.onDateChange = function(){ if(scope.processDate) { var params = {}; @@ -519,7 +686,7 @@ }; } }); - mifosX.ng.application.controller('LoanAccountActionsController', ['$scope', 'ResourceFactory', '$location', '$routeParams', 'dateFilter', mifosX.controllers.LoanAccountActionsController]).run(function ($log) { + mifosX.ng.application.controller('LoanAccountActionsController', ['$scope','$rootScope', 'ResourceFactory', '$location', '$routeParams', 'dateFilter', mifosX.controllers.LoanAccountActionsController]).run(function ($log) { $log.info("LoanAccountActionsController initialized"); }); }(mifosX.controllers || {})); diff --git a/app/scripts/controllers/loanAccount/NewLoanAccAppController.js b/app/scripts/controllers/loanAccount/NewLoanAccAppController.js index 3de37cc8..91f1b574 100755 --- a/app/scripts/controllers/loanAccount/NewLoanAccAppController.js +++ b/app/scripts/controllers/loanAccount/NewLoanAccAppController.js @@ -6,6 +6,7 @@ scope.groupId = routeParams.groupId; scope.restrictDate = new Date(); scope.formData = {}; + scope.loandetails = {}; scope.chargeFormData = {}; //For charges scope.collateralFormData = {}; //For collaterals scope.inparams = {resourceType: 'template', activeOnly: 'true'}; @@ -20,6 +21,7 @@ scope.loanApp = "LoanApp"; scope.customSteps = []; scope.tempDataTables = []; + scope.disabled = true; scope.date.first = new Date(); @@ -48,7 +50,6 @@ resourceFactory.loanResource.get(scope.inparams, function (data) { scope.products = data.productOptions; - scope.datatables = data.datatables; if (data.clientName) { scope.clientName = data.clientName; @@ -56,12 +57,11 @@ if (data.group) { scope.groupName = data.group.name; } - scope.handleDatatables(scope.datatables); }); scope.loanProductChange = function (loanProductId) { - _.isUndefined(scope.datatables) ? scope.tempDataTables = [] : scope.tempDataTables = scope.datatables; - WizardHandler.wizard().removeSteps(1, scope.tempDataTables.length); + // _.isUndefined(scope.datatables) ? scope.tempDataTables = [] : scope.tempDataTables = scope.datatables; + // WizardHandler.wizard().removeSteps(1, scope.tempDataTables.length); scope.inparams.productId = loanProductId; // scope.datatables = []; resourceFactory.loanResource.get(scope.inparams, function (data) { @@ -69,6 +69,7 @@ scope.previewClientLoanAccInfo(); scope.datatables = data.datatables; scope.handleDatatables(scope.datatables); + scope.disabled = false; }); resourceFactory.loanResource.get({resourceType: 'template', templateType: 'collateral', productId: loanProductId, fields: 'id,loanCollateralOptions'}, function (data) { @@ -135,20 +136,26 @@ scope.formData.principal = scope.loanaccountinfo.principal; scope.formData.loanTermFrequency = scope.loanaccountinfo.termFrequency; scope.formData.loanTermFrequencyType = scope.loanaccountinfo.termPeriodFrequencyType.id; + scope.loandetails.loanTermFrequencyValue = scope.loanaccountinfo.termPeriodFrequencyType.value; scope.formData.numberOfRepayments = scope.loanaccountinfo.numberOfRepayments; scope.formData.repaymentEvery = scope.loanaccountinfo.repaymentEvery; scope.formData.repaymentFrequencyType = scope.loanaccountinfo.repaymentFrequencyType.id; + scope.loandetails.repaymentFrequencyValue = scope.loanaccountinfo.repaymentFrequencyType.value; scope.formData.interestRatePerPeriod = scope.loanaccountinfo.interestRatePerPeriod; scope.formData.amortizationType = scope.loanaccountinfo.amortizationType.id; scope.formData.isEqualAmortization = scope.loanaccountinfo.isEqualAmortization; + scope.loandetails.amortizationValue = scope.loanaccountinfo.amortizationType.value; scope.formData.interestType = scope.loanaccountinfo.interestType.id; + scope.loandetails.interestValue = scope.loanaccountinfo.interestType.value; scope.formData.interestCalculationPeriodType = scope.loanaccountinfo.interestCalculationPeriodType.id; + scope.loandetails.interestCalculationPeriodValue = scope.loanaccountinfo.interestCalculationPeriodType.value; scope.formData.allowPartialPeriodInterestCalcualtion = scope.loanaccountinfo.allowPartialPeriodInterestCalcualtion; scope.formData.inArrearsTolerance = scope.loanaccountinfo.inArrearsTolerance; 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.loandetails.transactionProcessingStrategyValue = scope.formValue(scope.loanaccountinfo.transactionProcessingStrategyOptions,scope.formData.transactionProcessingStrategyId,'id','name'); scope.formData.graceOnInterestCharged = scope.loanaccountinfo.graceOnInterestCharged; scope.formData.fixedEmiAmount = scope.loanaccountinfo.fixedEmiAmount; scope.formData.maxOutstandingLoanBalance = scope.loanaccountinfo.maxOutstandingLoanBalance; @@ -163,7 +170,23 @@ if(scope.loanaccountinfo.isLoanProductLinkedToFloatingRate) { scope.formData.isFloatingInterestRate = false ; } - } + + scope.loandetails = angular.copy(scope.formData); + scope.loandetails.productName = scope.formValue(scope.products,scope.formData.productId,'id','name'); + }; + + scope.$watch('formData',function(newVal){ + scope.loandetails = angular.extend(scope.loandetails,newVal); + },true); + + scope.formValue = function(array,model,findattr,retAttr){ + findattr = findattr ? findattr : 'id'; + retAttr = retAttr ? retAttr : 'value'; + console.log(findattr,retAttr,model); + return _.find(array, function (obj) { + return obj[findattr] === model; + })[retAttr]; + }; scope.addCharge = function () { if (scope.chargeFormData.chargeId) { @@ -292,10 +315,10 @@ }; scope.submit = function () { - if (WizardHandler.wizard().getCurrentStep() != scope.noOfTabs) { - WizardHandler.wizard().next(); - return; - } + // if (WizardHandler.wizard().getCurrentStep() != scope.noOfTabs) { + // WizardHandler.wizard().next(); + // return; + // } // Make sure charges and collaterals are empty before initializing. delete scope.formData.charges; delete scope.formData.collateral; diff --git a/app/scripts/controllers/loanAccount/ViewLoanDetailsController.js b/app/scripts/controllers/loanAccount/ViewLoanDetailsController.js index 1ed23687..74c9ca9a 100755 --- a/app/scripts/controllers/loanAccount/ViewLoanDetailsController.js +++ b/app/scripts/controllers/loanAccount/ViewLoanDetailsController.js @@ -488,6 +488,7 @@ resourceFactory.DataTablesResource.getTableDetails({datatablename: datatable.registeredTableName, entityId: routeParams.id, genericResultSet: 'true'}, function (data) { scope.datatabledetails = data; + console.log(data); scope.datatabledetails.isData = data.data.length > 0 ? true : false; scope.datatabledetails.isMultirow = data.columnHeaders[0].columnName == "id" ? true : false; scope.showDataTableAddButton = !scope.datatabledetails.isData || scope.datatabledetails.isMultirow; diff --git a/app/scripts/controllers/product/CreateFixedDepositProductController.js b/app/scripts/controllers/product/CreateFixedDepositProductController.js index cd32ea65..04f498e7 100755 --- a/app/scripts/controllers/product/CreateFixedDepositProductController.js +++ b/app/scripts/controllers/product/CreateFixedDepositProductController.js @@ -2,6 +2,7 @@ mifosX.controllers = _.extend(module, { CreateFixedDepositProductController: function (scope, resourceFactory, location, dateFilter,$uibModal) { scope.formData = {}; + scope.depositproduct = {}; scope.charges = []; scope.showOrHideValue = "show"; scope.configureFundOptions = []; @@ -35,9 +36,22 @@ scope.chart = scope.product.chartTemplate; scope.chart.chartSlabs = []; scope.formData.accountingRule = '1'; + scope.depositproduct = angular.copy(scope.formData); }); + scope.$watch('formData',function(newVal){ + scope.depositproduct = angular.extend(scope.depositproduct,newVal); + },true); + + scope.formValue = function(array,model,findattr,retAttr){ + findattr = findattr ? findattr : 'id'; + retAttr = retAttr ? retAttr : 'value'; + console.log(findattr,retAttr,model); + return _.find(array, function (obj) { + return obj[findattr] === model; + })[retAttr]; + }; //advanced accounting rule scope.showOrHide = function (showOrHideValue) { diff --git a/app/scripts/controllers/product/CreateLoanProductController.js b/app/scripts/controllers/product/CreateLoanProductController.js index f6478dc1..e93efc17 100755 --- a/app/scripts/controllers/product/CreateLoanProductController.js +++ b/app/scripts/controllers/product/CreateLoanProductController.js @@ -1,9 +1,11 @@ (function (module) { mifosX.controllers = _.extend(module, { - CreateLoanProductController: function (scope, resourceFactory, location, dateFilter) { + CreateLoanProductController: function (scope, $rootScope, resourceFactory, location, dateFilter) { scope.restrictDate = new Date(); scope.formData = {}; + scope.loanproduct = {}; scope.charges = []; + scope.accountingOptions = ['None','Cash','Accrual(Periodic)','Accrual(Upfront)']; scope.floatingrateoptions = []; scope.loanProductConfigurableAttributes = []; scope.showOrHideValue = "show"; @@ -78,8 +80,22 @@ scope.formData.isLinkedToFloatingInterestRates = false ; scope.formData.allowVariableInstallments = false ; scope.product.interestRecalculationNthDayTypeOptions.push({"code" : "onDay", "id" : -2, "value" : "on day"}); + scope.loanproduct = angular.copy(scope.formData); }); + scope.$watch('formData',function(newVal){ + scope.loanproduct = angular.extend(scope.loanproduct,newVal); + },true); + + $rootScope.formValue = function(array,model,findattr,retAttr){ + findattr = findattr ? findattr : 'id'; + retAttr = retAttr ? retAttr : 'value'; + console.log(findattr,retAttr,model); + return _.find(array, function (obj) { + return obj[findattr] === model; + })[retAttr]; + }; + scope.chargeSelected = function (chargeId) { if (chargeId) { @@ -370,7 +386,7 @@ }; } }); - mifosX.ng.application.controller('CreateLoanProductController', ['$scope', 'ResourceFactory', '$location', 'dateFilter', mifosX.controllers.CreateLoanProductController]).run(function ($log) { + mifosX.ng.application.controller('CreateLoanProductController', ['$scope','$rootScope', 'ResourceFactory', '$location', 'dateFilter', mifosX.controllers.CreateLoanProductController]).run(function ($log) { $log.info("CreateLoanProductController initialized"); }); }(mifosX.controllers || {})); diff --git a/app/scripts/controllers/product/CreateRecurringDepositProductController.js b/app/scripts/controllers/product/CreateRecurringDepositProductController.js index 65cd035e..b2d9e790 100755 --- a/app/scripts/controllers/product/CreateRecurringDepositProductController.js +++ b/app/scripts/controllers/product/CreateRecurringDepositProductController.js @@ -2,6 +2,7 @@ mifosX.controllers = _.extend(module, { CreateRecurringDepositProductController: function (scope, resourceFactory, location, dateFilter,$uibModal) { scope.formData = {}; + scope.depositproduct = {}; scope.charges = []; scope.showOrHideValue = "show"; scope.configureFundOptions = []; @@ -37,9 +38,20 @@ scope.chart = scope.product.chartTemplate; scope.chart.chartSlabs = []; scope.formData.accountingRule = '1'; + scope.depositproduct = angular.copy(scope.formData); }); - + scope.$watch('formData',function(newVal){ + scope.depositproduct = angular.extend(scope.depositproduct,newVal); + },true); + scope.formValue = function(array,model,findattr,retAttr){ + findattr = findattr ? findattr : 'id'; + retAttr = retAttr ? retAttr : 'value'; + console.log(findattr,retAttr,model); + return _.find(array, function (obj) { + return obj[findattr] === model; + })[retAttr]; + }; //advanced accounting rule scope.showOrHide = function (showOrHideValue) { diff --git a/app/scripts/controllers/product/CreateSavingProductController.js b/app/scripts/controllers/product/CreateSavingProductController.js index 6af4cac1..63fde0e5 100644 --- a/app/scripts/controllers/product/CreateSavingProductController.js +++ b/app/scripts/controllers/product/CreateSavingProductController.js @@ -1,14 +1,14 @@ (function (module) { mifosX.controllers = _.extend(module, { - CreateSavingProductController: function (scope, resourceFactory, location) { + CreateSavingProductController: function (scope, $rootScope, resourceFactory, location) { scope.formData = {}; + scope.savingproduct = {}; scope.charges = []; scope.showOrHideValue = "show"; scope.configureFundOptions = []; scope.specificIncomeaccounts = []; scope.penaltySpecificIncomeaccounts = []; scope.configureFundOption = {}; - resourceFactory.savingProductResource.get({resourceType: 'template'}, function (data) { scope.product = data; scope.product.chargeOptions = scope.product.chargeOptions || []; @@ -24,9 +24,24 @@ scope.formData.interestCalculationType = data.interestCalculationType.id; scope.formData.interestCalculationDaysInYearType = data.interestCalculationDaysInYearType.id; scope.formData.accountingRule = '1'; + scope.savingproduct = angular.copy(scope.formData); }); + scope.$watch('formData',function(newVal){ + scope.savingproduct = angular.extend(scope.savingproduct,newVal); + },true); + + scope.formValue = function(array,model,findattr,retAttr){ + findattr = findattr ? findattr : 'id'; + retAttr = retAttr ? retAttr : 'value'; + console.log(findattr,retAttr,model); + return _.find(array, function (obj) { + return obj[findattr] === model; + })[retAttr]; + }; + //$rootScope.formValue is used which is defined in CreateLoanProductController.js + //advanced accounting rule scope.showOrHide = function (showOrHideValue) { @@ -159,7 +174,7 @@ } } }); - mifosX.ng.application.controller('CreateSavingProductController', ['$scope', 'ResourceFactory', '$location', mifosX.controllers.CreateSavingProductController]).run(function ($log) { + mifosX.ng.application.controller('CreateSavingProductController', ['$scope', '$rootScope', 'ResourceFactory', '$location', mifosX.controllers.CreateSavingProductController]).run(function ($log) { $log.info("CreateSavingProductController initialized"); }); }(mifosX.controllers || {})); diff --git a/app/scripts/controllers/product/CreateShareProductController.js b/app/scripts/controllers/product/CreateShareProductController.js index ce18db24..51ec1520 100644 --- a/app/scripts/controllers/product/CreateShareProductController.js +++ b/app/scripts/controllers/product/CreateShareProductController.js @@ -2,6 +2,7 @@ mifosX.controllers = _.extend(module, { CreateShareProductController: function (scope, resourceFactory, dateFilter, location) { scope.formData = {}; + scope.shareproduct = {}; scope.charges = []; scope.formData.marketPricePeriods = [] ; scope.showOrHideValue = "show"; @@ -14,14 +15,28 @@ scope.incomeAccountOptions = scope.product.accountingMappingOptions.incomeAccountOptions || []; scope.formData.currencyCode = data.currencyOptions[0].code; scope.formData.digitsAfterDecimal = data.currencyOptions[0].decimalPlaces; + scope.formData.allowDividendCalculationForInactiveClients = false; scope.formData.accountingRule = '1'; - + scope.shareproduct = angular.copy(scope.formData); }); scope.shareCapitaValue = function () { scope.formData.shareCapital = scope.formData.unitPrice * scope.formData.sharesIssued; }; + scope.$watch('formData',function(newVal){ + scope.shareproduct = angular.extend(scope.shareproduct,newVal); + },true); + + scope.formValue = function(array,model,findattr,retAttr){ + findattr = findattr ? findattr : 'id'; + retAttr = retAttr ? retAttr : 'value'; + console.log(findattr,retAttr,model); + return _.find(array, function (obj) { + return obj[findattr] === model; + })[retAttr]; + }; + scope.addMarketPricePeriod = function () { var marketPrice = {} ; marketPrice.locale=scope.optlang.code; diff --git a/app/scripts/controllers/savings/CreateSavingAccountController.js b/app/scripts/controllers/savings/CreateSavingAccountController.js index 16ca458f..c9a82fd2 100644 --- a/app/scripts/controllers/savings/CreateSavingAccountController.js +++ b/app/scripts/controllers/savings/CreateSavingAccountController.js @@ -1,10 +1,11 @@ (function (module) { mifosX.controllers = _.extend(module, { - CreateSavingAccountController: function (scope, resourceFactory, location, routeParams, dateFilter) { + CreateSavingAccountController: function (scope, $rootScope, resourceFactory, location, routeParams, dateFilter,WizardHandler) { scope.products = []; scope.fieldOfficers = []; scope.formData = {}; scope.formDat = {}; + scope.savingdetails = {}; scope.restrictDate = new Date(); scope.clientId = routeParams.clientId; scope.groupId = routeParams.groupId; @@ -17,6 +18,7 @@ scope.formDat.datatables = []; scope.tf = "HH:mm"; scope.tempDataTables = []; + scope.disabled = true; if (routeParams.centerEntity) { scope.centerEntity = true; @@ -26,15 +28,15 @@ if (scope.clientId) { scope.inparams.clientId = scope.clientId } - ; + if (scope.groupId) { scope.inparams.groupId = scope.groupId } - ; + if (scope.centerId) { scope.inparams.centerId = scope.centerId } - ; + scope.inparams.staffInSelectedOfficeOnly = true; @@ -43,8 +45,6 @@ scope.chargeOptions = data.chargeOptions; scope.clientName = data.clientName; scope.groupName = data.groupName; - scope.datatables = data.datatables; - scope.handleDatatables(scope.datatables); }); scope.handleDatatables = function (datatables) { @@ -86,8 +86,17 @@ } }; + scope.formValue = function(array,model,findattr,retAttr){ + findattr = findattr ? findattr : 'id'; + retAttr = retAttr ? retAttr : 'value'; + console.log(findattr,retAttr,model); + return _.find(array, function (obj) { + return obj[findattr] === model; + })[retAttr]; + }; + scope.changeProduct = function () { - _.isUndefined(scope.datatables) ? scope.tempDataTables = [] : scope.tempDataTables = scope.datatables; + // _.isUndefined(scope.datatables) ? scope.tempDataTables = [] : scope.tempDataTables = scope.datatables; scope.inparams.productId = scope.formData.productId; resourceFactory.savingsTemplateResource.get(scope.inparams, function (data) { @@ -124,9 +133,16 @@ if (data.withdrawalFeeType) scope.formData.withdrawalFeeType = data.withdrawalFeeType.id; scope.datatables = data.datatables; scope.handleDatatables(scope.datatables); + scope.disabled = false; + scope.savingdetails = angular.copy(scope.formData); + scope.savingdetails.productName = scope.formValue(scope.products,scope.formData.productId,'id','name'); }); }; + scope.$watch('formData',function(newVal){ + scope.savingdetails = angular.extend(scope.savingdetails,newVal); + }); + scope.addCharge = function (chargeId) { scope.errorchargeevent = false; if (chargeId) { @@ -250,7 +266,7 @@ } } }); - mifosX.ng.application.controller('CreateSavingAccountController', ['$scope', 'ResourceFactory', '$location', '$routeParams', 'dateFilter', mifosX.controllers.CreateSavingAccountController]).run(function ($log) { + mifosX.ng.application.controller('CreateSavingAccountController', ['$scope','$rootScope','ResourceFactory', '$location', '$routeParams', 'dateFilter', 'WizardHandler',mifosX.controllers.CreateSavingAccountController]).run(function ($log) { $log.info("CreateSavingAccountController initialized"); }); }(mifosX.controllers || {})); diff --git a/app/scripts/controllers/savings/SavingAccountActionsController.js b/app/scripts/controllers/savings/SavingAccountActionsController.js index 30e7f839..7f7ac993 100644 --- a/app/scripts/controllers/savings/SavingAccountActionsController.js +++ b/app/scripts/controllers/savings/SavingAccountActionsController.js @@ -1,17 +1,134 @@ (function (module) { mifosX.controllers = _.extend(module, { - SavingAccountActionsController: function (scope, resourceFactory, location, routeParams, dateFilter) { + SavingAccountActionsController: function (scope, rootScope, resourceFactory, location, routeParams, dateFilter) { scope.action = routeParams.action || ""; scope.accountId = routeParams.id; scope.savingAccountId = routeParams.id; scope.formData = {}; + scope.entityformData = {}; + scope.entityformData.datatables = {}; scope.restrictDate = new Date(); // Transaction UI Related scope.isTransaction = false; scope.transactionAmountField = false; scope.showPaymentDetails = false; scope.paymentTypes = []; + scope.submittedDatatables = []; + scope.tf = "HH:mm"; + var submitStatus = []; + + rootScope.RequestEntities = function(entity,status,productId){ + resourceFactory.entityDatatableChecksResource.getAll({limit:-1},function (response) { + scope.entityDatatableChecks = _.filter(response.pageItems , function(datatable){ + var specificProduct = (datatable.entity == entity && datatable.status.value == status && datatable.productId == productId); + var AllProducts = (datatable.entity == entity && datatable.status.value == status); + return (datatable.productId?specificProduct:AllProducts); + }); + scope.entityDatatableChecks = _.pluck(scope.entityDatatableChecks,'datatableName'); + scope.datatables = []; + var k=0; + _.each(scope.entityDatatableChecks,function(entitytable) { + resourceFactory.DataTablesResource.getTableDetails({datatablename:entitytable,entityId: routeParams.id, genericResultSet: 'true'}, function (data) { + data.registeredTableName = entitytable; + var colName = data.columnHeaders[0].columnName; + if (colName == 'id') { + data.columnHeaders.splice(0, 1); + } + + colName = data.columnHeaders[0].columnName; + if (colName == 'client_id' || colName == 'office_id' || colName == 'group_id' || colName == 'center_id' || colName == 'loan_id' || colName == 'savings_account_id') { + data.columnHeaders.splice(0, 1); + scope.isCenter = (colName == 'center_id') ? true : false; + } + + + data.noData = (data.data.length == 0); + if(data.noData){ + scope.datatables.push(data); + scope.entityformData.datatables[k] = {data:{}}; + submitStatus[k] = "save"; + _.each(data.columnHeaders,function(Header){ + if(Header.columnDisplayType == 'DATETIME'){ + scope.entityformData.datatables[k].data[Header.columnName] = {}; + } + else { + scope.entityformData.datatables[k].data[Header.columnName] = ""; + } + }); + k++; + scope.isEntityDatatables = true; + } + }); + + + }); + + }); + }; + + scope.fetchEntities = function(entity,status,productId){ + if(!productId){ + resourceFactory.savingsResource.get({accountId: routeParams.id, associations: 'all'}, + function (data) { + scope.productId = data.savingsProductId; + rootScope.RequestEntities(entity,status,scope.productId); + }); + } + else{ + rootScope.RequestEntities(entity,status,productId); + } + }; + + function asyncLoop(iterations, func, callback) { + var index = 0; + var done = false; + var loop = { + next: function() { + if (done) { + return; + } + + if (index < iterations) { + index++; + func(loop); + + } else { + done = true; + callback(); + } + }, + + iteration: function() { + return index - 1; + }, + + break: function() { + done = true; + } + }; + loop.next(); + return loop; + } + + scope.fieldType = function (type) { + var fieldType = ""; + if (type) { + if (type == 'CODELOOKUP' || type == 'CODEVALUE') { + fieldType = 'SELECT'; + } else if (type == 'DATE') { + fieldType = 'DATE'; + } else if (type == 'DATETIME') { + fieldType = 'DATETIME'; + } else if (type == 'BOOLEAN') { + fieldType = 'BOOLEAN'; + } else { + fieldType = 'TEXT'; + } + } + return fieldType; + }; + switch (scope.action) { case "approve": @@ -21,6 +138,7 @@ scope.showDateField = true; scope.showNoteField = true; scope.taskPermissionName = 'APPROVE_SAVINGSACCOUNT'; + scope.fetchEntities('m_savings_account','APPROVE'); break; case "reject": scope.title = 'label.heading.rejectsavingaccount'; @@ -29,6 +147,7 @@ scope.showDateField = true; scope.showNoteField = true; scope.taskPermissionName = 'REJECT_SAVINGSACCOUNT'; + scope.fetchEntities('m_savings_account','REJECT'); break; case "withdrawnByApplicant": scope.title = 'label.heading.withdrawsavingaccount'; @@ -51,6 +170,7 @@ scope.showDateField = true; scope.showNoteField = false; scope.taskPermissionName = 'ACTIVATE_SAVINGSACCOUNT'; + scope.fetchEntities('m_savings_account','ACTIVATE'); break; case "deposit": resourceFactory.savingsTrxnsTemplateResource.get({savingsId: scope.accountId}, function (data) { @@ -88,6 +208,7 @@ scope.transactionAmountField = true; scope.showPaymentDetails = false; scope.taskPermissionName = 'WITHDRAWAL_SAVINGSACCOUNT'; + scope.fetchEntities('m_savings_account','WITHDRAWN'); break; case "applyAnnualFees": resourceFactory.savingsResource.get({accountId: routeParams.id, resourceType: 'charges', chargeId: routeParams.chargeId}, @@ -123,6 +244,7 @@ scope.postInterestValidationOnClosure = true; scope.formData.postInterestValidationOnClosure = true; scope.taskPermissionName = 'CLOSE_SAVINGSACCOUNT'; + scope.fetchEntities('m_savings_account','CLOSE'); break; case "modifytransaction": resourceFactory.savingsTrxnsResource.get({savingsId: scope.accountId, transactionId: routeParams.transactionId, template: 'true'}, @@ -303,9 +425,54 @@ }); } }; + + scope.submitDatatable = function(){ + if(scope.datatables) { + asyncLoop(Object.keys(scope.entityformData.datatables).length,function(loop){ + var cnt = loop.iteration(); + var formData = scope.entityformData.datatables[cnt]; + formData.registeredTableName = scope.datatables[cnt].registeredTableName; + + var params = { + datatablename: formData.registeredTableName, + entityId: routeParams.id, + genericResultSet: 'true' + }; + + angular.extend(formData.data,{dateFormat: scope.df, locale: scope.optlang.code}); + + _.each(formData.data, function (columnHeader) { + if (columnHeader.dateType) { + columnHeader = dateFilter(columnHeader.dateType.date, params.dateFormat); + } + else if (columnHeader.dateTimeType) { + columnHeader = dateFilter(columnHeader.dateTimeType.date, scope.df) + + " " + dateFilter(columnHeader.dateTimeType.time, scope.tf); + } + }); + console.log(scope.entityformData); + var action = submitStatus[cnt]; + resourceFactory.DataTablesResource[action](params, formData.data, function (data) { + + submitStatus[cnt] = "update"; + scope.submittedDatatables.push(scope.datatables[cnt].registeredTableName); + loop.next(); + },function(){ + rootScope.errorDetails[0].push({datatable:scope.datatables[cnt].registeredTableName}); + loop.break(); + }); + + },function(){ + scope.submit(); + }); + } + else{ + scope.submit(); + } + }; } }); - mifosX.ng.application.controller('SavingAccountActionsController', ['$scope', 'ResourceFactory', '$location', '$routeParams', 'dateFilter', mifosX.controllers.SavingAccountActionsController]).run(function ($log) { + mifosX.ng.application.controller('SavingAccountActionsController', ['$scope','$rootScope', 'ResourceFactory', '$location', '$routeParams', 'dateFilter', mifosX.controllers.SavingAccountActionsController]).run(function ($log) { $log.info("SavingAccountActionsController initialized"); }); }(mifosX.controllers || {})); diff --git a/app/scripts/controllers/shares/CreateShareAccountController.js b/app/scripts/controllers/shares/CreateShareAccountController.js index 09b5c095..619f1dc8 100644 --- a/app/scripts/controllers/shares/CreateShareAccountController.js +++ b/app/scripts/controllers/shares/CreateShareAccountController.js @@ -4,6 +4,7 @@ scope.products = []; scope.fieldOfficers = []; scope.formData = {}; + scope.sharedetails = {}; scope.restrictDate = new Date(); scope.clientId = routeParams.clientId; scope.date = {}; @@ -26,7 +27,23 @@ scope.formData.unitPrice = data.currentMarketPrice ; scope.formData.requestedShares = data.defaultShares ; scope.charges = data.charges; + scope.sharedetails = angular.copy(scope.formData); + scope.sharedetails.productName = scope.formValue(scope.products,scope.formData.productId,'id','name'); }); + + }; + + scope.$watch('formData',function(newVal){ + scope.sharedetails = angular.extend(scope.sharedetails,newVal); + }); + + scope.formValue = function(array,model,findattr,retAttr){ + findattr = findattr ? findattr : 'id'; + retAttr = retAttr ? retAttr : 'value'; + console.log(findattr,retAttr,model); + return _.find(array, function (obj) { + return obj[findattr] === model; + })[retAttr]; }; scope.addCharge = function (chargeId) { diff --git a/app/scripts/directives/ApiValidationDirective.js b/app/scripts/directives/ApiValidationDirective.js index a8d140ba..8b363b6e 100644 --- a/app/scripts/directives/ApiValidationDirective.js +++ b/app/scripts/directives/ApiValidationDirective.js @@ -13,8 +13,8 @@ '
' + '
' + '' + '{{error.code | translate:error.args}} - {{error.datatable}}' + + '' + '
'; elm.html('').append($compile(template)(scope)); } diff --git a/app/scripts/mifosXComponents.js b/app/scripts/mifosXComponents.js index 3eafc901..11b23d66 100755 --- a/app/scripts/mifosXComponents.js +++ b/app/scripts/mifosXComponents.js @@ -15,6 +15,7 @@ define(['Q', 'underscore', 'mifosX'], function (Q) { 'UIConfigService', 'NotificationResponseHeaderProvider' ], + controllers: [ 'main/MainController', 'main/LoginFormController', diff --git a/app/scripts/modules/angular-wizard.js b/app/scripts/modules/angular-wizard.js index 856e1600..d10d20cd 100644 --- a/app/scripts/modules/angular-wizard.js +++ b/app/scripts/modules/angular-wizard.js @@ -18,26 +18,23 @@ angular.module("wizard.html", []).run(["$templateCache", function($templateCache "
\n" + "
\n" + "
\n" + - "
\n" + - "
\n" + + // "
\n" + + // "
\n" + // "
\n" + // "
\n" + - " \n" + - "" + - "" + - "" + - ""+ - // " " + - "  {{step.title || step.wzTitle}}\n" + - " \n" + + "

{{steps[0].title || steps[0].wzTitle}}

"+ + "
    "+ + "
  • " + + ""+ + " {{step.title || step.wzTitle}}"+ + "
  • " + + "
" + // "
\n" + //"
\n" + - "
\n" + - "
\n" + + // "
\n" + + // "
\n" + "
\n" + "
\n" + "
\n" + @@ -55,20 +52,32 @@ angular.module('mgo-angular-wizard').directive('wzStep', function() { transclude: true, scope: { wzTitle: '@', - title: '@', - icon: '@' + wzHeadingTitle: '@', + canenter : '=', + canexit : '=', + disabled: '@?wzDisabled', + description: '@', + wzData: '=', + wzOrder: '@?' }, require: '^wizard', templateUrl: function(element, attributes) { return attributes.template || "step.html"; }, - link: function($scope, $element, $attrs, wizard) { - $scope.title = $scope.title || $scope.wzTitle; + link: function ($scope, $element, $attrs, wizard) { + $attrs.$observe('wzTitle', function (value) { + $scope.title = $scope.wzTitle; + }); + $scope.title = $scope.wzTitle; wizard.addStep($scope); + $scope.$on('$destroy', function(){ + wizard.removeStep($scope); + }); } - } + }; }); +//wizard directive angular.module('mgo-angular-wizard').directive('wizard', function() { return { restrict: 'EA', @@ -76,115 +85,388 @@ angular.module('mgo-angular-wizard').directive('wizard', function() { transclude: true, scope: { currentStep: '=', + onCancel: '&', onFinish: '&', hideIndicators: '=', editMode: '=', - name: '@' + name: '@', + indicatorsPosition: '@?' }, templateUrl: function(element, attributes) { return attributes.template || "wizard.html"; }, - controller: ['$scope', '$element', 'WizardHandler', function($scope, $element, WizardHandler) { + //controller for wizard directive, treat this just like an angular controller + controller: ['$scope', '$element', '$log', 'WizardHandler', '$q', '$timeout', function ($scope, $element, $log, WizardHandler, $q, $timeout) { + //setting default step position if none declared. + if ($scope.indicatorsPosition == undefined) { + $scope.indicatorsPosition = 'bottom'; + } + //this variable allows directive to load without having to pass any step validation + var firstRun = true; + //creating instance of wizard, passing this as second argument allows access to functions attached to this via Service WizardHandler.addWizard($scope.name || WizardHandler.defaultName, this); + $scope.$on('$destroy', function() { WizardHandler.removeWizard($scope.name || WizardHandler.defaultName); }); + //steps array where all the scopes of each step are added $scope.steps = []; - $scope.$watch('currentStep', function(step) { - if (!step) return; - var stepTitle = $scope.selectedStep.title || $scope.selectedStep.wzTitle; - if ($scope.selectedStep && stepTitle !== $scope.currentStep) { - $scope.goTo(_.findWhere($scope.steps, {title: $scope.currentStep})); - } + var stepIdx = function(step) { + var idx = 0; + var res = -1; + angular.forEach($scope.getEnabledSteps(), function(currStep) { + if (currStep === step) { + res = idx; + } + idx++; + }); + return res; + }; - }); + var stepByTitle = function(titleToFind) { + var foundStep = null; + angular.forEach($scope.getEnabledSteps(), function(step) { + if (step.wzTitle === titleToFind) { + foundStep = step; + } + }); + return foundStep; + }; - $scope.$watch('[editMode, steps.length]', function() { + + //update completed state for each step based on the editMode and current step number + var handleEditModeChange = function() { var editMode = $scope.editMode; - if (_.isUndefined(editMode) || _.isNull(editMode)) return; + if (angular.isUndefined(editMode) || (editMode === null)) return; - if (editMode) { - _.each($scope.steps, function(step) { - step.completed = true; + //Set completed for all steps to the value of editMode + angular.forEach($scope.steps, function (step) { + step.completed = editMode; + }); + + //If editMode is false, set ONLY ENABLED steps with index lower then completedIndex to completed + if (!editMode) { + var completedStepsIndex = $scope.currentStepNumber() - 1; + angular.forEach($scope.getEnabledSteps(), function(step, stepIndex) { + if(stepIndex < completedStepsIndex) { + step.completed = true; + } }); } + }; + + //access to context object for step validation + $scope.context = {}; + + //watching changes to currentStep + $scope.$watch('currentStep', function(step) { + //checking to make sure currentStep is truthy value + if (!step) return; + //setting stepTitle equal to current step title or default title + var stepTitle = $scope.selectedStep.wzTitle; + if ($scope.selectedStep && stepTitle !== $scope.currentStep) { + //invoking goTo() with step title as argument + $scope.goTo(stepByTitle($scope.currentStep)); + } + }); + + //watching steps array length and editMode value, if edit module is undefined or null the nothing is done + //if edit mode is truthy, then all steps are marked as completed + $scope.$watch('[editMode, steps.length]', function() { + handleEditModeChange(); }, true); + //called each time step directive is loaded this.addStep = function(step) { - $scope.steps.push(step); - if ($scope.steps.length === 1) { - $scope.goTo($scope.steps[0]); + var wzOrder = (step.wzOrder >= 0 && !$scope.steps[step.wzOrder]) ? step.wzOrder : $scope.steps.length; + //adding the scope of directive onto step array + $scope.steps[wzOrder] = step; + //if this step is the new first then goTo it + if ($scope.getEnabledSteps()[0] === step) { + //goTo first step + $scope.goTo($scope.getEnabledSteps()[0]); } }; + //called each time step directive is destroyed + this.removeStep = function (step) { + var index = $scope.steps.indexOf(step); + if (index > 0) { + $scope.steps.splice(index, 1); + } + }; + + this.removeSteps = function (index, length) { + $scope.steps.splice(index, length); + }; + + this.context = $scope.context; + + $scope.getStepNumber = function(step) { + return stepIdx(step) + 1; + }; + $scope.goTo = function(step) { - unselectAll(); - $scope.selectedStep = step; - if (!_.isUndefined($scope.currentStep)) { - $scope.currentStep = step.title || step.wzTitle; + //if this is the first time the wizard is loading it bi-passes step validation + if(firstRun){ + //deselect all steps so you can set fresh below + unselectAll(); + $scope.selectedStep = step; + //making sure current step is not undefined + if (!angular.isUndefined($scope.currentStep)) { + $scope.currentStep = step.wzTitle; + } + //setting selected step to argument passed into goTo() + step.selected = true; + //emit event upwards with data on goTo() invoktion + $scope.$emit('wizard:stepChanged', {step: step, index: stepIdx(step)}); + //setting variable to false so all other step changes must pass validation + firstRun = false; + } else { + //createing variables to capture current state that goTo() was invoked from and allow booleans + var thisStep; + //getting data for step you are transitioning out of + if($scope.currentStepNumber() > 0){ + thisStep = $scope.currentStepNumber() - 1; + } else if ($scope.currentStepNumber() === 0){ + thisStep = 0; + } + //$log.log('steps[thisStep] Data: ', $scope.getEnabledSteps()[thisStep].canexit); + $q.all([canExitStep($scope.getEnabledSteps()[thisStep], step), canEnterStep(step)]).then(function(data) { + if(data[0] && data[1]){ + //deselect all steps so you can set fresh below + unselectAll(); + + //$log.log('value for canExit argument: ', $scope.currentStep.canexit); + $scope.selectedStep = step; + //making sure current step is not undefined + if(!angular.isUndefined($scope.currentStep)){ + $scope.currentStep = step.wzTitle; + } + //setting selected step to argument passed into goTo() + step.selected = true; + //emit event upwards with data on goTo() invoktion + $scope.$emit('wizard:stepChanged', {step: step, index: stepIdx(step)}); + //$log.log('current step number: ', $scope.currentStepNumber()); + } else { + $scope.$emit('wizard:stepChangeFailed', {step: step, index: _.indexOf($scope.getEnabledSteps(), step)}); + } + }); } - step.selected = true; - $scope.$emit('wizard:stepChanged', {step: step, index: _.indexOf($scope.steps , step)}); }; + function canEnterStep(step) { + var defer; + var canEnter; + //If no validation function is provided, allow the user to enter the step + if(step.canenter === undefined){ + return true; + } + //If canenter is a boolean value instead of a function, return the value + if(typeof step.canenter === 'boolean'){ + return step.canenter; + } + //If canenter is a string instead of a function, evaluate the function + if(typeof step.canenter === 'string'){ + var splitFunction = step.canenter.split('('); + canEnter = eval('$scope.$parent.' + splitFunction[0] + '($scope.context' + splitFunction[1]) + } else { + canEnter = step.canenter($scope.context); + } + //Check to see if the canenter function is a promise which needs to be returned + if(angular.isFunction(canEnter.then)){ + defer = $q.defer(); + canEnter.then(function(response){ + defer.resolve(response); + }); + return defer.promise; + } else { + return canEnter === true; + } + } + + function canExitStep(step, stepTo) { + var defer; + var canExit; + //Exiting the step should be allowed if no validation function was provided or if the user is moving backwards + if(typeof(step.canexit) === 'undefined' || $scope.getStepNumber(stepTo) < $scope.currentStepNumber()){ + return true; + } + //If canexit is a boolean value instead of a function, return the value + if(typeof step.canexit === 'boolean'){ + return step.canexit; + } + //If canenter is a string instead of a function, evaluate the function + if(typeof step.canexit === 'string'){ + var splitFunction = step.canexit.split('('); + canExit = eval('$scope.$parent.' + splitFunction[0] + '($scope.context' + splitFunction[1]) + } else { + canExit = step.canexit($scope.context); + } + //Check to see if the canexit function is a promise which needs to be returned + if(angular.isFunction(canExit.then)){ + defer = $q.defer(); + canExit.then(function(response){ + defer.resolve(response); + }); + return defer.promise; + } else { + return canExit === true; + } + } + $scope.currentStepNumber = function() { - return _.indexOf($scope.steps , $scope.selectedStep) + 1; - } + //retreive current step number + return stepIdx($scope.selectedStep) + 1; + }; - this.getCurrentStep = function() { - return $scope.currentStepNumber(); - } + $scope.getEnabledSteps = function() { + return $scope.steps.filter(function(step){ + return step && step.disabled !== 'true'; + }); + }; + //unSelect All Steps function unselectAll() { - _.each($scope.steps, function (step) { + //traverse steps array and set each "selected" property to false + angular.forEach($scope.getEnabledSteps(), function (step) { step.selected = false; }); + //set selectedStep variable to null $scope.selectedStep = null; } - this.next = function(draft) { - var index = _.indexOf($scope.steps , $scope.selectedStep); - if (!draft) { + //ALL METHODS ATTACHED TO this ARE ACCESSIBLE VIA WizardHandler.wizard().methodName() + + this.currentStepTitle = function(){ + return $scope.selectedStep.wzTitle; + }; + + this.currentStepDescription = function(){ + return $scope.selectedStep.description; + }; + + this.currentStep = function(){ + return $scope.selectedStep; + }; + + this.totalStepCount = function() { + return $scope.getEnabledSteps().length; + }; + + //Access to enabled steps from outside + this.getEnabledSteps = function(){ + return $scope.getEnabledSteps(); + }; + + //Access to current step number from outside + this.currentStepNumber = function(){ + return $scope.currentStepNumber(); + }; + //method used for next button within step + this.next = function(callback) { + var enabledSteps = $scope.getEnabledSteps(); + //setting variable equal to step you were on when next() was invoked + var index = stepIdx($scope.selectedStep); + //checking to see if callback is a function + if(angular.isFunction(callback)){ + if(callback()){ + if (index === enabledSteps.length - 1) { + this.finish(); + } else { + //invoking goTo() with step number next in line + $scope.goTo(enabledSteps[index + 1]); + } + } else { + return; + } + } + if (!callback) { + //completed property set on scope which is used to add class/remove class from progress bar $scope.selectedStep.completed = true; } - if (index === $scope.steps.length - 1) { + //checking to see if this is the last step. If it is next behaves the same as finish() + if (index === enabledSteps.length - 1) { this.finish(); } else { - $scope.goTo($scope.steps[index + 1]); + //invoking goTo() with step number next in line + $scope.goTo(enabledSteps[index + 1]); } + }; + //used to traverse to any step, step number placed as argument this.goTo = function(step) { - var stepTo; - if (_.isNumber(step)) { - stepTo = $scope.steps[step]; - } else { - stepTo = _.findWhere($scope.steps, {title: step}); - } - $scope.goTo(stepTo); + //wrapped inside $timeout so newly enabled steps are included. + $timeout(function() { + var enabledSteps = $scope.getEnabledSteps(); + var stepTo; + //checking that step is a Number + if (angular.isNumber(step)) { + stepTo = enabledSteps[step]; + } else { + //finding the step associated with the title entered as goTo argument + stepTo = stepByTitle(step); + } + //going to step + $scope.goTo(stepTo); + }); }; + //calls finish() which calls onFinish() which is declared on an attribute and linked to controller via wizard directive. this.finish = function() { if ($scope.onFinish) { $scope.onFinish(); } }; - this.cancel = this.previous = function() { - var index = _.indexOf($scope.steps , $scope.selectedStep); + this.previous = function() { + //getting index of current step + var index = stepIdx($scope.selectedStep); + //ensuring you aren't trying to go back from the first step if (index === 0) { throw new Error("Can't go back. It's already in step 0"); } else { - $scope.goTo($scope.steps[index - 1]); + //go back one step from current step + $scope.goTo($scope.getEnabledSteps()[index - 1]); } }; - //deletes steps from $scope.steps array starting with index to length - this.removeSteps = function (index, length) { - $scope.steps.splice(index, length); + //cancel is alias for previous. + this.cancel = function() { + if ($scope.onCancel) { + //onCancel is linked to controller via wizard directive: + $scope.onCancel(); + } else { + //getting index of current step + var index = stepIdx($scope.selectedStep); + //ensuring you aren't trying to go back from the first step + if (index === 0) { + throw new Error("Can't go back. It's already in step 0"); + } else { + //go back one step from current step + $scope.goTo($scope.getEnabledSteps()[0]); + } + } + }; + + //reset + this.reset = function(){ + //traverse steps array and set each "completed" property to false + angular.forEach($scope.getEnabledSteps(), function (step) { + step.completed = false; + }); + //go to first step + this.goTo(0); + }; + + //change edit mode + this.setEditMode = function(mode) { + $scope.editMode = mode; + handleEditModeChange(); }; }] }; @@ -215,6 +497,7 @@ wizardButtonDirective('wzNext'); wizardButtonDirective('wzPrevious'); wizardButtonDirective('wzFinish'); wizardButtonDirective('wzCancel'); +wizardButtonDirective('wzReset'); angular.module('mgo-angular-wizard').factory('WizardHandler', function() { var service = {}; @@ -241,4 +524,4 @@ angular.module('mgo-angular-wizard').factory('WizardHandler', function() { }; return service; -}); +}); \ No newline at end of file diff --git a/app/styles-dev/main/_custom_mixins.scss b/app/styles-dev/main/_custom_mixins.scss index 933107e2..0510e219 100644 --- a/app/styles-dev/main/_custom_mixins.scss +++ b/app/styles-dev/main/_custom_mixins.scss @@ -6,6 +6,17 @@ $xs-large-screen: 1200px; // Custom mixins +@mixin bubble-style($color) { + background-color: $color; + color: $color; + border-color: darken($color, $darken-amount); + &:before, + &:after { + background-color: $color; + border-color: darken($color, $darken-amount); + } +} + @mixin utility-responsive($width) { @media only screen and (min-width: $width) { @content; } } diff --git a/app/styles-dev/main/components/_content.scss b/app/styles-dev/main/components/_content.scss index d3ba10e0..b258a5a3 100644 --- a/app/styles-dev/main/components/_content.scss +++ b/app/styles-dev/main/components/_content.scss @@ -198,6 +198,191 @@ span.required { background:$table-bg-active; } +// Progress Bar.. + +.flexer { + display: -webkit-box; + display: -moz-box; + display: -ms-flexbox; + display: -webkit-flex; + display: flex; +} +.no-flexer { + display: block; +} +.no-flexer-element { + -ms-flex: 0; + -webkit-flex: 0; + -moz-flex: 0; + flex: 0; +} +.flexer-element { + -ms-flex: 1; + -webkit-flex: 1; + -moz-flex: 1; + flex: 1; +} +.progress-indicator { + @extend .flexer; + margin: 0; + padding: 0; + font-size: 80%; + text-transform: uppercase; + margin-bottom: 1em; + > li { + @extend .flexer-element; + list-style: none; + text-align: center; + width: auto; + padding: 0; + margin: 0; + position: relative; + text-overflow: ellipsis; + color: $incomplete; + display: block; + &:hover { + color: darken($incomplete, $darken-amount); + } + } + > li .bubble { + border-radius: 1000px; + width: $bubble-size; + height: $bubble-size; + background-color: $incomplete; + display: block; + margin: 0 auto 0.5em auto; + border-bottom: $border-thickness solid darken($incomplete, 20%); + } + + // line connectors + + > li .bubble:before, + > li .bubble:after { + display: block; + position: absolute; + top: $bubble-size / 2 - $border-thickness; + width: 100%; + height: $bubble-line-thickness; + content: ''; + background-color: $incomplete; + &:hover{ + box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19); + } + } + > li .bubble:before { + left: 0; + } + > li .bubble:after { + right: 0; + } + + > li:first-child .bubble:before, + > li:first-child .bubble:after { + width: 50%; + margin-left: 50%; + } + + > li:last-child .bubble:before, + > li:last-child .bubble:after { + width: 50%; + margin-right: 50%; + } + + + // completed state + + > li.progress-done { + color: $complete; + .bubble { + @include bubble-style($complete); + transition: background-color 0.6s ease-in-out, color 0.6s ease-in-out; + -webkit-transition: background-color 0.6s ease-in-out, color 0.6s ease-in-out; + -moz-transition: background-color 0.6s ease-in-out, color 0.6s ease-in-out; + &:before, + &:after { + transition: background-color 0.6s ease-in-out, border-color 0.6s ease-in-out; + -webkit-transition: background-color 0.6s ease-in-out, border-color 0.6s ease-in-out; + -moz-transition: background-color 0.6s ease-in-out, border-color 0.6s ease-in-out; + } + + } + } + + // current state + + > li.progress-current { + color: $active; + .bubble { + @include bubble-style($active); + } + } + + // button states + + > li a:hover .bubble { + @include bubble-style($hover); + } + + // override states + + > li.danger .bubble { + @include bubble-style($step-danger); + } + > li.warning .bubble { + @include bubble-style($step-warning); + } + > li.info .bubble { + @include bubble-style($step-info); + } + + // stacked version + + &.stacked { + @extend .no-flexer; + > li { + text-indent: -10px; + text-align: center; + display: block; + } + > li .bubble:before, + > li .bubble:after { + left: 50%; + margin-left: -$bubble-line-thickness / 2; + width: $bubble-line-thickness; + height: 100%; + } + .stacked-text { + position: relative; + z-index: 10; + top: 0; + margin-left: 60% !important; + width: 45% !important; + display: inline-block; + text-align: left; + line-height: 1.2em; + } + > li a { + border: none; + } + } + &.stacked.nocenter { + > li .bubble { + margin-left: 0; + margin-right: 0 + } + > li .bubble:before, + > li .bubble:after { + left: $bubble-size / 2; + } + .stacked-text { + width: auto !important; + display: block; + margin-left: $bubble-size * 2 !important; + } + } +} + + .card{ background:#fff; display:block; @@ -318,7 +503,7 @@ span.required { &.btn-default:hover{ background:#f5f5f5; - color:$brand-primary; + color:$brand-info; } } diff --git a/app/styles-dev/main/components/_report.scss b/app/styles-dev/main/components/_report.scss index 92422859..47707a71 100644 --- a/app/styles-dev/main/components/_report.scss +++ b/app/styles-dev/main/components/_report.scss @@ -159,7 +159,34 @@ } } +td.labelrow { + padding: 0 0 10px; +} +tr.bottomborder td, tr.bottomborder th { + border-bottom:1px solid #C0C0C0; + padding-bottom:2px +} +tr.toppadding td, tr.toppadding th { + padding-top:8px +} + +tr.graybg td, tr.graybg th { + background-color: #F0F0F0; +} + +td.graybg { + background-color: #F0F0F0; +} + + +td.left-border { + border-left: thick solid #F0F0F0; +} + +hr.marginbottom { + margin-bottom: 8px; +} .margintopminustenpx { margin-top: -10px; diff --git a/app/styles-dev/main/components/_variables.scss b/app/styles-dev/main/components/_variables.scss index 0703b0c9..6487d8bf 100644 --- a/app/styles-dev/main/components/_variables.scss +++ b/app/styles-dev/main/components/_variables.scss @@ -8,6 +8,7 @@ $bootstrap-sass-asset-helper: false !default; // //## Gray and brand colors for use across Bootstrap. + $gray-base: #000 !default; $gray-darker: lighten($gray-base, 13.5%) !default; // #222 $gray-dark: lighten($gray-base, 20%) !default; // #333 @@ -21,6 +22,23 @@ $brand-info: #5bc0de !default; $brand-warning: #f0ad4e !default; $brand-danger: #d9534f !default; +//Progress bar +$incomplete: #bbb !default; +$complete: #65d074 !default; +$active: #337AB7 !default; +$hover: #5671d0 !default; +$step-danger: #d3140f !default; +$step-warning: #edb10a !default; +$step-info: #5b32d6 !default; +// sizing + +$bubble-size: 20px !default; +$bubble-line-thickness: 3px !default; +$border-thickness: 1px !default; +$darken-amount: 30% !default; + +// misc +$mobile-size: 400px !default; //== Scaffolding // diff --git a/app/styles/styles.css b/app/styles/styles.css index 4b08213c..dfd3f50d 100644 --- a/app/styles/styles.css +++ b/app/styles/styles.css @@ -7529,6 +7529,163 @@ span.required { .table th { background: #f5f5f5; } +.flexer, .progress-indicator { + display: -webkit-box; + display: -moz-box; + display: -ms-flexbox; + display: -webkit-flex; + display: flex; } + +.no-flexer, .progress-indicator.stacked { + display: block; } + +.no-flexer-element { + -ms-flex: 0; + -webkit-flex: 0; + -moz-flex: 0; + flex: 0; } + +.flexer-element, .progress-indicator > li { + -ms-flex: 1; + -webkit-flex: 1; + -moz-flex: 1; + flex: 1; } + +.progress-indicator { + margin: 0; + padding: 0; + font-size: 80%; + text-transform: uppercase; + margin-bottom: 1em; } + .progress-indicator > li { + list-style: none; + text-align: center; + width: auto; + padding: 0; + margin: 0; + position: relative; + text-overflow: ellipsis; + color: #bbb; + display: block; } + .progress-indicator > li:hover { + color: #6f6f6f; } + .progress-indicator > li .bubble { + border-radius: 1000px; + width: 20px; + height: 20px; + background-color: #bbb; + display: block; + margin: 0 auto 0.5em auto; + border-bottom: 1px solid #888888; } + .progress-indicator > li .bubble:before, + .progress-indicator > li .bubble:after { + display: block; + position: absolute; + top: 9px; + width: 100%; + height: 3px; + content: ''; + background-color: #bbb; } + .progress-indicator > li .bubble:before:hover, + .progress-indicator > li .bubble:after:hover { + box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19); } + .progress-indicator > li .bubble:before { + left: 0; } + .progress-indicator > li .bubble:after { + right: 0; } + .progress-indicator > li:first-child .bubble:before, + .progress-indicator > li:first-child .bubble:after { + width: 50%; + margin-left: 50%; } + .progress-indicator > li:last-child .bubble:before, + .progress-indicator > li:last-child .bubble:after { + width: 50%; + margin-right: 50%; } + .progress-indicator > li.progress-done { + color: #65d074; } + .progress-indicator > li.progress-done .bubble { + background-color: #65d074; + color: #65d074; + border-color: #247830; + transition: background-color 0.6s ease-in-out, color 0.6s ease-in-out; + -webkit-transition: background-color 0.6s ease-in-out, color 0.6s ease-in-out; + -moz-transition: background-color 0.6s ease-in-out, color 0.6s ease-in-out; } + .progress-indicator > li.progress-done .bubble:before, .progress-indicator > li.progress-done .bubble:after { + background-color: #65d074; + border-color: #247830; } + .progress-indicator > li.progress-done .bubble:before, .progress-indicator > li.progress-done .bubble:after { + transition: background-color 0.6s ease-in-out, border-color 0.6s ease-in-out; + -webkit-transition: background-color 0.6s ease-in-out, border-color 0.6s ease-in-out; + -moz-transition: background-color 0.6s ease-in-out, border-color 0.6s ease-in-out; } + .progress-indicator > li.progress-current { + color: #337AB7; } + .progress-indicator > li.progress-current .bubble { + background-color: #337AB7; + color: #337AB7; + border-color: #122a3f; } + .progress-indicator > li.progress-current .bubble:before, .progress-indicator > li.progress-current .bubble:after { + background-color: #337AB7; + border-color: #122a3f; } + .progress-indicator > li a:hover .bubble { + background-color: #5671d0; + color: #5671d0; + border-color: #1f306e; } + .progress-indicator > li a:hover .bubble:before, .progress-indicator > li a:hover .bubble:after { + background-color: #5671d0; + border-color: #1f306e; } + .progress-indicator > li.danger .bubble { + background-color: #d3140f; + color: #d3140f; + border-color: #440605; } + .progress-indicator > li.danger .bubble:before, .progress-indicator > li.danger .bubble:after { + background-color: #d3140f; + border-color: #440605; } + .progress-indicator > li.warning .bubble { + background-color: #edb10a; + color: #edb10a; + border-color: #5a4304; } + .progress-indicator > li.warning .bubble:before, .progress-indicator > li.warning .bubble:after { + background-color: #edb10a; + border-color: #5a4304; } + .progress-indicator > li.info .bubble { + background-color: #5b32d6; + color: #5b32d6; + border-color: #25135d; } + .progress-indicator > li.info .bubble:before, .progress-indicator > li.info .bubble:after { + background-color: #5b32d6; + border-color: #25135d; } + .progress-indicator.stacked > li { + text-indent: -10px; + text-align: center; + display: block; } + .progress-indicator.stacked > li .bubble:before, + .progress-indicator.stacked > li .bubble:after { + left: 50%; + margin-left: -1.5px; + width: 3px; + height: 100%; } + .progress-indicator.stacked .stacked-text { + position: relative; + z-index: 10; + top: 0; + margin-left: 60% !important; + width: 45% !important; + display: inline-block; + text-align: left; + line-height: 1.2em; } + .progress-indicator.stacked > li a { + border: none; } + .progress-indicator.stacked.nocenter > li .bubble { + margin-left: 0; + margin-right: 0; } + .progress-indicator.stacked.nocenter > li .bubble:before, + .progress-indicator.stacked.nocenter > li .bubble:after { + left: 10px; } + .progress-indicator.stacked.nocenter .stacked-text { + width: auto !important; + display: block; + margin-left: 40px !important; } + .card { background: #fff; display: block; @@ -7601,7 +7758,7 @@ span.required { border-left: 1px solid #e5e5e5; } .card .toolbar > .btn-group .btn.btn-default:hover { background: #f5f5f5; - color: #4f99ed; } + color: #5bc0de; } .card .toolbar > .btn-group.open .dropdown-toggle { -webkit-box-shadow: none; -moz-box-shadow: none; @@ -8093,6 +8250,28 @@ div.chosen-container.chosen-container-single { width: auto; vertical-align: middle; } +td.labelrow { + padding: 0 0 10px; } + +tr.bottomborder td, tr.bottomborder th { + border-bottom: 1px solid #C0C0C0; + padding-bottom: 2px; } + +tr.toppadding td, tr.toppadding th { + padding-top: 8px; } + +tr.graybg td, tr.graybg th { + background-color: #F0F0F0; } + +td.graybg { + background-color: #F0F0F0; } + +td.left-border { + border-left: thick solid #F0F0F0; } + +hr.marginbottom { + margin-bottom: 8px; } + .margintopminustenpx { margin-top: -10px; } .margintopminustenpx input { diff --git a/app/views/clients/clientactions.html b/app/views/clients/clientactions.html index db22988c..3bb27862 100644 --- a/app/views/clients/clientactions.html +++ b/app/views/clients/clientactions.html @@ -4,8 +4,13 @@
  • {{'label.anchor.viewclient' | translate}}
  • {{breadcrumbName | translate}}
  • - -
    + + + +
    + Entry in ` {{table}} ` has been made successfully. If the inputs are changed, the datatable entries will be updated.
    +
    +
    @@ -60,11 +65,91 @@
    - -
    +
    + +
    +
    - +
    + + +
    +
    +
    + Entry in ` {{table}} ` has been made successfully. If the inputs are changed, the datatable entries will be updated.
    +
    + +
    + {{datatable.registeredTableName}} +
    + +
    + + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + + + +
    +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    diff --git a/app/views/clients/createclient.html b/app/views/clients/createclient.html index b2d0432b..e4512f64 100755 --- a/app/views/clients/createclient.html +++ b/app/views/clients/createclient.html @@ -6,13 +6,13 @@
  • {{'label.anchor.viewgroup' | translate}}
  • {{'label.anchor.createclient' | translate}}
  • - +
    -
    +
    - {{'label.heading.createclient' | translate}} +
    -
    +
    {{'label.button.cancel' | translate}} - +
    +
    + +
    + +
    +
    + + +
    +
    + + +
    + + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + + + +
    +
    + + + + + + + + + +
    +
    + {{'label.button.cancel' | translate}} + +
    +
    +
    +
    \ No newline at end of file diff --git a/app/views/groups/editgroup.html b/app/views/groups/editgroup.html index 91e0f13e..adad7124 100644 --- a/app/views/groups/editgroup.html +++ b/app/views/groups/editgroup.html @@ -1,12 +1,12 @@
    - -
    -
    -
    + +
    +
    - {{'label.heading.editgroup' | translate}} + +
    @@ -53,7 +53,7 @@
    -
    +
    @@ -63,15 +63,95 @@
    -
    + + +
    {{'label.button.cancel' | translate}} -
    +
    -
    -
    -
    + + +
    +
    +
    + Entry in ` {{table}} ` has been made successfully. If the inputs are changed, the datatable entries will be updated.
    +
    + +
    + +
    + +
    + + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + + + +
    +
    +
    + +
    +
    + {{'label.button.cancel' | translate}} + +
    +
    +
    +
    +
    +
    +
    diff --git a/app/views/loans/loanaccountactions.html b/app/views/loans/loanaccountactions.html index cc8beec4..681076ae 100644 --- a/app/views/loans/loanaccountactions.html +++ b/app/views/loans/loanaccountactions.html @@ -5,13 +5,18 @@
  • {{'label.anchor.'+action | translate}}
  • -
    + + +
    +
    + Entry in ` {{table}} ` has been made successfully. If the inputs are changed, the datatable entries will be updated.
    +
    - {{ title | translate}} + @@ -37,7 +42,7 @@
    @@ -363,28 +368,128 @@
    -
    - +
    + +
    +
    + +
    +
    + + +
    +
    + + +
    +
    -
    - - -
    -
    - - -
    -
    +
    + +
    +
    +
    + Entry in ` {{table}} ` has been made successfully. If the inputs are changed, the datatable entries will be updated.
    +
    + +
    + +
    + +
    + + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + + + +
    +
    +
    + +
    +
    +
    + +
    +
    + + +
    +
    + + +
    +
    +
    +
    +
    +
    +
    diff --git a/app/views/loans/newloanaccount.html b/app/views/loans/newloanaccount.html index 0abf97e0..2e49fc91 100755 --- a/app/views/loans/newloanaccount.html +++ b/app/views/loans/newloanaccount.html @@ -5,31 +5,38 @@
  • '{{clientName}}'
  • {{'label.anchor.loanapplication' | translate}}
  • - -
    - -
    + + +
    +
    - - + +
    - - - - + - - + - - + - - - - +
    - - + + + - - + + - @@ -37,608 +44,778 @@
    - - + + +
    - + + + ng-model="date.first" is-open="opened" min="'2000-01-01'" max="restrictDate" + class="form-control"/> - - + + + + + datepicker-pop="dd MMMM yyyy" ng-model="date.second" is-open="opened1" + min="minDate" + max="'2020-06-22'" class="form-control"/>
    - - + + + +
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - -
    {{calendar.startDate | DateFormat}}{{calendar.humanReadable}}
    -
    -
    -
    -
    - -
    - - - - - - - -
    - - - - - - - -
    +
    +
    +
    + + + + + + + + + + + + + + +
    {{calendar.startDate | DateFormat}}{{calendar.humanReadable}}
    +
    +

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

    +
    +
    + + + + + + + +
    + + + + + + + +
    +
    + + +
    +
    +
    + +
    +
    + + +
    + + + + + + + + + + + +
    +  {{loanaccountinfo.currency.displaySymbol}} + + + + + + +
    + + +   + + + + -
    - - - - - - - - - - - - - - - - + + + + + + + + + + + + + - - - - - - - - - + + + + - - - - + + - - - - - - - - + + + + + + + + + + + + + + - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - + + + + + + + + - - - - - + loanaccountinfo.interestRecalculationData.recalculationCompoundingFrequencyNthDay != null">on + {{ + loanaccountinfo.interestRecalculationData.recalculationCompoundingFrequencyNthDay.value}} + {{ + loanaccountinfo.interestRecalculationData.recalculationCompoundingFrequencyWeekday.value}} + + + + + + + -
    -  {{loanaccountinfo.currency.displaySymbol}} - - - - -
    - -   - - + +  on +   +   - - - -   -   + +
    + + + + + + + + +
    +   {{loanaccountinfo.interestRateFrequencyType.value}} + + +
    + + + +
    +
    - - - - - - - -
    + + + +
    + -   {{loanaccountinfo.interestRateFrequencyType.value}} - -
    - -
    -
    + + + + +
    - -
    - - -
    + +  {{loanaccountinfo.currency.displaySymbol}} + + + +
    + + + + {{'label.input.grace' | translate }}: + + + + + + + +
    +   +   -
    -  {{loanaccountinfo.currency.displaySymbol}} - - -
    - - {{'label.input.grace' | translate }}: - - - - - - - -
    -   -   +
    + + + +
    +
    +
    + + + + + + + + +
    + + + + + + + + +
    + + + +
    - - -

    - - - - - - - - -
    - - - - - - - - -
    - - - - - - - - - - + + + + -
    - - - -
    - - - - - - +
    + + + +
    + + + + + + -
    - - - -
    + + + +
    +
    -
    -
    -
    - - - - - - -
    -   - -
    - - - - - - - - - - - - - - - -
    {{'label.input.expecteddisbursementon' | translate}}{{'label.input.principal' | translate}} 
    - - - -
    -
    -
    -
    - - - -
    - - - - - - - - - - - - - - - - - -
    {{'label.heading.name' | translate}}{{'label.heading.type' | translate}}{{'label.heading.amount' | translate}}{{'label.heading.collectedon' | translate}}{{'label.heading.date' | translate}}{{'label.heading.actions' | translate}}
    {{charge.name}},{{charge.currency.displaySymbol}}{{charge.chargeCalculationType.value}}{{charge.chargeTimeType.value}} - -
    -
    - - - - - - - - - - - - - - -
    {{'label.heading.name' | translate}}{{'label.heading.type' | translate}}{{'label.heading.amount' | translate}}{{'label.heading.collectedon' | translate}}
    {{charge.name}},{{charge.currency.displaySymbol}}{{charge.chargeCalculationType.value}}{{charge.amount | number}}{{charge.chargeTimeType.value}}
    -
    -
    - -    -    - -   -
    -
    - - - - - - - - - - - - - -
    {{'label.heading.type' | translate}}{{'label.heading.value' | translate}}{{'label.heading.description' | translate}}{{'label.heading.actions' | translate}}
    -
    +
    +
    +
    + + + + + + +
    +   + +
    + + + + + + + + + + + + + + + +
    {{'label.input.expecteddisbursementon' | translate}}{{'label.input.principal' | translate}} 
    + + + +
    +
    +
    +
    + + +
    +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    +  Add +
    +
    + + + + + + + + + + + + + + + + + +
    {{'label.heading.name' | translate}}{{'label.heading.type' | translate}}{{'label.heading.amount' | translate}}{{'label.heading.collectedon' | translate}}{{'label.heading.date' | translate}}{{'label.heading.actions' | translate}}
    {{charge.name}},{{charge.currency.displaySymbol}}{{charge.chargeCalculationType.value}}{{charge.chargeTimeType.value}} + +
    +
    + + + + + + + + + + + + + + +
    {{'label.heading.name' | translate}}{{'label.heading.type' | translate}}{{'label.heading.amount' | translate}}{{'label.heading.collectedon' | translate}}
    {{charge.name}},{{charge.currency.displaySymbol}}{{charge.chargeCalculationType.value}}{{charge.amount | number}}{{charge.chargeTimeType.value}}
    +
    +
    +
    + +    +
    + +
    +
    + +
    +
    +   Add +
    +
    +
    +
    + + + + + + + + + + + + + +
    {{'label.heading.type' | translate}}{{'label.heading.value' | translate}}{{'label.heading.description' | translate}}{{'label.heading.actions' | translate}}

    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    {{'label.heading.loanamountandbalance' | translate}}{{'label.heading.totalcostofloan' | translate}}
    #{{'label.heading.date' | translate}}{{'label.heading.days' | translate}}{{'label.heading.disbursement' | translate}}{{'label.heading.principaldue' | translate}}{{'label.heading.principalbalance' | translate}}{{'label.heading.interestdue' | translate}}{{'label.heading.fees' | translate}}{{'label.heading.penalty' | translate}}{{'label.heading.due' | translate}}
    {{period.period}}{{period.dueDate | DateFormat}}{{period.daysInPeriod}}{{period.principalDisbursed | number}}{{period.principalDue| number}}{{period.principalLoanBalanceOutstanding| number}}{{period.interestDue| number}}{{period.feeChargesDue| number}}{{period.penaltyChargesDue| number}}{{period.totalDueForPeriod| number}}
    {{'label.heading.total' | translate}}{{repaymentscheduleinfo.loanTermInDays}}{{repaymentscheduleinfo.totalPrincipalDisbursed| number}}{{repaymentscheduleinfo.totalPrincipalExpected| number}}{{repaymentscheduleinfo.totalInterestCharged| number}}{{repaymentscheduleinfo.totalFeeChargesCharged| number}}{{repaymentscheduleinfo.totalPenaltyChargesCharged| number}}{{repaymentscheduleinfo.totalRepaymentExpected| number}}
    -
    -
    - -
    - - +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {{'label.heading.loanamountandbalance' | translate}}{{'label.heading.totalcostofloan' | translate}}
    #{{'label.heading.date' | translate}}{{'label.heading.days' | translate}}{{'label.heading.disbursement' | translate}}{{'label.heading.principaldue' | translate}}{{'label.heading.principalbalance' | translate}}{{'label.heading.interestdue' | translate}}{{'label.heading.fees' | translate}}{{'label.heading.penalty' | translate}}{{'label.heading.due' | translate}}
    {{period.period}}{{period.dueDate | DateFormat}}{{period.daysInPeriod}}{{period.principalDisbursed | number}}{{period.principalDue| number}}{{period.principalLoanBalanceOutstanding| number}}{{period.interestDue| number}}{{period.feeChargesDue| number}}{{period.penaltyChargesDue| number}}{{period.totalDueForPeriod| number}}
    {{'label.heading.total' | translate}}{{repaymentscheduleinfo.loanTermInDays}}{{repaymentscheduleinfo.totalPrincipalDisbursed| number}}{{repaymentscheduleinfo.totalPrincipalExpected| number}}{{repaymentscheduleinfo.totalInterestCharged| number}}{{repaymentscheduleinfo.totalFeeChargesCharged| number}}{{repaymentscheduleinfo.totalPenaltyChargesCharged| number}}{{repaymentscheduleinfo.totalRepaymentExpected| number}}
    +
    +
    +
    + + +
    +
    +
    + +
    +
    + + +
    +
    + + +
    + + +
    +
    + +
    +
    + +
    -
    -
    -
    -
    -
    - -
    - -
    -

    {{datatable.registeredTableName}}

    -
    -
    -
    -
    - -
    -
    - - -
    -
    -
    -
    +
    -
    - - + + + + + + + + + +
    + + + + + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {{'label.heading.details' | translate}}
    {{'label.input.product' | translate}}{{loandetails.productName}}
    {{ 'label.input.loanofficer' | translate + }}: {{loandetails.loanOfficerName}}
    {{ 'label.input.loanpurpose' | translate }}: {{loandetails.loanPurposeName}}
    + {{ 'label.input.fund' | translate }}:{{loandetails.fundName}}
    {{ 'label.input.submittedon' | translate }}{{date.first | DateFormat}}
    {{ 'label.input.disbursementon' | translate }}{{date.second | DateFormat}}
    {{ 'label.input.externalid' | translate }}{{loandetails.externalId}}
    {{'label.heading.terms' | translate}}
    {{ 'label.input.principal' | translate }}{{loandetails.principal}} {{loanaccountinfo.currency.DisplaySymbol}}
    {{ 'label.input.loanterm' | translate }}{{loandetails.loanTermFrequency}} {{loandetails.loanTermFrequencyValue}}
    + {{ 'label.input.numofrepayments' | translate }}  + {{loandetails.numberOfRepayments}}
    {{ 'label.input.repaidevery' | translate }}{{loandetails.repaymentEvery}} {{loandetails.repaymentFrequencyValue}} {{loandetails.repaymentFrequencyNthDayValue}} {{loandetails.repaymentFrequencyDayOfWeekValue}}
    {{ 'label.input.firstrepaymenton' | translate }}{{date.fourth | DateFormat }}
    {{ 'label.input.interestchargedfrom' | translate}} + {{date.third | DateFormat}}
    {{ 'label.input.nominalinterestrate' | translate }}{{loandetails.interestRatePerPeriod}}  {{loanaccountinfo.interestRateFrequencyType.value}}
    {{ 'label.input.interestmethod' | translate }}{{loandetails.interestValue}}
    {{ 'label.input.isequalamortization' | translate }}{{loandetails.isEqualAmortization}}
    {{ 'label.input.amortization' | translate }} {{loandetails.amortizationValue}}
    {{ 'label.input.interestcalculationperiod' | translate }} {{loandetails.interestCalculationPeriodValue}}
    {{ 'label.input.allowpartialperiodinterestcalcualtion' | translate }} {{loandetails.allowPartialPeriodInterestCalcualtion}}
    {{ 'label.input.arearstolerance' | translate }}{{loandetails.inArrearsTolerance}} {{loanaccountinfo.currency.displaySymbol}}
    {{ 'label.input.interestfreeperiod' | translate }}{{loandetails.graceOnInterestCharged}}
    {{ 'label.input.repaymentstrategy' | translate }} {{loandetails.transactionProcessingStrategyValue}}
    {{'label.input.grace' | translate }}
    {{'label.input.onprincipalpayment' | translate}}{{formData.graceOnPrincipalPayment}}
    {{'label.input.oninterestpayment' | translate}}{{formData.graceOnInterestPayment}}
    {{'label.input.onduedate' | translate}}{{formData.graceOnArrearsAgeing}}
    {{ 'label.input.fixedemiamount' | translate }}:{{formData.fixedEmiAmount}}
    {{ 'label.heading.isTopup' | translate }}{{formData.isTopup}}
    {{ 'label.input.loanIdToClose' | translate}}{{loandetails.loanAccountToClose}}
    {{ 'label.input.recalculateinterest' | translate }}{{ loanaccountinfo.isInterestRecalculationEnabled | YesOrNo}}
    {{ 'label.input.daysinyears' | translate }}{{ loanaccountinfo.daysInYearType.value}}
    + {{ 'label.input.interest.recalculation.reschdule.strategy' | translate }} + + {{ loanaccountinfo.interestRecalculationData.rescheduleStrategyType.value}} +
    {{ 'label.input.daysinmonth' | translate }}{{ loanaccountinfo.daysInMonthType.value }}
    + {{ 'label.input.interest.recalculation.compounding.method'| translate }} + + {{ loanaccountinfo.interestRecalculationData.interestRecalculationCompoundingType.value}} +
    {{ 'label.input.frequency.for.recalculte.outstanding.principal' |translate }} + {{ loanaccountinfo.interestRecalculationData.recalculationRestFrequencyType.value}} + + + +
    + {{ 'label.input.frequenc.interval.for.recalculte.outstanding.principal' | translate}} + + {{ loanaccountinfo.interestRecalculationData.recalculationRestFrequencyInterval}} +
    + + + + + + +
    + + + +
    {{'label.heading.tranchedetails' | translate}}
    {{'label.input.expecteddisbursementon' | translate}}{{'label.input.principal' | translate}}
    {{disbursementDetail.expectedDisbursementDate | DateFormat}}{{disbursementDetail.principal}}
    {{'label.heading.charges' | translate}}
    {{'label.heading.name' | translate}}{{'label.heading.type' | translate}}{{'label.heading.amount' | translate}}{{'label.heading.collectedon' | translate}}{{'label.heading.date' | translate}}
    {{charge.name}},{{charge.currency.displaySymbol}}{{charge.chargeCalculationType.value}}{{charge.amount}}{{charge.chargeTimeType.value}}{{charge.dueDate | DateFormat}}
    {{'label.heading.name' | translate}}{{'label.heading.type' | translate}}{{'label.heading.amount' | translate}}{{'label.heading.collectedon' | translate}}
    {{charge.name}},{{charge.currency.displaySymbol}}{{charge.chargeCalculationType.value}}{{charge.amount | number}}{{charge.chargeTimeType.value}}
    +
    + + + + + + + + + + +
    {{datatable.registeredTableName}}
    {{ columnHeader.columnName | prettifyDataTableColumn }}{{formData.datatables[datatables.indexOf(datatable)].data[columnHeader.columnName]}}{{formData.datatables[datatables.indexOf(datatable)].data[columnHeader.columnName].date | DateFormat}} {{formData.datatables[datatables.indexOf(datatable)].data[columnHeader.columnName].time }}{{formData.datatables[datatables.indexOf(datatable)].data[columnHeader.columnName] | DateFormat}}
    +
    +
    +
    + + +
    +
    + + +
    +
    +
    + diff --git a/app/views/organization/entitydatatablechecks/entitydatatablechecks.html b/app/views/organization/entitydatatablechecks/entitydatatablechecks.html index 8906adbe..65883ccf 100644 --- a/app/views/organization/entitydatatablechecks/entitydatatablechecks.html +++ b/app/views/organization/entitydatatablechecks/entitydatatablechecks.html @@ -3,8 +3,8 @@
  • {{'label.anchor.organization' | translate}}
  • {{'label.anchor.entitydatatablechecks' | translate}}
  • - - +
    +  {{'label.button.createdatatablecheck' | translate}} @@ -159,4 +159,5 @@ + \ No newline at end of file diff --git a/app/views/products/createfixeddepositproduct.html b/app/views/products/createfixeddepositproduct.html index d174a74a..0ee30346 100755 --- a/app/views/products/createfixeddepositproduct.html +++ b/app/views/products/createfixeddepositproduct.html @@ -1,693 +1,1186 @@ -
    +
    -
    - -
    -

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

    -
    -
    - -
    - -
    -
    - -
    - -
    - -
    -
    - -
    -
    -
    - -
    - -
    -
    - -
    -
    -

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

    -
    -
    - -
    - -
    -
    - -
    -
    -
    - -
    - -
    -
    - -
    -
    -

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

    -
    -
    - -
    - -
    -
    - -
    -
    -
    - -
    - -
    - -
    - -
    -
    -
    - -
    - -
    - -
    - -
    -
    -
    - -
    - -
    - -
    - -
    -
    -

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

    -
    -
    - -
    - -
    -
    - -
    - -
    - -
    -
    - -
    -
    -
    - -
    - -
    -
    - -
    - -
    - -
    -
    - -
    -
    -
    - -
    - -
    -
    - -
    -
    - {{ 'label.on' | translate }} -
    -
    - -
    -
    -
    - - -
    - -
    -
    - -
    - -
    -
    -
    -

    {{ 'label.heading.interestchart' | translate }} - -

    -
    - -
    - -
    - -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    {{'label.heading.interestratedetails.amount.range' | translate}}{{'label.heading.interestratedetails.period.type' | translate}}{{'label.heading.interestratedetails.period.from.to' | translate}}{{'label.heading.interestratedetails.amount.range' | translate}}{{'label.heading.interestratedetails.interest' | translate}}{{'label.heading.interestratedetails.description' | translate}} - -  
    - - - - - - - - - - - -
      -  
    -
    - - - - - - - {{'label.remove.row' - | translate}} - - - - {{'label.incentive.row' - | translate}} -
    -
    -

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

    -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - -
    {{'label.heading.name' | translate}}{{'label.heading.type' | translate}}{{'label.heading.amount' | translate}}{{'label.heading.collectedon' | translate}}{{'label.heading.actions' | translate}}
    {{charge.name}},{{charge.currency.displaySymbol}}{{charge.chargeCalculationType.value}}{{charge.amount | number}}{{charge.chargeTimeType.value}}
    -
    -

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

    -
    -
    - -
    -
    - -
    -
    -
    -
    -

    {{"label.heading.assets" | translate}}

    - - -
    - -
    -
    -
    -
    -

    {{"label.heading.liabilities" | translate}}

    - - -
    - -
    - - -
    - -
    -
    -
    -
    -

    {{"label.heading.expenses" | translate}}

    - - -
    - -
    -
    -
    -
    -

    {{"label.heading.income" | translate}}

    - - -
    - -
    - - -
    - -
    -
    -
    -

    {{'label.heading.advancedaccountingrules' | translate}}[{{showOrHideValue}}]

    -
    -
    {{'label.heading.configurefundsourcesforpaymentchannels' | translate}}
    - - - - - - - - - - - - - - - - -
    {{'label.heading.paymenttype' | translate}}{{'label.heading.fundsource' | translate}}{{'label.heading.actions' | translate}}
    - - - -
    -
    {{'label.heading.mapfeestoincomeaccounts' | translate}}
    - - - - - - - - - - - - - - - - -
    {{'label.heading.fees' | translate}}{{'label.heading.incomeaccount' | translate}}{{'label.heading.actions' | translate}}
    - - - -
    -
    {{'label.heading.mappenaltiestospecificincomeaccounts' | translate}}
    - - - - - - - - - - - - - - - - -
    {{'label.heading.penalty' | translate}}{{'label.heading.incomeaccount' | translate}}{{'label.heading.actions' | translate}}
    - - - -
    -
    -
    -
    - - -
    - - - +
    + + + + + + +
    +
    + + +
    +
    + +
    + +
    + +
    + +
    +
    + +
    +
    +
    + +
    + +
    +
    + +
    +
    +
    + + +
    +
    +
    + +
    +
    + + +
    +
    + +
    + +
    +
    + +
    +
    +
    + +
    + +
    + +
    + +
    +
    +
    + +
    + +
    + +
    + +
    +
    +
    + +
    + +
    + +
    + +
    +
    +
    + + +
    +
    +
    + +
    +
    + + +
    +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + +
    +
    +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + +
    +
    +
    + +
    + +
    +
    + +
    +
    + {{ 'label.on' | translate }} +
    +
    + +
    +
    +
    + + +
    + +
    +
    + +
    + +
    +
    +
    +
    + + +
    +
    +
    + +
    +
    + +

    {{ 'label.heading.interestchart' | translate }} + +

    +
    + +
    + +
    + +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + +
    + {{'label.heading.interestratedetails.amount.range' | translate}} + {{'label.heading.interestratedetails.period.type' | translate}}{{'label.heading.interestratedetails.period.from.to' | translate}} + {{'label.heading.interestratedetails.amount.range' | translate}} + {{'label.heading.interestratedetails.interest' | translate}}{{'label.heading.interestratedetails.description' | translate}} + +  
    + - + + + + + + + + + + +
      -  
    +
    + - + + + + + {{'label.remove.row' + | translate}} + + + + {{'label.incentive.row' + | translate}} +
    +
    +
    + + +
    +
    +
    + +
    +
    + + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + +
    {{'label.heading.name' | translate}}{{'label.heading.type' | translate}}{{'label.heading.amount' | translate}}{{'label.heading.collectedon' | translate}}{{'label.heading.actions' | translate}}
    {{charge.name}},{{charge.currency.displaySymbol}}{{charge.chargeCalculationType.value}}{{charge.amount | number}}{{charge.chargeTimeType.value}}
    +
    +
    + + +
    +
    +
    + +
    +
    + + +
    +
    + +
    +
    + +
    +
    +
    +
    +

    {{"label.heading.assets" | translate}}

    + + +
    + +
    +
    +
    +
    +

    {{"label.heading.liabilities" | translate}}

    + + +
    + +
    + + +
    + +
    +
    +
    +
    +

    {{"label.heading.expenses" | translate}}

    + + +
    + +
    +
    +
    +
    +

    {{"label.heading.income" | translate}}

    + + +
    + +
    + + +
    + +
    +
    +
    +

    {{'label.heading.advancedaccountingrules' | translate}}[{{showOrHideValue}}]

    +
    +
    {{'label.heading.configurefundsourcesforpaymentchannels' | + translate}} +
    + + + + + + + + + + + + + + + + +
    {{'label.heading.paymenttype' | translate}}{{'label.heading.fundsource' | translate}}{{'label.heading.actions' | translate}}
    + + + +
    +
    {{'label.heading.mapfeestoincomeaccounts' | translate}}
    + + + + + + + + + + + + + + + + +
    {{'label.heading.fees' | translate}}{{'label.heading.incomeaccount' | translate}}{{'label.heading.actions' | translate}}
    + + + +
    +
    {{'label.heading.mappenaltiestospecificincomeaccounts' | translate}} +
    + + + + + + + + + + + + + + + + +
    {{'label.heading.penalty' | translate}}{{'label.heading.incomeaccount' | translate}}{{'label.heading.actions' | translate}}
    + + + + +
    +
    +
    +
    + + +
    +
    +
    + +
    +
    + +
    +
    +

    {{depositproduct.name}}

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +   +
    + {{'label.heading.details' | translate}} +
    {{'label.heading.description' | translate}}{{depositproduct.description}}
    {{'label.heading.shortname' | translate}} :{{depositproduct.shortName}}

    {{'label.heading.items' | translate}}
    {{'label.heading.currency' | translate}}{{depositproduct.currency.name}}
    {{'label.heading.decimalplaces' | translate}}{{depositproduct.digitsAfterDecimal}}
    {{'label.heading.currencyinmultiplesof' | translate}}{{depositproduct.inMultiplesOf | number}}
    {{'label.input.minDepositAmount' | translate}}{{depositproduct.minDepositAmount | number}}
    {{'label.input.default.deposit.amount' | translate}}{{depositproduct.depositAmount | number}}
    {{'label.input.maxDepositAmount' | translate}}{{depositproduct.maxDepositAmount | number}}
    {{'label.heading.interestcompoundingperiod' | translate}}{{depositproduct.interestCompoundingPeriodOption.value}}
    {{'label.heading.interestpostingperiod' | translate}}{{depositproduct.interestPostingPeriodOption.value}}
    {{'label.heading.interestcalculatedusing' | translate}}{{depositproduct.interestCalculationOption.value}}
    {{'label.heading.daysinyears' | translate}}{{depositproduct.interestCalculationDaysInYearOption.value}}

    {{'label.heading.settings' | translate}}
    {{'label.heading.lockinPeriodFrequency' | translate}}{{depositproduct.lockinPeriodFrequency}} + {{depositproduct.lockinPeriodFrequencyOption.value}} +
    {{'label.heading.minimumdepositterm' | translate}}{{depositproduct.minDepositTerm}}   {{depositproduct.minDepositTermType.value}} +
    {{'label.heading.maximumdepositterm' | translate}}{{depositproduct.maxDepositTerm}}   {{depositproduct.maxDepositTermType.value}} +
    {{'label.heading.inmultiplesofdeposit' | translate}}{{depositproduct.inMultiplesOfDepositTerm}} - + {{depositproduct.inMultiplesOfDepositTermType.value}} +
    {{'label.heading.preclosurepenalapplicable' | translate}}{{depositproduct.preClosurePenalInterest | number}}     %     On +    + {{depositproduct.preClosurePenalInterestOnType.value}} +
    {{'label.heading.withholdtax' | translate}}{{depositproduct.withHoldTax}}
    {{'label.heading.withholdtaxgroup' | translate}}{{depositproduct.taxGroup.name}}

    {{'label.heading.interestchart' | translate}}
    {{'label.heading.interestratechart.valid.from' | translate}} : + {{depositproduct.activeChart.fromDate | + DateFormat}} + {{'label.heading.interestratechart.valid.to' | translate}} : + {{depositproduct.activeChart.endDate | + DateFormat}} +
    + {{'label.heading.interestratedetails.amount.range' | translate}} + {{'label.heading.interestratedetails.period.from.to' | translate}} + {{'label.heading.interestratedetails.amount.range' | translate}} + {{'label.heading.interestratedetails.interest' | translate}}{{'label.heading.interestratedetails.description' | translate}} 
    + {{chartSlab.amountRangeFrom}} - {{chartSlab.amountRangeTo}} + {{chartSlab.fromPeriod}} - + {{chartSlab.toPeriod}} {{chartSlab.periodType.value}} +   + {{chartSlab.amountRangeFrom}} - {{chartSlab.amountRangeTo}} + +  {{chartSlab.annualInterestRate}}{{chartSlab.description}} + {{'label.incentive.row' + | translate}} +

    {{'label.heading.charges' | translate}}
    {{'label.heading.name' | translate}}{{'label.heading.type' | translate}}{{'label.heading.amount' | translate}}{{'label.heading.collectedon' | translate}}
    {{charge.name}}{{charge.chargeCalculationType.value}}{{charge.amount | number}}{{charge.chargeTimeType.value}}

    {{'label.heading.accounting' | translate}}{{'label.none' | translate}}
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {{'label.heading.savingsreference' | translate}}({{'label.heading.assets' | + translate}}) + + {{depositproduct.accountingMappings.savingsReferenceAccount.name}} +
    {{'label.heading.savingscontrol' | translate}}({{'label.heading.liabilities' + | translate}}) + + {{depositproduct.accountingMappings.savingsControlAccount.name}} +
    {{'label.heading.transfersinsuspenpense' | + translate}}({{'label.heading.liabilities' | + translate}}) + + {{depositproduct.accountingMappings.transfersInSuspenseAccount.name}} +
    {{'label.heading.interestonsavings' | translate}}({{'label.heading.expenses' + | translate}}) + + {{depositproduct.accountingMappings.interestOnSavingsAccount.name}} +
    {{'label.heading.incomefromfee' | translate}}({{'label.heading.income' | + translate}}) + + {{depositproduct.accountingMappings.incomeFromFeeAccount.name}} +
    {{'label.heading.incomefrompenalties' | translate}}({{'label.heading.income' + | translate}}) + + {{depositproduct.accountingMappings.incomeFromPenaltyAccount.name}} +

    + {{'label.heading.advancedaccountingrules' | translate}} +
    {{'label.heading.configurefundsourcesforpaymentchannels' | + translate}} +
    {{'label.heading.paymenttype' | translate}}{{'label.heading.fundsource' | translate}}
    {{paymentChannel.paymentType.name}}{{paymentChannel.fundSourceAccount.name}}
    {{'label.heading.feestospecificincome' | translate}}
    {{'label.heading.fees' | translate}}{{'label.heading.incomeaccount' | translate}}
    {{feeToIncomeAccount.charge.name}}{{feeToIncomeAccount.incomeAccount.name}}
    {{'label.heading.penaltiesspecifictoincomeacc' | translate}} +
    {{'label.heading.penalty' | translate}}{{'label.heading.incomeaccount' | translate}}
    {{penaltyToIncomeAccount.charge.name}}{{penaltyToIncomeAccount.incomeAccount.name}}
    +
    +
    +
    +
    + + +
    + + +
    +
    +
    + + + + diff --git a/app/views/products/createloanproduct.html b/app/views/products/createloanproduct.html index 28c52813..9e50182e 100755 --- a/app/views/products/createloanproduct.html +++ b/app/views/products/createloanproduct.html @@ -1,1379 +1,2121 @@ -
    - -
    - -
    -

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

    -
    -
    - - -
    - -
    -
    - -
    - - -
    - -
    -
    - -
    -
    -
    - - -
    - -
    - - -
    - -
    -
    -
    - - -
    - -
    - - -
    - -
    -
    -
    - - -
    - -
    -
    -

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

    -
    -
    - - -
    - -
    - - -
    - -
    -
    - -
    -
    -
    - - -
    - -
    -
    - -
    -
    -
    - - -
    - -
    -
    -

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

    -
    -
    - - -
    - -
    -
    -
    - - -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    -
    - - - -
    - - - - - - - - - - - - - - - - - -
    {{'label.input.cyclenumber' | translate}}{{'label.input.minimum' | translate}}{{'label.input.default' | translate}}{{'label.input.maximum' | translate}}
    - - - - - - - - - - -
    -
    -
    -
    - - -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    - - - -
    - - - - - - - - - - - - - - - - - -
    {{'label.input.cyclenumber' | translate}}{{'label.input.minimum' | translate}}{{'label.input.default' | translate}}{{'label.input.maximum' | translate}}
    - - - - - - - - - - -
    -
    -
    - -
    -
    - - {{'label.input.islinedtofloatinginterestrates' | translate}} -
    -
    - -
    - - -
    - -
    - -
    - -
    - -
    - - {{'label.input.isfloatingcalculationallowed' | translate}} -
    - -
    - -
    - - -
    - -
    -
    - -
    -
    - -
    -
    -
    - - -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    -
    - - - -
    - - - - - - - - - - - - - - - - - -
    {{'label.input.cyclenumber' | translate}}{{'label.input.minimum' | translate}}{{'label.input.default' | translate}}{{'label.input.maximum' | translate}}
    - - - - - - - - - - -
    -
    -
    -
    - - -
    - -
    -
    - -
    -
    - -
    -
    -
    - - -
    - -
    -
    -

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

    -
    -
    - - -
    - -
    - - -
    - -
    - -
    - -
    -
    -
    - - -
    - -
    - - -
    - -
    -
    - -
    -
    - -
    - - -
    - -
    -
    -
    -
    - - -
    - -
    -
    - -
    -
    -
    - - -
    - -
    - - -
    - -
    -
    -
    - - -
    - -
    - - -
    - -
    -
    - -
    - - -
    - -
    -
    - -
    - - -
    - -
    -
    -
    - - -
    - -
    -
    -
    - - -
    - -
    -
    - -
    -
    - -
    - - -
    - -
    -
    - -
    -
    - - {{'label.input.isvariableinstallmentsallowed' | translate}} - -
    -
    - -
    - - -
    - -
    - -
    - -
    -
    - -
    -
    - - {{'label.input.canUseForTopup' | translate}} - -
    -
    - - -

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

    -
    -
    - - -
    - -
    -
    - -
    - - -
    - -
    - - -
    - -
    -
    - -
    - - -
    - -
    -
    - -
    - - -
    - -
    - -
    -
    -   -
    -
    -   -
    -
    -   -
    -
    -
    -
    + + + + +
    + + +
    +
    + + +
    + +
    +
    + +
    + + +
    + +
    +
    + +
    +
    +
    + + +
    + +
    + + +
    + +
    +
    + +
    + + +
    + +
    + + +
    + +
    +
    +
    + + +
    + +
    +
    +
    + + +
    + +
    + +
    +
    + + +
    +
    + + +
    + +
    + + +
    + +
    +
    + +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    + + +
    + +
    +
    +
    + + +
    +
    +
    + +
    +
    + + +
    +
    + + +
    + +
    +
    +
    + + +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + + +
    + + + + + + + + + + + + + + + + + +
    {{'label.input.cyclenumber' | translate}}{{'label.input.minimum' | translate}}{{'label.input.default' | translate}}{{'label.input.maximum' | translate}}
    + + + + + + + + + + +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    + + + +
    + + + + + + + + + + + + + + + + + +
    {{'label.input.cyclenumber' | translate}}{{'label.input.minimum' | translate}}{{'label.input.default' | translate}}{{'label.input.maximum' | translate}}
    + + + + + + + + + + +
    +
    +
    + +
    +
    + + {{'label.input.islinedtofloatinginterestrates' | translate}} +
    +
    + +
    + + +
    + +
    + +
    + +
    + +
    + + {{'label.input.isfloatingcalculationallowed' | translate}} +
    + +
    + +
    + + +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + + +
    + + + + + + + + + + + + + + + + + +
    {{'label.input.cyclenumber' | translate}}{{'label.input.minimum' | translate}}{{'label.input.default' | translate}}{{'label.input.maximum' | translate}}
    + + + + + + + + + + +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + +
    +
    +
    + + +
    +
    +
    + +
    +
    + + +
    +
    + + +
    + +
    + + +
    + +
    + +
    + +
    +
    +
    + + +
    + +
    + + +
    + +
    +
    + +
    + + +
    + +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    + + +
    + +
    + + +
    + +
    +
    +
    + + +
    + +
    + + +
    + +
    +
    + +
    + + +
    + +
    +
    + +
    + + +
    + +
    +
    +
    + + +
    + +
    +
    +
    + + +
    + +
    +
    + +
    + + +
    + +
    +
    + +
    +
    + + {{'label.input.isvariableinstallmentsallowed' | translate}} + +
    +
    + +
    + + +
    + +
    + +
    + +
    +
    + +
    +
    + + {{'label.input.canUseForTopup' | translate}} + +
    +
    + + +

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

    +
    +
    + + +
    + +
    +
    +

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

    +
    +
    + + +
    + +
    +
    +

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

    +
    +
    + + +
    + +
    +
    +
    + + +
    + +
    + + +
    + +
    +
    +

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

    +
    +
    + + +
    + +
    +
    +
    + + +
    + +
    + + +
    + +
    +
    +
    + + +
    + +
    + + +
    + +
    +
    +
    + + + +
    + +
    + + +
    + +
    +
    +
    + + + +
    + +
    + + +
    + +
    +
    +
    + + +
    +
    +
    + +
    +
    + +
    +
    + + +
    + +
    + + +
    + +
    +
    + +
    + + +
    + +
    +
    + +
    + + +
    + +
    + +
    +
    +   +
    +
    +   +
    +
    +   +
    +
    +
    +
    + + +
    + +
    + +
    + + +
    + + +
    + +
    +
    +
    +   +
    +
    +   +
    +
    +   +
    +
    +
    +
    + + +
    + +
    + +
    + +
    + + +
    + +
    +
    +
    + + +
    +
    +
    + +
    +
    + +
    +
    + + +
    + + +
    +
    + +
    + + +
    + + +
    + + +
    +
    +
    +
    + + +
    +
    +
    + +
    +
    + + +
    +
    +
    + +
    +
    + +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    {{'label.heading.name' | translate}}{{'label.heading.type' | translate}}{{'label.heading.amount' | translate}}{{'label.heading.collectedon' | translate}}{{'label.heading.date' | translate}}{{'label.heading.actions' | translate}}
    {{charge.name}},{{charge.currency.displaySymbol}}{{charge.chargeCalculationType.value}}{{charge.amount}}{{charge.chargeTimeType.value}}
    +
    +

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

    +
    +
    +
    + +
    +
    + +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    {{'label.heading.name' | translate}}{{'label.heading.type' | translate}}{{'label.heading.amount' | translate}}{{'label.heading.collectedon' | translate}}{{'label.heading.date' | translate}}{{'label.heading.actions' | translate}}
    {{charge.name}},{{charge.currency.displaySymbol}}{{charge.chargeCalculationType.value}}{{charge.amount}}{{charge.chargeTimeType.value}}
    +
    +
    + + +
    +
    +
    + +
    +
    + + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    +
    +

    {{"label.heading.assets" | translate}}

    + + + +
    + +
    + + +
    + +
    +
    +
    + + + +
    + +
    + + +
    + +
    +
    +
    + + + +
    + +
    +
    +
    + + +
    + +
    +
    +
    +
    +

    {{"label.heading.income" | translate}}

    + + + +
    + +
    + + +
    + +
    +
    +
    + + + +
    + +
    + + +
    + +
    +
    +
    +
    +

    {{"label.heading.expenses" | translate}}

    + + + +
    + +
    +
    +
    +
    +

    {{"label.heading.liabilities" | translate}}

    + + + +
    + +
    +
    +
    +

    {{'label.heading.advancedaccountingrules' | translate}}[{{showOrHideValue}}] +

    + +
    +
    {{'label.heading.configurefundsourcesforpaymentchannels' | translate}}
    + + + + + + + + + + + + + + + + +
    {{'label.heading.paymenttype' | translate}}{{'label.heading.fundsource' | translate}}{{'label.heading.actions' | translate}}
    + + + + + +
    +
    {{'label.heading.mapfeestoincomeaccounts' | translate}}
    + + + + + + + + + + + + + + + + +
    {{'label.heading.fees' | translate}}{{'label.heading.incomeaccount' | translate}}{{'label.heading.actions' | translate}}
    + + + + + +
    +
    {{'label.heading.mappenaltiestospecificincomeaccounts' | translate}}
    + + + + + + + + + + + + + + + + +
    {{'label.heading.penalty' | translate}}{{'label.heading.incomeaccount' | translate}}{{'label.heading.actions' | translate}}
    + + + +
    +
    +
    +
    + + +
    +
    +
    + +
    +
    + +
    +
    +

    {{loanproduct.name}}

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + -
    - -
    - - - -
    - - -
    - -
    -
    -
    -   -
    -
    -   -
    -
    -   -
    -
    -
    -
    - - -
    - -
    - -
    - -
    - - -
    - -
    -
    - -

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

    -
    -
    - - -
    - -
    -
    - -
    - - -
    - - -
    -
    - -
    - - -
    - - -
    - - -
    -
    -
    - -

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

    -
    -
    - - -
    - -
    -
    -
    - - -
    - -
    - - -
    - -
    -
    -

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

    -
    -
    - - -
    - -
    -
    -
    - - -
    - -
    - - -
    - -
    -
    -
    - - -
    - -
    - - -
    - -
    -
    -
    - - - -
    - -
    - - -
    - -
    -
    -
    - - - -
    - -
    - - -
    - -
    -
    -

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

    -
    -
    -
    - -
    -
    - -
    -
    -
    -
    +   +
    + {{'label.heading.details' | translate}} +
    {{'label.heading.description' | translate}} :{{loanproduct.description}}
    {{'label.heading.shortname' | translate}} :{{loanproduct.shortName}}
    {{'label.heading.fundname' | translate}}:{{loanproduct.fundName}}
    {{'label.heading.startdate' | translate}}:{{date.first | DateFormat}}
    {{'label.heading.closedate' | translate}}:{{date.second | DateFormat}}
    {{'label.heading.includeborrowercycle' | translate}} :{{loanproduct.includeInBorrowerCycle}}

    {{'label.heading.currency' | translate}}
    {{'label.heading.currency' | translate}}:{{loanproduct.currency.name}}
    {{'label.heading.decimalplaces' | translate}} :{{formData.digitsAfterDecimal}}
    {{'label.heading.currencyinmultiplesof' | translate}}{{formData.inMultiplesOf}}
    {{'label.input.installmentinmultiplesof' | translate}}{{loanproduct.installmentAmountInMultiplesOf}}

    {{'label.heading.terms' | translate}}
    {{'label.input.useborrowerloancounter' | translate}} :{{loanproduct.useBorrowerCycle}}
    {{'label.heading.principal' | translate}}:{{loanproduct.principal|number}}   ( Min:{{loanproduct.minPrincipal|number}} , Max + :{{loanproduct.maxPrincipal|number}} ) +
    {{'label.heading.numofrepayments' | translate}}:{{loanproduct.numberOfRepayments}}   ( Min:{{loanproduct.minNumberOfRepayments}} , + Max:{{loanproduct.maxNumberOfRepayments}}) +
    {{'label.heading.repayevery' | translate}}:{{loanproduct.repaymentEvery}}  {{loanproduct.repaymentFrequencyOption.value}}
    {{'label.heading.nominalinterestrate' | translate}}:{{loanproduct.interestRatePerPeriod | number}}   ( + Min:{{loanproduct.minInterestRatePerPeriod | number}} , Max:{{loanproduct.maxInterestRatePerPeriod | number}})  {{loanproduct.interestRateFrequencyOption.value}} +
    {{'label.heading.floatinglendingrate' | translate}}:{{loanproduct.floatingRateName}}    + {{'label.heading.floatinginterestratedifferential' | translate}}:{{loanproduct.interestRateDifferential}}     + {{'label.heading.isFloatingInterestRateCalculationAllowed' | translate}}:{{loanproduct.isFloatingInterestRateCalculationAllowed}} +
    {{'label.heading.floatinginterestrate' | translate}}:{{loanproduct.defaultDifferentialLendingRate}}    + (Min:{{loanproduct.minDifferentialLendingRate}} , Max:{{loanproduct.maxDifferentialLendingRate}})   +
    {{'label.heading.principalCycleVariations' | translate}}:
    {{'label.input.cyclenumber' | translate}}{{'label.input.minimum' | translate}}{{'label.input.default' | translate}}{{'label.input.maximum' | translate}}
    {{borrowerCycleVariation.valueConditionType.code | translate}}{{borrowerCycleVariation.borrowerCycleNumber}} + {{borrowerCycleVariation.minValue}}{{borrowerCycleVariation.defaultValue}}{{borrowerCycleVariation.maxValue}}
    {{'label.heading.numerOfRepaymentCycleVariations' | translate}}
    {{'label.input.cyclenumber' | translate}}{{'label.input.minimum' | translate}}{{'label.input.default' | translate}}{{'label.input.maximum' | translate}}
    {{borrowerCycleVariation.valueConditionType.code | translate}}{{borrowerCycleVariation.borrowerCycleNumber}} + {{borrowerCycleVariation.minValue}}{{borrowerCycleVariation.defaultValue}}{{borrowerCycleVariation.maxValue}}
    {{'label.heading.interestRateCycleVariations' | translate}}
    {{'label.input.cyclenumber' | translate}}{{'label.input.minimum' | translate}}{{'label.input.default' | translate}}{{'label.input.maximum' | translate}}
    {{borrowerCycleVariation.valueConditionType.code | translate}}{{borrowerCycleVariation.borrowerCycleNumber}} + {{borrowerCycleVariation.minValue}}{{borrowerCycleVariation.defaultValue}}{{borrowerCycleVariation.maxValue}}
    {{'label.input.minimum.days.between.disbursal.and.first.repayment' | translate}}{{loanproduct.minimumDaysBetweenDisbursalAndFirstRepayment}}

    {{'label.heading.settings' | translate}}
    {{'label.heading.amortization' | translate}}{{loanproduct.amortizationOption.value}}
    {{'label.heading.interestmethod' | translate}}{{loanproduct.interestOption.value}}
    {{ 'label.input.isequalamortization' | translate }}{{loanproduct.isEqualAmortization}}
    {{'label.heading.interestcalculationperiod' | translate}}{{loanproduct.interestCalculationPeriodOption.value}}
    {{'label.heading.allowpartialperiodinterestcalcualtion' | translate}}{{loanproduct.allowPartialPeriodInterestCalcualtion}}
    {{'label.heading.arrearstolerance' | translate}}{{loanproduct.inArrearsTolerance|number}}
    {{'label.heading.repaymentstrategy' | translate}}{{loanproduct.transactionProcessingStrategyName}}
    {{'label.heading.grace' | translate}}{{loanproduct.graceOnPrincipalPayment}}
    {{'label.heading.interestfreeperiod' | translate}}{{loanproduct.graceOnInterestCharged}}
    {{'label.heading.graceOnArrearsAgeing' | translate}}{{loanproduct.graceOnArrearsAgeing}}
    {{'label.heading.overduedaysfornpa' | translate}}{{loanproduct.overdueDaysForNPA}}
    {{'label.input.loan.account.moves.out.of.npa.only.on.arrears.completion' | translate}}{{loanproduct.accountMovesOutOfNPAOnlyOnArrearsCompletion | YesOrNo}}
    {{'label.input.daysinyears' | translate}}{{loanproduct.daysInYearOption.value}}
    {{'label.input.daysinmonth' | translate}}{{loanproduct.daysInMonthOption.value}}
    {{'label.input.thresholdforlastinstallment' | translate}}{{loanproduct.principalThresholdForLastInstallment}}
    {{'label.input.candefineinstallmentamount' | translate}}{{loanproduct.canDefineInstallmentAmount | YesOrNo}}
    {{'label.input.variableinstallments' | translate}}(Min:{{loanproduct.minimumGap}} , Max:{{loanproduct.maximumGap}}) +
    {{'label.input.canUseForTopup' | translate}}{{loanproduct.canUseForTopup | YesOrNo}}

    {{'label.heading.interestRecalculation' | translate}}
    {{'label.input.recalculateinterest' | translate}}{{loanproduct.isInterestRecalculationEnabled | YesOrNo}}
    {{'label.input.interest.recalculation.reschdule.strategy' | translate}}{{loanproduct.interestRecalculationData.rescheduleStrategyType.value}}
    {{'label.input.preclose.interest.calculation.strategy' | translate}}{{loanproduct.interestRecalculationData.preClosureInterestCalculationStrategy.code | translate}}
    {{'label.input.interest.recalculation.compounding.method' | translate}}{{loanproduct.interestRecalculationData.interestRecalculationCompoundingType.value}}
    {{'label.input.frequency.for.compounding' | translate}}{{loanproduct.interestRecalculationData.recalculationCompoundingFrequencyType.value}} + + + +
    {{'label.input.frequency.interval.for.compounding' | translate}}{{formData.recalculationCompoundingFrequencyInterval}}
    - - - - - - - - - - - - - - - - - - - - - - - - -
    {{'label.heading.name' | translate}}{{'label.heading.type' | translate}}{{'label.heading.amount' | translate}}{{'label.heading.collectedon' | translate}}{{'label.heading.date' | translate}}{{'label.heading.actions' | translate}}
    {{charge.name}},{{charge.currency.displaySymbol}}{{charge.chargeCalculationType.value}}{{charge.amount}}{{charge.chargeTimeType.value}}
    -
    -

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

    -
    -
    -
    - -
    -
    - -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - -
    {{'label.heading.name' | translate}}{{'label.heading.type' | translate}}{{'label.heading.amount' | translate}}{{'label.heading.collectedon' | translate}}{{'label.heading.date' | translate}}{{'label.heading.actions' | translate}}
    {{charge.name}},{{charge.currency.displaySymbol}}{{charge.chargeCalculationType.value}}{{charge.amount}}{{charge.chargeTimeType.value}}
    -
    -

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

    -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    -
    -
    -

    {{"label.heading.assets" | translate}}

    - - - -
    - -
    - - -
    - -
    -
    -
    - - - -
    - -
    - - -
    - -
    -
    -
    - - - -
    - -
    -
    -
    - - -
    - -
    -
    -
    -
    -

    {{"label.heading.income" | translate}}

    - - - -
    - -
    - - -
    - -
    -
    -
    - - - -
    - -
    - - -
    - -
    -
    -
    -
    -

    {{"label.heading.expenses" | translate}}

    - - - -
    - -
    -
    -
    -
    -

    {{"label.heading.liabilities" | translate}}

    - - - -
    - -
    -
    -
    -

    {{'label.heading.advancedaccountingrules' | translate}}[{{showOrHideValue}}] -

    - -
    -
    {{'label.heading.configurefundsourcesforpaymentchannels' | translate}}
    - - - - - - - - - - - - - - - - -
    {{'label.heading.paymenttype' | translate}}{{'label.heading.fundsource' | translate}}{{'label.heading.actions' | translate}}
    - - - - - -
    -
    {{'label.heading.mapfeestoincomeaccounts' | translate}}
    - - - - - - - - - - - - - - - - -
    {{'label.heading.fees' | translate}}{{'label.heading.incomeaccount' | translate}}{{'label.heading.actions' | translate}}
    - - - - - -
    -
    {{'label.heading.mappenaltiestospecificincomeaccounts' | translate}}
    - - - - - - - - - - - - - - - - -
    {{'label.heading.penalty' | translate}}{{'label.heading.incomeaccount' | translate}}{{'label.heading.actions' | translate}}
    - - - -
    -
    -
    -
    - - -
    -
    - + + {{'label.input.frequency.for.recalculte.outstanding.principal' | translate}} + {{loanproduct.interestRecalculationData.recalculationRestFrequencyType.value}} + + + + + + + {{'label.input.frequenc.interval.for.recalculte.outstanding.principal' | translate}} + {{loanproduct.recalculationRestFrequencyInterval}} + + + + {{'label.input.arrearsbasedonoriginalschedule' | translate}} + {{loanproduct.isArrearsBasedOnOriginalSchedule | YesOrNo}} + + + +
    + + + {{'label.heading.gauranteeRequirements' | translate}} + + + {{'label.input.holdguaranteefunds' | translate}} + {{loanproduct.holdGuaranteeFunds | YesOrNo}} + + + {{'label.input.mandatory.guarantee' | translate}} + {{loanproduct.mandatoryGuarantee}} + + + {{'label.input.minimum.guarantee.from.own.funds' | translate}} + {{loanproduct.minimumGuaranteeFromOwnFunds}} + + + {{'label.input.minimum.guarantee.from.guarantor' | translate}} + {{loanproduct.minimumGuaranteeFromGuarantor}} + + + +
    + + + {{'label.heading.tranchedetails' | translate}} + + + {{'label.input.multidisburseloan' | translate}} + {{loanproduct.multiDisburseLoan}} + + + {{'label.input.maxtranchecount' | translate}} + {{loanproduct.maxTrancheCount}} + + + {{'label.input.outstandingloanbalance' | translate}} + {{loanproduct.outstandingLoanBalance}} + + +
    + + + {{'label.heading.configurableAttributes' | translate}} + + + {{'label.input.isConfigLoanAttributes' | translate}} + {{allowAttributeConfiguration}} + + + {{'label.input.amortization' | translate}} + {{amortization}} + + + {{'label.input.interestmethod' | translate}} + {{interestMethod}} + + + {{'label.input.repaymentstrategy' | translate}} + {{transactionProcessingStrategy}} + + + {{'label.input.interestcalculationperiod' | translate}} + {{interestCalcPeriod}} + + + {{'label.input.arearstolerance' | translate}} + {{arrearsTolerance}} + + + {{'label.input.repaidevery' | translate}} + {{repaymentFrequency}} + + + {{'label.input.grace' | translate}} + {{graceOnPrincipalAndInterest}} + + + {{'label.input.no.of.overdue.days.to.move.loan.into.arrears' | translate}} + {{graceOnArrearsAging}} + + + {{'label.heading.charges' | translate}} + + + {{'label.heading.name' | translate}} + {{'label.heading.type' | translate}} + {{'label.heading.amount' | translate}} + {{'label.heading.collectedon' | translate}} + + + {{charge.name}} + {{charge.chargeCalculationType.value}} + {{charge.amount|number}} + {{charge.chargeTimeType.value}} + + +
    + + + {{'label.heading.overduepenalitycharge' | translate}} + + + {{'label.heading.name' | translate}} + {{'label.heading.type' | translate}} + {{'label.heading.amount' | translate}} + {{'label.heading.collectedon' | translate}} + + + {{charge.name}} + {{charge.chargeCalculationType.value}} + {{charge.amount|number}} + {{charge.chargeTimeType.value}} + + +
    + + + + {{'label.heading.accounting' | translate}} + {{accountingOptions[formData.accountingRule - 1]}} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {{'label.heading.fundsource' | translate}}:{{loanproduct.accountingMappings.fundSourceAccount.name}}
    {{'label.heading.loanportfolio' | translate}}:{{loanproduct.accountingMappings.loanPortfolioAccount.name}}
    {{'label.heading.receivableinterest' | translate}}:{{loanproduct.accountingMappings.receivableInterestAccount.name}}
    {{'label.heading.receivablefees' | translate}}:{{loanproduct.accountingMappings.receivableFeeAccount.name}}
    {{'label.heading.receivablepenalties' | translate}}:{{loanproduct.accountingMappings.receivablePenaltyAccount.name}}
    {{'label.heading.transfersinsuspenpense' | translate}}:{{loanproduct.accountingMappings.transfersInSuspenseAccount.name}}
    {{'label.heading.incomefrominterest' | translate}}:{{loanproduct.accountingMappings.interestOnLoanAccount.name}}
    {{'label.heading.incomefromfees' | translate}}:{{loanproduct.accountingMappings.incomeFromFeeAccount.name}}
    {{'label.heading.incomefrompenalties' | translate}}:{{loanproduct.accountingMappings.incomeFromPenaltyAccount.name}}
    {{'label.heading.recoverypayments' | translate}}:{{loanproduct.accountingMappings.incomeFromRecoveryAccount.name}}
    {{'label.heading.loseswrittenoff' | translate}}:{{loanproduct.accountingMappings.writeOffAccount.name}}
    {{'label.heading.overpaymentliability' | translate}}:{{loanproduct.accountingMappings.overpaymentLiabilityAccount.name}}

    + {{'label.heading.advancedaccountingrules' | translate}} +
    {{'label.heading.fundsourcesforpayment' | translate}}
    {{'label.heading.paymenttype' | translate}}{{'label.heading.fundsource' | translate}}
    {{paymentChannel.paymentType.name}}{{paymentChannel.fundSourceAccount.name}}
    {{'label.heading.feestospecificincome' | translate}}
    {{'label.heading.fees' | translate}}{{'label.heading.incomeaccount' | translate}}
    {{feeToIncomeAccount.charge.name}}{{feeToIncomeAccount.incomeAccount.name}}
    {{'label.heading.penaltiesspecifictoincomeacc' | translate}}
    {{'label.heading.penalty' | translate}}{{'label.heading.incomeaccount' | translate}}
    {{penaltyToIncomeAccount.charge.name}}{{penaltyToIncomeAccount.incomeAccount.name}}
    + + + +
    +
    +
    +
    + + +
    +
    + + + + + +
    diff --git a/app/views/products/createrecurringdepositproduct.html b/app/views/products/createrecurringdepositproduct.html index 11435028..cf917010 100755 --- a/app/views/products/createrecurringdepositproduct.html +++ b/app/views/products/createrecurringdepositproduct.html @@ -1,693 +1,1210 @@ -
    +
    -
    - -
    -

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

    -
    -
    - -
    - -
    -
    - -
    - -
    - -
    -
    - -
    -
    -
    - -
    - -
    -
    - -
    -
    -

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

    -
    -
    - -
    - -
    -
    - -
    -
    -
    - -
    - -
    -
    - -
    -
    -

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

    -
    -
    - -
    - -
    -
    - -
    -
    -
    - -
    - -
    - -
    - -
    -
    -
    - -
    - -
    - -
    - -
    -
    -
    - -
    - -
    - -
    - -
    -
    -

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

    -
    -
    - -
    - -
    - -
    - -
    -
    -
    - -
    - -
    -
    - -
    - -
    - -
    -
    - -
    - -
    - -
    -
    - -
    -
    -
    - -
    - -
    -
    - -
    - -
    - -
    -
    - -
    -
    -
    - -
    - -
    -
    - -
    -
    - {{ 'label.on' | translate }} -
    -
    - -
    -
    -
    - -
    - -
    - -
    -
    - - -
    - -
    -
    - -
    - -
    -
    -
    -

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

    -
    - -
    - -
    - -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    {{'label.heading.interestratedetails.amount.range' | translate}}{{'label.heading.interestratedetails.period.type' | translate}}{{'label.heading.interestratedetails.period.from.to' | translate}}{{'label.heading.interestratedetails.amount.range' | translate}}{{'label.heading.interestratedetails.interest' | translate}}{{'label.heading.interestratedetails.description' | translate}} - -  
    - - - - - - - - - - - -
      -  
    -
    - - - - - - - {{'label.remove.row' - | translate}} - - - - {{'label.incentive.row' - | translate}} -
    -
    -

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

    -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - -
    {{'label.heading.name' | translate}}{{'label.heading.type' | translate}}{{'label.heading.amount' | translate}}{{'label.heading.collectedon' | translate}}{{'label.heading.actions' | translate}}
    {{charge.name}},{{charge.currency.displaySymbol}}{{charge.chargeCalculationType.value}}{{charge.amount | number}}{{charge.chargeTimeType.value}}
    -
    -

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

    -
    -
    - -
    -
    - -
    -
    -
    -
    -

    {{"label.heading.assets" | translate}}

    - - -
    - -
    -
    -
    -
    -

    {{"label.heading.liabilities" | translate}}

    - - -
    - -
    - - -
    - -
    -
    -
    -
    -

    {{"label.heading.expenses" | translate}}

    - - -
    - -
    -
    -
    -
    -

    {{"label.heading.income" | translate}}

    - - -
    - -
    - - -
    - -
    -
    -
    -

    {{'label.heading.advancedaccountingrules' | translate}}[{{showOrHideValue}}]

    -
    -
    {{'label.heading.configurefundsourcesforpaymentchannels' | translate}}
    - - - - - - - - - - - - - - - - -
    {{'label.heading.paymenttype' | translate}}{{'label.heading.fundsource' | translate}}{{'label.heading.actions' | translate}}
    - - - -
    -
    {{'label.heading.mapfeestoincomeaccounts' | translate}}
    - - - - - - - - - - - - - - - - -
    {{'label.heading.fees' | translate}}{{'label.heading.incomeaccount' | translate}}{{'label.heading.actions' | translate}}
    - - - -
    -
    {{'label.heading.mappenaltiestospecificincomeaccounts' | translate}}
    - - - - - - - - - - - - - - - - -
    {{'label.heading.penalty' | translate}}{{'label.heading.incomeaccount' | translate}}{{'label.heading.actions' | translate}}
    - - - -
    -
    -
    -
    - - -
    - - -
    -
    +
    + + + + + + +
    +
    + + +
    +
    + +
    + +
    + +
    + +
    +
    + +
    +
    +
    + +
    + +
    +
    + +
    +
    +
    + + +
    +
    +
    + +
    +
    + + +
    +
    + +
    + +
    +
    + +
    +
    +
    + +
    + +
    + +
    + +
    +
    +
    + +
    + +
    + +
    + +
    +
    +
    + +
    + +
    + +
    + +
    +
    +
    + + +
    +
    +
    + +
    +
    + + +
    +
    + +
    + +
    + +
    + +
    +
    +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + +
    +
    +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + +
    +
    +
    + +
    + +
    +
    + +
    +
    + {{ 'label.on' | translate }} +
    +
    + +
    +
    +
    + +
    + +
    +
    +
    + + +
    + +
    +
    + +
    + +
    +
    +
    +
    + + +
    +
    +
    + +
    +
    + +

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

    +
    + +
    + +
    + +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + +
    + {{'label.heading.interestratedetails.amount.range' | translate}} + {{'label.heading.interestratedetails.period.type' | translate}}{{'label.heading.interestratedetails.period.from.to' | translate}} + {{'label.heading.interestratedetails.amount.range' | translate}} + {{'label.heading.interestratedetails.interest' | translate}}{{'label.heading.interestratedetails.description' | translate}} + +  
    + - + + + + + + + + + + +
      -  
    +
    + - + + + + + {{'label.remove.row' + | translate}} + + + + {{'label.incentive.row' + | translate}} +
    +
    +
    + + +
    +
    +
    + +
    +
    + + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + +
    {{'label.heading.name' | translate}}{{'label.heading.type' | translate}}{{'label.heading.amount' | translate}}{{'label.heading.collectedon' | translate}}{{'label.heading.actions' | translate}}
    {{charge.name}},{{charge.currency.displaySymbol}}{{charge.chargeCalculationType.value}}{{charge.amount | number}}{{charge.chargeTimeType.value}}
    +
    +
    + + +
    +
    +
    + +
    +
    + + +
    +
    + +
    +
    + +
    +
    +
    +
    +

    {{"label.heading.assets" | translate}}

    + + +
    + +
    +
    +
    +
    +

    {{"label.heading.liabilities" | translate}}

    + + +
    + +
    + + +
    + +
    +
    +
    +
    +

    {{"label.heading.expenses" | translate}}

    + + +
    + +
    +
    +
    +
    +

    {{"label.heading.income" | translate}}

    + + +
    + +
    + + +
    + +
    +
    +
    +

    {{'label.heading.advancedaccountingrules' | translate}}[{{showOrHideValue}}]

    +
    +
    {{'label.heading.configurefundsourcesforpaymentchannels' | + translate}} +
    + + + + + + + + + + + + + + + + +
    {{'label.heading.paymenttype' | translate}}{{'label.heading.fundsource' | translate}}{{'label.heading.actions' | translate}}
    + + + +
    +
    {{'label.heading.mapfeestoincomeaccounts' | translate}}
    + + + + + + + + + + + + + + + + +
    {{'label.heading.fees' | translate}}{{'label.heading.incomeaccount' | translate}}{{'label.heading.actions' | translate}}
    + + + +
    +
    {{'label.heading.mappenaltiestospecificincomeaccounts' | translate}} +
    + + + + + + + + + + + + + + + + +
    {{'label.heading.penalty' | translate}}{{'label.heading.incomeaccount' | translate}}{{'label.heading.actions' | translate}}
    + + + + +
    +
    +
    +
    + + +
    +
    +
    + +
    +
    +
    +
    + + +

    {{depositproduct.name}}

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + {{'label.heading.details' | translate}} +
    {{'label.heading.description' | translate}}{{depositproduct.description}}
    {{'label.heading.shortname' | translate}} :{{depositproduct.shortName}}

    {{'label.heading.items' | translate}}
    {{'label.heading.currency' | translate}}{{depositproduct.currency.name}}
    {{'label.heading.decimalplaces' | translate}}{{depositproduct.digitsAfterDecimal}}
    {{'label.heading.currencyinmultiplesof' | translate}}{{depositproduct.inMultiplesOf | number}}
    {{'label.input.minDepositAmount' | translate}}{{depositproduct.minDepositAmount | number}}
    {{'label.input.default.deposit.amount' | translate}}{{depositproduct.depositAmount | number}}
    {{'label.input.maxDepositAmount' | translate}}{{depositproduct.maxDepositAmount | number}}
    {{'label.heading.interestcompoundingperiod' | translate}}{{depositproduct.interestCompoundingPeriodOption.value}}
    {{'label.heading.interestpostingperiod' | translate}}{{depositproduct.interestPostingPeriodOption.value}}
    {{'label.heading.interestcalculatedusing' | translate}}{{depositproduct.interestCalculationOption.value}}
    {{'label.heading.daysinyears' | translate}}{{depositproduct.interestCalculationDaysInYearOption.value}}

    {{'label.heading.settings' | translate}}
    {{'label.heading.lockinPeriodFrequency' | translate}}{{depositproduct.lockinPeriodFrequency}} + {{depositproduct.lockinPeriodFrequencyOption.value}} +
    {{'label.heading.minimumdepositterm' | translate}}{{depositproduct.minDepositTerm}}   {{depositproduct.minDepositTermType.value}} +
    {{'label.heading.maximumdepositterm' | translate}}{{depositproduct.maxDepositTerm}}   {{depositproduct.maxDepositTermType.value}} +
    {{'label.heading.inmultiplesofdeposit' | translate}}{{depositproduct.inMultiplesOfDepositTerm}} - + {{depositproduct.inMultiplesOfDepositTermType.value}} +
    {{'label.heading.recurringdeposittype' | translate}} +
    {{'label.mandatory' | + translate}} +
    +
    {{'label.voluntary' | + translate}} +
    +
    {{'label.heading.preclosurepenalapplicable' | translate}}{{depositproduct.preClosurePenalInterest}}     %     On    + {{depositproduct.preClosurePenalInterestOnType.value}} +
    {{'label.heading.minbalanceforinterestcalculation' | translate}}{{depositproduct.minBalanceForInterestCalculation | number}}
    {{'label.heading.withholdtax' | translate}}{{depositproduct.withHoldTax}}
    {{'label.heading.withholdtaxgroup' | translate}}{{depositproduct.taxGroup.name}}

    {{'label.heading.interestchart' | translate}}
    + +
    {{'label.heading.interestratechart.valid.from' | translate}} : + {{depositproduct.activeChart.fromDate | + DateFormat}} + {{'label.heading.interestratechart.valid.to' | translate}} : + {{depositproduct.activeChart.endDate | + DateFormat}} +
    + {{'label.heading.interestratedetails.amount.range' | translate}} + {{'label.heading.interestratedetails.period.from.to' | translate}} + {{'label.heading.interestratedetails.amount.range' | translate}} + {{'label.heading.interestratedetails.interest' | translate}}{{'label.heading.interestratedetails.description' | translate}} 
    + {{chartSlab.amountRangeFrom}} - {{chartSlab.amountRangeTo}} + {{chartSlab.fromPeriod}} - + {{chartSlab.toPeriod}} {{chartSlab.periodType.value}} +   + {{chartSlab.amountRangeFrom}} - {{chartSlab.amountRangeTo}} + +  {{chartSlab.annualInterestRate}}{{chartSlab.description}}{{'label.incentive.row' + | translate}}

    {{'label.heading.charges' | translate}}
    {{'label.heading.name' | translate}}{{'label.heading.type' | translate}}{{'label.heading.amount' | translate}}{{'label.heading.collectedon' | translate}}
    {{charge.name}}{{charge.chargeCalculationType.value}}{{charge.amount | number}}{{charge.chargeTimeType.value}}

    {{'label.heading.accounting' | translate}}{{'label.none' | translate}}
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {{'label.heading.savingsreference' | translate}}({{'label.heading.assets' | + translate}}) + + {{depositproduct.accountingMappings.savingsReferenceAccount.name}} +
    {{'label.heading.savingscontrol' | translate}}({{'label.heading.liabilities' + | translate}}) + + {{depositproduct.accountingMappings.savingsControlAccount.name}} +
    {{'label.heading.transfersinsuspenpense' | + translate}}({{'label.heading.liabilities' | + translate}}) + + {{depositproduct.accountingMappings.transfersInSuspenseAccount.name}} +
    {{'label.heading.interestonsavings' | translate}}({{'label.heading.expenses' + | translate}}) + + {{depositproduct.accountingMappings.interestOnSavingsAccount.name}} +
    {{'label.heading.incomefromfee' | translate}}({{'label.heading.income' | + translate}}) + + {{depositproduct.accountingMappings.incomeFromFeeAccount.name}} +
    {{'label.heading.incomefrompenalties' | translate}}({{'label.heading.income' + | translate}}) + + {{depositproduct.accountingMappings.incomeFromPenaltyAccount.name}} +

    + {{'label.heading.advancedaccountingrules' | translate}} +
    {{'label.heading.configurefundsourcesforpaymentchannels' | + translate}} +
    {{'label.heading.paymenttype' | translate}}{{'label.heading.fundsource' | translate}}
    {{paymentChannel.paymentType.name}}{{paymentChannel.fundSourceAccount.name}}
    {{'label.heading.feestospecificincome' | translate}}
    {{'label.heading.fees' | translate}}{{'label.heading.incomeaccount' | translate}}
    {{feeToIncomeAccount.charge.name}}{{feeToIncomeAccount.incomeAccount.name}}
    {{'label.heading.penaltiesspecifictoincomeacc' | translate}} +
    {{'label.heading.penalty' | translate}}{{'label.heading.incomeaccount' | translate}}
    {{penaltyToIncomeAccount.charge.name}}{{penaltyToIncomeAccount.incomeAccount.name}}
    +
    +
    +
    +
    + + +
    +
    + + +
    +
    +
    + +
    diff --git a/app/views/products/createsavingproduct.html b/app/views/products/createsavingproduct.html index 957a43b3..16f470c6 100755 --- a/app/views/products/createsavingproduct.html +++ b/app/views/products/createsavingproduct.html @@ -1,537 +1,1026 @@ -
    +
    -
    - -
    -

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

    -
    -
    - - -
    - -
    -
    - -
    -
    -
    - - -
    - -
    -
    - -
    -
    -
    - - -
    - -
    -
    - -
    -
    -

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

    -
    -
    - - -
    - -
    -
    - -
    -
    -
    - - -
    - -
    -
    - -
    -
    - -

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

    -
    -
    - - -
    - -
    -
    - -
    -
    -
    - - -
    - -
    - - -
    - -
    -
    -
    - - -
    - -
    - - -
    - -
    -
    -

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

    -
    -
    - - -
    - -
    - - -
    - -
    -
    - -
    -
    -
    - - -
    - -
    - - -
    - -
    -
    -
    - - -
    - -
    - - -
    - -
    -
    -
    - - -
    - -
    -
    - - - -
    - + + + + +
    + +
    +
    + + +
    + +
    +
    + +
    -
    -
    -
    - - - -
    - -
    - - - - -
    - -
    -
    - -
    - - -
    - -
    -
    - - -
    - +
    + + +
    + +
    +
    + +
    -
    -
    +
    + + +
    + +
    +
    + +
    +
    +
    + + +
    +
    + + +
    + +
    + +
    +
    + + +
    + +
    + + +
    + +
    +
    + +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    + + +
    +
    +
    + +
    + +
    + +
    +
    + + +
    + +
    +
    + +
    +
    +
    + + +
    + +
    + + +
    + +
    +
    +
    + + +
    + +
    + + +
    + +
    +
    +
    + + +
    +
    +
    + +
    + +
    + +
    +
    + + +
    + +
    + + +
    + +
    +
    + +
    +
    +
    + + +
    + +
    + + +
    + +
    +
    +
    + + +
    + +
    + + +
    + +
    +
    +
    + + +
    + +
    +
    + + -
    - - -
    - -
    -
    - - +
    + +
    +
    +
    +
    + + -
    - -
    -
    -
    -
    - - +
    + +
    -
    - -
    + + - - +
    + +
    +
    -
    - -
    -
    +
    + + +
    + +
    +
    + -

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

    -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    {{'label.heading.name' | translate}}{{'label.heading.type' | translate}}{{'label.heading.amount' | translate}}{{'label.heading.collectedon' | translate}}{{'label.heading.actions' | translate}}
    {{charge.name}},{{charge.currency.displaySymbol}}{{charge.chargeCalculationType.value}}{{charge.amount|number}}{{charge.chargeTimeType.value}}
    -
    -

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

    -
    -
    - -
    -
    - -
    -
    -
    -
    -

    {{"label.heading.assets" | translate}}

    - - -
    - -
    - - -
    - -
    -
    -
    -
    -

    {{"label.heading.liabilities" | translate}}

    - - -
    - -
    - - -
    - -
    -
    -
    - - -
    - -
    -
    -
    -
    -

    {{"label.heading.expenses" | translate}}

    - - -
    - -
    - - -
    - -
    -
    -
    -
    -

    {{"label.heading.income" | translate}}

    - - -
    - -
    - - -
    - -
    -
    -
    - - -
    - -
    -
    -
    -

    {{'label.heading.advancedaccountingrules' | translate}}[{{showOrHideValue}}]

    -
    -
    {{'label.heading.configurefundsourcesforpaymentchannels' | translate}}
    - - - - - - - - - - - - - - - - -
    {{'label.heading.paymenttype' | translate}}{{'label.heading.fundsource' | translate}}{{'label.heading.actions' | translate}}
    - - - -
    -
    {{'label.heading.mapfeestoincomeaccounts' | translate}}
    - - - - - - - - - - - - - - - - -
    {{'label.heading.fees' | translate}}{{'label.heading.incomeaccount' | translate}}{{'label.heading.actions' | translate}}
    - - - -
    -
    {{'label.heading.mappenaltiestospecificincomeaccounts' | translate}}
    - - - - - - - - - - - - - - - - -
    {{'label.heading.penalty' | translate}}{{'label.heading.incomeaccount' | translate}}{{'label.heading.actions' | translate}}
    - - - -
    -
    -
    -
    - - -
    -
    -
    +
    + +
    +
    +
    + +
    + + +
    + +
    +
    + + + +
    + +
    +
    +
    +
    + + + +
    + +
    + + + + +
    + +
    +
    +
    + + + + + + +
    +
    + + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    {{'label.heading.name' | translate}}{{'label.heading.type' | translate}}{{'label.heading.amount' | translate}}{{'label.heading.collectedon' | translate}}{{'label.heading.actions' | translate}}
    {{charge.name}},{{charge.currency.displaySymbol}}{{charge.chargeCalculationType.value}}{{charge.amount|number}}{{charge.chargeTimeType.value}}
    +
    +
    + + +
    +
    +
    + +
    + +
    + +
    +
    + +
    +
    + +
    +
    +
    +
    +

    {{"label.heading.assets" | translate}}

    + + +
    + +
    + + +
    + +
    +
    +
    +
    +

    {{"label.heading.liabilities" | translate}}

    + + +
    + +
    + + +
    + +
    +
    +
    + + +
    + +
    +
    +
    +
    +

    {{"label.heading.expenses" | translate}}

    + + +
    + +
    + + +
    + +
    +
    +
    +
    +

    {{"label.heading.income" | translate}}

    + + +
    + +
    + + +
    + +
    +
    +
    + + +
    + +
    +
    +
    +

    {{'label.heading.advancedaccountingrules' | translate}}[{{showOrHideValue}}]

    +
    +
    {{'label.heading.configurefundsourcesforpaymentchannels' | + translate}} +
    + + + + + + + + + + + + + + + + +
    {{'label.heading.paymenttype' | translate}}{{'label.heading.fundsource' | translate}}{{'label.heading.actions' | translate}}
    + + + +
    +
    {{'label.heading.mapfeestoincomeaccounts' | translate}}
    + + + + + + + + + + + + + + + + +
    {{'label.heading.fees' | translate}}{{'label.heading.incomeaccount' | translate}}{{'label.heading.actions' | translate}}
    + + + +
    +
    {{'label.heading.mappenaltiestospecificincomeaccounts' | translate}} +
    + + + + + + + + + + + + + + + + +
    {{'label.heading.penalty' | translate}}{{'label.heading.incomeaccount' | translate}}{{'label.heading.actions' | translate}}
    + + + + +
    +
    +
    +
    + + +
    +
    +
    + +
    +
    + +
    +
    +

    {{savingproduct.name}}

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + {{'label.heading.details' | translate}} +
    {{'label.heading.description' | translate}}{{savingproduct.description}}
    {{'label.heading.shortname' | translate}} :{{savingproduct.shortName}}

    {{'label.heading.items' | translate}}
    {{'label.heading.currency' | translate}}{{savingproduct.currency.name}}
    {{'label.heading.decimalplaces' | translate}}{{savingproduct.digitsAfterDecimal}}
    {{'label.heading.currencyinmultiplesof' | translate}}{{savingproduct.inMultiplesOf}}
    {{'label.heading.nominalannualinterestrate' | translate}}{{savingproduct.nominalAnnualInterestRate}}
    {{'label.heading.interestcompoundingperiod' | translate}}{{savingproduct.interestCompoundingPeriodOption.value}}
    {{'label.heading.interestpostingperiod' | translate}}{{savingproduct.interestPostingPeriodOption.value}}
    {{'label.heading.interestcalculatedusing' | translate}}{{savingproduct.interestCalculationOption.value}}
    {{'label.heading.daysinyears' | translate}}{{savingproduct.interestCalculationDaysInYearOption.value}}

    {{'label.heading.settings' | translate}}
    {{'label.heading.minimumopeningbalance' | translate}}{{savingproduct.minRequiredOpeningBalance|number}}
    {{'label.heading.lockinPeriodFrequency' | translate}}{{savingproduct.lockinPeriodFrequency}} + {{savingproduct.lockinPeriodFrequencyOption.value}} +
    {{'label.heading.withdrawalfeefortransfers' | translate}}{{savingproduct.withdrawalFeeForTransfers}}
    {{'label.heading.allowoverdraft' | translate}}{{savingproduct.allowOverdraft}}
    {{'label.heading.overdraftlimit' | translate}}{{savingproduct.overdraftLimit}}
    {{'label.heading.nominalannualinterestrateoverdraft' | translate}}{{savingproduct.nominalAnnualInterestRateOverdraft}}
    {{'label.heading.minoverdraftforinterestcalculation' | translate}}{{savingproduct.minOverdraftForInterestCalculation}}
    {{'label.heading.minbalanceforinterestcalculation' | translate}}{{savingproduct.minBalanceForInterestCalculation|number}}
    {{'label.heading.enforceMinRequiredBalance' | translate}}{{savingproduct.enforceMinRequiredBalance}}
    {{'label.heading.minRequiredBalance' | translate}}{{savingproduct.minRequiredBalance|number}}
    {{'label.heading.withholdtax' | translate}}{{savingproduct.withHoldTax}}
    {{'label.heading.withholdtaxgroup' | translate}}{{savingproduct.taxGroup.name}}
    {{'label.heading.isDormancyTrackingActive' | translate}}{{savingproduct.isDormancyTrackingActive}}
    {{'label.heading.daysToInactive' | translate}}{{savingproduct.daysToInactive}}
    {{'label.heading.daysToDormancy' | translate}}{{savingproduct.daysToDormancy}}
    {{'label.heading.daysToEscheat' | translate}}{{savingproduct.daysToEscheat}}

    {{'label.heading.charges' | translate}}
    {{'label.heading.name' | translate}}{{'label.heading.type' | translate}}{{'label.heading.amount' | translate}}{{'label.heading.collectedon' | translate}}
    {{charge.name}}{{charge.chargeCalculationType.value}}{{charge.amount|number}}{{charge.chargeTimeType.value}}

    {{'label.heading.accounting' | translate}}{{'label.none' | translate}}
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {{'label.heading.savingsreference' | translate}}({{'label.heading.assets' | + translate}}) + + {{savingproduct.accountingMappings.savingsReferenceAccount.name}} +
    {{'label.input.overdraftportfoliocontrol' | + translate}}({{'label.heading.assets' | + translate}}) + + {{savingproduct.accountingMappings.overdraftPortfolioControl.name}} +
    {{'label.heading.savingscontrol' | translate}}({{'label.heading.liabilities' + | + translate}}) + + {{savingproduct.accountingMappings.savingsControlAccount.name}} +
    {{'label.heading.transfersinsuspenpense' | + translate}}({{'label.heading.liabilities' | + translate}}) + + {{savingproduct.accountingMappings.transfersInSuspenseAccount.name}} +
    {{'label.heading.escheatLiability' | + translate}}({{'label.heading.liabilities' | + translate}}) + + {{savingproduct.accountingMappings.escheatLiabilityAccount.name}} +
    {{'label.heading.interestonsavings' | translate}}({{'label.heading.expenses' + | + translate}}) + + {{savingproduct.accountingMappings.interestOnSavingsAccount.name}} +
    {{'label.input.writeOff' | translate}}({{'label.heading.expenses' | + translate}}) + {{savingproduct.accountingMappings.writeOffAccount.name}}
    {{'label.heading.incomefromfee' | translate}}({{'label.heading.income' | + translate}}) + {{savingproduct.accountingMappings.incomeFromFeeAccount.name}} +
    {{'label.heading.incomefrompenalties' | translate}}({{'label.heading.income' + | + translate}}) + + {{savingproduct.accountingMappings.incomeFromPenaltyAccount.name}} +
    {{'label.input.interest.on.overdrafts' | + translate}}({{'label.heading.income' | translate}}) + {{savingproduct.accountingMappings.incomeFromInterest.name}} +

    + {{'label.heading.advancedaccountingrules' | translate}} +
    {{'label.heading.configurefundsourcesforpaymentchannels' | + translate}} +
    {{'label.heading.paymenttype' | translate}}{{'label.heading.fundsource' | translate}}
    {{paymentChannel.paymentType.name}}{{paymentChannel.fundSourceAccount.name}}
    {{'label.heading.feestospecificincome' | translate}}
    {{'label.heading.fees' | translate}}{{'label.heading.incomeaccount' | translate}}
    {{feeToIncomeAccount.charge.name}}{{feeToIncomeAccount.incomeAccount.name}}
    {{'label.heading.penaltiesspecifictoincomeacc' | translate}} +
    {{'label.heading.penalty' | translate}}{{'label.heading.incomeaccount' | translate}}
    {{penaltyToIncomeAccount.charge.name}}{{penaltyToIncomeAccount.incomeAccount.name}}
    +
    +
    +
    +
    + + +
    +
    + + +
    +
    +
    +
    diff --git a/app/views/products/createshareproduct.html b/app/views/products/createshareproduct.html index f2c78f50..9c02e71c 100644 --- a/app/views/products/createshareproduct.html +++ b/app/views/products/createshareproduct.html @@ -1,125 +1,220 @@ -
    - -
    - -
    -

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

    -
    -
    - - -
    - -
    -
    - -
    -
    -
    - - -
    - -
    -
    - -
    -
    -
    - - -
    - -
    -
    - -
    -
    -

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

    -
    -
    - - -
    - -
    -
    - -
    -
    -
    - - -
    - -
    -
    - -
    -
    -

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

    -
    -
    - - -
    - -
    -
    - -
    +
    + + + + + +
    + +
    +
    + + +
    + +
    +
    + +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    + + +
    + +
    + +
    + +
    + +
    +
    + + +
    + +
    + + +
    + +
    +
    + +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    + + +
    +
    +
    + +
    + +
    + +
    +
    + + +
    + +
    +
    + +
    - - + + +
    + +
    +
    +
    + + +
    + +
    +
    + +
    -
    - -
    -
    + + -
    - - -
    - -
    -
    - -
    +
    + +
    +
    +
    + + +
    +
    +
    + +
    + +
    + - - +
    -
    - -
    -
    +
    + + -

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

    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    -
    +
    + + +
    + +
    +<<<<<<< 3d8ceda40f8225a11b2b61f31d6b24ed458f0700
    @@ -140,209 +235,437 @@
    +======= +
    + +
    +
    -
    - - -
    - -
    +
    + + +
    + +
    +
    + +
    +
    +>>>>>>> Entity Datatable UI & Wizard Screens -
    - -
    -
    - -
    - - -
    - -
    -
    - -
    -
    - -
    - - -
    - -
    -
    - -

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

    -
    - -
    -
    - -
    -
    - -
    -
    - -
    - - - - - - - - - - - -
    {{'label.heading.fromdate' | translate}} -  {{'label.heading.sharenominalprice' | translate}} -   {{'label.heading.actions' | translate}}
    - - - {{ 'label.requirefield' | translate }} - - - - - {{ 'label.requirefield' | translate }} - - - -
    - -

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

    -
    -
    -
    - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - -
    {{'label.heading.name' | translate}}{{'label.heading.type' | translate}}{{'label.heading.amount' | translate}}{{'label.heading.collectedon' | translate}}{{'label.heading.actions' | translate}}
    {{charge.name}},{{charge.currency.displaySymbol}}{{charge.chargeCalculationType.value}}{{charge.amount|number}}{{charge.chargeTimeType.value}}
    -
    - -

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

    -
    -
    - -
    -
    - -
    -
    - -
    -
    -

    {{"label.heading.assets" | translate}}

    - - -
    - -
    -
    -
    -
    -

    {{"label.heading.liabilities" | translate}}

    - - -
    - -
    -
    -
    -
    -

    {{"label.heading.shareequity" | translate}}

    - - -
    - -
    -
    -
    -
    -

    {{"label.heading.income" | translate}}

    - - -
    - -
    -
    -
    - -
    - - -
    -
    - +
    + + +
    + +
    +
    +
    + + + + + + +
    + +
    +

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

    +
    + +
    +
    + +
    +
    + +
    +
    + +
    + + + + + + + + + + + +
    {{'label.heading.fromdate' | translate}} +  {{'label.heading.sharenominalprice' | translate}} +   {{'label.heading.actions' | translate}}
    + + + {{ 'label.requirefield' | translate }} + + + + + {{ 'label.requirefield' | translate }} + + + +
    +
    + + +
    +
    +
    + +
    + +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    {{'label.heading.name' | translate}}{{'label.heading.type' | translate}}{{'label.heading.amount' | translate}}{{'label.heading.collectedon' | translate}}{{'label.heading.actions' | translate}}
    {{charge.name}},{{charge.currency.displaySymbol}}{{charge.chargeCalculationType.value}}{{charge.amount|number}}{{charge.chargeTimeType.value}}
    +
    +
    + + +
    +
    +
    + +
    + +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +

    {{"label.heading.assets" | translate}}

    + + +
    + +
    +
    +
    +
    +

    {{"label.heading.liabilities" | translate}}

    + + +
    + +
    +
    +
    +
    +

    {{"label.heading.shareequity" | translate}}

    + + +
    + +
    +
    +
    +
    +

    {{"label.heading.income" | translate}}

    + + +
    + +
    +
    +
    +
    + + +
    +
    +
    + +
    +
    + +
    +
    +

    {{shareproduct.name}}

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + {{'label.heading.details' | translate}} +
    {{'label.heading.description' | translate}}{{shareproduct.description}}
    {{'label.heading.shortname' | translate}} :{{shareproduct.shortName}}

    {{'label.heading.items' | translate}}
    {{'label.heading.currency' | translate}}{{shareproduct.currency.name}}
    {{'label.heading.decimalplaces' | translate}}{{shareproduct.digitsAfterDecimal}}
    {{'label.heading.currencyinmultiplesof' | translate}}{{shareproduct.inMultiplesOf}}
    {{'label.heading.totalshares' | translate}}{{shareproduct.totalShares|number}}
    {{'label.heading.totalsharestobeissued' | translate}}{{shareproduct.sharesIssued|number}}
    {{'label.heading.sharenominalprice' | translate}}{{shareproduct.unitPrice|number}}
    {{'label.heading.sharecapitalvalue' | translate}}{{shareproduct.shareCapital|number}}

    {{'label.heading.settings' | translate}}
    {{'label.heading.shareperclient' | translate}}:{{shareproduct.nominalShares|number}}   ( + Min:{{shareproduct.minimumShares|number}} , Max + :{{shareproduct.maximumShares|number}} ) +
    {{'label.heading.minimumactiveperiod' | translate}}{{shareproduct.minimumActivePeriodForDividends}} + {{shareproduct.minimumActivePeriod}} +
    {{'label.heading.lockinPeriodFrequency' | translate}}{{shareproduct.lockinPeriodFrequency}} {{shareproduct.lockinPeriod}}
    {{'label.heading.allowdividendsforinactiveclients' | translate}}{{shareproduct.allowDividendCalculationForInactiveClients}}

    {{'label.heading.marketprice' | translate}}
    {{'label.heading.fromdate' | translate}}{{'label.heading.sharenominalprice' | translate}}
    {{marketPriceData.fromDate|DateFormat}}{{marketPriceData.shareValue|FormatNumber}}

    {{'label.heading.charges' | translate}}
    {{'label.heading.name' | translate}}{{'label.heading.type' | translate}}{{'label.heading.amount' | translate}}{{'label.heading.collectedon' | translate}}
    {{charge.name}}{{charge.chargeCalculationType.value}}{{charge.amount|number}}{{charge.chargeTimeType.value}}

    {{'label.heading.accounting' | translate}}None
    + + + + + + + + + + + + + + + + + +
    {{'label.heading.sharereference' | translate}}({{'label.heading.assets' | + translate}}) + {{shareproduct.accountingMappings.shareReferenceId.name}}
    {{'label.heading.sharecontrol' | translate}}({{'label.heading.liabilities' | + translate}}) + {{shareproduct.accountingMappings.shareSuspenseId.name}}
    {{'label.heading.shareequity' | translate}}({{'label.heading.equity' | + translate}}) + {{shareproduct.accountingMappings.shareEquityId.name}}
    {{'label.heading.incomefromfee' | translate}}({{'label.heading.income' | + translate}}) + + {{shareproduct.accountingMappings.incomeFromFeeAccountId.name}} +
    +
    +
    +
    +
    + + +
    +
    + + +
    +
    +
    +
    diff --git a/app/views/products/viewsavingproduct.html b/app/views/products/viewsavingproduct.html index 503af359..3a48400c 100755 --- a/app/views/products/viewsavingproduct.html +++ b/app/views/products/viewsavingproduct.html @@ -14,7 +14,7 @@ - +
    - - +
    {{'label.heading.details' | translate}} diff --git a/app/views/savings/new_saving_account_application.html b/app/views/savings/new_saving_account_application.html index ed134b67..fbdfabd4 100755 --- a/app/views/savings/new_saving_account_application.html +++ b/app/views/savings/new_saving_account_application.html @@ -1,303 +1,565 @@
    -
    -
    -
    -

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

    -
    -
    -
    - -
    - - - - - - - - - - - - - -
    - - - - - - - -
    - - - - - - - -
    -
    - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + -
    - - - - - -
    - - - - - - - - -
    - - - - -
    - - -
    - - - - - - -
    -   - +
    -
    -   - -
    -  {{ 'label.input.allowoverdraft' | translate }}  - - - -
    - - - - - -
    -  {{ 'label.input.enforceMinRequiredBalance' | translate }}  - - - -
    {{'label.heading.minbalanceforinterestcalculation' | translate}}{{data.minBalanceForInterestCalculation | number}}
    -  {{ 'label.input.withholdtax' | translate }}  - - - {{data.taxGroup.name}} -
    -
    - - - - - - {{'label.'+labelchargeerror | translate}} - - - - - - - - - - - - - - - - - - - - - -
    {{'label.heading.name' | translate}}{{'label.heading.type' | translate}}{{'label.heading.amount' | translate}}{{'label.heading.collectedon' | translate}}{{'label.heading.date' | translate}}{{'label.heading.repaymentsevery' | translate}}{{'label.heading.actions' | translate}}
    {{charge.name}},{{charge.currency.displaySymbol}}{{charge.chargeCalculationType.value}}{{charge.chargeTimeType.value}} - - - - - - - -
    -
    -
    - - -
    +
    + +
    +
    +
    + +
    + +
    + +
    + +
    +
    +
    + + + + + + +
    +
    + + +
    +
    + + + + +
    +
    + +
    + +
    +
    + +
    + +
    + +
    +
    +
    + +
    + +
    -
    -
    -
    -
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    +
    +
    + +
    + +
    + + +
    +
    +   + +
    +
    +
    +
    +
    +   + +
    +
    +
    +
    +  {{ 'label.input.allowoverdraft' | translate }}  +
    +
    +
    +
    + +
    +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    +
    +  {{ 'label.input.enforceMinRequiredBalance' | translate }}  +
    +
    + +
    +
    + +
    +
    +
    +
    {{'label.heading.minbalanceforinterestcalculation' | translate}}
    +
    {{data.minBalanceForInterestCalculation | number}}
    +
    +
    +
    +  {{ 'label.input.withholdtax' | translate }}  +
    +
    + +
    +
    + {{data.taxGroup.name}} +
    +
    +
    + + + + + + +
    +
    + + +
    +
    +
    + +
    +
    + + Add +
    +
    + {{'label.'+labelchargeerror | translate}} +
    +
    + + + + + + + + + + + + + + + + + + + +
    {{'label.heading.name' | translate}}{{'label.heading.type' | translate}}{{'label.heading.amount' | translate}}{{'label.heading.collectedon' | translate}}{{'label.heading.date' | translate}}{{'label.heading.repaymentsevery' | translate}}{{'label.heading.actions' | translate}}
    {{charge.name}},{{charge.currency.displaySymbol}}{{charge.chargeCalculationType.value}}{{charge.chargeTimeType.value}} + + + + + + + +
    +
    + + +
    +
    +
    + +
    +
    + + +
    +
    + + +
    + + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + + + +
    +
    + + + + + + + + + +
    + + +
    +
    +
    + +
    +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + {{'label.heading.details' | translate}} +
    {{ 'label.input.product' | translate }}{{savingdetails.productName}}
    {{ 'label.input.submittedon' | translate}}{{date.submittedOnDate | DateFormat}}
    {{ 'label.input.fieldofficer' | translate }}{{savingdetails.fieldOfficerName}}
    {{ 'label.input.externalid' | translate}}{{formData.externalId}}

    {{'label.heading.terms' | translate}}
    {{'label.heading.currency' | translate}}{{data.currency.name}}({{data.currency.displaySymbol}})
    {{'label.heading.decimalplaces' | translate}}{{data.currency.decimalPlaces}}
    {{ 'label.input.nominalannualinterestrate' | translate}}{{formData.nominalAnnualInterestRate}}
    {{'label.input.interestcompoundingperiod' | translate}}{{savingdetails.interestCompoundingPeriodTypeValue}}
    {{ 'label.input.currencyinmultiplesof' | translate }}{{data.currency.inMultiplesOf}}
    {{'label.input.interestpostingperiod' | translate}}{{savingdetails.interestPostingPeriodTypeValue}}
    {{'label.input.interestcalculatedusing' | translate}}{{savingdetails.interestCalculationTypeValue}}
    {{ 'label.input.daysinyears' | translate }}{{savingdetails.interestCalculationDaysInYearTypeValue}}
    {{ 'label.input.minimumopeningbalance' | translate }}{{formData.minRequiredOpeningBalance}}
    {{ 'label.input.lockinPeriodFrequency' | translate }}{{formData.lockinPeriodFrequency}} + {{savingdetails.lockinPeriodFrequencyTypeValue}} +
    {{ 'label.input.applywithdrawalfeefortransfers' | translate }}{{formData.withdrawalFeeForTransfers}}
    {{'label.input.allowoverdraft' | translate}}{{formData.allowOverdraft}}
    {{'label.input.overdraftlimit' | translate}}{{formData.overdraftLimit}}
    {{ 'label.input.nominalannualinterestrateoverdraft' | translate}}{{formData.nominalAnnualInterestRateOverdraft}}
    {{ 'label.input.minoverdraftforinterestcalculation' | translate}}{{formData.minOverdraftForInterestCalculation}}
    {{ 'label.input.enforceMinRequiredBalance' | translate }}{{formData.enforceMinRequiredBalance}}
    {{ 'label.input.minRequiredBalance' | translate}}{{formData.minRequiredBalance}}
    {{ 'label.input.withholdtax' | translate }} {{formData.withHoldTax}}
    {{ 'label.input.taxgroup' | translate}}{{data.taxGroup.name}}

    {{'label.heading.charges' | translate}}
    {{'label.heading.name' | translate}}{{'label.heading.type' | translate}}{{'label.heading.amount' | translate}}{{'label.heading.collectedon' | translate}}{{'label.heading.date' | translate}}{{'label.heading.repaymentsevery' | translate}}
    {{charge.name}},{{charge.currency.displaySymbol}}{{charge.chargeCalculationType.value}}{{charge.amount}}{{charge.chargeTimeType.value}} + {{charge.feeOnMonthDay | DateFormat}} + {{charge.dueDate | DateFormat}} + + {{charge.feeInterval}} +
    +
    + + + + + + + + + + +
    {{datatable.registeredTableName}}
    {{ columnHeader.columnName | prettifyDataTableColumn }}{{formData.datatables[datatables.indexOf(datatable)].data[columnHeader.columnName]}}{{formData.datatables[datatables.indexOf(datatable)].data[columnHeader.columnName].date | DateFormat}} {{formData.datatables[datatables.indexOf(datatable)].data[columnHeader.columnName].time }}{{formData.datatables[datatables.indexOf(datatable)].data[columnHeader.columnName] | DateFormat}}
    +
    +
    +
    + + +
    +
    + + +
    +
    +
    + diff --git a/app/views/savings/saving_account_actions.html b/app/views/savings/saving_account_actions.html index 2a0b5288..35c9420d 100644 --- a/app/views/savings/saving_account_actions.html +++ b/app/views/savings/saving_account_actions.html @@ -3,10 +3,15 @@
  • {{'label.anchor.viewsavingaccount' | translate}}
  • {{action}}
  • -
    + + +
    +
    + Entry in ` {{table}} ` has been made successfully. If the inputs are changed, the entries will be updated.
    +
    - {{ title | translate}} +
    +
    + +
    +
    + +
    +
    + + +
    -
    - +
    + + +
    +
    -
    - - -
    - -
    - - -
    -
    +
    + +
    +
    +
    + Entry in ` {{table}} ` has been made successfully. If the inputs are changed, the datatable entries will be updated.
    +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    + +
    +
    +
    + + +
    + + + + +
    +
    +
    + +
    +
    +
    + +
    +
    + + +
    +
    + + +
    +
    +
    +
    +
    +
    +
    diff --git a/app/views/shares/createshareaccount.html b/app/views/shares/createshareaccount.html index 376777db..dc7611b3 100644 --- a/app/views/shares/createshareaccount.html +++ b/app/views/shares/createshareaccount.html @@ -3,214 +3,373 @@
  • '{{clientName}}'
  • {{'label.anchor.sharesapplication' | translate}}
  • - -
    -
    -
    -

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

    -
    -
    -
    -
    - - - - - - - - - - - -
    - - - - - - - -
    - - - -
    -
    - + + + +
    + + +
    + + + + + + + + + + + +
    + + + + + + + +
    + + + +
    +
    + + +
    + +
    + +
    +
    + + +
    +
    + + + + + + + + + -
    -
    + + + + + +
    + +
    - - - - - - - - + + + - - - + + + + + + + - - - - - - - + + + + + + - - - - + + + + + + + + + + + + + + + + + + +
    - - - - - -
    - - + + + + + + + - - - - - - -
    + + + + + +
    - - - - -
    + + +
    +   + +
    +
    + + +
    +   + +
    +
    - - -
    -   - +
    + + + + +   + +
    -
    - - -
    -   - +
    + + + + + + +
    +
    + + +
    +
    +
    + +
    +
    + + Add +
    +
    + {{'label.'+labelchargeerror | translate}} +
    -
    + + + + + + + + + + + + + + +
    {{'label.heading.name' | translate}}{{'label.heading.type' | translate}}{{'label.heading.amount' | translate}}{{'label.heading.collectedon' | translate}}{{'label.heading.actions' | translate}}
    {{charge.name}},{{charge.currency.displaySymbol}}{{charge.chargeCalculationType.value}}{{charge.chargeTimeType.value}}
    +
    +
    + + + + + + +
    +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {{'label.heading.details' | translate}}
    {{'label.input.product' | translate}}{{sharedetails.productName}}
    {{ 'label.input.submittedon' | translate}}{{formData.submittedDate | DateFormat}}
    {{ 'label.input.externalid' | translate}}{{formData.externalId}}

    {{'label.heading.terms' | translate}}
    {{ 'label.heading.currency' | translate }}{{data.currency.name}}({{data.currency.displaySymbol}})
    {{ 'label.heading.decimalplaces' | translate}}{{data.currency.decimalPlaces}}
    {{ 'label.input.totalnumberofshares' | translate}}{{formData.requestedShares}}
    {{ 'label.input.todaysprice' | translate}}{{formData.unitPrice}}
    {{ 'label.input.currencyinmultiplesof' | translate }}{{data.currency.inMultiplesOf}}
    {{ 'label.input.savingsaccount' | translate }}{{sharedetails.savingsAccountNo}}
    {{ 'label.input.minimumactiveperiod' | translate }}{{formData.minimumAcctivePeriod}} + {{sharedetails.minimumActivePeriodFrequencyValue}} +
    {{ 'label.input.lockinPeriodFrequency' | translate }}{{formData.lockinPeriodFrequency}} + {{sharedetails.lockinPeriodFrequencyValue}} +
    {{ 'label.input.applicationdate' | translate}}{{formData.applicationDate | DateFormat}}
    {{ 'label.input.allowdividendsforinactiveclients' | translate }}{{formData.allowDividendCalculationForInactiveClients}}

    {{'label.heading.charges' | translate}}
    {{'label.heading.name' | translate}}{{'label.heading.type' | translate}}{{'label.heading.amount' | translate}}{{'label.heading.collectedon' | translate}}
    {{charge.name}},{{charge.currency.displaySymbol}}{{charge.chargeCalculationType.value}}{{charge.amount}} + {{charge.chargeTimeType.value}}
    - - - - - - - - -   - - - - - - - - - - - - - - - -
    - - - - - - {{'label.'+labelchargeerror | translate}} - - - - - - - - - - - - - - - - - - -
    {{'label.heading.name' | translate}}{{'label.heading.type' | translate}}{{'label.heading.amount' | translate}}{{'label.heading.collectedon' | translate}}{{'label.heading.actions' | translate}}
    {{charge.name}},{{charge.currency.displaySymbol}}{{charge.chargeCalculationType.value}}{{charge.chargeTimeType.value}}
    - -
    - - -
    -
    -
    - - +

    +
    + + +
    +
    + + + + +
    + +