community-app/app/scripts/controllers/product/CreateLoanProductController.js
2016-10-25 18:02:01 +05:30

466 lines
24 KiB
JavaScript
Executable File

(function (module) {
mifosX.controllers = _.extend(module, {
CreateLoanProductController: function (scope, resourceFactory, location, dateFilter) {
scope.restrictDate = new Date();
scope.formData = {};
scope.charges = [];
scope.floatingrateoptions = [];
scope.loanProductConfigurableAttributes = [];
scope.showOrHideValue = "show";
scope.configureFundOptions = [];
scope.specificIncomeAccountMapping = [];
scope.penaltySpecificIncomeaccounts = [];
scope.codeValueSpecificAccountMappings = [];
scope.codeValueSpecificAccountMapping = [];
scope.configureFundOption = {};
scope.date = {};
scope.pvFlag = false;
scope.rvFlag = false;
scope.irFlag = false;
scope.chargeFlag = false;
scope.penalityFlag = false;
scope.frFlag = false;
scope.fiFlag = false;
scope.piFlag = false;
scope.amortization = true;
scope.arrearsTolerance = true;
scope.graceOnArrearsAging = true;
scope.interestCalcPeriod = true;
scope.interestMethod = true;
scope.graceOnPrincipalAndInterest = true;
scope.repaymentFrequency = true;
scope.transactionProcessingStrategy = true;
scope.allowAttributeConfiguration = true;
scope.interestRecalculationOnDayTypeOptions = [];
for (var i = 1; i <= 28; i++) {
scope.interestRecalculationOnDayTypeOptions.push(i);
}
scope.minimumDaysOrrPeriodsBetweenDisbursalAndFirstRepayment = "minimumDaysBetweenDisbursalAndFirstRepayment";
scope.minDurationType = [
{id :'1',name:"DAYS"},
{id :'2',name:"REPAYMENT"}
]
scope.minimumDaysBetweenDisbursalAndFirstRepaymentShow = true;
scope.minimumPeriodsBetweenDisbursalAndFirstRepaymentshow = false;
resourceFactory.loanProductResource.get({resourceType: 'template'}, function (data) {
scope.product = data;
scope.assetAccountOptions = scope.product.accountingMappingOptions.assetAccountOptions || [];
scope.incomeAccountOptions = scope.product.accountingMappingOptions.incomeAccountOptions || [];
scope.expenseAccountOptions = scope.product.accountingMappingOptions.expenseAccountOptions || [];
scope.liabilityAccountOptions = scope.product.accountingMappingOptions.liabilityAccountOptions || [];
scope.incomeAndLiabilityAccountOptions = scope.incomeAccountOptions.concat(scope.liabilityAccountOptions);
scope.penaltyOptions = scope.product.penaltyOptions || [];
scope.chargeOptions = scope.product.chargeOptions || [];
scope.writeOffReasonOptions = [];
if(angular.isDefined(scope.product.codeValueOptions) && scope.product.codeValueOptions.length>0){
resourceFactory.codeValueByCodeNameResources.get({codeName: "WriteOffReasons", sqlSearch: "cv.is_active = 1"}, function (codeValueData) {
scope.writeOffReasonOptions = scope.getCodeValues(scope.product.codeValueOptions,codeValueData);
});
}
scope.overduecharges = [];
for (var i in scope.penaltyOptions) {
if (scope.penaltyOptions[i].chargeTimeType.code == 'chargeTimeType.overdueInstallment') {
scope.overduecharges.push(scope.penaltyOptions[i]);
}
}
scope.formData.currencyCode = scope.product.currencyOptions[0].code;
scope.formData.includeInBorrowerCycle = 'false';
scope.formData.useBorrowerCycle = 'false';
scope.formData.digitsAfterDecimal = '2';
scope.formData.inMultiplesOf = '0';
scope.formData.repaymentFrequencyType = scope.product.repaymentFrequencyType.id;
scope.formData.interestRateFrequencyType = scope.product.interestRateFrequencyType.id;
scope.formData.amortizationType = scope.product.amortizationType.id;
scope.formData.interestType = scope.product.interestType.id;
scope.formData.interestCalculationPeriodType = scope.product.interestCalculationPeriodType.id;
scope.formData.transactionProcessingStrategyId = scope.product.transactionProcessingStrategyOptions[0].id;
scope.formData.principalVariationsForBorrowerCycle = scope.product.principalVariationsForBorrowerCycle;
scope.formData.interestRateVariationsForBorrowerCycle = scope.product.interestRateVariationsForBorrowerCycle;
scope.formData.numberOfRepaymentVariationsForBorrowerCycle = scope.product.numberOfRepaymentVariationsForBorrowerCycle;
scope.formData.multiDisburseLoan = 'false';
scope.formData.accountingRule = '1';
scope.formData.daysInYearType = scope.product.daysInYearType.id;
scope.formData.daysInMonthType = scope.product.daysInMonthType.id;
scope.formData.isInterestRecalculationEnabled = scope.product.isInterestRecalculationEnabled;
scope.formData.interestRecalculationCompoundingMethod = scope.product.interestRecalculationData.interestRecalculationCompoundingType.id;
scope.formData.rescheduleStrategyMethod = scope.product.interestRecalculationData.rescheduleStrategyType.id;
scope.formData.preClosureInterestCalculationStrategy = scope.product.interestRecalculationData.preClosureInterestCalculationStrategy.id;
if(scope.product.interestRecalculationData.recalculationRestFrequencyType){
scope.formData.recalculationRestFrequencyType = scope.product.interestRecalculationData.recalculationRestFrequencyType.id;
}
scope.floatingRateOptions = data.floatingRateOptions ;
scope.formData.isFloatingInterestRateCalculationAllowed = false ;
scope.formData.isLinkedToFloatingInterestRates = false ;
scope.formData.allowVariableInstallments = false ;
scope.product.interestRecalculationNthDayTypeOptions.push({"code" : "onDay", "id" : -2, "value" : "on day"});
scope.formData.isSubsidyApplicable = false;
scope.formData.loanTenureFrequencyType = scope.product.repaymentFrequencyType.id;
scope.formData.weeksInYearType = scope.product.weeksInYearTypeOptions[0].id;
});
scope.variableName = function(minDurationType){
if(minDurationType == 1){
scope.minimumDaysBetweenDisbursalAndFirstRepaymentShow = true;
scope.minimumPeriodsBetweenDisbursalAndFirstRepaymentshow = false;
}
if(minDurationType == 2){
scope.minimumPeriodsBetweenDisbursalAndFirstRepaymentshow = true;
scope.minimumDaysBetweenDisbursalAndFirstRepaymentShow = false;
}
};
scope.chargeSelected = function (chargeId) {
if (chargeId) {
resourceFactory.chargeResource.get({chargeId: chargeId, template: 'true'}, this.formData, function (data) {
data.chargeId = data.id;
scope.charges.push(data);
//to charge select box empty
if (data.penalty) {
scope.penalityFlag = true;
scope.penalityId = '';
} else {
scope.chargeFlag = true;
scope.chargeId = '';
}
});
}
};
scope.getCodeValues = function(optionsArray,codeValues){
var codeValuesData = [];
for(var i=0; i<optionsArray.length;i++){
for(var j=0;j<codeValues.length;j++){
if(codeValues[j].id==optionsArray[i].id){
codeValuesData.push(optionsArray[i]);
}
}
}
return codeValuesData;
};
scope.deleteCharge = function (index) {
scope.charges.splice(index, 1);
};
//advanced accounting rule
scope.showOrHide = function (showOrHideValue) {
if (showOrHideValue == "show") {
scope.showOrHideValue = 'hide';
}
if (showOrHideValue == "hide") {
scope.showOrHideValue = 'show';
}
};
scope.addConfigureFundSource = function () {
scope.frFlag = true;
scope.configureFundOptions.push({
paymentTypeId: scope.product.paymentTypeOptions.length > 0 ? scope.product.paymentTypeOptions[0].id : '',
fundSourceAccountId: scope.assetAccountOptions.length > 0 ? scope.assetAccountOptions[0].id : '',
paymentTypeOptions: scope.product.paymentTypeOptions.length > 0 ? scope.product.paymentTypeOptions : [],
assetAccountOptions: scope.assetAccountOptions.length > 0 ? scope.assetAccountOptions : []
});
};
scope.mapFees = function () {
scope.fiFlag = true;
scope.specificIncomeAccountMapping.push({
chargeId: scope.chargeOptions.length > 0 ? scope.chargeOptions[0].id : '',
incomeAccountId: scope.incomeAndLiabilityAccountOptions.length > 0 ? scope.incomeAndLiabilityAccountOptions[0].id : ''
});
};
scope.mapWriteOffReason = function () {
scope.writeOffFlag = true;
scope.codeValueSpecificAccountMappings.push({
codeVaueId: scope.writeOffReasonOptions.length > 0 ? scope.writeOffReasonOptions[0].id : '',
expenseAccountId: scope.expenseAccountOptions.length > 0 ? scope.expenseAccountOptions[0].id : ''
});
};
scope.addPrincipalVariation = function () {
scope.pvFlag = true;
scope.formData.principalVariationsForBorrowerCycle.push({
valueConditionType: scope.product.valueConditionTypeOptions[0].id
});
};
scope.addInterestRateVariation = function () {
scope.irFlag = true;
scope.formData.interestRateVariationsForBorrowerCycle.push({
valueConditionType: scope.product.valueConditionTypeOptions[0].id
});
};
scope.addNumberOfRepaymentVariation = function () {
scope.rvFlag = true;
scope.formData.numberOfRepaymentVariationsForBorrowerCycle.push({
valueConditionType: scope.product.valueConditionTypeOptions[0].id
});
};
scope.mapPenalty = function () {
scope.piFlag = true;
scope.penaltySpecificIncomeaccounts.push({
chargeId: scope.penaltyOptions.length > 0 ? scope.penaltyOptions[0].id : '',
incomeAccountId: scope.incomeAccountOptions.length > 0 ? scope.incomeAccountOptions[0].id : ''
});
};
scope.deleteFund = function (index) {
scope.configureFundOptions.splice(index, 1);
};
scope.deleteFee = function (index) {
scope.specificIncomeAccountMapping.splice(index, 1);
};
scope.deleteCodeValue = function (index) {
scope.codeValueSpecificAccountMappings.splice(index, 1);
};
scope.deletePenalty = function (index) {
scope.penaltySpecificIncomeaccounts.splice(index, 1);
};
scope.deletePrincipalVariation = function (index) {
scope.formData.principalVariationsForBorrowerCycle.splice(index, 1);
};
scope.deleteInterestRateVariation = function (index) {
scope.formData.interestRateVariationsForBorrowerCycle.splice(index, 1);
};
scope.deleterepaymentVariation = function (index) {
scope.formData.numberOfRepaymentVariationsForBorrowerCycle.splice(index, 1);
};
scope.cancel = function () {
location.path('/loanproducts');
};
scope.isAccountingEnabled = function () {
if (scope.formData.accountingRule == 2 || scope.formData.accountingRule == 3 || scope.formData.accountingRule == 4) {
return true;
}
return false;
}
scope.isAccrualAccountingEnabled = function () {
if (scope.formData.accountingRule == 3 || scope.formData.accountingRule == 4) {
return true;
}
return false;
}
scope.setAttributeValues = function(){
if(scope.allowAttributeConfiguration == false){
scope.amortization = false;
scope.arrearsTolerance = false;
scope.graceOnArrearsAging = false;
scope.interestCalcPeriod = false;
scope.interestMethod = false;
scope.graceOnPrincipalAndInterest = false;
scope.repaymentFrequency = false;
scope.transactionProcessingStrategy = false;
}
}
scope.filterCharges = function(currencyCode, multiDisburseLoan) {
return function (item) {
if ((multiDisburseLoan != true) && item.chargeTimeType.id == 12) {
return false;
}
if (item.currency.code != currencyCode) {
return false;
}
return true;
};
};
scope.submit = function () {
var reqFirstDate = dateFilter(scope.date.first, scope.df);
var reqSecondDate = dateFilter(scope.date.second, scope.df);
scope.paymentChannelToFundSourceMappings = [];
scope.feeToIncomeAccountMappings = [];
scope.penaltyToIncomeAccountMappings = [];
scope.chargesSelected = [];
scope.selectedConfigurableAttributes = [];
var temp = '';
//configure fund sources for payment channels
for (var i in scope.configureFundOptions) {
temp = {
paymentTypeId: scope.configureFundOptions[i].paymentTypeId,
fundSourceAccountId: scope.configureFundOptions[i].fundSourceAccountId
}
scope.paymentChannelToFundSourceMappings.push(temp);
}
//map fees to specific income accounts
for (var i in scope.specificIncomeAccountMapping) {
temp = {
chargeId: scope.specificIncomeAccountMapping[i].chargeId,
incomeAccountId: scope.specificIncomeAccountMapping[i].incomeAccountId
}
scope.feeToIncomeAccountMappings.push(temp);
}
//map penalties to specific income accounts
for (var i in scope.penaltySpecificIncomeaccounts) {
temp = {
chargeId: scope.penaltySpecificIncomeaccounts[i].chargeId,
incomeAccountId: scope.penaltySpecificIncomeaccounts[i].incomeAccountId
}
scope.penaltyToIncomeAccountMappings.push(temp);
}
//map code value to specific expense accounts
for (var i in scope.codeValueSpecificAccountMappings) {
temp = {
codeValueId: scope.codeValueSpecificAccountMappings[i].codeValueId,
expenseAccountId: scope.codeValueSpecificAccountMappings[i].expenseAccountId
}
scope.codeValueSpecificAccountMapping.push(temp);
}
for (var i in scope.charges) {
var isMandatory = false;
if(scope.charges[i].isMandatory){
isMandatory = scope.charges[i].isMandatory;
}
temp = {
id: scope.charges[i].id,
isMandatory: isMandatory
}
scope.chargesSelected.push(temp);
}
if(scope.allowAttributeConfiguration == false){
scope.amortization = false;
scope.arrearsTolerance = false;
scope.graceOnArrearsAging = false;
scope.interestCalcPeriod = false;
scope.interestMethod = false;
scope.graceOnPrincipalAndInterest = false;
scope.repaymentFrequency = false;
scope.transactionProcessingStrategy = false;
}
scope.selectedConfigurableAttributes =
{amortizationType:scope.amortization,
interestType:scope.interestMethod,
transactionProcessingStrategyId:scope.transactionProcessingStrategy,
interestCalculationPeriodType:scope.interestCalcPeriod,
inArrearsTolerance:scope.arrearsTolerance,
repaymentEvery:scope.repaymentFrequency,
graceOnPrincipalAndInterestPayment:scope.graceOnPrincipalAndInterest,
graceOnArrearsAgeing:scope.graceOnArrearsAging};
this.formData.paymentChannelToFundSourceMappings = scope.paymentChannelToFundSourceMappings;
this.formData.feeToIncomeAccountMappings = scope.feeToIncomeAccountMappings;
this.formData.penaltyToIncomeAccountMappings = scope.penaltyToIncomeAccountMappings;
this.formData.codeValueSpecificAccountMapping = scope.codeValueSpecificAccountMapping;
this.formData.charges = scope.chargesSelected;
this.formData.allowAttributeOverrides = scope.selectedConfigurableAttributes;
this.formData.locale = scope.optlang.code;
this.formData.dateFormat = scope.df;
this.formData.startDate = reqFirstDate;
this.formData.closeDate = reqSecondDate;
//Interest recalculation data
if (this.formData.isInterestRecalculationEnabled) {
var restFrequencyDate = dateFilter(scope.date.recalculationRestFrequencyDate, scope.df);
scope.formData.recalculationRestFrequencyDate = restFrequencyDate;
var compoundingFrequencyDate = dateFilter(scope.date.recalculationCompoundingFrequencyDate, scope.df);
scope.formData.recalculationCompoundingFrequencyDate = compoundingFrequencyDate;
}else{
delete scope.formData.interestRecalculationCompoundingMethod;
delete scope.formData.rescheduleStrategyMethod;
delete scope.formData.recalculationRestFrequencyType;
delete scope.formData.recalculationRestFrequencyInterval;
}
if(this.formData.isLinkedToFloatingInterestRates) {
delete scope.formData.interestRatePerPeriod ;
delete scope.formData.minInterestRatePerPeriod ;
delete scope.formData.maxInterestRatePerPeriod ;
delete scope.formData.interestRateFrequencyType ;
}else {
delete scope.formData.floatingRatesId ;
delete scope.formData.interestRateDifferential ;
delete scope.formData.isFloatingInterestRateCalculationAllowed ;
delete scope.formData.minDifferentialLendingRate ;
delete scope.formData.defaultDifferentialLendingRate ;
delete scope.formData.maxDifferentialLendingRate ;
}
//If Variable Installments is not allowed for this product, remove the corresponding formData
if(!this.formData.allowVariableInstallments) {
delete scope.formData.minimumGap ;
delete scope.formData.maximumGap ;
}
if(this.formData.interestCalculationPeriodType == 0){
this.formData.allowPartialPeriodInterestCalcualtion = false;
}
if (this.formData.recalculationCompoundingFrequencyType == 4) {
if(this.formData.recalculationCompoundingFrequencyNthDayType == -2) {
delete this.formData.recalculationCompoundingFrequencyNthDayType;
delete this.formData.recalculationCompoundingFrequencyDayOfWeekType;
} else {
delete this.formData.recalculationCompoundingFrequencyOnDayType;
}
} else if (this.formData.recalculationCompoundingFrequencyType == 3){
delete this.formData.recalculationCompoundingFrequencyOnDayType;
delete this.formData.recalculationCompoundingFrequencyNthDayType;
}
if (this.formData.recalculationRestFrequencyType == 4) {
if(this.formData.recalculationRestFrequencyNthDayType == -2) {
delete this.formData.recalculationRestFrequencyNthDayType;
delete this.formData.recalculationRestFrequencyDayOfWeekType;
} else {
delete this.formData.recalculationRestFrequencyOnDayType;
}
} else if (this.formData.recalculationRestFrequencyType == 3){
delete this.formData.recalculationRestFrequencyOnDayType;
delete this.formData.recalculationRestFrequencyNthDayType;
}
if(!this.formData.isSubsidyApplicable){
delete this.formData.isSubsidyApplicable ;
delete this.formData.subsidyFundSourceId ;
delete this.formData.subsidyAccountId ;
}
if(!this.formData.adjustFirstEMIAmount){
this.formData.adjustedInstallmentInMultiplesOf = null;
}
if(this.formData.minimumDaysOrrPeriodsBetweenDisbursalAndFirstRepaymentType){
delete this.formData.minimumDaysOrrPeriodsBetweenDisbursalAndFirstRepaymentType;
}
if(this.formData.minimumDaysBetweenDisbursalAndFirstRepayment){
delete this.formData.minimumPeriodsBetweenDisbursalAndFirstRepayment;
}
if(this.formData.minimumPeriodsBetweenDisbursalAndFirstRepayment){
delete this.formData.minimumDaysBetweenDisbursalAndFirstRepayment;
}
if(this.formData.minLoanTerm==null && this.formData.maxLoanTerm== null &&
this.formData.loanTenureFrequencyType != null){
this.formData.loanTenureFrequencyType = null;
}
resourceFactory.loanProductResource.save(this.formData, function (data) {
location.path('/viewloanproduct/' + data.resourceId);
});
};
}
});
mifosX.ng.application.controller('CreateLoanProductController', ['$scope', 'ResourceFactory', '$location', 'dateFilter', mifosX.controllers.CreateLoanProductController]).run(function ($log) {
$log.info("CreateLoanProductController initialized");
});
}(mifosX.controllers || {}));