From b491d53f10b40142d5195e6a4918894b7740313f Mon Sep 17 00:00:00 2001 From: John Woodlock Date: Thu, 31 May 2012 13:27:36 +1000 Subject: [PATCH] more api doc updates and make available LoanProductLookup to loan template --- APIFolder/api.htm | 936 +++++++----------- APIFolder/docUpdateComments.txt | 17 +- .../platform/api/LoanProductApiResource.java | 2 +- .../api/data/ApiGlobalErrorResponse.java | 2 +- .../platform/api/data/LoanProductLookup.java | 34 + .../platform/api/data/NewLoanData.java | 28 +- .../service/LoanReadPlatformServiceImpl.java | 101 +- .../LoanProductReadPlatformService.java | 3 + .../LoanProductReadPlatformServiceImpl.java | 196 ++-- 9 files changed, 642 insertions(+), 677 deletions(-) create mode 100644 mifosng-provider/src/main/java/org/mifosng/platform/api/data/LoanProductLookup.java diff --git a/APIFolder/api.htm b/APIFolder/api.htm index 8c991688e..fac770980 100644 --- a/APIFolder/api.htm +++ b/APIFolder/api.htm @@ -114,7 +114,7 @@ var jqxhr = $.ajax({
- + @@ -137,7 +137,7 @@ var jqxhr = $.ajax({
RESOURCES
POST
create/update
GET
read
PUT
simple update
DELETE
delete
RESOURCES
POST
create/complex update
GET
read
PUT
update
DELETE
delete
CLIENT/v1/clientsCreate a ClientList Clients
/v1/clients/{clientId}Retrieve a ClientUpdate a Client
/v1/clients/{clientId}/loansRetrieve a Client's Loan Account Summary
- +
RESOURCES
POST
create/update
GET
read
PUT
simple update
DELETE
delete
RESOURCES
POST
create/complex update
GET
read
PUT
update
DELETE
delete
CONFIGURATION/v1/configurations/currencyRetrieve Currency ConfigurationUpdate Currency Configuration
@@ -148,7 +148,7 @@ var jqxhr = $.ajax({
- +
RESOURCES
POST
create/update
GET
read
PUT
simple update
DELETE
delete
RESOURCES
POST
create/complex update
GET
read
PUT
update
DELETE
delete
ADDITIONAL FIELDS/v1/additionalfieldsList Additional Fields Sets
/v1/additionalfields/{Type}/{Set}/{id}Update Additional FieldsRetrieve Additional Fields
@@ -160,7 +160,7 @@ var jqxhr = $.ajax({
- +
RESOURCES
POST
create/update
GET
read
PUT
simple update
DELETE
delete
RESOURCES
POST
create/complex update
GET
read
PUT
update
DELETE
delete
REPORT/v1/reportsList Reports
/v1/reports/{reportName}Run a Report
@@ -172,7 +172,7 @@ var jqxhr = $.ajax({
- + @@ -892,468 +892,195 @@ Request Body:
GET https://thedomainname/api/v1/loans/template - -{ - "organisationId": 1, - "organisationName": "Demo MFI", - "clientId": 1, - "clientName": "Patrick O'Meara", - "productId": 1, - "productName": "Agricultural Loan", - "allowedProducts": [ - { - "id": 1, - "name": "Agricultural Loan", - "description": "An agricultural loan given to farmers to help buy crop, stock and machinery. With an arrears tolerance setting of 1,000 CFA, loans are not marked as 'in arrears' or 'in bad standing' if the amount outstanding is less than this. Interest rate is described using monthly percentage rate (MPR) even though the loan typically lasts a year and requires one repayment (typically at time when farmer sells crop)", - "principalMoney": { - "currencyCode": "XOF", - "currencyDigitsAfterDecimal": 0, - "amount": 100000, - "defaultName": "CFA Franc BCEAO", - "nameCode": "currency.XOF", - "displaySymbol": "CFA", - "zero": false, - "greaterThanZero": true, - "displaySymbolValue": "100000 CFA" - }, - "interestRatePerPeriod": 1.75, - "interestRatePeriod": 2, - "annualInterestRate": 21, - "interestMethod": 0, - "interestRateCalculatedInPeriod": 1, - "numberOfInterestFreePeriods": 0, - "repaidEvery": 12, - "repaymentPeriodFrequency": 2, - "numberOfRepayments": 1, - "amortizationMethod": 1, - "inArrearsTolerance": { - "currencyCode": "XOF", - "currencyDigitsAfterDecimal": 0, - "amount": 1000, - "defaultName": "CFA Franc BCEAO", - "nameCode": "currency.XOF", - "displaySymbol": "CFA", - "zero": false, - "greaterThanZero": true, - "displaySymbolValue": "1000 CFA" - }, - "createdOn": "2012-04-12T00:00:00.000+01:00", - "lastModifedOn": "2012-04-12T00:00:00.000+01:00", - "possibleCurrencies": [], - "possibleAmortizationOptions": [], - "possibleInterestOptions": [], - "possibleInterestRateCalculatedInPeriodOptions": [], - "repaymentFrequencyOptions": [], - "interestFrequencyOptions": [], - "interestRebateAllowed": false, - "flexible": false +{ + "clientId" : 1, + "clientName" : "Patrick O'Meara", + "productId" : 1, + "productName" : "Agricultural Loan", + "allowedProducts" : [ { + "id" : 1, + "name" : "Agricultural Loan" + }, { + "id" : 2, + "name" : "Brunei Loan" + }, { + "id" : 3, + "name" : "IL Loan" + }, { + "id" : 4, + "name" : "IBL Mabeshte" + }, { + "id" : 5, + "name" : "Salary Loan" + }, { + "id" : 6, + "name" : "daily-declining-balance" + }, { + "id" : 7, + "name" : "really fantastic loan" + } ], + "dateFormat" : null, + "submittedOnDateFormatted" : null, + "submittedOnDate" : null, + "submittedOnNote" : "", + "expectedDisbursementDateFormatted" : null, + "expectedDisbursementDate" : [ 2012, 5, 31 ], + "repaymentsStartingFromDateFormatted" : null, + "repaymentsStartingFromDate" : null, + "interestCalculatedFromDateFormatted" : null, + "interestCalculatedFromDate" : null, + "repaymentSchedule" : null, + "selectedProduct" : { + "id" : 1, + "name" : "Agricultural Loan", + "description" : "An agricultural loan given to farmers to help buy crop, stock and machinery. With an arrears tolerance setting of 1,000 CFA, loans are not marked as 'in arrears' or 'in bad standing' if the amount outstanding is less than this. Interest rate is described using monthly percentage rate (MPR) even though the loan typically lasts a year and requires one repayment (typically at time when farmer sells crop)", + "principal" : { + "currencyCode" : "XOF", + "digitsAfterDecimal" : 0, + "amount" : 100000, + "defaultName" : "CFA Franc BCEAO", + "nameCode" : "currency.XOF", + "displaySymbol" : "CFA", + "zero" : false, + "greaterThanZero" : true, + "displaySymbolValue" : "100000 CFA" }, - { - "id": 2, - "name": "Brunei Loan", - "description": null, - "principalMoney": { - "currencyCode": "BND", - "currencyDigitsAfterDecimal": 2, - "amount": 76000, - "defaultName": "Brunei Dollar", - "nameCode": "currency.BND", - "displaySymbol": "BND", - "zero": false, - "greaterThanZero": true, - "displaySymbolValue": "76000.00 BND" - }, - "interestRatePerPeriod": 6, - "interestRatePeriod": 2, - "annualInterestRate": 72, - "interestMethod": 0, - "interestRateCalculatedInPeriod": 1, - "numberOfInterestFreePeriods": 0, - "repaidEvery": 1, - "repaymentPeriodFrequency": 1, - "numberOfRepayments": 10, - "amortizationMethod": 1, - "inArrearsTolerance": { - "currencyCode": "BND", - "currencyDigitsAfterDecimal": 2, - "amount": 50, - "defaultName": "Brunei Dollar", - "nameCode": "currency.BND", - "displaySymbol": "BND", - "zero": false, - "greaterThanZero": true, - "displaySymbolValue": "50.00 BND" - }, - "createdOn": "2012-04-16T00:00:00.000+01:00", - "lastModifedOn": "2012-04-16T00:00:00.000+01:00", - "possibleCurrencies": [], - "possibleAmortizationOptions": [], - "possibleInterestOptions": [], - "possibleInterestRateCalculatedInPeriodOptions": [], - "repaymentFrequencyOptions": [], - "interestFrequencyOptions": [], - "interestRebateAllowed": false, - "flexible": false + "inArrearsTolerance" : { + "currencyCode" : "XOF", + "digitsAfterDecimal" : 0, + "amount" : 1000, + "defaultName" : "CFA Franc BCEAO", + "nameCode" : "currency.XOF", + "displaySymbol" : "CFA", + "zero" : false, + "greaterThanZero" : true, + "displaySymbolValue" : "1000 CFA" }, - { - "id": 3, - "name": "IL Loan", - "description": null, - "principalMoney": { - "currencyCode": "USD", - "currencyDigitsAfterDecimal": 2, - "amount": 5000, - "defaultName": "US Dollar", - "nameCode": "currency.USD", - "displaySymbol": "$", - "zero": false, - "greaterThanZero": true, - "displaySymbolValue": "5000.00 $" - }, - "interestRatePerPeriod": 15.6, - "interestRatePeriod": 3, - "annualInterestRate": 15.6, - "interestMethod": 1, - "interestRateCalculatedInPeriod": 1, - "numberOfInterestFreePeriods": 0, - "repaidEvery": 1, - "repaymentPeriodFrequency": 2, - "numberOfRepayments": 12, - "amortizationMethod": 1, - "inArrearsTolerance": { - "currencyCode": "USD", - "currencyDigitsAfterDecimal": 2, - "amount": 0, - "defaultName": "US Dollar", - "nameCode": "currency.USD", - "displaySymbol": "$", - "zero": true, - "greaterThanZero": false, - "displaySymbolValue": "0.00 $" - }, - "createdOn": "2012-04-18T00:00:00.000+01:00", - "lastModifedOn": "2012-04-18T00:00:00.000+01:00", - "possibleCurrencies": [], - "possibleAmortizationOptions": [], - "possibleInterestOptions": [], - "possibleInterestRateCalculatedInPeriodOptions": [], - "repaymentFrequencyOptions": [], - "interestFrequencyOptions": [], - "interestRebateAllowed": false, - "flexible": false + "numberOfRepayments" : 1, + "repaymentEvery" : 12, + "interestRatePerPeriod" : 1.750000, + "annualInterestRate" : 21.000000, + "repaymentFrequencyType" : { + "id" : 2, + "code" : "repaymentFrequency.periodFrequencyType.months", + "value" : "Months" }, - { - "id": 4, - "name": "IBL Mabeshte", - "description": "Individual loan", - "principalMoney": { - "currencyCode": "KES", - "currencyDigitsAfterDecimal": 2, - "amount": 5000, - "defaultName": "Kenyan Shilling", - "nameCode": "currency.KES", - "displaySymbol": "KSh", - "zero": false, - "greaterThanZero": true, - "displaySymbolValue": "5000.00 KSh" - }, - "interestRatePerPeriod": 2, - "interestRatePeriod": 2, - "annualInterestRate": 24, - "interestMethod": 1, - "interestRateCalculatedInPeriod": 1, - "numberOfInterestFreePeriods": 0, - "repaidEvery": 12, - "repaymentPeriodFrequency": 2, - "numberOfRepayments": 12, - "amortizationMethod": 1, - "inArrearsTolerance": { - "currencyCode": "KES", - "currencyDigitsAfterDecimal": 2, - "amount": 0, - "defaultName": "Kenyan Shilling", - "nameCode": "currency.KES", - "displaySymbol": "KSh", - "zero": true, - "greaterThanZero": false, - "displaySymbolValue": "0.00 KSh" - }, - "createdOn": "2012-04-21T00:00:00.000+01:00", - "lastModifedOn": "2012-04-21T00:00:00.000+01:00", - "possibleCurrencies": [], - "possibleAmortizationOptions": [], - "possibleInterestOptions": [], - "possibleInterestRateCalculatedInPeriodOptions": [], - "repaymentFrequencyOptions": [], - "interestFrequencyOptions": [], - "interestRebateAllowed": false, - "flexible": false + "interestRateFrequencyType" : { + "id" : 2, + "code" : "interestRateFrequency.periodFrequencyType.months", + "value" : "Per month" }, - { - "id": 5, - "name": "Salary Loan", - "description": "Loan for salaried workers", - "principalMoney": { - "currencyCode": "GHC", - "currencyDigitsAfterDecimal": 2, - "amount": 500, - "defaultName": "Ghana Cedi", - "nameCode": "currency.GHC", - "displaySymbol": "GHC", - "zero": false, - "greaterThanZero": true, - "displaySymbolValue": "500.00 GHC" - }, - "interestRatePerPeriod": 3.5, - "interestRatePeriod": 2, - "annualInterestRate": 42, - "interestMethod": 1, - "interestRateCalculatedInPeriod": 1, - "numberOfInterestFreePeriods": 0, - "repaidEvery": 1, - "repaymentPeriodFrequency": 2, - "numberOfRepayments": 12, - "amortizationMethod": 1, - "inArrearsTolerance": { - "currencyCode": "GHC", - "currencyDigitsAfterDecimal": 2, - "amount": 0, - "defaultName": "Ghana Cedi", - "nameCode": "currency.GHC", - "displaySymbol": "GHC", - "zero": true, - "greaterThanZero": false, - "displaySymbolValue": "0.00 GHC" - }, - "createdOn": "2012-04-24T00:00:00.000+01:00", - "lastModifedOn": "2012-04-24T00:00:00.000+01:00", - "possibleCurrencies": [], - "possibleAmortizationOptions": [], - "possibleInterestOptions": [], - "possibleInterestRateCalculatedInPeriodOptions": [], - "repaymentFrequencyOptions": [], - "interestFrequencyOptions": [], - "interestRebateAllowed": false, - "flexible": false + "amortizationType" : { + "id" : 1, + "code" : "amortizationType.equal.installments", + "value" : "Equal installments" }, - { - "id": 6, - "name": "daily-declining-balance", - "description": "an example loan product based on description for daily declining balance as given by Hugo technologies.", - "principalMoney": { - "currencyCode": "USD", - "currencyDigitsAfterDecimal": 2, - "amount": 100000, - "defaultName": "US Dollar", - "nameCode": "currency.USD", - "displaySymbol": "$", - "zero": false, - "greaterThanZero": true, - "displaySymbolValue": "100000.00 $" - }, - "interestRatePerPeriod": 2, - "interestRatePeriod": 2, - "annualInterestRate": 24, - "interestMethod": 0, - "interestRateCalculatedInPeriod": 0, - "numberOfInterestFreePeriods": 0, - "repaidEvery": 1, - "repaymentPeriodFrequency": 2, - "numberOfRepayments": 12, - "amortizationMethod": 1, - "inArrearsTolerance": { - "currencyCode": "USD", - "currencyDigitsAfterDecimal": 2, - "amount": 0, - "defaultName": "US Dollar", - "nameCode": "currency.USD", - "displaySymbol": "$", - "zero": true, - "greaterThanZero": false, - "displaySymbolValue": "0.00 $" - }, - "createdOn": "2012-05-01T00:00:00.000+01:00", - "lastModifedOn": "2012-05-01T00:00:00.000+01:00", - "possibleCurrencies": [], - "possibleAmortizationOptions": [], - "possibleInterestOptions": [], - "possibleInterestRateCalculatedInPeriodOptions": [], - "repaymentFrequencyOptions": [], - "interestFrequencyOptions": [], - "interestRebateAllowed": false, - "flexible": false + "interestType" : { + "id" : 0, + "code" : "interestType.declining.balance", + "value" : "Declining Balance" }, - { - "id": 7, - "name": "New kind of Loan", - "description": "A description not exceeding 500 characters.", - "principalMoney": { - "currencyCode": "XOF", - "currencyDigitsAfterDecimal": 0, - "amount": 100000, - "defaultName": "CFA Franc BCEAO", - "nameCode": "currency.XOF", - "displaySymbol": "CFA", - "zero": false, - "greaterThanZero": true, - "displaySymbolValue": "100000 CFA" - }, - "interestRatePerPeriod": 1.75, - "interestRatePeriod": 2, - "annualInterestRate": 21, - "interestMethod": 0, - "interestRateCalculatedInPeriod": 1, - "numberOfInterestFreePeriods": 0, - "repaidEvery": 1, - "repaymentPeriodFrequency": 2, - "numberOfRepayments": 1, - "amortizationMethod": 1, - "inArrearsTolerance": { - "currencyCode": "XOF", - "currencyDigitsAfterDecimal": 0, - "amount": 1000, - "defaultName": "CFA Franc BCEAO", - "nameCode": "currency.XOF", - "displaySymbol": "CFA", - "zero": false, - "greaterThanZero": true, - "displaySymbolValue": "1000 CFA" - }, - "createdOn": "2012-05-21T00:00:00.000+01:00", - "lastModifedOn": "2012-05-21T00:00:00.000+01:00", - "possibleCurrencies": [], - "possibleAmortizationOptions": [], - "possibleInterestOptions": [], - "possibleInterestRateCalculatedInPeriodOptions": [], - "repaymentFrequencyOptions": [], - "interestFrequencyOptions": [], - "interestRebateAllowed": false, - "flexible": false - } - ], - "dateFormat": null, - "submittedOnDateFormatted": null, - "submittedOnDate": null, - "submittedOnNote": "", - "expectedDisbursementDateFormatted": null, - "expectedDisbursementDate": "2012-05-22", - "repaymentsStartingFromDateFormatted": null, - "repaymentsStartingFromDate": null, - "interestCalculatedFromDateFormatted": null, - "interestCalculatedFromDate": null, - "repaymentSchedule": null, - "selectedProduct": { - "id": 1, - "name": "Agricultural Loan", - "description": "An agricultural loan given to farmers to help buy crop, stock and machinery. With an arrears tolerance setting of 1,000 CFA, loans are not marked as 'in arrears' or 'in bad standing' if the amount outstanding is less than this. Interest rate is described using monthly percentage rate (MPR) even though the loan typically lasts a year and requires one repayment (typically at time when farmer sells crop)", - "principalMoney": { - "currencyCode": "XOF", - "currencyDigitsAfterDecimal": 0, - "amount": 100000, - "defaultName": "CFA Franc BCEAO", - "nameCode": "currency.XOF", - "displaySymbol": "CFA", - "zero": false, - "greaterThanZero": true, - "displaySymbolValue": "100000 CFA" + "interestCalculationPeriodType" : { + "id" : 1, + "code" : "interestCalculationPeriodType.same.as.repayment.period", + "value" : "Same as repayment period" }, - "interestRatePerPeriod": 1.75, - "interestRatePeriod": 2, - "annualInterestRate": 21, - "interestMethod": 0, - "interestRateCalculatedInPeriod": 1, - "numberOfInterestFreePeriods": 0, - "repaidEvery": 12, - "repaymentPeriodFrequency": 2, - "numberOfRepayments": 1, - "amortizationMethod": 1, - "inArrearsTolerance": { - "currencyCode": "XOF", - "currencyDigitsAfterDecimal": 0, - "amount": 1000, - "defaultName": "CFA Franc BCEAO", - "nameCode": "currency.XOF", - "displaySymbol": "CFA", - "zero": false, - "greaterThanZero": true, - "displaySymbolValue": "1000 CFA" - }, - "createdOn": "2012-04-12T00:00:00.000+01:00", - "lastModifedOn": "2012-04-12T00:00:00.000+01:00", - "possibleCurrencies": [ - { - "code": "GBP", - "name": "Pound Sterling", - "decimalPlaces": 2, - "displaySymbol": null, - "nameCode": "currency.GBP", - "displayLabel": "Pound Sterling [GBP]" - }, - { - "code": "USD", - "name": "US Dollar", - "decimalPlaces": 2, - "displaySymbol": "$", - "nameCode": "currency.USD", - "displayLabel": "US Dollar ($)" - } - ], - "possibleAmortizationOptions": [ - { - "id": 1, - "value": "Equal installments" - }, - { - "id": 0, - "value": "Equal principle payments" - } - ], - "possibleInterestOptions": [ - { - "id": 0, - "value": "Declining Balance" - }, - { - "id": 1, - "value": "Flat" - } - ], - "possibleInterestRateCalculatedInPeriodOptions": [ - { - "id": 0, - "value": "Daily" - }, - { - "id": 1, - "value": "Same as repayment period" - } - ], - "repaymentFrequencyOptions": [ - { - "id": 0, - "value": "Days" - }, - { - "id": 1, - "value": "Weeks" - }, - { - "id": 2, - "value": "Months" - } - ], - "interestFrequencyOptions": [ - { - "id": 2, - "value": "Per month" - }, - { - "id": 3, - "value": "Per year" - } - ], + "createdOn" : 1334232874000, + "lastModifedOn" : 1334232874000, + "currencyOptions" : [ { + "code" : "KES", + "name" : "Kenyan Shilling", + "decimalPlaces" : 2, + "displaySymbol" : "KSh", + "nameCode" : "currency.KES", + "displayLabel" : "Kenyan Shilling (KSh)" + }, { + "code" : "BND", + "name" : "Brunei Dollar", + "decimalPlaces" : 2, + "displaySymbol" : "BND", + "nameCode" : "currency.BND", + "displayLabel" : "Brunei Dollar (BND)" + }, { + "code" : "LBP", + "name" : "Lebanese Pound", + "decimalPlaces" : 2, + "displaySymbol" : "L£", + "nameCode" : "currency.LBP", + "displayLabel" : "Lebanese Pound (L£)" + }, { + "code" : "GHC", + "name" : "Ghana Cedi", + "decimalPlaces" : 2, + "displaySymbol" : "GHC", + "nameCode" : "currency.GHC", + "displayLabel" : "Ghana Cedi (GHC)" + }, { + "code" : "USD", + "name" : "US Dollar", + "decimalPlaces" : 2, + "displaySymbol" : "$", + "nameCode" : "currency.USD", + "displayLabel" : "US Dollar ($)" + }, { + "code" : "XOF", + "name" : "CFA Franc BCEAO", + "decimalPlaces" : 0, + "displaySymbol" : "CFA", + "nameCode" : "currency.XOF", + "displayLabel" : "CFA Franc BCEAO (CFA)" + } ], + "amortizationTypeOptions" : [ { + "id" : 1, + "code" : "amortizationType.equal.installments", + "value" : "Equal installments" + }, { + "id" : 0, + "code" : "amortizationType.equal.principal", + "value" : "Equal principle payments" + } ], + "interestTypeOptions" : [ { + "id" : 1, + "code" : "interestType.flat", + "value" : "Flat" + }, { + "id" : 0, + "code" : "interestType.declining.balance", + "value" : "Declining Balance" + } ], + "interestCalculationPeriodTypeOptions" : [ { + "id" : 0, + "code" : "interestCalculationPeriodType.daily", + "value" : "Daily" + }, { + "id" : 1, + "code" : "interestCalculationPeriodType.same.as.repayment.period", + "value" : "Same as repayment period" + } ], + "repaymentFrequencyTypeOptions" : [ { + "id" : 0, + "code" : "repaymentFrequency.periodFrequencyType.days", + "value" : "Days" + }, { + "id" : 1, + "code" : "repaymentFrequency.periodFrequencyType.weeks", + "value" : "Weeks" + }, { + "id" : 2, + "code" : "repaymentFrequency.periodFrequencyType.months", + "value" : "Months" + } ], + "interestRateFrequencyTypeOptions" : [ { + "id" : 2, + "code" : "interestRateFrequency.periodFrequencyType.months", + "value" : "Per month" + }, { + "id" : 3, + "code" : "interestRateFrequency.periodFrequencyType.years", + "value" : "Per year" + } ] } -} +}
@@ -2134,7 +1861,7 @@ Request Body:

Example Requests:

https://localhost:8443/mifosng-provider/api/v1/loanproducts?pretty=true

- https://localhost:8443/mifosng-provider/api/v1/loanproducts?pretty=true&fields=name,description + https://localhost:8443/mifosng-provider/api/v1/loanproducts?pretty=true&fields=name,description,interestRateFrequencyType,amortizationType
GET https://thedomainname/api/v1/loanproducts @@ -2142,9 +1869,9 @@ Request Body: "id" : 1, "name" : "Agricultural Loan", "description" : "An agricultural loan given to farmers to help buy crop, stock and machinery. With an arrears tolerance setting of 1,000 CFA, loans are not marked as 'in arrears' or 'in bad standing' if the amount outstanding is less than this. Interest rate is described using monthly percentage rate (MPR) even though the loan typically lasts a year and requires one repayment (typically at time when farmer sells crop)", - "principalMoney" : { + "principal" : { "currencyCode" : "XOF", - "currencyDigitsAfterDecimal" : 0, + "digitsAfterDecimal" : 0, "amount" : 100000, "defaultName" : "CFA Franc BCEAO", "nameCode" : "currency.XOF", @@ -2153,19 +1880,9 @@ Request Body: "greaterThanZero" : true, "displaySymbolValue" : "100000 CFA" }, - "interestRatePerPeriod" : 1.750000, - "interestRatePeriod" : 2, - "annualInterestRate" : 21.000000, - "interestMethod" : 0, - "interestRateCalculatedInPeriod" : 1, - "numberOfInterestFreePeriods" : 0, - "repaidEvery" : 12, - "repaymentPeriodFrequency" : 2, - "numberOfRepayments" : 1, - "amortizationMethod" : 1, "inArrearsTolerance" : { "currencyCode" : "XOF", - "currencyDigitsAfterDecimal" : 0, + "digitsAfterDecimal" : 0, "amount" : 1000, "defaultName" : "CFA Franc BCEAO", "nameCode" : "currency.XOF", @@ -2174,15 +1891,44 @@ Request Body: "greaterThanZero" : true, "displaySymbolValue" : "1000 CFA" }, + "numberOfRepayments" : 1, + "repaymentEvery" : 12, + "interestRatePerPeriod" : 1.750000, + "annualInterestRate" : 21.000000, + "repaymentFrequencyType" : { + "id" : 2, + "code" : "repaymentFrequency.periodFrequencyType.months", + "value" : "Months" + }, + "interestRateFrequencyType" : { + "id" : 2, + "code" : "interestRateFrequency.periodFrequencyType.months", + "value" : "Per month" + }, + "amortizationType" : { + "id" : 1, + "code" : "amortizationType.equal.installments", + "value" : "Equal installments" + }, + "interestType" : { + "id" : 0, + "code" : "interestType.declining.balance", + "value" : "Declining Balance" + }, + "interestCalculationPeriodType" : { + "id" : 1, + "code" : "interestCalculationPeriodType.same.as.repayment.period", + "value" : "Same as repayment period" + }, "createdOn" : 1334232874000, "lastModifedOn" : 1334232874000 }, { "id" : 2, "name" : "Brunei Loan", "description" : null, - "principalMoney" : { + "principal" : { "currencyCode" : "BND", - "currencyDigitsAfterDecimal" : 2, + "digitsAfterDecimal" : 2, "amount" : 76000.00, "defaultName" : "Brunei Dollar", "nameCode" : "currency.BND", @@ -2191,19 +1937,9 @@ Request Body: "greaterThanZero" : true, "displaySymbolValue" : "76000.00 BND" }, - "interestRatePerPeriod" : 6.000000, - "interestRatePeriod" : 2, - "annualInterestRate" : 72.000000, - "interestMethod" : 0, - "interestRateCalculatedInPeriod" : 1, - "numberOfInterestFreePeriods" : 0, - "repaidEvery" : 1, - "repaymentPeriodFrequency" : 1, - "numberOfRepayments" : 10, - "amortizationMethod" : 1, "inArrearsTolerance" : { "currencyCode" : "BND", - "currencyDigitsAfterDecimal" : 2, + "digitsAfterDecimal" : 2, "amount" : 50.00, "defaultName" : "Brunei Dollar", "nameCode" : "currency.BND", @@ -2212,9 +1948,38 @@ Request Body: "greaterThanZero" : true, "displaySymbolValue" : "50.00 BND" }, + "numberOfRepayments" : 10, + "repaymentEvery" : 1, + "interestRatePerPeriod" : 6.000000, + "annualInterestRate" : 72.000000, + "repaymentFrequencyType" : { + "id" : 1, + "code" : "repaymentFrequency.periodFrequencyType.weeks", + "value" : "Weeks" + }, + "interestRateFrequencyType" : { + "id" : 2, + "code" : "interestRateFrequency.periodFrequencyType.months", + "value" : "Per month" + }, + "amortizationType" : { + "id" : 1, + "code" : "amortizationType.equal.installments", + "value" : "Equal installments" + }, + "interestType" : { + "id" : 0, + "code" : "interestType.declining.balance", + "value" : "Declining Balance" + }, + "interestCalculationPeriodType" : { + "id" : 1, + "code" : "interestCalculationPeriodType.same.as.repayment.period", + "value" : "Same as repayment period" + }, "createdOn" : 1334513601000, "lastModifedOn" : 1334513601000 -}... ] +}...]
@@ -2235,45 +2000,90 @@ Request Body:
GET https://thedomainname/api/v1/loanproducts/template { - "principalMoney" : { - "currencyCode" : "ETB", - "currencyDigitsAfterDecimal" : 2, + "principal" : { + "currencyCode" : "KES", + "digitsAfterDecimal" : 2, "amount" : 0.00, - "defaultName" : "Ethiopian Birr", - "nameCode" : "currency.ETB", - "displaySymbol" : null, + "defaultName" : "Kenyan Shilling", + "nameCode" : "currency.KES", + "displaySymbol" : "KSh", "zero" : true, "greaterThanZero" : false, - "displaySymbolValue" : "0.00 null" + "displaySymbolValue" : "0.00 KSh" + }, + "inArrearsTolerance" : { + "currencyCode" : "KES", + "digitsAfterDecimal" : 2, + "amount" : 0.00, + "defaultName" : "Kenyan Shilling", + "nameCode" : "currency.KES", + "displaySymbol" : "KSh", + "zero" : true, + "greaterThanZero" : false, + "displaySymbolValue" : "0.00 KSh" }, "interestRatePerPeriod" : 0, - "interestRatePeriod" : 2, "annualInterestRate" : 0, - "interestMethod" : 0, - "interestRateCalculatedInPeriod" : 1, - "numberOfInterestFreePeriods" : 0, - "repaidEvery" : 1, - "repaymentPeriodFrequency" : 2, - "numberOfRepayments" : 0, - "amortizationMethod" : 1, - "inArrearsTolerance" : { - "currencyCode" : "ETB", - "currencyDigitsAfterDecimal" : 2, - "amount" : 0.00, - "defaultName" : "Ethiopian Birr", - "nameCode" : "currency.ETB", - "displaySymbol" : null, - "zero" : true, - "greaterThanZero" : false, - "displaySymbolValue" : "0.00 null" + "repaymentFrequencyType" : { + "id" : 2, + "code" : "repaymentFrequency.periodFrequencyType.months", + "value" : "Months" }, - "possibleCurrencies" : [ { - "code" : "ETB", - "name" : "Ethiopian Birr", + "interestRateFrequencyType" : { + "id" : 2, + "code" : "interestRateFrequency.periodFrequencyType.months", + "value" : "Per month" + }, + "amortizationType" : { + "id" : 1, + "code" : "amortizationType.equal.installments", + "value" : "Equal installments" + }, + "interestType" : { + "id" : 0, + "code" : "interestType.declining.balance", + "value" : "Declining Balance" + }, + "interestCalculationPeriodType" : { + "id" : 1, + "code" : "interestCalculationPeriodType.same.as.repayment.period", + "value" : "Same as repayment period" + }, + "currencyOptions" : [ { + "code" : "KES", + "name" : "Kenyan Shilling", "decimalPlaces" : 2, - "displaySymbol" : null, - "nameCode" : "currency.ETB", - "displayLabel" : "Ethiopian Birr [ETB]" + "displaySymbol" : "KSh", + "nameCode" : "currency.KES", + "displayLabel" : "Kenyan Shilling (KSh)" + }, { + "code" : "BND", + "name" : "Brunei Dollar", + "decimalPlaces" : 2, + "displaySymbol" : "BND", + "nameCode" : "currency.BND", + "displayLabel" : "Brunei Dollar (BND)" + }, { + "code" : "LBP", + "name" : "Lebanese Pound", + "decimalPlaces" : 2, + "displaySymbol" : "L£", + "nameCode" : "currency.LBP", + "displayLabel" : "Lebanese Pound (L£)" + }, { + "code" : "GHC", + "name" : "Ghana Cedi", + "decimalPlaces" : 2, + "displaySymbol" : "GHC", + "nameCode" : "currency.GHC", + "displayLabel" : "Ghana Cedi (GHC)" + }, { + "code" : "USD", + "name" : "US Dollar", + "decimalPlaces" : 2, + "displaySymbol" : "$", + "nameCode" : "currency.USD", + "displayLabel" : "US Dollar ($)" }, { "code" : "XOF", "name" : "CFA Franc BCEAO", @@ -2281,57 +2091,54 @@ Request Body: "displaySymbol" : "CFA", "nameCode" : "currency.XOF", "displayLabel" : "CFA Franc BCEAO (CFA)" - }, { - "code" : "GBP", - "name" : "Pound Sterling", - "decimalPlaces" : 2, - "displaySymbol" : null, - "nameCode" : "currency.GBP", - "displayLabel" : "Pound Sterling [GBP]" - }, { - "code" : "USD", - "name" : "US Dollar", - "decimalPlaces" : 2, - "displaySymbol" : null, - "nameCode" : "currency.USD", - "displayLabel" : "US Dollar [USD]" } ], - "possibleAmortizationOptions" : [ { + "amortizationTypeOptions" : [ { "id" : 1, + "code" : "amortizationType.equal.installments", "value" : "Equal installments" }, { "id" : 0, + "code" : "amortizationType.equal.principal", "value" : "Equal principle payments" } ], - "possibleInterestOptions" : [ { - "id" : 0, - "value" : "Declining Balance" - }, { + "interestTypeOptions" : [ { "id" : 1, + "code" : "interestType.flat", "value" : "Flat" - } ], - "possibleInterestRateCalculatedInPeriodOptions" : [ { + }, { "id" : 0, + "code" : "interestType.declining.balance", + "value" : "Declining Balance" + } ], + "interestCalculationPeriodTypeOptions" : [ { + "id" : 0, + "code" : "interestCalculationPeriodType.daily", "value" : "Daily" }, { "id" : 1, + "code" : "interestCalculationPeriodType.same.as.repayment.period", "value" : "Same as repayment period" } ], - "repaymentFrequencyOptions" : [ { + "repaymentFrequencyTypeOptions" : [ { "id" : 0, + "code" : "repaymentFrequency.periodFrequencyType.days", "value" : "Days" }, { "id" : 1, + "code" : "repaymentFrequency.periodFrequencyType.weeks", "value" : "Weeks" }, { "id" : 2, + "code" : "repaymentFrequency.periodFrequencyType.months", "value" : "Months" } ], - "interestFrequencyOptions" : [ { + "interestRateFrequencyTypeOptions" : [ { "id" : 2, + "code" : "interestRateFrequency.periodFrequencyType.months", "value" : "Per month" }, { "id" : 3, + "code" : "interestRateFrequency.periodFrequencyType.years", "value" : "Per year" } ] } @@ -2356,9 +2163,9 @@ Request Body: "id" : 1, "name" : "Agricultural Loan", "description" : "An agricultural loan given to farmers to help buy crop, stock and machinery. With an arrears tolerance setting of 1,000 CFA, loans are not marked as 'in arrears' or 'in bad standing' if the amount outstanding is less than this. Interest rate is described using monthly percentage rate (MPR) even though the loan typically lasts a year and requires one repayment (typically at time when farmer sells crop)", - "principalMoney" : { + "principal" : { "currencyCode" : "XOF", - "currencyDigitsAfterDecimal" : 0, + "digitsAfterDecimal" : 0, "amount" : 100000, "defaultName" : "CFA Franc BCEAO", "nameCode" : "currency.XOF", @@ -2367,19 +2174,9 @@ Request Body: "greaterThanZero" : true, "displaySymbolValue" : "100000 CFA" }, - "interestRatePerPeriod" : 1.750000, - "interestRatePeriod" : 2, - "annualInterestRate" : 21.000000, - "interestMethod" : 0, - "interestRateCalculatedInPeriod" : 1, - "numberOfInterestFreePeriods" : 0, - "repaidEvery" : 12, - "repaymentPeriodFrequency" : 2, - "numberOfRepayments" : 1, - "amortizationMethod" : 1, "inArrearsTolerance" : { "currencyCode" : "XOF", - "currencyDigitsAfterDecimal" : 0, + "digitsAfterDecimal" : 0, "amount" : 1000, "defaultName" : "CFA Franc BCEAO", "nameCode" : "currency.XOF", @@ -2388,6 +2185,35 @@ Request Body: "greaterThanZero" : true, "displaySymbolValue" : "1000 CFA" }, + "numberOfRepayments" : 1, + "repaymentEvery" : 12, + "interestRatePerPeriod" : 1.750000, + "annualInterestRate" : 21.000000, + "repaymentFrequencyType" : { + "id" : 2, + "code" : "repaymentFrequency.periodFrequencyType.months", + "value" : "Months" + }, + "interestRateFrequencyType" : { + "id" : 2, + "code" : "interestRateFrequency.periodFrequencyType.months", + "value" : "Per month" + }, + "amortizationType" : { + "id" : 1, + "code" : "amortizationType.equal.installments", + "value" : "Equal installments" + }, + "interestType" : { + "id" : 0, + "code" : "interestType.declining.balance", + "value" : "Declining Balance" + }, + "interestCalculationPeriodType" : { + "id" : 1, + "code" : "interestCalculationPeriodType.same.as.repayment.period", + "value" : "Same as repayment period" + }, "createdOn" : 1334232874000, "lastModifedOn" : 1334232874000 } @@ -3482,7 +3308,7 @@ Request body:
RESOURCES
POST
create/update
GET
read
PUT
simple update
DELETE
delete
RESOURCES
POST
create/complex update
GET
read
PUT
update
DELETE
delete
AUTHENTICATION/v1/authenticationVerify Authentication
USER/v1/usersCreate a UserList Users
/v1/users/{userId}Retrieve a UserUpdate a UserDelete a User

Full API Matrix

API Endpoint:

https://thedomainname/api
- + diff --git a/APIFolder/docUpdateComments.txt b/APIFolder/docUpdateComments.txt index ec37a9072..8e907cdd2 100644 --- a/APIFolder/docUpdateComments.txt +++ b/APIFolder/docUpdateComments.txt @@ -8,24 +8,16 @@ recreate() Lost permissions again... restore fixed it up... must be some prob with permissions/roles maintenance also, maybe I should be using a user that has everything but role admin. -users - delete still falls over if user doesn't exist. DOING -Loan Products -List/Retrieve - should show textual values of enums? DOING -Create - principal is later called principalMoney , also consistency between other loan fields and loan product fields with Type on them DOING -clients - parentid = id or id 1 has parentId not null DOING -list clients notes - noteType needs a 'text' - createdOn & updatedOn values... do they need reformatting? - are they ord -updating client note - ignores clientId anyhow! so is it really a notes resource? +list clients notes - noteType needs a 'text'TODO + createdOn & updatedOn values... do they need reformatting?TODO + +updating client note - ignores clientId anyhow! so is it really a notes resource? TODO loan template Formatted field still there -Type fields rename and with associated text? -allowedProduct should maybe just be id & name -which fields have defaults as not all on NewLoanWorkflowStepOneData dto seem to be default. loan retrieve break up data into categories.. e.g. @@ -43,6 +35,7 @@ loanRepayments Additional Fields put right message for parameter not recognized etc.(plus tht 9 other jpwwrongmsg items) +should be able to get clients by branch as well (but not for now) diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/LoanProductApiResource.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/LoanProductApiResource.java index b58dcda05..bb5cd2923 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/LoanProductApiResource.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/LoanProductApiResource.java @@ -32,7 +32,7 @@ import org.springframework.stereotype.Component; @Scope("singleton") public class LoanProductApiResource { - private String defaultFieldList = "principal,inArrearsTolerance,numberOfRepayments,repaymentEvery,interestRatePerPeriod,annualInterestRate,repaymentFrequencyType,interestRateFrequencyType,amortizationType,interestType,interestCalculationPeriodType"; + private String defaultFieldList = "principal,inArrearsTolerance,interestRatePerPeriod,annualInterestRate,repaymentFrequencyType,interestRateFrequencyType,amortizationType,interestType,interestCalculationPeriodType"; private String allowedFieldList = "currencyOptions,amortizationTypeOptions,interestTypeOptions,interestCalculationPeriodTypeOptions,repaymentFrequencyTypeOptions,interestRateFrequencyTypeOptions"; private String filterName = "myFilter"; diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/data/ApiGlobalErrorResponse.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/data/ApiGlobalErrorResponse.java index 72be66252..bfcd051c6 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/data/ApiGlobalErrorResponse.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/data/ApiGlobalErrorResponse.java @@ -67,7 +67,7 @@ public class ApiGlobalErrorResponse { public static ApiGlobalErrorResponse domainRuleViolation(String globalisationMessageCode, String defaultUserMessage, Object... defaultUserMessageArgs) { ApiGlobalErrorResponse globalErrorResponse = new ApiGlobalErrorResponse(); globalErrorResponse.setHttpStatusCode("403"); - globalErrorResponse.setDeveloperMessage("Request was understoon but caused a domain rule violation."); + globalErrorResponse.setDeveloperMessage("Request was understood but caused a domain rule violation."); globalErrorResponse.setDeveloperDocLink("https://github.com/keithwoodlock/mifosx/wiki/HTTP-API-Error-codes"); globalErrorResponse.setUserMessageGlobalisationCode("validation.msg.domain.rule.violation"); globalErrorResponse.setDefaultUserMessage("Errors contain reason for domain rule violation."); diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/data/LoanProductLookup.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/data/LoanProductLookup.java new file mode 100644 index 000000000..fc4e3fe20 --- /dev/null +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/data/LoanProductLookup.java @@ -0,0 +1,34 @@ +package org.mifosng.platform.api.data; + +import java.io.Serializable; + +public class LoanProductLookup implements Serializable { + + private Long id; + private String name; + + public LoanProductLookup() { + // + } + + public LoanProductLookup(Long id, String name) { + this.id = id; + this.name = name; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/data/NewLoanData.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/data/NewLoanData.java index bb4e5392e..f8a1ee13b 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/data/NewLoanData.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/data/NewLoanData.java @@ -19,28 +19,28 @@ public class NewLoanData implements Serializable { private String clientName; private Long productId; private String productName; - - private List allowedProducts = new ArrayList(); - + + private List allowedProducts = new ArrayList(); + // extra private String dateFormat; private String submittedOnDateFormatted; private LocalDate submittedOnDate; private String submittedOnNote = ""; - + private String expectedDisbursementDateFormatted; private LocalDate expectedDisbursementDate = new LocalDate(); - + private String repaymentsStartingFromDateFormatted; private LocalDate repaymentsStartingFromDate; - + private String interestCalculatedFromDateFormatted; private LocalDate interestCalculatedFromDate; - + private LoanSchedule repaymentSchedule; - + private LoanProductData selectedProduct; - + public NewLoanData() { // } @@ -93,11 +93,11 @@ public class NewLoanData implements Serializable { this.productName = productName; } - public List getAllowedProducts() { + public List getAllowedProducts() { return allowedProducts; } - public void setAllowedProducts(List allowedProducts) { + public void setAllowedProducts(List allowedProducts) { this.allowedProducts = allowedProducts; } @@ -137,7 +137,8 @@ public class NewLoanData implements Serializable { return repaymentsStartingFromDate; } - public void setRepaymentsStartingFromDate(LocalDate repaymentsStartingFromDate) { + public void setRepaymentsStartingFromDate( + LocalDate repaymentsStartingFromDate) { this.repaymentsStartingFromDate = repaymentsStartingFromDate; } @@ -145,7 +146,8 @@ public class NewLoanData implements Serializable { return interestCalculatedFromDate; } - public void setInterestCalculatedFromDate(LocalDate interestCalculatedFromDate) { + public void setInterestCalculatedFromDate( + LocalDate interestCalculatedFromDate) { this.interestCalculatedFromDate = interestCalculatedFromDate; } diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/loan/service/LoanReadPlatformServiceImpl.java b/mifosng-provider/src/main/java/org/mifosng/platform/loan/service/LoanReadPlatformServiceImpl.java index 5ad47fb0e..fdbc69803 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/loan/service/LoanReadPlatformServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/loan/service/LoanReadPlatformServiceImpl.java @@ -14,6 +14,7 @@ import org.mifosng.data.LoanRepaymentData; import org.mifosng.data.MoneyData; import org.mifosng.platform.api.data.ClientData; import org.mifosng.platform.api.data.LoanProductData; +import org.mifosng.platform.api.data.LoanProductLookup; import org.mifosng.platform.api.data.NewLoanData; import org.mifosng.platform.client.service.ClientReadPlatformService; import org.mifosng.platform.currency.domain.ApplicationCurrency; @@ -44,9 +45,13 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { private final LoanTransactionRepository loanTransactionRepository; @Autowired - public LoanReadPlatformServiceImpl(final PlatformSecurityContext context, - final LoanRepository loanRepository, final LoanTransactionRepository loanTransactionRepository, final ApplicationCurrencyRepository applicationCurrencyRepository, - final LoanProductReadPlatformService loanProductReadPlatformService, final ClientReadPlatformService clientReadPlatformService) { + public LoanReadPlatformServiceImpl( + final PlatformSecurityContext context, + final LoanRepository loanRepository, + final LoanTransactionRepository loanTransactionRepository, + final ApplicationCurrencyRepository applicationCurrencyRepository, + final LoanProductReadPlatformService loanProductReadPlatformService, + final ClientReadPlatformService clientReadPlatformService) { this.context = context; this.loanRepository = loanRepository; this.loanTransactionRepository = loanTransactionRepository; @@ -54,7 +59,7 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { this.loanProductReadPlatformService = loanProductReadPlatformService; this.clientReadPlatformService = clientReadPlatformService; } - + @Override public LoanAccountData retrieveLoanAccountDetails(Long loanId) { @@ -62,13 +67,16 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { // need of loan information. AppUser currentUser = context.authenticatedUser(); - Loan loan = this.loanRepository.findOne(loansThatMatch(currentUser.getOrganisation(), loanId)); + Loan loan = this.loanRepository.findOne(loansThatMatch( + currentUser.getOrganisation(), loanId)); if (loan == null) { throw new LoanNotFoundException(loanId); } - final String currencyCode = loan.getLoanRepaymentScheduleDetail().getPrincipal().getCurrencyCode(); - ApplicationCurrency currency = this.applicationCurrencyRepository.findOneByCode(currencyCode); + final String currencyCode = loan.getLoanRepaymentScheduleDetail() + .getPrincipal().getCurrencyCode(); + ApplicationCurrency currency = this.applicationCurrencyRepository + .findOneByCode(currencyCode); if (currency == null) { throw new CurrencyNotFoundException(currencyCode); } @@ -81,7 +89,7 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { return loanData; } - + private LoanAccountData convertToData(final Loan realLoan, CurrencyData currencyData) { @@ -166,22 +174,28 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { .getRepaymentPeriodFrequencyType().toString(), tolerance, loanData, waiveAllowed, interestRebateOwed); } - + @Override - public NewLoanData retrieveClientAndProductDetails(final Long clientId, final Long productId) { + public NewLoanData retrieveClientAndProductDetails(final Long clientId, + final Long productId) { AppUser currentUser = context.authenticatedUser(); NewLoanData workflowData = new NewLoanData(); workflowData.setOrganisationId(currentUser.getOrganisation().getId()); - workflowData.setOrganisationName(currentUser.getOrganisation().getName()); + workflowData.setOrganisationName(currentUser.getOrganisation() + .getName()); - Collection loanProducts = this.loanProductReadPlatformService.retrieveAllLoanProducts(); - workflowData.setAllowedProducts(new ArrayList(loanProducts)); + Collection loanProducts = this.loanProductReadPlatformService + .retrieveAllLoanProductsForLookup(); + workflowData.setAllowedProducts(new ArrayList( + loanProducts)); if (loanProducts.size() == 1) { - Long allowedProductId = workflowData.getAllowedProducts().get(0).getId(); - LoanProductData selectedProduct = this.loanProductReadPlatformService.retrieveLoanProduct(allowedProductId); + Long allowedProductId = workflowData.getAllowedProducts().get(0) + .getId(); + LoanProductData selectedProduct = this.loanProductReadPlatformService + .retrieveLoanProduct(allowedProductId); if (selectedProduct == null) { throw new LoanProductNotFoundException(allowedProductId); } @@ -190,7 +204,8 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { workflowData.setProductName(selectedProduct.getName()); workflowData.setSelectedProduct(selectedProduct); } else { - LoanProductData selectedProduct = findLoanProductById(loanProducts, productId); + LoanProductData selectedProduct = findLoanProductById(loanProducts, + productId); if (selectedProduct == null) { throw new LoanProductNotFoundException(productId); } @@ -199,7 +214,8 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { workflowData.setSelectedProduct(selectedProduct); } - ClientData clientAccount = this.clientReadPlatformService.retrieveIndividualClient(clientId); + ClientData clientAccount = this.clientReadPlatformService + .retrieveIndividualClient(clientId); workflowData.setClientId(clientAccount.getId()); workflowData.setClientName(clientAccount.getDisplayName()); @@ -207,20 +223,19 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { } private LoanProductData findLoanProductById( - Collection loanProducts, Long productId) { + Collection loanProducts, Long productId) { LoanProductData match = this.loanProductReadPlatformService .retrieveNewLoanProductDetails(); - for (LoanProductData loanProductData : loanProducts) { - if (loanProductData.getId().equals(productId)) { + for (LoanProductLookup loanProductLookup : loanProducts) { + if (loanProductLookup.getId().equals(productId)) { match = this.loanProductReadPlatformService - .retrieveLoanProduct(loanProductData.getId()); + .retrieveLoanProduct(loanProductLookup.getId()); break; } } return match; } - - + @Override public LoanRepaymentData retrieveNewLoanRepaymentDetails(Long loanId) { @@ -228,13 +243,16 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { // TODO - OPTIMIZE - write simple sql query to fetch back date of // possible next transaction date. - Loan loan = this.loanRepository.findOne(loansThatMatch(currentUser.getOrganisation(), loanId)); + Loan loan = this.loanRepository.findOne(loansThatMatch( + currentUser.getOrganisation(), loanId)); if (loan == null) { throw new LoanNotFoundException(loanId); } - final String currencyCode = loan.getLoanRepaymentScheduleDetail().getPrincipal().getCurrencyCode(); - ApplicationCurrency currency = this.applicationCurrencyRepository.findOneByCode(currencyCode); + final String currencyCode = loan.getLoanRepaymentScheduleDetail() + .getPrincipal().getCurrencyCode(); + ApplicationCurrency currency = this.applicationCurrencyRepository + .findOneByCode(currencyCode); if (currency == null) { throw new CurrencyNotFoundException(currencyCode); } @@ -243,9 +261,11 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { currency.getName(), currency.getDecimalPlaces(), currency.getDisplaySymbol(), currency.getNameCode()); - LocalDate earliestUnpaidInstallmentDate = loan.possibleNextRepaymentDate(); + LocalDate earliestUnpaidInstallmentDate = loan + .possibleNextRepaymentDate(); Money possibleNextRepaymentAmount = loan.possibleNextRepaymentAmount(); - MoneyData possibleNextRepayment = MoneyData.of(currencyData, possibleNextRepaymentAmount.getAmount()); + MoneyData possibleNextRepayment = MoneyData.of(currencyData, + possibleNextRepaymentAmount.getAmount()); LoanRepaymentData newRepaymentDetails = new LoanRepaymentData(); newRepaymentDetails.setDate(earliestUnpaidInstallmentDate); @@ -261,13 +281,16 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { // TODO - OPTIMIZE - write simple sql query to fetch back date of // possible next transaction date. - Loan loan = this.loanRepository.findOne(loansThatMatch(currentUser.getOrganisation(), loanId)); + Loan loan = this.loanRepository.findOne(loansThatMatch( + currentUser.getOrganisation(), loanId)); if (loan == null) { throw new LoanNotFoundException(loanId); } - final String currencyCode = loan.getLoanRepaymentScheduleDetail().getPrincipal().getCurrencyCode(); - ApplicationCurrency currency = this.applicationCurrencyRepository.findOneByCode(currencyCode); + final String currencyCode = loan.getLoanRepaymentScheduleDetail() + .getPrincipal().getCurrencyCode(); + ApplicationCurrency currency = this.applicationCurrencyRepository + .findOneByCode(currencyCode); if (currency == null) { throw new CurrencyNotFoundException(currencyCode); } @@ -288,22 +311,28 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService { } @Override - public LoanRepaymentData retrieveLoanRepaymentDetails(Long loanId, Long transactionId) { + public LoanRepaymentData retrieveLoanRepaymentDetails(Long loanId, + Long transactionId) { AppUser currentUser = context.authenticatedUser(); - Loan loan = this.loanRepository.findOne(loansThatMatch(currentUser.getOrganisation(), loanId)); + Loan loan = this.loanRepository.findOne(loansThatMatch( + currentUser.getOrganisation(), loanId)); if (loan == null) { throw new LoanNotFoundException(loanId); } - final String currencyCode = loan.getLoanRepaymentScheduleDetail().getPrincipal().getCurrencyCode(); - ApplicationCurrency currency = this.applicationCurrencyRepository.findOneByCode(currencyCode); + final String currencyCode = loan.getLoanRepaymentScheduleDetail() + .getPrincipal().getCurrencyCode(); + ApplicationCurrency currency = this.applicationCurrencyRepository + .findOneByCode(currencyCode); if (currency == null) { throw new CurrencyNotFoundException(currencyCode); } - LoanTransaction transaction = this.loanTransactionRepository.findOne(loanTransactionsThatMatch(currentUser.getOrganisation(), transactionId)); + LoanTransaction transaction = this.loanTransactionRepository + .findOne(loanTransactionsThatMatch( + currentUser.getOrganisation(), transactionId)); if (transaction == null) { throw new LoanTransactionNotFoundException(transactionId); } diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/loanproduct/service/LoanProductReadPlatformService.java b/mifosng-provider/src/main/java/org/mifosng/platform/loanproduct/service/LoanProductReadPlatformService.java index 0bb05eec6..2b06257d5 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/loanproduct/service/LoanProductReadPlatformService.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/loanproduct/service/LoanProductReadPlatformService.java @@ -3,11 +3,14 @@ package org.mifosng.platform.loanproduct.service; import java.util.Collection; import org.mifosng.platform.api.data.LoanProductData; +import org.mifosng.platform.api.data.LoanProductLookup; public interface LoanProductReadPlatformService { Collection retrieveAllLoanProducts(); + Collection retrieveAllLoanProductsForLookup(); + LoanProductData retrieveLoanProduct(Long productId); LoanProductData retrieveNewLoanProductDetails(); diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/loanproduct/service/LoanProductReadPlatformServiceImpl.java b/mifosng-provider/src/main/java/org/mifosng/platform/loanproduct/service/LoanProductReadPlatformServiceImpl.java index 51b522055..1a317526f 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/loanproduct/service/LoanProductReadPlatformServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/loanproduct/service/LoanProductReadPlatformServiceImpl.java @@ -13,6 +13,7 @@ import org.mifosng.data.CurrencyData; import org.mifosng.data.MoneyData; import org.mifosng.platform.api.data.EnumOptionData; import org.mifosng.platform.api.data.LoanProductData; +import org.mifosng.platform.api.data.LoanProductLookup; import org.mifosng.platform.currency.service.CurrencyReadPlatformService; import org.mifosng.platform.exceptions.LoanProductNotFoundException; import org.mifosng.platform.infrastructure.JdbcSupport; @@ -29,15 +30,18 @@ import org.springframework.jdbc.core.simple.SimpleJdbcTemplate; import org.springframework.stereotype.Service; @Service -public class LoanProductReadPlatformServiceImpl implements LoanProductReadPlatformService { +public class LoanProductReadPlatformServiceImpl implements + LoanProductReadPlatformService { private final PlatformSecurityContext context; private final CurrencyReadPlatformService currencyReadPlatformService; private final SimpleJdbcTemplate jdbcTemplate; private final LoanDropdownReadPlatformService dropdownReadPlatformService; - + @Autowired - public LoanProductReadPlatformServiceImpl(final PlatformSecurityContext context, final CurrencyReadPlatformService currencyReadPlatformService, + public LoanProductReadPlatformServiceImpl( + final PlatformSecurityContext context, + final CurrencyReadPlatformService currencyReadPlatformService, final LoanDropdownReadPlatformService dropdownReadPlatformService, final DataSource dataSource) { this.context = context; @@ -50,33 +54,53 @@ public class LoanProductReadPlatformServiceImpl implements LoanProductReadPlatfo public LoanProductData retrieveLoanProduct(final Long loanProductId) { try { - List allowedCurrencies = currencyReadPlatformService.retrieveAllPlatformCurrencies(); - + List allowedCurrencies = currencyReadPlatformService + .retrieveAllPlatformCurrencies(); + LoanProductMapper rm = new LoanProductMapper(allowedCurrencies); - String sql = "select " + rm.loanProductSchema() + " where lp.id = ?"; - - LoanProductData productData = this.jdbcTemplate.queryForObject(sql, rm, new Object[] { loanProductId }); - + String sql = "select " + rm.loanProductSchema() + + " where lp.id = ?"; + + LoanProductData productData = this.jdbcTemplate.queryForObject(sql, + rm, new Object[] { loanProductId }); + populateProductDataWithDropdownOptions(productData); - + return productData; } catch (EmptyResultDataAccessException e) { throw new LoanProductNotFoundException(loanProductId); } } - + @Override public Collection retrieveAllLoanProducts() { AppUser currentUser = this.context.authenticatedUser(); + // TODO - include currency read in the sql + List allowedCurrencies = currencyReadPlatformService + .retrieveAllPlatformCurrencies(); - List allowedCurrencies = currencyReadPlatformService.retrieveAllPlatformCurrencies(); - LoanProductMapper rm = new LoanProductMapper(allowedCurrencies); - String sql = "select " + rm.loanProductSchema() + " where lp.org_id = ?"; + String sql = "select " + rm.loanProductSchema() + + " where lp.org_id = ?"; - return this.jdbcTemplate.query(sql, rm, new Object[] { currentUser.getOrganisation().getId() }); + return this.jdbcTemplate.query(sql, rm, new Object[] { currentUser + .getOrganisation().getId() }); + } + + @Override + public Collection retrieveAllLoanProductsForLookup() { + + AppUser currentUser = this.context.authenticatedUser(); + + LoanProductLookupMapper rm = new LoanProductLookupMapper(); + + String sql = "select " + rm.loanProductLookupSchema() + + " where lp.org_id = ?"; + + return this.jdbcTemplate.query(sql, rm, new Object[] { currentUser + .getOrganisation().getId() }); } @Override @@ -84,11 +108,17 @@ public class LoanProductReadPlatformServiceImpl implements LoanProductReadPlatfo LoanProductData productData = new LoanProductData(); - productData.setAmortizationType(LoanEnumerations.amortizationType(AmortizationMethod.EQUAL_INSTALLMENTS)); - productData.setInterestType(LoanEnumerations.interestType(InterestMethod.DECLINING_BALANCE)); - productData.setRepaymentFrequencyType(LoanEnumerations.repaymentFrequencyType(PeriodFrequencyType.MONTHS)); - productData.setInterestRateFrequencyType(LoanEnumerations.interestRateFrequencyType(PeriodFrequencyType.MONTHS)); - productData.setInterestCalculationPeriodType(LoanEnumerations.interestCalculationPeriodType(InterestCalculationPeriodMethod.SAME_AS_REPAYMENT_PERIOD)); + productData.setAmortizationType(LoanEnumerations + .amortizationType(AmortizationMethod.EQUAL_INSTALLMENTS)); + productData.setInterestType(LoanEnumerations + .interestType(InterestMethod.DECLINING_BALANCE)); + productData.setRepaymentFrequencyType(LoanEnumerations + .repaymentFrequencyType(PeriodFrequencyType.MONTHS)); + productData.setInterestRateFrequencyType(LoanEnumerations + .interestRateFrequencyType(PeriodFrequencyType.MONTHS)); + productData + .setInterestCalculationPeriodType(LoanEnumerations + .interestCalculationPeriodType(InterestCalculationPeriodMethod.SAME_AS_REPAYMENT_PERIOD)); populateProductDataWithDropdownOptions(productData); @@ -98,11 +128,12 @@ public class LoanProductReadPlatformServiceImpl implements LoanProductReadPlatfo productData.setPrincipal(zero); productData.setInArrearsTolerance(zero); } - + return productData; } - private static final class LoanProductMapper implements RowMapper { + private static final class LoanProductMapper implements + RowMapper { private final List allowedCurrencies; @@ -130,74 +161,121 @@ public class LoanProductReadPlatformServiceImpl implements LoanProductReadPlatfo String description = rs.getString("description"); String currencyCode = rs.getString("currencyCode"); - Integer currencyDigits = JdbcSupport.getInteger(rs, "currencyDigits"); - - CurrencyData currencyData = findCurrencyByCode(currencyCode, allowedCurrencies); + Integer currencyDigits = JdbcSupport.getInteger(rs, + "currencyDigits"); + + CurrencyData currencyData = findCurrencyByCode(currencyCode, + allowedCurrencies); if (currencyData != null) { currencyData.setDecimalPlaces(currencyDigits); } BigDecimal principal = rs.getBigDecimal("principal"); BigDecimal tolerance = rs.getBigDecimal("tolerance"); - + MoneyData principalMoney = MoneyData.of(currencyData, principal); MoneyData toleranceMoney = MoneyData.of(currencyData, tolerance); - Integer numberOfRepayments = JdbcSupport.getInteger(rs, "numberOfRepayments"); + Integer numberOfRepayments = JdbcSupport.getInteger(rs, + "numberOfRepayments"); Integer repaymentEvery = JdbcSupport.getInteger(rs, "repaidEvery"); - BigDecimal interestRatePerPeriod = rs.getBigDecimal("interestRatePerPeriod"); - BigDecimal annualInterestRate = rs.getBigDecimal("annualInterestRate"); + BigDecimal interestRatePerPeriod = rs + .getBigDecimal("interestRatePerPeriod"); + BigDecimal annualInterestRate = rs + .getBigDecimal("annualInterestRate"); + + int repaymentFrequencyTypeId = JdbcSupport.getInteger(rs, + "repaymentPeriodFrequency"); + EnumOptionData repaymentFrequencyType = LoanEnumerations + .repaymentFrequencyType(repaymentFrequencyTypeId); + + int amortizationTypeId = JdbcSupport.getInteger(rs, + "amortizationMethod"); + EnumOptionData amortizationType = LoanEnumerations + .amortizationType(amortizationTypeId); + + int interestRateFrequencyTypeId = JdbcSupport.getInteger(rs, + "interestRatePerPeriodFreq"); + EnumOptionData interestRateFrequencyType = LoanEnumerations + .interestRateFrequencyType(interestRateFrequencyTypeId); - int repaymentFrequencyTypeId = JdbcSupport.getInteger(rs, "repaymentPeriodFrequency"); - EnumOptionData repaymentFrequencyType = LoanEnumerations.repaymentFrequencyType(repaymentFrequencyTypeId); - - int amortizationTypeId = JdbcSupport.getInteger(rs, "amortizationMethod"); - EnumOptionData amortizationType = LoanEnumerations.amortizationType(amortizationTypeId); - - int interestRateFrequencyTypeId = JdbcSupport.getInteger(rs, "interestRatePerPeriodFreq"); - EnumOptionData interestRateFrequencyType = LoanEnumerations.interestRateFrequencyType(interestRateFrequencyTypeId); - int interestTypeId = JdbcSupport.getInteger(rs, "interestMethod"); - EnumOptionData interestType = LoanEnumerations.interestType(interestTypeId); - - int interestCalculationPeriodTypeId = JdbcSupport.getInteger(rs, "interestCalculationInPeriodMethod"); - EnumOptionData interestCalculationPeriodType = LoanEnumerations.interestCalculationPeriodType(interestCalculationPeriodTypeId); - + EnumOptionData interestType = LoanEnumerations + .interestType(interestTypeId); + + int interestCalculationPeriodTypeId = JdbcSupport.getInteger(rs, + "interestCalculationInPeriodMethod"); + EnumOptionData interestCalculationPeriodType = LoanEnumerations + .interestCalculationPeriodType(interestCalculationPeriodTypeId); + DateTime createdOn = JdbcSupport.getDateTime(rs, "createdon"); DateTime lastModifedOn = JdbcSupport.getDateTime(rs, "modifiedon"); - return new LoanProductData(createdOn, lastModifedOn, id, name, description, principalMoney, toleranceMoney, - numberOfRepayments, repaymentEvery, interestRatePerPeriod, annualInterestRate, - repaymentFrequencyType, interestRateFrequencyType, amortizationType, interestType, interestCalculationPeriodType); + return new LoanProductData(createdOn, lastModifedOn, id, name, + description, principalMoney, toleranceMoney, + numberOfRepayments, repaymentEvery, interestRatePerPeriod, + annualInterestRate, repaymentFrequencyType, + interestRateFrequencyType, amortizationType, interestType, + interestCalculationPeriodType); } - private CurrencyData findCurrencyByCode(String currencyCode, List allowedCurrencies) { + private CurrencyData findCurrencyByCode(String currencyCode, + List allowedCurrencies) { CurrencyData match = null; for (CurrencyData currencyData : allowedCurrencies) { if (currencyData.getCode().equalsIgnoreCase(currencyCode)) { match = currencyData; break; } - } + } return match; } } - private void populateProductDataWithDropdownOptions(LoanProductData productData) { + private static final class LoanProductLookupMapper implements + RowMapper { - List currencyOptions = currencyReadPlatformService.retrieveAllowedCurrencies(); - List amortizationTypeOptions = dropdownReadPlatformService.retrieveLoanAmortizationTypeOptions(); - List interestTypeOptions = dropdownReadPlatformService.retrieveLoanInterestTypeOptions(); - List interestCalculationPeriodTypeOptions = dropdownReadPlatformService.retrieveLoanInterestRateCalculatedInPeriodOptions(); - List repaymentFrequencyTypeOptions = dropdownReadPlatformService.retrieveRepaymentFrequencyTypeOptions(); - List interestRateFrequencyTypeOptions = dropdownReadPlatformService.retrieveInterestRateFrequencyTypeOptions(); + public String loanProductLookupSchema() { + return "lp.id as id, lp.name as name from portfolio_product_loan lp"; + } + + @Override + public LoanProductLookup mapRow(final ResultSet rs, final int rowNum) + throws SQLException { + + Long id = rs.getLong("id"); + String name = rs.getString("name"); + + return new LoanProductLookup(id, name); + } + + } + + private void populateProductDataWithDropdownOptions( + LoanProductData productData) { + + List currencyOptions = currencyReadPlatformService + .retrieveAllowedCurrencies(); + List amortizationTypeOptions = dropdownReadPlatformService + .retrieveLoanAmortizationTypeOptions(); + List interestTypeOptions = dropdownReadPlatformService + .retrieveLoanInterestTypeOptions(); + List interestCalculationPeriodTypeOptions = dropdownReadPlatformService + .retrieveLoanInterestRateCalculatedInPeriodOptions(); + List repaymentFrequencyTypeOptions = dropdownReadPlatformService + .retrieveRepaymentFrequencyTypeOptions(); + List interestRateFrequencyTypeOptions = dropdownReadPlatformService + .retrieveInterestRateFrequencyTypeOptions(); productData.setCurrencyOptions(currencyOptions); productData.setAmortizationTypeOptions(amortizationTypeOptions); productData.setInterestTypeOptions(interestTypeOptions); - productData.setInterestCalculationPeriodTypeOptions(interestCalculationPeriodTypeOptions); - productData.setRepaymentFrequencyTypeOptions(repaymentFrequencyTypeOptions); - productData.setInterestRateFrequencyTypeOptions(interestRateFrequencyTypeOptions); + productData + .setInterestCalculationPeriodTypeOptions(interestCalculationPeriodTypeOptions); + productData + .setRepaymentFrequencyTypeOptions(repaymentFrequencyTypeOptions); + productData + .setInterestRateFrequencyTypeOptions(interestRateFrequencyTypeOptions); } - + } \ No newline at end of file
RESOURCES
POST
create/update
GET
read
PUT
simple update
DELETE
delete
RESOURCES
POST
create/complex update
GET
read
PUT
update
DELETE
delete
CLIENT/v1/clientsCreate a ClientList Clients
/v1/clients/{clientId}Retrieve a ClientUpdate a Client
/v1/clients/{clientId}/loansRetrieve a Client's Loan Account Summary