Fineract Savings Account Domain

Data migration of Savings Type Product records such as DDA, checking records excluding transactions.

According to a generic layout from legacy suites of CBS/LMS/transaction processors, you have to classify fields. One example of such listing is which fields are managed by client side e.g Social Security Number, unique client identifiers. These can be stored in client domain. Similarly you can list other fields for Savings type or lending type products and Create a Data model.

Most of the fields concerning core banking use cases are supported in Fineract excluding YTD 1099 Interest, Last Interest Payment . Those that are not included either require to be be calculated or new API resources need to be created. Some soft fields can also be created using datatables approach in Fineract.

Clearly, the file layouts provided by a typical legacy CBS are usually quite simple enough. With respect to Fineract, it actually supports more data attributes and have extensive list of the data fields than most of legacy suite of CBS/LMS/transaction processors.

This is the example domain represented by the fineract savings API for a single savings account.

{
    "id": 1,
    "accountNo": "000000001",
    "depositType": {
        "id": 100,
        "code": "depositAccountType.savingsDeposit",
        "value": "Savings"
    },
    "clientId": 1,
    "clientName": "John Doe",
    "savingsProductId": 1,
    "savingsProductName": "Student checking Account",
    "fieldOfficerId": 2,
    "fieldOfficerName": "Clark, Keevin",
    "status": {
        "id": 300,
        "code": "savingsAccountStatusType.active",
        "value": "Active",
        "submittedAndPendingApproval": false,
        "approved": false,
        "rejected": false,
        "withdrawnByApplicant": false,
        "active": true,
        "closed": false,
        "prematureClosed": false,
        "transferInProgress": false,
        "transferOnHold": false,
        "matured": false
    },
    "subStatus": {
        "id": 0,
        "code": "SavingsAccountSubStatusEnum.none",
        "value": "None",
        "none": true,
        "inactive": false,
        "dormant": false,
        "escheat": false,
        "block": false,
        "blockCredit": false,
        "blockDebit": false
    },
    "timeline": {
        "submittedOnDate": [
            2020,
            4,
            1
        ],
        "submittedByUsername": "herring",
        "submittedByFirstname": "Financial",
        "submittedByLastname": "Payments",
        "approvedOnDate": [
            2020,
            4,
            1
        ],
        "approvedByUsername": "herring",
        "approvedByFirstname": "Financial",
        "approvedByLastname": "Payments",
        "activatedOnDate": [
            2020,
            4,
            1
        ],
        "activatedByUsername": "herring",
        "activatedByFirstname": "Financial",
        "activatedByLastname": "Payments"
    },
    "currency": {
        "code": "USD",
        "name": "US Dollar",
        "decimalPlaces": 2,
        "inMultiplesOf": 100,
        "displaySymbol": "$",
        "nameCode": "currency.USD",
        "displayLabel": "US Dollar ($)"
    },
    "nominalAnnualInterestRate": 2,
    "interestCompoundingPeriodType": {
        "id": 4,
        "code": "savings.interest.period.savingsCompoundingInterestPeriodType.monthly",
        "value": "Monthly"
    },
    "interestPostingPeriodType": {
        "id": 4,
        "code": "savings.interest.posting.period.savingsPostingInterestPeriodType.monthly",
        "value": "Monthly"
    },
    "interestCalculationType": {
        "id": 2,
        "code": "savingsInterestCalculationType.averagedailybalance",
        "value": "Average Daily Balance"
    },
    "interestCalculationDaysInYearType": {
        "id": 365,
        "code": "savingsInterestCalculationDaysInYearType.days365",
        "value": "365 Days"
    },
    "minRequiredOpeningBalance": 100,
    "withdrawalFeeForTransfers": true,
    "allowOverdraft": true,
    "overdraftLimit": 100,
    "minRequiredBalance": 100,
    "enforceMinRequiredBalance": true,
    "minBalanceForInterestCalculation": 100,
    "withHoldTax": false,
    "lastActiveTransactionDate": [
        2020,
        4,
        1
    ],
    "isDormancyTrackingActive": false,
    "summary": {
        "currency": {
            "code": "USD",
            "name": "US Dollar",
            "decimalPlaces": 2,
            "inMultiplesOf": 100,
            "displaySymbol": "$",
            "nameCode": "currency.USD",
            "displayLabel": "US Dollar ($)"
        },
        "totalDeposits": 100,
        "totalInterestPosted": 0,
        "accountBalance": 0,
        "totalFeeCharge": 100,
        "totalOverdraftInterestDerived": 0,
        "interestNotPosted": 0,
        "availableBalance": 0
    },
    "transactions": [
        {
            "id": 2,
            "transactionType": {
                "id": 7,
                "code": "savingsAccountTransactionType.payCharge",
                "value": "Pay Charge",
                "deposit": false,
                "dividendPayout": false,
                "withdrawal": false,
                "interestPosting": false,
                "feeDeduction": true,
                "initiateTransfer": false,
                "approveTransfer": false,
                "withdrawTransfer": false,
                "rejectTransfer": false,
                "overdraftInterest": false,
                "writtenoff": false,
                "overdraftFee": true,
                "withholdTax": false,
                "escheat": false,
                "amountHold": false,
                "amountRelease": false
            },
            "accountId": 1,
            "accountNo": "000000001",
            "date": [
                2020,
                4,
                1
            ],
            "currency": {
                "code": "USD",
                "name": "US Dollar",
                "decimalPlaces": 2,
                "inMultiplesOf": 100,
                "displaySymbol": "$",
                "nameCode": "currency.USD",
                "displayLabel": "US Dollar ($)"
            },
            "amount": 100,
            "runningBalance": 0,
            "reversed": false,
            "submittedOnDate": [
                2020,
                4,
                1
            ],
            "interestedPostedAsOn": false,
            "submittedByUsername": "herring"
        },
        {
            "id": 1,
            "transactionType": {
                "id": 1,
                "code": "savingsAccountTransactionType.deposit",
                "value": "Deposit",
                "deposit": true,
                "dividendPayout": false,
                "withdrawal": false,
                "interestPosting": false,
                "feeDeduction": false,
                "initiateTransfer": false,
                "approveTransfer": false,
                "withdrawTransfer": false,
                "rejectTransfer": false,
                "overdraftInterest": false,
                "writtenoff": false,
                "overdraftFee": true,
                "withholdTax": false,
                "escheat": false,
                "amountHold": false,
                "amountRelease": false
            },
            "accountId": 1,
            "accountNo": "000000001",
            "date": [
                2020,
                4,
                1
            ],
            "currency": {
                "code": "USD",
                "name": "US Dollar",
                "decimalPlaces": 2,
                "inMultiplesOf": 100,
                "displaySymbol": "$",
                "nameCode": "currency.USD",
                "displayLabel": "US Dollar ($)"
            },
            "amount": 100,
            "runningBalance": 100,
            "reversed": false,
            "submittedOnDate": [
                2020,
                4,
                1
            ],
            "interestedPostedAsOn": false,
            "submittedByUsername": "herring"
        }
    ],
    "charges": [
        {
            "id": 3,
            "chargeId": 1,
            "accountId": 1,
            "name": "Processing Fees",
            "chargeTimeType": {
                "id": 3,
                "code": "chargeTimeType.savingsActivation",
                "value": "Savings Activation"
            },
            "chargeCalculationType": {
                "id": 1,
                "code": "chargeCalculationType.flat",
                "value": "Flat"
            },
            "percentage": 0,
            "amountPercentageAppliedTo": 0,
            "currency": {
                "code": "USD",
                "name": "US Dollar",
                "decimalPlaces": 2,
                "displaySymbol": "$",
                "nameCode": "currency.USD",
                "displayLabel": "US Dollar ($)"
            },
            "amount": 100,
            "amountPaid": 100,
            "amountWaived": 0,
            "amountWrittenOff": 0,
            "amountOutstanding": 0,
            "amountOrPercentage": 100,
            "penalty": false,
            "isActive": true
        },
        {
            "id": 2,
            "chargeId": 3,
            "accountId": 1,
            "name": "TDR fees",
            "chargeTimeType": {
                "id": 5,
                "code": "chargeTimeType.withdrawalFee",
                "value": "Withdrawal Fee"
            },
            "chargeCalculationType": {
                "id": 1,
                "code": "chargeCalculationType.flat",
                "value": "Flat"
            },
            "percentage": 0,
            "amountPercentageAppliedTo": 0,
            "currency": {
                "code": "USD",
                "name": "US Dollar",
                "decimalPlaces": 2,
                "displaySymbol": "$",
                "nameCode": "currency.USD",
                "displayLabel": "US Dollar ($)"
            },
            "amount": 1,
            "amountPaid": 0,
            "amountWaived": 0,
            "amountWrittenOff": 0,
            "amountOutstanding": 0,
            "amountOrPercentage": 1,
            "penalty": false,
            "isActive": true
        },
        {
            "id": 1,
            "chargeId": 5,
            "accountId": 1,
            "name": "OD fees",
            "chargeTimeType": {
                "id": 10,
                "code": "chargeTimeType.overdraftFee",
                "value": "Overdraft Fee"
            },
            "chargeCalculationType": {
                "id": 1,
                "code": "chargeCalculationType.flat",
                "value": "Flat"
            },
            "percentage": 0,
            "amountPercentageAppliedTo": 0,
            "currency": {
                "code": "USD",
                "name": "US Dollar",
                "decimalPlaces": 2,
                "displaySymbol": "$",
                "nameCode": "currency.USD",
                "displayLabel": "US Dollar ($)"
            },
            "amount": 10,
            "amountPaid": 0,
            "amountWaived": 0,
            "amountWrittenOff": 0,
            "amountOutstanding": 10,
            "amountOrPercentage": 10,
            "penalty": false,
            "isActive": true
        },
        {
            "id": 4,
            "chargeId": 4,
            "accountId": 1,
            "name": "Zero activity fees",
            "chargeTimeType": {
                "id": 16,
                "code": "chargeTimeType.savingsNoActivityFee",
                "value": "Saving No Activity Fee"
            },
            "chargeCalculationType": {
                "id": 2,
                "code": "chargeCalculationType.percent.of.amount",
                "value": "% Amount"
            },
            "percentage": 1,
            "amountPercentageAppliedTo": 0,
            "currency": {
                "code": "USD",
                "name": "US Dollar",
                "decimalPlaces": 2,
                "displaySymbol": "$",
                "nameCode": "currency.USD",
                "displayLabel": "US Dollar ($)"
            },
            "amount": 0,
            "amountPaid": 0,
            "amountWaived": 0,
            "amountWrittenOff": 0,
            "amountOutstanding": 0,
            "amountOrPercentage": 1,
            "penalty": false,
            "isActive": true
        }
    ],
    "withdrawalFee": {
        "id": 2,
        "chargeId": 3,
        "accountId": 1,
        "name": "TDR fees",
        "chargeTimeType": {
            "id": 5,
            "code": "chargeTimeType.withdrawalFee",
            "value": "Withdrawal Fee"
        },
        "chargeCalculationType": {
            "id": 1,
            "code": "chargeCalculationType.flat",
            "value": "Flat"
        },
        "percentage": 0,
        "amountPercentageAppliedTo": 0,
        "currency": {
            "code": "USD",
            "name": "US Dollar",
            "decimalPlaces": 2,
            "displaySymbol": "$",
            "nameCode": "currency.USD",
            "displayLabel": "US Dollar ($)"
        },
        "amount": 1,
        "amountPaid": 0,
        "amountWaived": 0,
        "amountWrittenOff": 0,
        "amountOutstanding": 0,
        "amountOrPercentage": 1,
        "penalty": false,
        "isActive": true
    },
    "nominalAnnualInterestRateOverdraft": 3,
    "minOverdraftForInterestCalculation": 100
}

To be able to migrate the Fineract Savings or DDA account, we need the following .

{
  "clientId": 1,
  "productId": 1,
  "fieldOfficerId": 1,
  "locale": "en",
  "dateFormat": "dd MMMM yyyy",
  "submittedOnDate": "01 March 2013",
  "accountNo": "SA000023",
  "externalId": "SYS-23",
  "nominalAnnualInterestRate": "5.65",
  "interestCompoundingPeriodType": 1,
  "interestPostingPeriodType": 4,
  "interestCalculationType": 1,
  "interestCalculationDaysInYearType": 365,
  "minRequiredOpeningBalance": "1,000",
  "lockinPeriodFrequency": 6,
  "lockinPeriodFrequencyType": 2,
  "allowOverdraft":true,
  "overdraftLimit":5000,
  "charges":[{"id":"1"}],
    "datatables": [{
        "registeredTableName": "Savings Enrichment",
        "data": {
        "locale": "en",
        "Name": "Raj",
        "COUNTRY_cd_country details": 17
        }
    },
    {
        "registeredTableName": "SavingsDataTableCreate",
        "data": {
        "locale": "en",
        "Volume": "25",
        "CurrentTimestamp": "01 December 2016 12:44",
        "dateFormat": "dd MMMM yyyy HH:mm",
        "DateData": "01 December 2016 00:00"
        }
    }]
}
	

The above is a full request but we can do with a minimal request also, where providing a product id is sufficient and following is the example domain represented in Fineract.

Client Id , 
account no, 
product_id
status_enum,
account_type_enum,
deposit_type_enum,
submitted_on_date,
approved_on_date, 
currency_code,
currency_digits
currency_multiplesof, 
nominal_annual_interest_rate,
interest_compunding_period_enum,
interest_posting_period_enum,
interest_calculatio_days_in_year
min_required_opening_balance,
withdrawl_fee_for_transfer,
allow_overdraft,
overdraft_limit,
nominal_interest_rate_overdraft,
min_overdraft_for_interest_calculation,
account_balance_derived,
min_required_balance,
enforce_min_required_balance,
min_balance_for_interest_calculation

Once this is done, you need to push transactions data to m_savings_transactions and subsquently updating the derived interest rates as well as updated balances.

Note: You will or may require to perform cleaning before ingesting data as is routine with data import.

Last updated

Logo

Maintained by © Muellners Foundation. All Rights Reserved.