Merging all changes in main branch of the last weeks into dev branch (#2444)
* fixed identities tab * fix: Loan Product capitalized income form validation * Loan account with Capitalized Income transaction * fix: Use first API url from url list * Loan Product with Capitalized Income GL accounting mappings * fix: Loan Product capitalized income with Income Type * Loan account details - income capitalization type * fix: Loan Product Cash accounting view * fix: Loan Id updated in Loan views after url changed * fix: Charge management minimum and maximum cap values validation * build(deps-dev): bump http-proxy-middleware from 2.0.7 to 2.0.9 (#2421) Bumps [http-proxy-middleware](https://github.com/chimurai/http-proxy-middleware) from 2.0.7 to 2.0.9. - [Release notes](https://github.com/chimurai/http-proxy-middleware/releases) - [Changelog](https://github.com/chimurai/http-proxy-middleware/blob/v2.0.9/CHANGELOG.md) - [Commits](https://github.com/chimurai/http-proxy-middleware/compare/v2.0.7...v2.0.9) --- updated-dependencies: - dependency-name: http-proxy-middleware dependency-version: 2.0.9 dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * docs: Improve contributing guidelines (#2440) The CONTRIBUTING.md file has been updated to clarify that we use the dev branch for development. In addition to that, I have slightly shortened and restructured the text. FIXES: WEB-165 --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: Craig-Rosario <craig.rosario04@gmail.com> Co-authored-by: Jose Alberto Hernandez <alberto@art3ch.solutions> Co-authored-by: Jose Alberto Hernandez <alberto@black-box.local> Co-authored-by: adam.magyari <magyari.adam96@gmail.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
This commit is contained in:
co-authored by
Craig-Rosario
Jose Alberto Hernandez
Jose Alberto Hernandez
adam.magyari
dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
parent
b61d9e3d34
commit
c8d857f3cb
+50
-46
@@ -1,48 +1,52 @@
|
||||
# Getting Started
|
||||
|
||||
- View the [README](./README.md) or [watch this video](https://youtu.be/OnxxC3K2oro) to get your development environment up and running.
|
||||
- Learn how to [format pull requests](#submitting-a-pull-request).
|
||||
- Read how to [rebase/merge upstream branches](#configuring-remotes).
|
||||
- Understand our [commit message conventions](./.github/COMMIT_MESSAGE.md).
|
||||
- Sign our [Mifos CLA](http://mifos.org/about-us/financial-legal/mifos-contributor-agreement/).
|
||||
- Follow our [code of conduct](https://mifos.org/resources/community/code-of-conduct/).
|
||||
- [Find a Jira ticket to work on](https://mifosforge.jira.com/browse/WEB) and start smashing!
|
||||
- [Ask a question on Slack](https://app.slack.com/client/T0F5GHE8Y/CJJGJLN10).
|
||||
- Sign the [Contribution License Agreement](http://mifos.org/about-us/financial-legal/mifos-contributor-agreement/).
|
||||
- Always follow the [code of conduct](https://mifos.org/resources/community/code-of-conduct/) - this is important to us. We are proud to be open, tolerant and providing a positive environment.
|
||||
- Introduce yourself or ask a question on the [#webapp channel on Slack](https://app.slack.com/client/T0F5GHE8Y/CJJGJLN10).
|
||||
- Find a [Jira](https://mifosforge.jira.com/browse/WEB) ticket to work on and start smashing!
|
||||
- Sign up to the [mailing list](https://sourceforge.net/projects/mifos/lists/mifos-developer).
|
||||
- Learn more at our [getting started guide](https://mifosforge.jira.com/wiki/spaces/RES/pages/464322561/New+Contributor+Getting+Started+Guide).
|
||||
- Have a look at our [Wiki](https://github.com/openMF/web-app/wiki).
|
||||
|
||||
Please outline the change you wish to make via a Jira ticket _before_ you start contributing. And please do not create Jira tickets for general support questions, as we want to keep Jira for bug reports and feature requests. If you have got any questions, the quickest way to get an answer is to join the above Slack channel. You can also write an email on our [mailing list](https://sourceforge.net/projects/mifos/lists/mifos-developer). Mifos has quite a few active repositories, and each has its own Slack channel to direct questions to.
|
||||
Tips for working with the web app repository:
|
||||
|
||||
Mifos is an inclusive community, committed to creating a safe, positive environment. Read the above Code of Conduct, and please follow it in all your interactions with the project.
|
||||
- Learn how to [format pull requests](#submitting-a-pull-request).
|
||||
- Read how to [rebase/merge upstream branches](#configuring-remotes).
|
||||
- Understand our [commit message conventions](./.github/COMMIT_MESSAGE.md).
|
||||
|
||||
## Submitting or Requesting an Issue/Enhancement
|
||||
## Our processes
|
||||
|
||||
### Best Practices for reporting or requesting for Issues/Enhancements:
|
||||
### Reporting or requesting Issues/Enhancements
|
||||
|
||||
- Before you submit an issue, please search Jira. Maybe an issue for your problem already exists, and the discussion might inform you of workarounds readily available.
|
||||
- Include screenshots if any (specially for UI related issues).
|
||||
- Before you submit an issue in Jira, please browse existing issues or ask on Slack. Maybe an issue for your problem already exists, or the discussion might inform you of workarounds readily available.
|
||||
- Include screenshots if helpful (specially for UI related issues).
|
||||
- For UI enhancements include mockups to provide a clear idea to the reader.
|
||||
|
||||
### Best Practices for getting assigned to work on an Issue/Enhancement:
|
||||
### Getting assigned and working on an Issue/Enhancement
|
||||
|
||||
- If you would like to work on an issue, make sure it is not assigned to someone else.
|
||||
- If you don't work on a Jira ticket, please unassign yourself.
|
||||
- Please be sure that you are able to reproduce the issue, before working on it. If not, please ask for clarification by commenting or asking the issue creator.
|
||||
- Always outline the change you wish to make via a Jira ticket _before_ contributing.
|
||||
- Do not create Jira tickets for support questions. Jira is for bug reports and feature requests. (If you have questions, ask in the above Slack channel or write an email on the named mailing list.)
|
||||
- If you would like to work on a Jira issue, make sure it is not assigned to someone else. (We do not appreciate pull requests for issues that are assigned to someone else or do not refer to a Jira ticket.)
|
||||
- If you want to take over a ticket, ask the assignee in a comment (utilizing the "@" prefix), if you can. Wait 3 days, before you assign the ticket to yourself.
|
||||
- If you don't work on a Jira ticket, unassign yourself.
|
||||
|
||||
**Note:** Please do not work on an issue which is assigned to someone else. We don't encourage creating multiple pull requests for the same issue. Also, please allow the assigned person at least 3 days to work on an issue. If there is no progress after this deadline, comment on the issue asking the contributor whether he/she is still working on it. Only if there is no reply after a couple of days, assign the ticket to you and work on it.
|
||||
## Jira
|
||||
|
||||
### Jira ticket life cycle
|
||||
Our Jira tickets follow the following life cycle:
|
||||
|
||||
- To Do: The issue is not prioritized yet. Make sure it make sense working on it by asking in Slack.
|
||||
- To Do: The issue is not prioritized yet. Make sure it makes sense working on it by asking in Slack.
|
||||
- On Deck: The issue can be worked on, but work hasn't been started. Often the issue has already someone assigned to it.
|
||||
- In Progress: The issue is being worked on.
|
||||
- In Review: There is a Pull Request on GitHub or the ticket is on hold, because someone needs to review made changes.
|
||||
- Done: The Pull Request got merged on GitHub.
|
||||
- Canceled: The ticket is unnecessary and for some reason (probably in the comments) work on it became unnecessary.
|
||||
|
||||
## Submitting a Pull Request
|
||||
Updating the Jira ticket is the responsibility of the person working on it. Make in particular sure the Status field is up-to-date.
|
||||
|
||||
### Best Practices to send Pull Requests:
|
||||
## Git and Github
|
||||
|
||||
### Best Practices to send Pull Requests
|
||||
|
||||
- Fork the [project](https://github.com/openMF/web-app) on GitHub
|
||||
- Clone the project locally into your system.
|
||||
@@ -51,10 +55,10 @@ Mifos is an inclusive community, committed to creating a safe, positive environm
|
||||
git clone https://github.com/your-username/web-app.git
|
||||
```
|
||||
|
||||
- Make sure you are in the `main` branch.
|
||||
- We use the `main` branch for releases, hotfixes and special purposes. All regular work on releases flows into the `dev` branch.
|
||||
|
||||
```
|
||||
git checkout main
|
||||
git checkout dev
|
||||
```
|
||||
|
||||
- Create a new branch with a meaningful name before adding and committing your changes.
|
||||
@@ -63,7 +67,7 @@ git checkout main
|
||||
git checkout -b branch-name
|
||||
```
|
||||
|
||||
- Add the files you changed. (avoid using `git add .`)
|
||||
- Add the files you changed. (Better don't use `git add .`)
|
||||
|
||||
```
|
||||
git add file-name
|
||||
@@ -81,7 +85,7 @@ git commit
|
||||
git commit --amend
|
||||
```
|
||||
|
||||
- Squash multiple commits to a single commit. (example: squash last two commits done on this branch into one)
|
||||
- Squash multiple commits to a single commit. (Example: squash last two commits done on this branch into one.)
|
||||
|
||||
```
|
||||
git rebase --interactive HEAD~2
|
||||
@@ -90,7 +94,7 @@ git rebase --interactive HEAD~2
|
||||
- Push this branch to your remote repository on GitHub.
|
||||
|
||||
```
|
||||
git push origin branch-name
|
||||
git push --set-upstream origin branch-name
|
||||
```
|
||||
|
||||
- If any of the squashed commits have already been pushed to your remote repository, you need to do a force push.
|
||||
@@ -99,13 +103,13 @@ git push origin branch-name
|
||||
git push origin remote-branch-name --force
|
||||
```
|
||||
|
||||
- Follow the Pull request template and submit a pull request with a motive for your change and the method you used to achieve it to be merged with the `main` branch.
|
||||
- If you can, please submit the pull request with the fix or improvements including tests.
|
||||
- During review, if you are requested to make changes, rebase your branch and squash the multiple commits into one again. Once you push these changes, the pull request will edit automatically.
|
||||
- Follow the Pull request template and submit a pull request with a motive for your change and the method you used to achieve it to be merged with the `dev` branch.
|
||||
- If possible, please submit the pull request along with tests.
|
||||
- During review, if you are requested to make changes, rebase your branch and squash commits into one again. Once you push these changes, the pull request will edit automatically.
|
||||
|
||||
## Configuring remotes
|
||||
### Configuring remotes
|
||||
|
||||
When a repository is cloned, it has a default remote called `origin` that points to your fork on GitHub, not the original repository it was forked from. To keep track of the original repository, you should add another remote called `upstream`.
|
||||
When a repository is cloned, it has a default remote called `origin` that points to your fork on GitHub, not the original repository it was forked from. To keep track of the original repository, you can add another remote called `upstream`.
|
||||
|
||||
1. Set the `upstream`.
|
||||
|
||||
@@ -122,18 +126,18 @@ git remote add upstream https://github.com/openMF/web-app.git
|
||||
> upstream https://github.com/openMF/web-app.git (push)
|
||||
```
|
||||
|
||||
3. To update your local copy with remote changes, run the following: (This will give you an exact copy of the current remote. You should not have any local changes on your main branch, if you do, use rebase instead.)
|
||||
3. To update your local copy with remote changes, run the following: (This will give you an exact copy of the current remote. You should not have any local changes on your dev branch, if you do, use rebase instead.)
|
||||
|
||||
```
|
||||
git fetch upstream
|
||||
git checkout main
|
||||
git merge upstream/main
|
||||
git checkout dev
|
||||
git merge upstream/dev
|
||||
```
|
||||
|
||||
4. Push these merged changes to the main branch on your fork. Ensure to pull in upstream changes regularly to keep your forked repository up to date.
|
||||
4. Push these merged changes to the dev branch on your fork. (Ensure to pull in upstream changes regularly to keep your forked repository up to date. Or you use the "Sync fork" button on top of the Github page of your fork, followed by `git pull`.)
|
||||
|
||||
```
|
||||
git push origin main
|
||||
git push origin dev
|
||||
```
|
||||
|
||||
5. Switch to the branch you are using for some piece of work.
|
||||
@@ -145,7 +149,7 @@ git checkout branch-name
|
||||
6. Rebase your branch, which means, take in all latest changes and replay your work in the branch on top of this - this produces cleaner versions/history.
|
||||
|
||||
```
|
||||
git rebase main
|
||||
git rebase dev
|
||||
```
|
||||
|
||||
7. Push the final changes when you're ready.
|
||||
@@ -154,9 +158,9 @@ git rebase main
|
||||
git push origin branch-name
|
||||
```
|
||||
|
||||
## After your Pull Request is merged
|
||||
### After your Pull Request is merged
|
||||
|
||||
After your pull request is merged, you can safely delete your branch and pull the changes from the main (upstream) repository.
|
||||
After your pull request is merged, you can safely delete your branch and pull the changes from the dev (upstream) repository.
|
||||
|
||||
1. Delete the remote branch on GitHub.
|
||||
|
||||
@@ -164,10 +168,10 @@ After your pull request is merged, you can safely delete your branch and pull th
|
||||
git push origin --delete branch-name
|
||||
```
|
||||
|
||||
2. Checkout the main branch.
|
||||
2. Checkout the dev branch.
|
||||
|
||||
```
|
||||
git checkout main
|
||||
git checkout dev
|
||||
```
|
||||
|
||||
3. Delete the local branch.
|
||||
@@ -176,14 +180,14 @@ git checkout main
|
||||
git branch -D branch-name
|
||||
```
|
||||
|
||||
4. Update your main branch with the latest upstream version.
|
||||
4. Update your dev branch with the latest upstream version.
|
||||
|
||||
```
|
||||
git pull upstream main
|
||||
git pull upstream dev
|
||||
```
|
||||
|
||||
## Skipping a Travis CI Build
|
||||
### Skipping a Travis CI Build
|
||||
|
||||
If running a build is not required for a particular commit (in some cases like an update to README.md), add [ci skip] or [skip ci] to the git commit message. Commits that have [ci skip] or [skip ci] anywhere in the commit messages are ignored by Travis CI.
|
||||
|
||||
That's it! Thank you for your contribution!
|
||||
**_Thank you for contributing!_**
|
||||
|
||||
Generated
+3
-1
@@ -11276,7 +11276,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/http-proxy-middleware": {
|
||||
"version": "2.0.7",
|
||||
"version": "2.0.9",
|
||||
"resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz",
|
||||
"integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
|
||||
@@ -92,7 +92,6 @@ export class GlAccountTreeService {
|
||||
// and rest as children to respective parent nodes.
|
||||
for (const glAccount of glAccountData) {
|
||||
if (glAccount.parentId === 0) {
|
||||
console.log(glAccount.type.value);
|
||||
if (glAccount.type.value === 'ASSET') {
|
||||
glAccountTree[0].children[0].children.push(glAccounts[glAccount.id]);
|
||||
} else if (glAccount.type.value === 'EQUITY') {
|
||||
|
||||
-1
@@ -46,7 +46,6 @@ export class EditFinancialActivityMappingComponent implements OnInit {
|
||||
) {
|
||||
this.route.data.subscribe((data: { financialActivityAccountAndTemplate: any }) => {
|
||||
this.financialActivityAccountId = data.financialActivityAccountAndTemplate.id;
|
||||
console.log(data.financialActivityAccountAndTemplate.financialActivityData);
|
||||
this.financialActivityId = data.financialActivityAccountAndTemplate.financialActivityData.id;
|
||||
this.glAccountId = data.financialActivityAccountAndTemplate.glAccountData.id;
|
||||
this.glAccountOptions = data.financialActivityAccountAndTemplate.glAccountOptions;
|
||||
|
||||
@@ -1,17 +1,21 @@
|
||||
<div class="tab-container mat-typography">
|
||||
<h3>{{ 'labels.heading.Identities' | translate }}</h3>
|
||||
<div class="header-row" fxLayout="row" fxLayoutAlign="space-between">
|
||||
<h3 class="mat-subheading-2">
|
||||
{{ 'labels.heading.Identities' | translate }}
|
||||
</h3>
|
||||
|
||||
<button
|
||||
mat-raised-button
|
||||
class="f-right"
|
||||
color="primary"
|
||||
(click)="addIdentifier()"
|
||||
*mifosxHasPermission="'CREATE_CLIENTIDENTIFIER'"
|
||||
>
|
||||
<fa-icon icon="plus" class="m-r-10"></fa-icon> {{ 'labels.buttons.Add' | translate }}
|
||||
<fa-icon icon="plus" class="m-r-10"></fa-icon>
|
||||
{{ 'labels.buttons.Add' | translate }}
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<table mat-table #identifiersTable [dataSource]="clientIdentities">
|
||||
<table mat-table #identifiersTable [dataSource]="clientIdentities" [ngStyle]="{ 'margin-top': '3%' }">
|
||||
<ng-container matColumnDef="id">
|
||||
<th mat-header-cell *matHeaderCellDef>{{ 'labels.inputs.Id' | translate }}</th>
|
||||
<td mat-cell *matCellDef="let identity">{{ identity.id }}</td>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
margin: 1%;
|
||||
|
||||
h3 {
|
||||
margin: 1% auto;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
table {
|
||||
|
||||
@@ -41,7 +41,7 @@ export class Accounting {
|
||||
'ACCRUAL (UPFRONT)'
|
||||
].includes(value)) {
|
||||
return 'Accrual (upfront)';
|
||||
} else if (value === 'CASH BASED') {
|
||||
} else if (value.startsWith('CASH')) {
|
||||
return 'Cash';
|
||||
} else if (value === 'NONE') {
|
||||
return 'NONE';
|
||||
|
||||
-1
@@ -68,7 +68,6 @@ export class FixedDepositAccountTermsStepComponent implements OnInit, OnChanges
|
||||
depositPeriod: this.fixedDepositsAccountTemplate.depositPeriod,
|
||||
depositPeriodFrequencyId: this.fixedDepositsAccountTemplate.depositPeriodFrequency.id
|
||||
});
|
||||
console.log(this.fixedDepositAccountTermsForm.value);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -31,8 +31,7 @@ export class LoanActionButtonResolver implements Resolve<Object> {
|
||||
return this.loansService.getLoanActionTemplate(loanId, 'repayment');
|
||||
} else if (loanActionButton === 'Goodwill Credit') {
|
||||
return this.loansService.getLoanActionTemplate(loanId, 'goodwillCredit');
|
||||
}
|
||||
if (loanActionButton === 'Interest Payment Waiver') {
|
||||
} else if (loanActionButton === 'Interest Payment Waiver') {
|
||||
return this.loansService.getLoanActionTemplate(loanId, 'interestPaymentWaiver');
|
||||
} else if (loanActionButton === 'Payout Refund') {
|
||||
return this.loansService.getLoanActionTemplate(loanId, 'payoutRefund');
|
||||
@@ -74,6 +73,8 @@ export class LoanActionButtonResolver implements Resolve<Object> {
|
||||
return this.loansService.getLoanForeclosureActionTemplate(loanId);
|
||||
} else if (loanActionButton === 'Charge-Off') {
|
||||
return this.loansService.getLoanActionTemplate(loanId, 'charge-off');
|
||||
} else if (loanActionButton === 'Capitalized Income') {
|
||||
return this.loansService.getLoanActionTemplate(loanId, 'capitalizedIncome');
|
||||
} else {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
@@ -94,6 +94,11 @@
|
||||
<span fxFlex="50%"> {{ loanDetails.capitalizedIncomeStrategy?.value | translateKey: 'catalogs' }} </span>
|
||||
</div>
|
||||
|
||||
<div fxFlexFill *ngIf="loanDetails.enableIncomeCapitalization">
|
||||
<span fxFlex="50%"> {{ 'labels.inputs.Income capitalization type' | translate }}</span>
|
||||
<span fxFlex="50%"> {{ loanDetails.capitalizedIncomeType?.value | translateKey: 'catalogs' }} </span>
|
||||
</div>
|
||||
|
||||
<div fxFlexFill>
|
||||
<span fxFlex="50%"> {{ 'labels.inputs.Grace: On Principal Payment' | translate }}</span>
|
||||
<span fxFlex="50%"> {{ loanDetails.graceOnPrincipalPayment }} </span>
|
||||
|
||||
@@ -6,7 +6,7 @@ import { ActivatedRoute } from '@angular/router';
|
||||
templateUrl: './datatable-tab.component.html',
|
||||
styleUrls: ['./datatable-tab.component.scss']
|
||||
})
|
||||
export class DatatableTabComponent {
|
||||
export class DatatableTabComponent implements OnInit {
|
||||
entityId: string;
|
||||
/** Loan Datatable */
|
||||
entityDatatable: any = null;
|
||||
@@ -25,4 +25,10 @@ export class DatatableTabComponent {
|
||||
this.multiRowDatatableFlag = this.entityDatatable.columnHeaders[0].columnName === 'id' ? true : false;
|
||||
});
|
||||
}
|
||||
|
||||
ngOnInit() {
|
||||
this.route.parent.parent.params.subscribe((params) => {
|
||||
this.entityId = params['loanId'];
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
<mifosx-foreclosure [dataObject]="actionButtonData" *ngIf="actions['Foreclosure']"></mifosx-foreclosure>
|
||||
<mifosx-prepay-loan [dataObject]="actionButtonData" *ngIf="actions['Prepay Loan']"></mifosx-prepay-loan>
|
||||
<mifosx-make-repayment [dataObject]="actionButtonData" *ngIf="actions['Make Repayment']"></mifosx-make-repayment>
|
||||
<mifosx-make-repayment [dataObject]="actionButtonData" *ngIf="actions['Capitalized Income']"></mifosx-make-repayment>
|
||||
<mifosx-make-repayment [dataObject]="actionButtonData" *ngIf="actions['Goodwill Credit']"></mifosx-make-repayment>
|
||||
<mifosx-make-repayment
|
||||
[dataObject]="actionButtonData"
|
||||
|
||||
@@ -51,6 +51,7 @@ export class LoanAccountActionsComponent {
|
||||
'Re-Amortize': boolean;
|
||||
'Interest Payment Waiver': boolean;
|
||||
'Add Interest Pause': boolean;
|
||||
'Capitalized Income': boolean;
|
||||
} = {
|
||||
Close: false,
|
||||
'Undo Approval': false,
|
||||
@@ -86,7 +87,8 @@ export class LoanAccountActionsComponent {
|
||||
'Re-Age': false,
|
||||
'Re-Amortize': false,
|
||||
'Interest Payment Waiver': false,
|
||||
'Add Interest Pause': false
|
||||
'Add Interest Pause': false,
|
||||
'Capitalized Income': false
|
||||
};
|
||||
|
||||
actionButtonData: any;
|
||||
|
||||
+1
-1
@@ -21,7 +21,7 @@
|
||||
</mat-error>
|
||||
</mat-form-field>
|
||||
|
||||
<div fxLayout="row wrap" class="content">
|
||||
<div fxLayout="row wrap" class="content" *ngIf="showDetails()">
|
||||
<div fxFlex="50%" class="mat-body-strong">
|
||||
{{ 'Principal' | translate }}
|
||||
</div>
|
||||
|
||||
+8
-2
@@ -33,6 +33,8 @@ export class MakeRepaymentComponent implements OnInit {
|
||||
repaymentLoanForm: UntypedFormGroup;
|
||||
currency: Currency | null = null;
|
||||
|
||||
command: string | null = null;
|
||||
|
||||
/**
|
||||
* @param {FormBuilder} formBuilder Form Builder.
|
||||
* @param {LoansService} loanService Loan Service.
|
||||
@@ -62,6 +64,7 @@ export class MakeRepaymentComponent implements OnInit {
|
||||
if (this.dataObject.currency) {
|
||||
this.currency = this.dataObject.currency;
|
||||
}
|
||||
this.command = this.dataObject.type.code.split('.')[1];
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -110,6 +113,10 @@ export class MakeRepaymentComponent implements OnInit {
|
||||
}
|
||||
}
|
||||
|
||||
showDetails(): boolean {
|
||||
return !['capitalizedIncome'].includes(this.command);
|
||||
}
|
||||
|
||||
/** Submits the repayment form */
|
||||
submit() {
|
||||
const repaymentLoanFormData = this.repaymentLoanForm.value;
|
||||
@@ -124,9 +131,8 @@ export class MakeRepaymentComponent implements OnInit {
|
||||
dateFormat,
|
||||
locale
|
||||
};
|
||||
const command = this.dataObject.type.code.split('.')[1];
|
||||
data['transactionAmount'] = data['transactionAmount'] * 1;
|
||||
this.loanService.submitLoanActionButton(this.loanId, data, command).subscribe((response: any) => {
|
||||
this.loanService.submitLoanActionButton(this.loanId, data, this.command).subscribe((response: any) => {
|
||||
this.router.navigate(['../../transactions'], { relativeTo: this.route });
|
||||
});
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/** Angular Imports */
|
||||
import { Component } from '@angular/core';
|
||||
import { Component, OnInit } from '@angular/core';
|
||||
import { ActivatedRoute } from '@angular/router';
|
||||
|
||||
/** Custom Services */
|
||||
@@ -15,7 +15,7 @@ import { SettingsService } from 'app/settings/settings.service';
|
||||
templateUrl: './loan-documents-tab.component.html',
|
||||
styleUrls: ['./loan-documents-tab.component.scss']
|
||||
})
|
||||
export class LoanDocumentsTabComponent {
|
||||
export class LoanDocumentsTabComponent implements OnInit {
|
||||
/** Stores the resolved loan documents data */
|
||||
entityDocuments: any;
|
||||
/** Loan account Id */
|
||||
@@ -38,6 +38,12 @@ export class LoanDocumentsTabComponent {
|
||||
});
|
||||
}
|
||||
|
||||
ngOnInit(): void {
|
||||
this.route.parent.params.subscribe((params) => {
|
||||
this.entityId = params['loanId'];
|
||||
});
|
||||
}
|
||||
|
||||
getLoanDocumentsData(data: any) {
|
||||
data.forEach((ele: any) => {
|
||||
ele.docUrl =
|
||||
|
||||
@@ -82,6 +82,12 @@ export class LoansViewComponent implements OnInit {
|
||||
}
|
||||
|
||||
ngOnInit() {
|
||||
this.route.params.subscribe((params) => {
|
||||
if (this.loanId != params['loanId']) {
|
||||
this.loanId = params['loanId'];
|
||||
this.reload();
|
||||
}
|
||||
});
|
||||
this.recalculateInterest = this.loanDetailsData.recalculateInterest || true;
|
||||
this.status = this.loanDetailsData.status.value;
|
||||
if (this.loanStatus.active && this.loanDetailsData.multiDisburseLoan) {
|
||||
@@ -129,6 +135,14 @@ export class LoansViewComponent implements OnInit {
|
||||
taskPermissionName: 'DISBURSE_LOAN'
|
||||
});
|
||||
} else if (this.status === 'Active') {
|
||||
if (this.loanDetailsData.enableIncomeCapitalization) {
|
||||
this.buttonConfig.addButton({
|
||||
name: 'Capitalized Income',
|
||||
icon: 'coins',
|
||||
taskPermissionName: 'CAPITALIZED_INCOME_LOAN'
|
||||
});
|
||||
}
|
||||
|
||||
if (this.loanDetailsData.canDisburse || this.loanDetailsData.multiDisburseLoan) {
|
||||
this.buttonConfig.addButton({
|
||||
name: 'Disburse',
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { Component } from '@angular/core';
|
||||
import { Component, OnInit } from '@angular/core';
|
||||
import { ActivatedRoute } from '@angular/router';
|
||||
|
||||
/** Custom Components */
|
||||
@@ -12,7 +12,7 @@ import { AuthenticationService } from '../../../core/authentication/authenticati
|
||||
templateUrl: './notes-tab.component.html',
|
||||
styleUrls: ['./notes-tab.component.scss']
|
||||
})
|
||||
export class NotesTabComponent {
|
||||
export class NotesTabComponent implements OnInit {
|
||||
entityId: string;
|
||||
username: string;
|
||||
entityNotes: any;
|
||||
@@ -30,6 +30,12 @@ export class NotesTabComponent {
|
||||
});
|
||||
}
|
||||
|
||||
ngOnInit(): void {
|
||||
this.route.parent.params.subscribe((params) => {
|
||||
this.entityId = params['loanId'];
|
||||
});
|
||||
}
|
||||
|
||||
addNote(noteContent: any) {
|
||||
this.loansService.createLoanNote(this.entityId, noteContent).subscribe((response: any) => {
|
||||
this.entityNotes.push({
|
||||
|
||||
@@ -112,7 +112,6 @@ export class ViewTransactionComponent implements OnInit {
|
||||
});
|
||||
this.clientId = this.route.snapshot.params['clientId'];
|
||||
this.loanId = this.route.snapshot.params['loanId'];
|
||||
console.log(this.transactionType);
|
||||
}
|
||||
|
||||
ngOnInit(): void {
|
||||
|
||||
@@ -191,18 +191,6 @@
|
||||
{{ 'labels.inputs.Amount' | translate }} {{ 'labels.commons.is' | translate }}
|
||||
<strong>{{ 'labels.commons.required' | translate }}</strong>
|
||||
</mat-error>
|
||||
<mat-error *ngIf="chargeForm.controls.amount.hasError('pattern') && currencyDecimalPlaces !== undefined">
|
||||
{{ 'labels.inputs.Amount' | translate }} {{ 'labels.commons.must be' | translate }}
|
||||
<strong
|
||||
>{{ 'labels.commons.a positive number with' | translate }}
|
||||
{{ currencyDecimalPlaces ? 'up to ' + currencyDecimalPlaces : 'no' }}
|
||||
{{ 'labels.inputs.decimal places' | translate }}</strong
|
||||
>
|
||||
</mat-error>
|
||||
<mat-error *ngIf="chargeForm.controls.amount.hasError('pattern') && currencyDecimalPlaces === undefined">
|
||||
{{ 'labels.inputs.Amount' | translate }} {{ 'labels.commons.must be' | translate }}
|
||||
<strong>{{ 'labels.commons.a positive number' | translate }}</strong>
|
||||
</mat-error>
|
||||
</mat-form-field>
|
||||
<!--
|
||||
* minCap and maxCap only allowed for loan ,shares and savings entitites
|
||||
@@ -217,7 +205,11 @@
|
||||
|
||||
<mat-form-field fxFlex="48%" *ngIf="showMinMaxCap()">
|
||||
<mat-label>{{ 'labels.inputs.Maximum Charge Cap' | translate }}</mat-label>
|
||||
<input matInput formControlName="maxCap" />
|
||||
<input matInput [min]="chargeForm.value.minCap" formControlName="maxCap" />
|
||||
<mat-error *ngIf="chargeForm.errors?.minGreaterThanMax">
|
||||
{{ 'labels.inputs.Maximum Charge Cap' | translate }} ({{ repeatEveryLabel }})
|
||||
<strong>{{ 'labels.commons.must higher than Minimum Charge Cap' | translate }}</strong>
|
||||
</mat-error>
|
||||
</mat-form-field>
|
||||
|
||||
<div fxFlex="48%" fxLayout="row" fxLayoutGap="2%" fxLayout.lt-md="column">
|
||||
|
||||
@@ -7,6 +7,7 @@ import { Router, ActivatedRoute } from '@angular/router';
|
||||
import { ProductsService } from '../../products.service';
|
||||
import { SettingsService } from 'app/settings/settings.service';
|
||||
import { Dates } from 'app/core/utils/dates';
|
||||
import { minLessThanOrEqualMaxValidator } from 'app/shared/validators/min-max-values.validator';
|
||||
|
||||
/**
|
||||
* Create charge component.
|
||||
@@ -79,7 +80,8 @@ export class CreateChargeComponent implements OnInit {
|
||||
* Creates the charge form.
|
||||
*/
|
||||
createChargeForm() {
|
||||
this.chargeForm = this.formBuilder.group({
|
||||
this.chargeForm = this.formBuilder.group(
|
||||
{
|
||||
chargeAppliesTo: [
|
||||
'',
|
||||
Validators.required
|
||||
@@ -102,16 +104,16 @@ export class CreateChargeComponent implements OnInit {
|
||||
],
|
||||
amount: [
|
||||
'',
|
||||
[
|
||||
Validators.required,
|
||||
Validators.pattern('^\\s*(?=.*[1-9])\\d*(?:\\.\\d+)?\\s*$')]
|
||||
Validators.required
|
||||
],
|
||||
active: [false],
|
||||
penalty: [false],
|
||||
taxGroupId: [''],
|
||||
minCap: [''],
|
||||
maxCap: ['']
|
||||
});
|
||||
},
|
||||
{ validators: minLessThanOrEqualMaxValidator('minCap', 'maxCap') }
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -275,15 +277,6 @@ export class CreateChargeComponent implements OnInit {
|
||||
this.currencyDecimalPlaces = this.chargesTemplateData.currencyOptions.find(
|
||||
(currency: any) => currency.code === currencyCode
|
||||
).decimalPlaces;
|
||||
if (this.currencyDecimalPlaces === 0) {
|
||||
this.chargeForm.get('amount').setValidators([
|
||||
Validators.required,
|
||||
Validators.pattern('^[1-9]\\d*$')]);
|
||||
} else {
|
||||
this.chargeForm.get('amount').setValidators([
|
||||
Validators.required,
|
||||
Validators.pattern(`^\\s*(?=.*[1-9])\\d*(\\.\\d{1,${this.currencyDecimalPlaces}})?\\s*$`)]);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -113,6 +113,12 @@
|
||||
>
|
||||
<mat-label>{{ 'labels.inputs.Minimum Charge Cap' | translate }}</mat-label>
|
||||
<input matInput autofocus formControlName="minCap" />
|
||||
<mat-error
|
||||
*ngIf="chargeForm.controls.maxCap.hasError('minGreaterThanMax') || chargeForm.errors?.minGreaterThanMax"
|
||||
>
|
||||
{{ 'labels.inputs.Minimum Charge Cap' | translate }} ({{ repeatEveryLabel }})
|
||||
<strong>{{ 'labels.commons.must lower than Maximum Charge Cap' | translate }}</strong>
|
||||
</mat-error>
|
||||
</mat-form-field>
|
||||
<mat-form-field
|
||||
fxFlex="48%"
|
||||
@@ -131,7 +137,11 @@
|
||||
"
|
||||
>
|
||||
<mat-label>{{ 'labels.inputs.Maximum Charge Cap' | translate }}</mat-label>
|
||||
<input matInput autofocus formControlName="maxCap" />
|
||||
<input matInput [min]="chargeForm.value.minCap" autofocus formControlName="maxCap" />
|
||||
<mat-error *ngIf="chargeForm.hasError('minGreaterThanMax') || chargeForm.errors?.minGreaterThanMax">
|
||||
{{ 'labels.inputs.Maximum Charge Cap' | translate }} ({{ repeatEveryLabel }})
|
||||
<strong>{{ 'labels.commons.must be equal or greater than Minimum Charge Cap' | translate }}</strong>
|
||||
</mat-error>
|
||||
</mat-form-field>
|
||||
|
||||
<mifosx-gl-account-selector
|
||||
|
||||
@@ -6,6 +6,7 @@ import { ActivatedRoute, Router } from '@angular/router';
|
||||
/** Custom Services */
|
||||
import { ProductsService } from 'app/products/products.service';
|
||||
import { SettingsService } from 'app/settings/settings.service';
|
||||
import { minLessThanOrEqualMaxValidator } from 'app/shared/validators/min-max-values.validator';
|
||||
|
||||
/**
|
||||
* Edit Charge component.
|
||||
@@ -73,7 +74,8 @@ export class EditChargeComponent implements OnInit {
|
||||
editChargeForm() {
|
||||
this.showFeeOptions = this.chargeData.feeInterval && this.chargeData.feeInterval > 0;
|
||||
|
||||
this.chargeForm = this.formBuilder.group({
|
||||
this.chargeForm = this.formBuilder.group(
|
||||
{
|
||||
name: [
|
||||
this.chargeData.name,
|
||||
Validators.required
|
||||
@@ -102,7 +104,9 @@ export class EditChargeComponent implements OnInit {
|
||||
this.chargeData.chargeCalculationType.id,
|
||||
Validators.required
|
||||
]
|
||||
});
|
||||
},
|
||||
{ validators: minLessThanOrEqualMaxValidator('minCap', 'maxCap') }
|
||||
);
|
||||
switch (this.chargeData.chargeAppliesTo.value) {
|
||||
case 'Loan': {
|
||||
this.chargeTimeTypeOptions = this.chargeData.loanChargeTimeTypeOptions;
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
</div>
|
||||
|
||||
<div fxFlex="50%">
|
||||
{{ chargeData.amount | formatNumber }}
|
||||
{{ chargeData.amount }}
|
||||
</div>
|
||||
|
||||
<div fxFlex="50%" class="mat-body-strong" *ngIf="minCap">
|
||||
|
||||
+21
@@ -878,6 +878,11 @@
|
||||
<span fxFlex="47%">{{ 'labels.inputs.Income capitalization strategy' | translate }}:</span>
|
||||
<span fxFlex="53%">{{ loanProduct.capitalizedIncomeStrategy?.value | translateKey: 'catalogs' }}</span>
|
||||
</div>
|
||||
|
||||
<div fxFlexFill *ngIf="loanProduct.enableIncomeCapitalization">
|
||||
<span fxFlex="47%">{{ 'labels.inputs.Income type' | translate }}:</span>
|
||||
<span fxFlex="53%">{{ loanProduct.capitalizedIncomeType?.value | translateKey: 'catalogs' }}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<h3 class="mat-h3" fxFlexFill>{{ 'labels.heading.Accounting' | translate }}</h3>
|
||||
@@ -1011,6 +1016,14 @@
|
||||
[withTitle]="'47%'"
|
||||
>
|
||||
</mifosx-gl-account-display>
|
||||
<mifosx-gl-account-display
|
||||
fxFlex="100%"
|
||||
*ngIf="accountingMappings.incomeFromCapitalizationAccount"
|
||||
[accountTitle]="'Income capitalization'"
|
||||
[glAccount]="accountingMappings.incomeFromCapitalizationAccount"
|
||||
[withTitle]="'47%'"
|
||||
>
|
||||
</mifosx-gl-account-display>
|
||||
|
||||
<h4 fxFlexFill class="mat-h4">{{ 'labels.heading.Expenses' | translate }}</h4>
|
||||
|
||||
@@ -1054,6 +1067,14 @@
|
||||
[withTitle]="'47%'"
|
||||
>
|
||||
</mifosx-gl-account-display>
|
||||
<mifosx-gl-account-display
|
||||
fxFlex="100%"
|
||||
*ngIf="accountingMappings.deferredIncomeLiabilityAccount"
|
||||
[accountTitle]="'Deferred income'"
|
||||
[glAccount]="accountingMappings.deferredIncomeLiabilityAccount"
|
||||
[withTitle]="'47%'"
|
||||
>
|
||||
</mifosx-gl-account-display>
|
||||
|
||||
<div *ngIf="isAdvancedAccountingEnabled()" fxFlexFill fxLayout="row wrap" fxLayout.lt-md="column">
|
||||
<h3 class="mat-h3" fxFlexFill>{{ 'labels.heading.Advanced Accounting Rules' | translate }}</h3>
|
||||
|
||||
+13
@@ -152,6 +152,10 @@ export class LoanProductSummaryComponent implements OnInit, OnChanges {
|
||||
this.loanProduct.incomeFromChargeOffPenaltyAccountId,
|
||||
incomeAccountData
|
||||
),
|
||||
incomeFromCapitalizationAccount: this.glAccountLookUp(
|
||||
this.loanProduct.incomeFromCapitalizationAccountId,
|
||||
incomeAccountData
|
||||
),
|
||||
|
||||
writeOffAccount: this.glAccountLookUp(this.loanProduct.writeOffAccountId, expenseAccountData),
|
||||
goodwillCreditAccount: this.glAccountLookUp(this.loanProduct.goodwillCreditAccountId, expenseAccountData),
|
||||
@@ -161,6 +165,10 @@ export class LoanProductSummaryComponent implements OnInit, OnChanges {
|
||||
overpaymentLiabilityAccount: this.glAccountLookUp(
|
||||
this.loanProduct.overpaymentLiabilityAccountId,
|
||||
liabilityAccountData
|
||||
),
|
||||
deferredIncomeLiabilityAccount: this.glAccountLookUp(
|
||||
this.loanProduct.deferredIncomeLiabilityAccountId,
|
||||
liabilityAccountData
|
||||
)
|
||||
};
|
||||
|
||||
@@ -293,6 +301,11 @@ export class LoanProductSummaryComponent implements OnInit, OnChanges {
|
||||
this.loanProductsTemplate.capitalizedIncomeStrategyOptions
|
||||
);
|
||||
this.loanProduct.capitalizedIncomeStrategy = optionValue;
|
||||
optionValue = this.optionDataLookUp(
|
||||
this.loanProduct.capitalizedIncomeType,
|
||||
this.loanProductsTemplate.capitalizedIncomeTypeOptions
|
||||
);
|
||||
this.loanProduct.capitalizedIncomeType = optionValue;
|
||||
}
|
||||
optionValue = this.optionDataLookUp(
|
||||
this.loanProduct.interestRateFrequencyType,
|
||||
|
||||
@@ -98,7 +98,9 @@
|
||||
[capitalizedIncome]="capitalizedIncome"
|
||||
[capitalizedIncomeCalculationTypeOptions]="loanProductsTemplate.capitalizedIncomeCalculationTypeOptions"
|
||||
[capitalizedIncomeStrategyOptions]="loanProductsTemplate.capitalizedIncomeStrategyOptions"
|
||||
[capitalizedIncomeTypeOptions]="loanProductsTemplate.capitalizedIncomeTypeOptions"
|
||||
(setCapitalizedIncome)="setCapitalizedIncome($event)"
|
||||
(setViewChildForm)="setViewChildForm($event)"
|
||||
>
|
||||
</mifosx-loan-product-capitalized-income-step>
|
||||
|
||||
@@ -112,6 +114,7 @@
|
||||
[loanProductsTemplate]="loanProductsTemplate"
|
||||
[accountingRuleData]="accountingRuleData"
|
||||
[loanProductFormValid]="loanProductFormValid"
|
||||
[capitalizedIncome]="capitalizedIncome"
|
||||
>
|
||||
</mifosx-loan-product-accounting-step>
|
||||
</mat-step>
|
||||
|
||||
+24
-10
@@ -23,6 +23,7 @@ import {
|
||||
import { Accounting } from 'app/core/utils/accounting';
|
||||
import { StringEnumOptionData } from '../../../shared/models/option-data.model';
|
||||
import { LoanProductCapitalizedIncomeStepComponent } from '../loan-product-stepper/loan-product-capitalized-income-step/loan-product-capitalized-income-step.component';
|
||||
import { UntypedFormGroup } from '@angular/forms';
|
||||
|
||||
@Component({
|
||||
selector: 'mifosx-create-loan-product',
|
||||
@@ -56,6 +57,7 @@ export class CreateLoanProductComponent implements OnInit {
|
||||
advancedCreditAllocations: AdvancedPaymentAllocation[] = [];
|
||||
|
||||
capitalizedIncome: CapitalizedIncome | null = null;
|
||||
loanIncomeCapitalizationForm: UntypedFormGroup;
|
||||
|
||||
/**
|
||||
* @param {ActivatedRoute} route Activated Route.
|
||||
@@ -115,8 +117,9 @@ export class CreateLoanProductComponent implements OnInit {
|
||||
if (this.loanProductsTemplate.enableIncomeCapitalization) {
|
||||
this.capitalizedIncome = {
|
||||
enableIncomeCapitalization: true,
|
||||
incomeCapitalizationCalculationType: this.loanProductsTemplate.capitalizedIncomeCalculationTypeOptions[0],
|
||||
incomeCapitalizationStrategy: this.loanProductsTemplate.capitalizedIncomeStrategyOptions[0]
|
||||
capitalizedIncomeCalculationType: this.loanProductsTemplate.capitalizedIncomeCalculationTypeOptions[0],
|
||||
capitalizedIncomeStrategy: this.loanProductsTemplate.capitalizedIncomeStrategyOptions[0],
|
||||
capitalizedIncomeType: this.loanProductsTemplate.capitalizedIncomeTypeOptions[0]
|
||||
};
|
||||
} else {
|
||||
this.capitalizedIncome = {
|
||||
@@ -150,6 +153,10 @@ export class CreateLoanProductComponent implements OnInit {
|
||||
}
|
||||
}
|
||||
|
||||
setViewChildForm(viewChildForm: UntypedFormGroup): void {
|
||||
this.loanIncomeCapitalizationForm = viewChildForm;
|
||||
}
|
||||
|
||||
get loanProductSettingsForm() {
|
||||
return this.loanProductSettingsStep.loanProductSettingsForm;
|
||||
}
|
||||
@@ -158,13 +165,17 @@ export class CreateLoanProductComponent implements OnInit {
|
||||
return this.loanProductAccountingStep.loanProductAccountingForm;
|
||||
}
|
||||
|
||||
get loanIncomeCapitalizationForm() {
|
||||
if (this.loanProductCapitalizedIncomeStep != null) {
|
||||
return this.loanProductCapitalizedIncomeStep.loanIncomeCapitalizationForm;
|
||||
}
|
||||
}
|
||||
|
||||
get loanProductFormValid() {
|
||||
if (this.isAdvancedPaymentStrategy) {
|
||||
return (
|
||||
this.loanProductDetailsForm.valid &&
|
||||
this.loanProductCurrencyForm.valid &&
|
||||
this.loanProductTermsForm.valid &&
|
||||
this.loanProductSettingsForm.valid &&
|
||||
this.loanIncomeCapitalizationForm.valid &&
|
||||
this.loanProductAccountingForm.valid
|
||||
);
|
||||
} else {
|
||||
return (
|
||||
this.loanProductDetailsForm.valid &&
|
||||
this.loanProductCurrencyForm.valid &&
|
||||
@@ -173,6 +184,7 @@ export class CreateLoanProductComponent implements OnInit {
|
||||
this.loanProductAccountingForm.valid
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
get loanProduct() {
|
||||
const loanProduct = {
|
||||
@@ -190,8 +202,9 @@ export class CreateLoanProductComponent implements OnInit {
|
||||
if (this.capitalizedIncome != null) {
|
||||
loanProduct['enableIncomeCapitalization'] = this.capitalizedIncome.enableIncomeCapitalization;
|
||||
if (this.capitalizedIncome.enableIncomeCapitalization) {
|
||||
loanProduct['capitalizedIncomeCalculationType'] = this.capitalizedIncome.incomeCapitalizationCalculationType;
|
||||
loanProduct['capitalizedIncomeStrategy'] = this.capitalizedIncome.incomeCapitalizationStrategy;
|
||||
loanProduct['capitalizedIncomeCalculationType'] = this.capitalizedIncome.capitalizedIncomeCalculationType;
|
||||
loanProduct['capitalizedIncomeStrategy'] = this.capitalizedIncome.capitalizedIncomeStrategy;
|
||||
loanProduct['capitalizedIncomeType'] = this.capitalizedIncome.capitalizedIncomeType;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -210,6 +223,7 @@ export class CreateLoanProductComponent implements OnInit {
|
||||
);
|
||||
} else {
|
||||
delete loanProduct['supportedInterestRefundTypes'];
|
||||
delete loanProduct['daysInYearCustomStrategy'];
|
||||
}
|
||||
delete loanProduct['useDueForRepaymentsConfigurations'];
|
||||
|
||||
|
||||
@@ -100,7 +100,9 @@
|
||||
[capitalizedIncome]="capitalizedIncome"
|
||||
[capitalizedIncomeCalculationTypeOptions]="loanProductAndTemplate.capitalizedIncomeCalculationTypeOptions"
|
||||
[capitalizedIncomeStrategyOptions]="loanProductAndTemplate.capitalizedIncomeStrategyOptions"
|
||||
[capitalizedIncomeTypeOptions]="loanProductAndTemplate.capitalizedIncomeTypeOptions"
|
||||
(setCapitalizedIncome)="setCapitalizedIncome($event)"
|
||||
(setViewChildForm)="setViewChildForm($event)"
|
||||
>
|
||||
</mifosx-loan-product-capitalized-income-step>
|
||||
|
||||
@@ -114,6 +116,7 @@
|
||||
[loanProductsTemplate]="loanProductAndTemplate"
|
||||
[accountingRuleData]="accountingRuleData"
|
||||
[loanProductFormValid]="loanProductFormValidAndNotPristine"
|
||||
[capitalizedIncome]="capitalizedIncome"
|
||||
>
|
||||
</mifosx-loan-product-accounting-step>
|
||||
</mat-step>
|
||||
|
||||
@@ -26,6 +26,7 @@ import { Accounting } from 'app/core/utils/accounting';
|
||||
import { LoanProductInterestRefundStepComponent } from '../loan-product-stepper/loan-product-interest-refund-step/loan-product-interest-refund-step.component';
|
||||
import { StringEnumOptionData } from '../../../shared/models/option-data.model';
|
||||
import { LoanProductCapitalizedIncomeStepComponent } from '../loan-product-stepper/loan-product-capitalized-income-step/loan-product-capitalized-income-step.component';
|
||||
import { UntypedFormGroup } from '@angular/forms';
|
||||
|
||||
@Component({
|
||||
selector: 'mifosx-edit-loan-product',
|
||||
@@ -60,6 +61,7 @@ export class EditLoanProductComponent implements OnInit {
|
||||
supportedInterestRefundTypes: StringEnumOptionData[] = [];
|
||||
|
||||
capitalizedIncome: CapitalizedIncome | null = null;
|
||||
loanIncomeCapitalizationForm: UntypedFormGroup | null = null;
|
||||
|
||||
/**
|
||||
* @param {ActivatedRoute} route Activated Route.
|
||||
@@ -99,8 +101,9 @@ export class EditLoanProductComponent implements OnInit {
|
||||
if (this.loanProductAndTemplate.enableIncomeCapitalization) {
|
||||
this.capitalizedIncome = {
|
||||
enableIncomeCapitalization: true,
|
||||
incomeCapitalizationCalculationType: this.loanProductAndTemplate.capitalizedIncomeCalculationType.id,
|
||||
incomeCapitalizationStrategy: this.loanProductAndTemplate.capitalizedIncomeStrategy.id
|
||||
capitalizedIncomeCalculationType: this.loanProductAndTemplate.capitalizedIncomeCalculationType.id,
|
||||
capitalizedIncomeStrategy: this.loanProductAndTemplate.capitalizedIncomeStrategy.id,
|
||||
capitalizedIncomeType: this.loanProductAndTemplate.capitalizedIncomeType.id
|
||||
};
|
||||
} else {
|
||||
this.capitalizedIncome = {
|
||||
@@ -132,10 +135,8 @@ export class EditLoanProductComponent implements OnInit {
|
||||
}
|
||||
}
|
||||
|
||||
get loanIncomeCapitalizationForm() {
|
||||
if (this.loanProductCapitalizedIncomeStep != null) {
|
||||
return this.loanProductCapitalizedIncomeStep.loanIncomeCapitalizationForm;
|
||||
}
|
||||
setViewChildForm(viewChildForm: UntypedFormGroup): void {
|
||||
this.loanIncomeCapitalizationForm = viewChildForm;
|
||||
}
|
||||
|
||||
advancePaymentStrategy(value: string): void {
|
||||
@@ -180,6 +181,25 @@ export class EditLoanProductComponent implements OnInit {
|
||||
}
|
||||
|
||||
get loanProductFormValidAndNotPristine() {
|
||||
if (this.isAdvancedPaymentStrategy) {
|
||||
return (
|
||||
this.loanProductDetailsForm.valid &&
|
||||
this.loanProductCurrencyForm.valid &&
|
||||
this.loanProductTermsForm.valid &&
|
||||
this.loanProductSettingsForm.valid &&
|
||||
this.loanProductAccountingForm.valid &&
|
||||
this.loanIncomeCapitalizationForm != null &&
|
||||
this.loanIncomeCapitalizationForm.valid &&
|
||||
(!this.loanProductDetailsForm.pristine ||
|
||||
!this.loanProductCurrencyForm.pristine ||
|
||||
!this.loanProductTermsForm.pristine ||
|
||||
!this.loanProductSettingsForm.pristine ||
|
||||
!this.loanProductChargesStep.pristine ||
|
||||
!this.loanProductAccountingForm.pristine ||
|
||||
!this.loanIncomeCapitalizationForm.pristine ||
|
||||
this.wasPaymentAllocationChanged)
|
||||
);
|
||||
} else {
|
||||
return (
|
||||
this.loanProductDetailsForm.valid &&
|
||||
this.loanProductCurrencyForm.valid &&
|
||||
@@ -195,6 +215,7 @@ export class EditLoanProductComponent implements OnInit {
|
||||
this.wasPaymentAllocationChanged)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
get loanProduct() {
|
||||
const loanProduct = {
|
||||
@@ -216,8 +237,9 @@ export class EditLoanProductComponent implements OnInit {
|
||||
if (this.capitalizedIncome != null) {
|
||||
loanProduct['enableIncomeCapitalization'] = this.capitalizedIncome.enableIncomeCapitalization;
|
||||
if (this.capitalizedIncome.enableIncomeCapitalization) {
|
||||
loanProduct['capitalizedIncomeCalculationType'] = this.capitalizedIncome.incomeCapitalizationCalculationType;
|
||||
loanProduct['capitalizedIncomeStrategy'] = this.capitalizedIncome.incomeCapitalizationStrategy;
|
||||
loanProduct['capitalizedIncomeCalculationType'] = this.capitalizedIncome.capitalizedIncomeCalculationType;
|
||||
loanProduct['capitalizedIncomeStrategy'] = this.capitalizedIncome.capitalizedIncomeStrategy;
|
||||
loanProduct['capitalizedIncomeType'] = this.capitalizedIncome.capitalizedIncomeType;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -236,6 +258,7 @@ export class EditLoanProductComponent implements OnInit {
|
||||
);
|
||||
} else {
|
||||
delete loanProduct['supportedInterestRefundTypes'];
|
||||
delete loanProduct['daysInYearCustomStrategy'];
|
||||
}
|
||||
delete loanProduct['useDueForRepaymentsConfigurations'];
|
||||
|
||||
|
||||
+20
@@ -189,6 +189,16 @@
|
||||
>
|
||||
</mifosx-gl-account-selector>
|
||||
|
||||
<mifosx-gl-account-selector
|
||||
*ngIf="capitalizedIncome?.enableIncomeCapitalization"
|
||||
fxFlex="48%"
|
||||
[inputFormControl]="loanProductAccountingForm.controls.incomeFromCapitalizationAccountId"
|
||||
[glAccountList]="incomeAccountData"
|
||||
[required]="true"
|
||||
[inputLabel]="'Income capitalization'"
|
||||
>
|
||||
</mifosx-gl-account-selector>
|
||||
|
||||
<mat-divider fxFlex="98%"></mat-divider>
|
||||
|
||||
<h4 fxFlex="98%" class="mat-h4">{{ 'labels.heading.Expenses' | translate }}</h4>
|
||||
@@ -242,6 +252,16 @@
|
||||
>
|
||||
</mifosx-gl-account-selector>
|
||||
|
||||
<mifosx-gl-account-selector
|
||||
*ngIf="capitalizedIncome?.enableIncomeCapitalization"
|
||||
fxFlex="48%"
|
||||
[inputFormControl]="loanProductAccountingForm.controls.deferredIncomeLiabilityAccountId"
|
||||
[glAccountList]="liabilityAccountData"
|
||||
[required]="true"
|
||||
[inputLabel]="'Deferred income'"
|
||||
>
|
||||
</mifosx-gl-account-selector>
|
||||
|
||||
<mat-divider fxFlex="98%"></mat-divider>
|
||||
|
||||
<mat-checkbox fxFlex="73%" formControlName="advancedAccountingRules">{{
|
||||
|
||||
+33
-2
@@ -1,4 +1,4 @@
|
||||
import { Component, Input, OnInit } from '@angular/core';
|
||||
import { Component, Input, OnChanges, OnInit, SimpleChanges } from '@angular/core';
|
||||
import { UntypedFormArray, UntypedFormBuilder, UntypedFormControl, UntypedFormGroup, Validators } from '@angular/forms';
|
||||
import { MatDialog } from '@angular/material/dialog';
|
||||
|
||||
@@ -9,16 +9,18 @@ import { TranslateService } from '@ngx-translate/core';
|
||||
import { FormfieldBase } from 'app/shared/form-dialog/formfield/model/formfield-base';
|
||||
import { SelectBase } from 'app/shared/form-dialog/formfield/model/select-base';
|
||||
import { ChargeOffReasonToExpenseAccountMapping } from 'app/shared/models/general.model';
|
||||
import { CapitalizedIncome } from '../loan-product-payment-strategy-step/payment-allocation-model';
|
||||
|
||||
@Component({
|
||||
selector: 'mifosx-loan-product-accounting-step',
|
||||
templateUrl: './loan-product-accounting-step.component.html',
|
||||
styleUrls: ['./loan-product-accounting-step.component.scss']
|
||||
})
|
||||
export class LoanProductAccountingStepComponent implements OnInit {
|
||||
export class LoanProductAccountingStepComponent implements OnInit, OnChanges {
|
||||
@Input() loanProductsTemplate: any;
|
||||
@Input() accountingRuleData: any;
|
||||
@Input() loanProductFormValid: boolean;
|
||||
@Input() capitalizedIncome: CapitalizedIncome;
|
||||
|
||||
loanProductAccountingForm: UntypedFormGroup;
|
||||
|
||||
@@ -61,6 +63,10 @@ export class LoanProductAccountingStepComponent implements OnInit {
|
||||
this.setConditionalControls();
|
||||
}
|
||||
|
||||
ngOnChanges(changes: SimpleChanges): void {
|
||||
this.setCapitalizedIncomeControls();
|
||||
}
|
||||
|
||||
ngOnInit() {
|
||||
this.chargeData = this.loanProductsTemplate.chargeOptions || [];
|
||||
this.penaltyData = this.loanProductsTemplate.penaltyOptions || [];
|
||||
@@ -79,6 +85,7 @@ export class LoanProductAccountingStepComponent implements OnInit {
|
||||
});
|
||||
|
||||
const accountingMappings = this.loanProductsTemplate.accountingMappings;
|
||||
this.setCapitalizedIncomeControls();
|
||||
switch (this.loanProductsTemplate.accountingRule.id) {
|
||||
case 3:
|
||||
case 4:
|
||||
@@ -90,6 +97,12 @@ export class LoanProductAccountingStepComponent implements OnInit {
|
||||
this.loanProductAccountingForm.patchValue({
|
||||
enableAccrualActivityPosting: this.loanProductsTemplate.enableAccrualActivityPosting
|
||||
});
|
||||
if (this.capitalizedIncome.enableIncomeCapitalization) {
|
||||
this.loanProductAccountingForm.patchValue({
|
||||
deferredIncomeLiabilityAccountId: accountingMappings.deferredIncomeLiabilityAccount.id,
|
||||
incomeFromCapitalizationAccountId: accountingMappings.incomeFromCapitalizationAccount.id
|
||||
});
|
||||
}
|
||||
/* falls through */
|
||||
case 2:
|
||||
this.loanProductAccountingForm.patchValue({
|
||||
@@ -524,4 +537,22 @@ export class LoanProductAccountingStepComponent implements OnInit {
|
||||
get loanProductAccounting() {
|
||||
return this.loanProductAccountingForm.value;
|
||||
}
|
||||
|
||||
setCapitalizedIncomeControls() {
|
||||
if (this.isAccountingAccrualBased) {
|
||||
if (this.capitalizedIncome.enableIncomeCapitalization) {
|
||||
this.loanProductAccountingForm.addControl(
|
||||
'deferredIncomeLiabilityAccountId',
|
||||
new UntypedFormControl('', Validators.required)
|
||||
);
|
||||
this.loanProductAccountingForm.addControl(
|
||||
'incomeFromCapitalizationAccountId',
|
||||
new UntypedFormControl('', Validators.required)
|
||||
);
|
||||
} else {
|
||||
this.loanProductAccountingForm.removeControl('deferredIncomeLiabilityAccountId');
|
||||
this.loanProductAccountingForm.removeControl('incomeFromCapitalizationAccountId');
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+13
-2
@@ -6,7 +6,7 @@
|
||||
|
||||
<mat-form-field fxFlex="48%" *ngIf="enableIncomeCapitalization">
|
||||
<mat-label>{{ 'labels.inputs.Income capitalization calculation type' | translate }}</mat-label>
|
||||
<mat-select formControlName="incomeCapitalizationCalculationType" required>
|
||||
<mat-select formControlName="capitalizedIncomeCalculationType" required>
|
||||
<mat-option
|
||||
*ngFor="let capitalizedIncomeCalculationType of capitalizedIncomeCalculationTypeOptions"
|
||||
[value]="capitalizedIncomeCalculationType.id"
|
||||
@@ -17,7 +17,7 @@
|
||||
</mat-form-field>
|
||||
<mat-form-field fxFlex="48%" *ngIf="enableIncomeCapitalization">
|
||||
<mat-label>{{ 'labels.inputs.Income capitalization strategy' | translate }}</mat-label>
|
||||
<mat-select formControlName="incomeCapitalizationStrategy" required>
|
||||
<mat-select formControlName="capitalizedIncomeStrategy" required>
|
||||
<mat-option
|
||||
*ngFor="let capitalizedIncomeStrategy of capitalizedIncomeStrategyOptions"
|
||||
[value]="capitalizedIncomeStrategy.id"
|
||||
@@ -26,5 +26,16 @@
|
||||
</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
<mat-form-field fxFlex="48%" *ngIf="enableIncomeCapitalization">
|
||||
<mat-label>{{ 'labels.inputs.Income type' | translate }}</mat-label>
|
||||
<mat-select formControlName="capitalizedIncomeType" required>
|
||||
<mat-option
|
||||
*ngFor="let capitalizedIncomeType of capitalizedIncomeTypeOptions"
|
||||
[value]="capitalizedIncomeType.id"
|
||||
>
|
||||
{{ capitalizedIncomeType.value | translateKey: 'catalogs' }}
|
||||
</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
+59
-31
@@ -12,12 +12,14 @@ export class LoanProductCapitalizedIncomeStepComponent implements OnChanges {
|
||||
@Input() capitalizedIncome: CapitalizedIncome;
|
||||
@Input() capitalizedIncomeCalculationTypeOptions: StringEnumOptionData[];
|
||||
@Input() capitalizedIncomeStrategyOptions: StringEnumOptionData[];
|
||||
@Input() capitalizedIncomeTypeOptions: StringEnumOptionData[];
|
||||
|
||||
loanIncomeCapitalizationForm: UntypedFormGroup;
|
||||
|
||||
enableIncomeCapitalization: boolean;
|
||||
|
||||
@Output() setCapitalizedIncome = new EventEmitter<CapitalizedIncome>();
|
||||
@Output() setViewChildForm = new EventEmitter<UntypedFormGroup>();
|
||||
|
||||
constructor(private formBuilder: UntypedFormBuilder) {
|
||||
this.enableIncomeCapitalization =
|
||||
@@ -30,12 +32,16 @@ export class LoanProductCapitalizedIncomeStepComponent implements OnChanges {
|
||||
if (this.enableIncomeCapitalization) {
|
||||
this.loanIncomeCapitalizationForm = this.formBuilder.group({
|
||||
enableIncomeCapitalization: [this.enableIncomeCapitalization],
|
||||
incomeCapitalizationCalculationType: [
|
||||
this.capitalizedIncome.incomeCapitalizationCalculationType,
|
||||
capitalizedIncomeCalculationType: [
|
||||
this.capitalizedIncome.capitalizedIncomeCalculationType,
|
||||
Validators.required
|
||||
],
|
||||
incomeCapitalizationStrategy: [
|
||||
this.capitalizedIncome.incomeCapitalizationStrategy,
|
||||
capitalizedIncomeStrategy: [
|
||||
this.capitalizedIncome.capitalizedIncomeStrategy,
|
||||
Validators.required
|
||||
],
|
||||
capitalizedIncomeType: [
|
||||
this.capitalizedIncome.capitalizedIncomeType,
|
||||
Validators.required
|
||||
]
|
||||
});
|
||||
@@ -44,6 +50,7 @@ export class LoanProductCapitalizedIncomeStepComponent implements OnChanges {
|
||||
enableIncomeCapitalization: [this.enableIncomeCapitalization]
|
||||
});
|
||||
}
|
||||
this.setViewChildForm.emit(this.loanIncomeCapitalizationForm);
|
||||
}
|
||||
|
||||
ngOnChanges(changes: SimpleChanges): void {
|
||||
@@ -51,66 +58,87 @@ export class LoanProductCapitalizedIncomeStepComponent implements OnChanges {
|
||||
if (this.enableIncomeCapitalization) {
|
||||
this.loanIncomeCapitalizationForm.patchValue({
|
||||
enableIncomeCapitalization: this.enableIncomeCapitalization,
|
||||
incomeCapitalizationCalculationType: this.capitalizedIncome.incomeCapitalizationCalculationType,
|
||||
incomeCapitalizationStrategy: this.capitalizedIncome.incomeCapitalizationStrategy
|
||||
capitalizedIncomeCalculationType: this.capitalizedIncome.capitalizedIncomeCalculationType,
|
||||
capitalizedIncomeStrategy: this.capitalizedIncome.capitalizedIncomeStrategy,
|
||||
capitalizedIncomeType: this.capitalizedIncome.capitalizedIncomeType
|
||||
});
|
||||
}
|
||||
this.setViewChildForm.emit(this.loanIncomeCapitalizationForm);
|
||||
}
|
||||
|
||||
setConditionalControls() {
|
||||
this.loanIncomeCapitalizationForm.get('enableIncomeCapitalization').valueChanges.subscribe((enabled: boolean) => {
|
||||
this.enableIncomeCapitalization = enabled;
|
||||
if (this.enableIncomeCapitalization) {
|
||||
const incomeCapitalizationCalculationType =
|
||||
this.capitalizedIncome.incomeCapitalizationCalculationType == ''
|
||||
const capitalizedIncomeCalculationType =
|
||||
!this.capitalizedIncome.capitalizedIncomeCalculationType ||
|
||||
this.capitalizedIncome.capitalizedIncomeCalculationType == ''
|
||||
? this.capitalizedIncomeCalculationTypeOptions[0].id
|
||||
: this.capitalizedIncome.incomeCapitalizationCalculationType;
|
||||
: this.capitalizedIncome.capitalizedIncomeCalculationType;
|
||||
this.loanIncomeCapitalizationForm.addControl(
|
||||
'incomeCapitalizationCalculationType',
|
||||
new UntypedFormControl(
|
||||
this.capitalizedIncome.incomeCapitalizationCalculationType ||
|
||||
this.capitalizedIncomeCalculationTypeOptions[0].id,
|
||||
Validators.required
|
||||
)
|
||||
'capitalizedIncomeCalculationType',
|
||||
new UntypedFormControl(capitalizedIncomeCalculationType, Validators.required)
|
||||
);
|
||||
const incomeCapitalizationStrategy =
|
||||
this.capitalizedIncome.incomeCapitalizationStrategy == ''
|
||||
const capitalizedIncomeStrategy =
|
||||
!this.capitalizedIncome.capitalizedIncomeStrategy || this.capitalizedIncome.capitalizedIncomeStrategy == ''
|
||||
? this.capitalizedIncomeStrategyOptions[0].id
|
||||
: this.capitalizedIncome.incomeCapitalizationStrategy;
|
||||
: this.capitalizedIncome.capitalizedIncomeStrategy;
|
||||
this.loanIncomeCapitalizationForm.addControl(
|
||||
'incomeCapitalizationStrategy',
|
||||
new UntypedFormControl(incomeCapitalizationStrategy, Validators.required)
|
||||
'capitalizedIncomeStrategy',
|
||||
new UntypedFormControl(capitalizedIncomeStrategy, Validators.required)
|
||||
);
|
||||
const capitalizedIncomeType =
|
||||
!this.capitalizedIncome.capitalizedIncomeType || this.capitalizedIncome.capitalizedIncomeType == ''
|
||||
? this.capitalizedIncomeTypeOptions[0].id
|
||||
: this.capitalizedIncome.capitalizedIncomeType;
|
||||
this.loanIncomeCapitalizationForm.addControl(
|
||||
'capitalizedIncomeType',
|
||||
new UntypedFormControl(capitalizedIncomeType, Validators.required)
|
||||
);
|
||||
this.setCapitalizedIncome.emit({
|
||||
enableIncomeCapitalization: true,
|
||||
incomeCapitalizationCalculationType: incomeCapitalizationCalculationType,
|
||||
incomeCapitalizationStrategy: incomeCapitalizationStrategy
|
||||
capitalizedIncomeCalculationType: capitalizedIncomeCalculationType,
|
||||
capitalizedIncomeStrategy: capitalizedIncomeStrategy,
|
||||
capitalizedIncomeType: capitalizedIncomeType
|
||||
});
|
||||
|
||||
this.loanIncomeCapitalizationForm
|
||||
.get('incomeCapitalizationCalculationType')
|
||||
.get('capitalizedIncomeCalculationType')
|
||||
.valueChanges.subscribe((newValue: string) => {
|
||||
this.setCapitalizedIncome.emit({
|
||||
enableIncomeCapitalization: true,
|
||||
incomeCapitalizationCalculationType: newValue,
|
||||
incomeCapitalizationStrategy: this.loanIncomeCapitalizationForm.value.incomeCapitalizationStrategy
|
||||
capitalizedIncomeCalculationType: newValue,
|
||||
capitalizedIncomeStrategy: this.loanIncomeCapitalizationForm.value.capitalizedIncomeStrategy,
|
||||
capitalizedIncomeType: this.loanIncomeCapitalizationForm.value.capitalizedIncomeType
|
||||
});
|
||||
});
|
||||
this.loanIncomeCapitalizationForm
|
||||
.get('incomeCapitalizationStrategy')
|
||||
.get('capitalizedIncomeStrategy')
|
||||
.valueChanges.subscribe((newValue: string) => {
|
||||
this.setCapitalizedIncome.emit({
|
||||
enableIncomeCapitalization: true,
|
||||
incomeCapitalizationCalculationType:
|
||||
this.loanIncomeCapitalizationForm.value.incomeCapitalizationCalculationType,
|
||||
incomeCapitalizationStrategy: newValue
|
||||
capitalizedIncomeCalculationType:
|
||||
this.loanIncomeCapitalizationForm.value.capitalizedIncomeCalculationType,
|
||||
capitalizedIncomeStrategy: newValue,
|
||||
capitalizedIncomeType: this.loanIncomeCapitalizationForm.value.capitalizedIncomeType
|
||||
});
|
||||
});
|
||||
this.loanIncomeCapitalizationForm.get('capitalizedIncomeType').valueChanges.subscribe((newValue: string) => {
|
||||
this.setCapitalizedIncome.emit({
|
||||
enableIncomeCapitalization: true,
|
||||
capitalizedIncomeCalculationType: this.loanIncomeCapitalizationForm.value.capitalizedIncomeCalculationType,
|
||||
capitalizedIncomeStrategy: this.loanIncomeCapitalizationForm.value.capitalizedIncomeStrategy,
|
||||
capitalizedIncomeType: newValue
|
||||
});
|
||||
});
|
||||
} else {
|
||||
this.loanIncomeCapitalizationForm.removeControl('incomeCapitalizationCalculationType');
|
||||
this.loanIncomeCapitalizationForm.removeControl('incomeCapitalizationStrategy');
|
||||
this.loanIncomeCapitalizationForm.removeControl('capitalizedIncomeCalculationType');
|
||||
this.loanIncomeCapitalizationForm.removeControl('capitalizedIncomeStrategy');
|
||||
this.loanIncomeCapitalizationForm.removeControl('capitalizedIncomeType');
|
||||
this.setCapitalizedIncome.emit({ enableIncomeCapitalization: false });
|
||||
}
|
||||
|
||||
this.setViewChildForm.emit(this.loanIncomeCapitalizationForm);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
+3
-2
@@ -44,8 +44,9 @@ export interface CreditAllocation {
|
||||
|
||||
export interface CapitalizedIncome {
|
||||
enableIncomeCapitalization: boolean;
|
||||
incomeCapitalizationCalculationType?: string;
|
||||
incomeCapitalizationStrategy?: string;
|
||||
capitalizedIncomeCalculationType?: string;
|
||||
capitalizedIncomeStrategy?: string;
|
||||
capitalizedIncomeType?: string;
|
||||
}
|
||||
|
||||
export class PaymentAllocationTransactionTypes {
|
||||
|
||||
@@ -69,6 +69,7 @@ export interface LoanProduct {
|
||||
enableIncomeCapitalization?: boolean;
|
||||
capitalizedIncomeCalculationType?: OptionData;
|
||||
capitalizedIncomeStrategy?: OptionData;
|
||||
capitalizedIncomeType?: OptionData;
|
||||
|
||||
canDefineInstallmentAmount: boolean;
|
||||
graceOnArrearsAgeing?: number;
|
||||
@@ -117,6 +118,7 @@ export interface LoanProduct {
|
||||
accountingMappings?: { [key: string]: AccountingMapping };
|
||||
fundSourceAccountId?: number;
|
||||
goodwillCreditAccountId?: number;
|
||||
incomeFromCapitalizationAccountId?: number;
|
||||
incomeFromChargeOffFeesAccountId?: number;
|
||||
incomeFromChargeOffInterestAccountId?: number;
|
||||
incomeFromChargeOffPenaltyAccountId?: number;
|
||||
@@ -134,6 +136,7 @@ export interface LoanProduct {
|
||||
receivablePenaltyAccountId?: number;
|
||||
transfersInSuspenseAccountId?: number;
|
||||
writeOffAccountId?: number;
|
||||
deferredIncomeLiabilityAccountId?: number;
|
||||
// Advanced Accounting
|
||||
paymentChannelToFundSourceMappings?: PaymentChannelToFundSourceMapping[];
|
||||
feeToIncomeAccountMappings?: ChargeToIncomeAccountMapping[];
|
||||
|
||||
-1
@@ -170,7 +170,6 @@ export class SavingsAccountChargesStepComponent implements OnInit, OnChanges {
|
||||
newCharge = { ...charge, feeOnMonthDay: dateMonthDay };
|
||||
break;
|
||||
}
|
||||
console.log(newCharge);
|
||||
this.chargesDataSource.splice(this.chargesDataSource.indexOf(charge), 1, newCharge);
|
||||
this.chargesDataSource = this.chargesDataSource.concat([]);
|
||||
}
|
||||
|
||||
@@ -157,7 +157,11 @@ export class SettingsService {
|
||||
if (localStorage.getItem('mifosXServerURL')) {
|
||||
return localStorage.getItem('mifosXServerURL');
|
||||
}
|
||||
if (environment.baseApiUrl && environment.baseApiUrl !== '') {
|
||||
return environment.baseApiUrl;
|
||||
} else {
|
||||
return this.servers()[0];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -3,12 +3,7 @@
|
||||
<fa-icon icon="building" size="lg"></fa-icon>
|
||||
</span>
|
||||
<mat-label>{{ 'labels.inputs.Tenant' | translate }}</mat-label>
|
||||
<mat-select
|
||||
[disabled]="!allowSelection()"
|
||||
[formControl]="tenantSelector"
|
||||
(selectionChange)="setTenantIdentifier()"
|
||||
class="tenantselector"
|
||||
>
|
||||
<mat-select [formControl]="tenantSelector" (selectionChange)="setTenantIdentifier()" class="tenantselector">
|
||||
<mat-option *ngFor="let tenant of tenants" [value]="tenant">
|
||||
{{ tenant }}
|
||||
</mat-option>
|
||||
|
||||
@@ -19,6 +19,11 @@ export class TenantSelectorComponent implements OnInit {
|
||||
|
||||
ngOnInit(): void {
|
||||
this.tenantSelector.setValue(this.settingsService.tenantIdentifier);
|
||||
if (this.tenants.length > 1) {
|
||||
this.tenantSelector.enable;
|
||||
} else {
|
||||
this.tenantSelector.disable;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms';
|
||||
|
||||
export function minLessThanOrEqualMaxValidator(minKey: string, maxKey: string): ValidatorFn {
|
||||
return (group: AbstractControl): ValidationErrors | null => {
|
||||
const min = group.get(minKey)?.value;
|
||||
const max = group.get(maxKey)?.value;
|
||||
|
||||
if (min != null && max != null) {
|
||||
if (max * 1 < min * 1) {
|
||||
return { minGreaterThanMax: true };
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
};
|
||||
}
|
||||
@@ -40,7 +40,6 @@ export class ChargesTabComponent implements OnInit {
|
||||
this.sharesAccountData = data.sharesAccountData;
|
||||
this.chargesData = this.sharesAccountData.charges;
|
||||
});
|
||||
console.log(this.sharesAccountData);
|
||||
}
|
||||
|
||||
ngOnInit() {
|
||||
|
||||
@@ -141,7 +141,6 @@ export class CreateHookComponent implements OnInit {
|
||||
const addEventDialogRef = this.dialog.open(AddEventDialogComponent, {
|
||||
data: this.hooksTemplateData
|
||||
});
|
||||
console.log(this.hooksTemplateData);
|
||||
|
||||
addEventDialogRef.afterClosed().subscribe((response: any) => {
|
||||
if (response) {
|
||||
|
||||
@@ -231,9 +231,7 @@ export class ViewRoleComponent implements OnInit {
|
||||
this.formGroup.controls.roster.disable();
|
||||
this.checkboxesChanged = false;
|
||||
this.isDisabled = true;
|
||||
this.systemService.updateRolePermission(this.roleId, permissionData).subscribe((response: any) => {
|
||||
console.log('response: ', response);
|
||||
});
|
||||
this.systemService.updateRolePermission(this.roleId, permissionData).subscribe((response: any) => {});
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -127,3 +127,7 @@ $error-log: #ffa726;
|
||||
.accrual {
|
||||
color: $msg-default;
|
||||
}
|
||||
|
||||
.fa-question {
|
||||
color: $status-approved;
|
||||
}
|
||||
|
||||
@@ -1482,6 +1482,7 @@
|
||||
"Default Savings Account": "Výchozí spořicí účet",
|
||||
"Default Shares per Client": "Výchozí podíly na klienta",
|
||||
"Default Theme": "Výchozí motiv",
|
||||
"Deferred income": "Výnosy příštích období",
|
||||
"Deleted": "Smazáno",
|
||||
"Delinquency Action": "Akce delikvence",
|
||||
"Delinquency Bucket": "Delikvence Bucket",
|
||||
@@ -1709,6 +1710,7 @@
|
||||
"Income from fees": "Příjem z poplatků",
|
||||
"Income from fees Repayments": "Příjmy z poplatků Splátky",
|
||||
"Income from penalties": "Příjem z penále",
|
||||
"Income type": "Typ příjmu",
|
||||
"Incorporation No": "Čís",
|
||||
"Incorporation Number": "Číslo zápisu",
|
||||
"Incorporation Validity Till Date": "Platnost založení do data",
|
||||
@@ -2461,7 +2463,8 @@
|
||||
"Passwords do not match": "Hesla se neshodují",
|
||||
"Enable income capitalization": "Povolit kapitalizaci příjmu",
|
||||
"Income capitalization calculation type": "Typ výpočtu kapitalizace příjmu",
|
||||
"Income capitalization strategy": "Strategie kapitalizace příjmu"
|
||||
"Income capitalization strategy": "Strategie kapitalizace příjmu",
|
||||
"Income capitalization type": "Typ kapitalizace příjmu"
|
||||
},
|
||||
"links": {
|
||||
"Community": "Společenství",
|
||||
@@ -2498,6 +2501,7 @@
|
||||
"Block Withdrawal": "Blokovat výběr",
|
||||
"Breadcrumbs": "Strouhanka",
|
||||
"Calculate Interest": "Vypočítejte úrok",
|
||||
"Capitalized Income": "Kapitalizovaný příjem",
|
||||
"Centers": "Střediska",
|
||||
"Charge-Off": "Charge-Off",
|
||||
"Chart of Accounts": "Graf účtů",
|
||||
|
||||
@@ -1482,6 +1482,7 @@
|
||||
"Default Savings Account": "Standardsparkonto",
|
||||
"Default Shares per Client": "Standardanteile pro Kunde",
|
||||
"Default Theme": "Standardthema",
|
||||
"Deferred income": "Rechnungsabgrenzungsposten",
|
||||
"Deleted": "Gelöscht",
|
||||
"Delinquency Action": "Kriminalitätsaktion",
|
||||
"Delinquency Bucket": "Kriminalitätseimer",
|
||||
@@ -1709,6 +1710,7 @@
|
||||
"Income from fees": "Einnahmen aus Gebühren",
|
||||
"Income from fees Repayments": "Einnahmen aus Gebührenrückzahlungen",
|
||||
"Income from penalties": "Einnahmen aus Strafen",
|
||||
"Income type": "Einkommensart",
|
||||
"Incorporation No": "Gründungsnr",
|
||||
"Incorporation Number": "Gründungsnummer",
|
||||
"Incorporation Validity Till Date": "Gültigkeit der Gründung bis zum Datum",
|
||||
@@ -2461,7 +2463,8 @@
|
||||
"Passwords do not match": "Passwörter stimmen nicht überein",
|
||||
"Enable income capitalization": "Aktivieren Sie die Einkommenskapitalisierung",
|
||||
"Income capitalization calculation type": "Berechnungsart der Einkommenskapitalisierung",
|
||||
"Income capitalization strategy": "Strategie zur Ertragskapitalisierung"
|
||||
"Income capitalization strategy": "Strategie zur Ertragskapitalisierung",
|
||||
"Income capitalization type": "Art der Ertragskapitalisierung"
|
||||
},
|
||||
"links": {
|
||||
"Community": "Gemeinschaft",
|
||||
@@ -2498,6 +2501,7 @@
|
||||
"Block Withdrawal": "Auszahlung blockieren",
|
||||
"Breadcrumbs": "Semmelbrösel",
|
||||
"Calculate Interest": "Zinsen berechnen",
|
||||
"Capitalized Income": "Kapitalisiertes Einkommen",
|
||||
"Centers": "Zentren",
|
||||
"Charge-Off": "Abladen",
|
||||
"Chart of Accounts": "Kontenplan",
|
||||
|
||||
@@ -1486,6 +1486,7 @@
|
||||
"Default Savings Account": "Default Savings Account",
|
||||
"Default Shares per Client": "Default Shares per Client",
|
||||
"Default Theme": "Default Theme",
|
||||
"Deferred income": "Deferred income",
|
||||
"Deleted": "Deleted",
|
||||
"Delinquency Action": "Delinquency Action",
|
||||
"Delinquency Bucket": "Delinquency Bucket",
|
||||
@@ -1713,6 +1714,7 @@
|
||||
"Income from fees": "Income from fees",
|
||||
"Income from fees Repayments": "Income from fees Repayments",
|
||||
"Income from penalties": "Income from penalties",
|
||||
"Income type": "Income type",
|
||||
"Incorporation No": "Incorporation No",
|
||||
"Incorporation Number": "Incorporation Number",
|
||||
"Incorporation Date": "Incorporation Date",
|
||||
@@ -2468,7 +2470,8 @@
|
||||
"Passwords do not match": "Passwords do not match",
|
||||
"Enable income capitalization": "Enable income capitalization",
|
||||
"Income capitalization calculation type": "Income capitalization calculation type",
|
||||
"Income capitalization strategy": "Income capitalization strategy"
|
||||
"Income capitalization strategy": "Income capitalization strategy",
|
||||
"Income capitalization type": "Income capitalization type"
|
||||
},
|
||||
"links": {
|
||||
"Community": "Community",
|
||||
@@ -2505,6 +2508,7 @@
|
||||
"Block Withdrawal": "Block Withdrawal",
|
||||
"Breadcrumbs": "Breadcrumbs",
|
||||
"Calculate Interest": "Calculate Interest",
|
||||
"Capitalized Income": "Capitalized Income",
|
||||
"Centers": "Centers",
|
||||
"Charge-Off": "Charge-Off",
|
||||
"Chart of Accounts": "Chart of Accounts",
|
||||
|
||||
@@ -1481,6 +1481,7 @@
|
||||
"Default Savings Account": "Cuenta de Ahorros predeterminada",
|
||||
"Default Shares per Client": "Acciones predeterminadas por cliente",
|
||||
"Default Theme": "Tema predeterminado",
|
||||
"Deferred income": "Ingresos diferidos",
|
||||
"Deleted": "Eliminado",
|
||||
"Delinquency Action": "Acción de morosidad",
|
||||
"Delinquency Bucket": "Clasificación de morosidad",
|
||||
@@ -1708,6 +1709,7 @@
|
||||
"Income from fees": "Ingresos por Comisiones",
|
||||
"Income from fees Repayments": "Ingresos por comisiones Amortizaciones",
|
||||
"Income from penalties": "Ingresos por penalizaciones",
|
||||
"Income type": "Tipo de ingreso",
|
||||
"Incorporation No": "Número de constitución",
|
||||
"Incorporation Number": "Número de constitución",
|
||||
"Incorporation Validity Till Date": "Validez de constitución hasta la fecha",
|
||||
@@ -2461,7 +2463,8 @@
|
||||
"Passwords do not match": "Las contraseñas no coinciden",
|
||||
"Enable income capitalization": "Habilitar capitalización de ingresos",
|
||||
"Income capitalization calculation type": "Tipo de cálculo de capitalización de ingresos",
|
||||
"Income capitalization strategy": "Estrategia de capitalización de ingresos"
|
||||
"Income capitalization strategy": "Estrategia de capitalización de ingresos",
|
||||
"Income capitalization type": "Tipo de capitalización de ingresos"
|
||||
},
|
||||
"links": {
|
||||
"Community": "Comunidad",
|
||||
@@ -2498,6 +2501,7 @@
|
||||
"Block Withdrawal": "Bloquear retiros",
|
||||
"Breadcrumbs": "Migas de pan",
|
||||
"Calculate Interest": "Calcular interés",
|
||||
"Capitalized Income": "Ingreso capitalizado",
|
||||
"Centers": "Centros",
|
||||
"Charge-Off": "Cancelación",
|
||||
"Chart of Accounts": "Catálogo de cuentas",
|
||||
|
||||
@@ -1481,6 +1481,7 @@
|
||||
"Default Savings Account": "Cuenta de Ahorros predeterminada",
|
||||
"Default Shares per Client": "Acciones predeterminadas por cliente",
|
||||
"Default Theme": "Tema predeterminado",
|
||||
"Deferred income": "Ingresos diferidos",
|
||||
"Deleted": "Eliminado",
|
||||
"Delinquency Action": "Acción de morosidad",
|
||||
"Delinquency Bucket": "Clasificación de morosidad",
|
||||
@@ -1708,6 +1709,7 @@
|
||||
"Income from fees": "Ingresos por Comisiones",
|
||||
"Income from fees Repayments": "Ingresos por comisiones Amortizaciones",
|
||||
"Income from penalties": "Ingresos por penalizaciones",
|
||||
"Income type": "Tipo de ingreso",
|
||||
"Incorporation No": "Número de constitución",
|
||||
"Incorporation Number": "Número de constitución",
|
||||
"Incorporation Validity Till Date": "Validez de constitución hasta la fecha",
|
||||
@@ -2461,7 +2463,8 @@
|
||||
"Passwords do not match": "Las contraseñas no coinciden",
|
||||
"Enable income capitalization": "Habilitar capitalización de ingresos",
|
||||
"Income capitalization calculation type": "Tipo de cálculo de capitalización de ingresos",
|
||||
"Income capitalization strategy": "Estrategia de capitalización de ingresos"
|
||||
"Income capitalization strategy": "Estrategia de capitalización de ingresos",
|
||||
"Income capitalization type": "Tipo de capitalización de ingresos"
|
||||
},
|
||||
"links": {
|
||||
"Community": "Comunidad",
|
||||
@@ -2498,6 +2501,7 @@
|
||||
"Block Withdrawal": "Bloquear retiros",
|
||||
"Breadcrumbs": "Migas de pan",
|
||||
"Calculate Interest": "Calcular interés",
|
||||
"Capitalized Income": "Ingreso capitalizado",
|
||||
"Centers": "Centros",
|
||||
"Charge-Off": "Cancelación",
|
||||
"Chart of Accounts": "Catálogo de cuentas",
|
||||
|
||||
@@ -1482,6 +1482,7 @@
|
||||
"Default Savings Account": "Compte d'épargne par défaut",
|
||||
"Default Shares per Client": "Actions par défaut par client",
|
||||
"Default Theme": "Thème par défaut",
|
||||
"Deferred income": "Produits différés",
|
||||
"Deleted": "Supprimé",
|
||||
"Delinquency Action": "Action de délinquance",
|
||||
"Delinquency Bucket": "Seau de délinquance",
|
||||
@@ -1709,6 +1710,7 @@
|
||||
"Income from fees": "Revenus d'honoraires",
|
||||
"Income from fees Repayments": "Revenus de taxes Remboursements",
|
||||
"Income from penalties": "Revenus des pénalités",
|
||||
"Income type": "Type de revenu",
|
||||
"Incorporation No": "Numéro de constitution",
|
||||
"Incorporation Number": "Numéro de constitution",
|
||||
"Incorporation Validity Till Date": "Validité de la constitution jusqu'à la date",
|
||||
@@ -2461,7 +2463,8 @@
|
||||
"Passwords do not match": "Les mots de passe ne correspondent pas",
|
||||
"Enable income capitalization": "Activer la capitalisation des revenus",
|
||||
"Income capitalization calculation type": "Type de calcul de capitalisation des revenus",
|
||||
"Income capitalization strategy": "Stratégie de capitalisation des revenus"
|
||||
"Income capitalization strategy": "Stratégie de capitalisation des revenus",
|
||||
"Income capitalization type": "Type de capitalisation des revenus"
|
||||
},
|
||||
"links": {
|
||||
"Community": "Communauté",
|
||||
@@ -2498,6 +2501,7 @@
|
||||
"Block Withdrawal": "Bloquer le retrait",
|
||||
"Breadcrumbs": "Chapelure",
|
||||
"Calculate Interest": "Calculer les intérêts",
|
||||
"Capitalized Income": "Revenu capitalisé",
|
||||
"Centers": "Centres",
|
||||
"Charge-Off": "Amortir",
|
||||
"Chart of Accounts": "Plan comptable",
|
||||
|
||||
@@ -1482,6 +1482,7 @@
|
||||
"Default Savings Account": "Conto di risparmio predefinito",
|
||||
"Default Shares per Client": "Condivisioni predefinite per cliente",
|
||||
"Default Theme": "Tema predefinito",
|
||||
"Deferred income": "Ricavi differiti",
|
||||
"Deleted": "Eliminato",
|
||||
"Delinquency Action": "Azione di delinquenza",
|
||||
"Delinquency Bucket": "Il secchio della delinquenza",
|
||||
@@ -1709,6 +1710,7 @@
|
||||
"Income from fees": "Proventi da commissioni",
|
||||
"Income from fees Repayments": "Proventi da commissioni Rimborsi",
|
||||
"Income from penalties": "Proventi da sanzioni",
|
||||
"Income type": "Tipo di reddito",
|
||||
"Incorporation No": "Costituzione n",
|
||||
"Incorporation Number": "Numero di costituzione",
|
||||
"Incorporation Validity Till Date": "Validità della costituzione fino alla data",
|
||||
@@ -2461,7 +2463,8 @@
|
||||
"Passwords do not match": "Le password non corrispondono",
|
||||
"Enable income capitalization": "Abilita la capitalizzazione del reddito",
|
||||
"Income capitalization calculation type": "Tipo di calcolo della capitalizzazione del reddito",
|
||||
"Income capitalization strategy": "Strategia di capitalizzazione del reddito"
|
||||
"Income capitalization strategy": "Strategia di capitalizzazione del reddito",
|
||||
"Income capitalization type": "Tipo di capitalizzazione del reddito"
|
||||
},
|
||||
"links": {
|
||||
"Community": "Comunità",
|
||||
@@ -2498,6 +2501,7 @@
|
||||
"Block Withdrawal": "Blocca il ritiro",
|
||||
"Breadcrumbs": "Briciole di pane",
|
||||
"Calculate Interest": "Calcola gli interessi",
|
||||
"Capitalized Income": "Reddito capitalizzato",
|
||||
"Centers": "Centri",
|
||||
"Charge-Off": "Addebito",
|
||||
"Chart of Accounts": "Piano dei conti",
|
||||
|
||||
@@ -1483,6 +1483,7 @@
|
||||
"Default Savings Account": "기본 저축 계좌",
|
||||
"Default Shares per Client": "클라이언트당 기본 공유",
|
||||
"Default Theme": "기본 테마",
|
||||
"Deferred income": "이연소득",
|
||||
"Deleted": "삭제됨",
|
||||
"Delinquency Action": "연체 행동",
|
||||
"Delinquency Bucket": "연체 버킷",
|
||||
@@ -1710,6 +1711,7 @@
|
||||
"Income from fees": "수수료 수입",
|
||||
"Income from fees Repayments": "수수료 수익 상환",
|
||||
"Income from penalties": "벌금으로 인한 소득",
|
||||
"Income type": "소득 유형",
|
||||
"Incorporation No": "법인설립번호",
|
||||
"Incorporation Number": "법인번호",
|
||||
"Incorporation Validity Till Date": "법인설립 유효일까지",
|
||||
@@ -2462,7 +2464,8 @@
|
||||
"Passwords do not match": "비밀번호가 일치하지 않습니다.",
|
||||
"Enable income capitalization": "소득 자본화 활성화",
|
||||
"Income capitalization calculation type": "소득 자본화 계산 유형",
|
||||
"Income capitalization strategy": "소득 자본화 전략"
|
||||
"Income capitalization strategy": "소득 자본화 전략",
|
||||
"Income capitalization type": "소득 자본화 유형"
|
||||
},
|
||||
"links": {
|
||||
"Community": "지역 사회",
|
||||
@@ -2499,6 +2502,7 @@
|
||||
"Block Withdrawal": "출금 차단",
|
||||
"Breadcrumbs": "빵 부스러기",
|
||||
"Calculate Interest": "이자 계산",
|
||||
"Capitalized Income": "자본화 소득",
|
||||
"Centers": "센터",
|
||||
"Charge-Off": "상각",
|
||||
"Chart of Accounts": "계정 목록",
|
||||
|
||||
@@ -1482,6 +1482,7 @@
|
||||
"Default Savings Account": "Numatytoji taupomoji sąskaita",
|
||||
"Default Shares per Client": "Numatytosios akcijos vienam klientui",
|
||||
"Default Theme": "Numatytoji tema",
|
||||
"Deferred income": "Atidėtos pajamos",
|
||||
"Deleted": "Ištrinta",
|
||||
"Delinquency Action": "Deliktingumo veiksmas",
|
||||
"Delinquency Bucket": "Nusikaltimų kibiras",
|
||||
@@ -1709,6 +1710,7 @@
|
||||
"Income from fees": "Pajamos iš mokesčių",
|
||||
"Income from fees Repayments": "Pajamos iš mokesčių Grąžinimai",
|
||||
"Income from penalties": "Pajamos iš baudų",
|
||||
"Income type": "Pajamų rūšis",
|
||||
"Incorporation No": "Įmonės Nr",
|
||||
"Incorporation Number": "Įmonės numeris",
|
||||
"Incorporation Validity Till Date": "Įkūrimo galiojimas iki datos",
|
||||
@@ -2461,7 +2463,8 @@
|
||||
"Passwords do not match": "Slaptažodžiai nesutampa",
|
||||
"Enable income capitalization": "Įgalinti pajamų kapitalizaciją",
|
||||
"Income capitalization calculation type": "Pajamų kapitalizavimo skaičiavimo tipas",
|
||||
"Income capitalization strategy": "Pajamų kapitalizavimo strategija"
|
||||
"Income capitalization strategy": "Pajamų kapitalizavimo strategija",
|
||||
"Income capitalization type": "Pajamų kapitalizacijos tipas"
|
||||
},
|
||||
"links": {
|
||||
"Community": "bendruomenė",
|
||||
@@ -2498,6 +2501,7 @@
|
||||
"Block Withdrawal": "Blokuoti išėmimą",
|
||||
"Breadcrumbs": "Duonos trupiniai",
|
||||
"Calculate Interest": "Apskaičiuokite palūkanas",
|
||||
"Capitalized Income": "Kapitalizuotos pajamos",
|
||||
"Centers": "Centrai",
|
||||
"Charge-Off": "Atsakingas už",
|
||||
"Chart of Accounts": "Sąskaitų planas",
|
||||
|
||||
@@ -1482,6 +1482,7 @@
|
||||
"Default Savings Account": "Noklusējuma krājkonts",
|
||||
"Default Shares per Client": "Noklusējuma akcijas vienam klientam",
|
||||
"Default Theme": "Noklusējuma motīvs",
|
||||
"Deferred income": "Atliktie ienākumi",
|
||||
"Deleted": "Izdzēsts",
|
||||
"Delinquency Action": "Likumpārkāpums",
|
||||
"Delinquency Bucket": "Noziedzības spainis",
|
||||
@@ -1709,6 +1710,7 @@
|
||||
"Income from fees": "Ienākumi no honorāriem",
|
||||
"Income from fees Repayments": "Ienākumi no nodevām Atmaksas",
|
||||
"Income from penalties": "Ienākumi no sodiem",
|
||||
"Income type": "Ienākumu veids",
|
||||
"Incorporation No": "Dibināšanas Nr",
|
||||
"Incorporation Number": "Uzņēmuma numurs",
|
||||
"Incorporation Validity Till Date": "Reģistrācijas derīguma termiņš līdz datumam",
|
||||
@@ -2461,7 +2463,8 @@
|
||||
"Passwords do not match": "Paroles nesakrīt",
|
||||
"Enable income capitalization": "Iespējot ienākumu kapitalizāciju",
|
||||
"Income capitalization calculation type": "Ienākumu kapitalizācijas aprēķina veids",
|
||||
"Income capitalization strategy": "Ienākumu kapitalizācijas stratēģija"
|
||||
"Income capitalization strategy": "Ienākumu kapitalizācijas stratēģija",
|
||||
"Income capitalization type": "Ienākumu kapitalizācijas veids"
|
||||
},
|
||||
"links": {
|
||||
"Community": "kopiena",
|
||||
@@ -2498,6 +2501,7 @@
|
||||
"Block Withdrawal": "Bloķēt izņemšanu",
|
||||
"Breadcrumbs": "Maizes drupačas",
|
||||
"Calculate Interest": "Aprēķināt procentus",
|
||||
"Capitalized Income": "Kapitalizētie ienākumi",
|
||||
"Centers": "Centri",
|
||||
"Charge-Off": "Charge-Off",
|
||||
"Chart of Accounts": "Kontu plāns",
|
||||
|
||||
@@ -1482,6 +1482,7 @@
|
||||
"Default Savings Account": "पूर्वनिर्धारित बचत खाता",
|
||||
"Default Shares per Client": "प्रति ग्राहक पूर्वनिर्धारित शेयरहरू",
|
||||
"Default Theme": "पूर्वनिर्धारित विषयवस्तु",
|
||||
"Deferred income": "स्थगित आय",
|
||||
"Deleted": "मेटाइयो",
|
||||
"Delinquency Action": "अपराध कार्य",
|
||||
"Delinquency Bucket": "अपराध बाल्टी",
|
||||
@@ -1709,6 +1710,7 @@
|
||||
"Income from fees": "शुल्कबाट आम्दानी",
|
||||
"Income from fees Repayments": "शुल्क भुक्तानीबाट आय",
|
||||
"Income from penalties": "दण्डबाट आम्दानी",
|
||||
"Income type": "आय प्रकार",
|
||||
"Incorporation No": "निगम नं",
|
||||
"Incorporation Number": "निगमन नम्बर",
|
||||
"Incorporation Validity Till Date": "मिति सम्म सम्मिलित वैधता",
|
||||
@@ -2461,7 +2463,8 @@
|
||||
"Passwords do not match": "पासवर्डहरू मेल खाँदैनन्",
|
||||
"Enable income capitalization": "आय पूंजीकरण सक्षम गर्नुहोस्",
|
||||
"Income capitalization calculation type": "आय पूंजीकरण गणना प्रकार",
|
||||
"Income capitalization strategy": "आय पूंजीकरण रणनीति"
|
||||
"Income capitalization strategy": "आय पूंजीकरण रणनीति",
|
||||
"Income capitalization type": "आय पूँजीकरण प्रकार"
|
||||
},
|
||||
"links": {
|
||||
"Community": "समुदाय",
|
||||
@@ -2498,6 +2501,7 @@
|
||||
"Block Withdrawal": "ब्लक निकासी",
|
||||
"Breadcrumbs": "ब्रेडक्रम्ब्स",
|
||||
"Calculate Interest": "ब्याज गणना गर्नुहोस्",
|
||||
"Capitalized Income": "पुँजीगत आय",
|
||||
"Centers": "केन्द्रहरू",
|
||||
"Charge-Off": "चार्ज-अफ",
|
||||
"Chart of Accounts": "लेखाको चार्ट",
|
||||
|
||||
@@ -1482,6 +1482,7 @@
|
||||
"Default Savings Account": "Conta poupança padrão",
|
||||
"Default Shares per Client": "Compartilhamentos padrão por cliente",
|
||||
"Default Theme": "Tema Padrão",
|
||||
"Deferred income": "Renda diferida",
|
||||
"Deleted": "Excluído",
|
||||
"Delinquency Action": "Ação de inadimplência",
|
||||
"Delinquency Bucket": "Balde de inadimplência",
|
||||
@@ -1709,6 +1710,7 @@
|
||||
"Income from fees": "Renda de taxas",
|
||||
"Income from fees Repayments": "Reembolsos de taxas",
|
||||
"Income from penalties": "Renda de penalidades",
|
||||
"Income type": "Tipo de renda",
|
||||
"Incorporation No": "Incorporação Não",
|
||||
"Incorporation Number": "Número de Incorporação",
|
||||
"Incorporation Validity Till Date": "Validade de incorporação até a data",
|
||||
@@ -2461,7 +2463,8 @@
|
||||
"Passwords do not match": "As senhas não coincidem",
|
||||
"Enable income capitalization": "Habilitar capitalização de renda",
|
||||
"Income capitalization calculation type": "Tipo de cálculo de capitalização de renda",
|
||||
"Income capitalization strategy": "Estratégia de capitalização de renda"
|
||||
"Income capitalization strategy": "Estratégia de capitalização de renda",
|
||||
"Income capitalization type": "Tipo de capitalização de renda"
|
||||
},
|
||||
"links": {
|
||||
"Community": "Comunidade",
|
||||
@@ -2498,6 +2501,7 @@
|
||||
"Block Withdrawal": "Retirada de bloco",
|
||||
"Breadcrumbs": "Migalhas de pão",
|
||||
"Calculate Interest": "Calcular juros",
|
||||
"Capitalized Income": "Renda Capitalizada",
|
||||
"Centers": "Centros",
|
||||
"Charge-Off": "Cobrança",
|
||||
"Chart of Accounts": "Plano de contas",
|
||||
|
||||
@@ -1482,6 +1482,7 @@
|
||||
"Default Savings Account": "Akaunti ya Akiba chaguomsingi",
|
||||
"Default Shares per Client": "Hisa Chaguomsingi kwa kila Mteja",
|
||||
"Default Theme": "Mandhari Chaguomsingi",
|
||||
"Deferred income": "Mapato yaliyoahirishwa",
|
||||
"Deleted": "Imefutwa",
|
||||
"Delinquency Action": "Kitendo cha Delinquency",
|
||||
"Delinquency Bucket": "Ndoo ya Uhalifu",
|
||||
@@ -1709,6 +1710,7 @@
|
||||
"Income from fees": "Mapato kutoka kwa ada",
|
||||
"Income from fees Repayments": "Mapato kutokana na Malipo ya ada",
|
||||
"Income from penalties": "Mapato kutoka kwa adhabu",
|
||||
"Income type": "Aina ya mapato",
|
||||
"Incorporation No": "Incorporation No",
|
||||
"Incorporation Number": "Nambari ya Kuingiza",
|
||||
"Incorporation Validity Till Date": "Uhalali wa Ujumuishaji Hadi Tarehe",
|
||||
@@ -2461,7 +2463,8 @@
|
||||
"Passwords do not match": "Manenosiri hayalingani",
|
||||
"Enable income capitalization": "Washa mtaji wa mapato",
|
||||
"Income capitalization calculation type": "Aina ya kukokotoa mtaji wa mapato",
|
||||
"Income capitalization strategy": "Mkakati wa mtaji wa mapato"
|
||||
"Income capitalization strategy": "Mkakati wa mtaji wa mapato",
|
||||
"Income capitalization type": "Aina ya mtaji wa mapato"
|
||||
},
|
||||
"links": {
|
||||
"Community": "Jumuiya",
|
||||
@@ -2498,6 +2501,7 @@
|
||||
"Block Withdrawal": "Zuia Uondoaji",
|
||||
"Breadcrumbs": "Makombo ya mkate",
|
||||
"Calculate Interest": "Hesabu Riba",
|
||||
"Capitalized Income": "Mapato ya Mtaji",
|
||||
"Centers": "Vituo",
|
||||
"Charge-Off": "Chaji-Zima",
|
||||
"Chart of Accounts": "Chati ya Hesabu",
|
||||
|
||||
@@ -18,7 +18,7 @@ export const environment = {
|
||||
// For connecting to server running elsewhere set the base API URL
|
||||
baseApiUrl:
|
||||
loadedEnv['fineractApiUrl'] ||
|
||||
(loadedEnv['fineractApiUrls']?.length > 0 ? loadedEnv['fineractApiUrls'][0] : window.location.origin),
|
||||
(loadedEnv['fineractApiUrls']?.length > 0 ? loadedEnv['fineractApiUrls'].split(',')[0] : window.location.origin),
|
||||
oauthServerUrl: loadedEnv['oauthServerUrl'] || loadedEnv['fineractApiUrl'] + loadedEnv['apiProvider'],
|
||||
allowServerSwitch: env.allow_switching_backend_instance,
|
||||
apiProvider: loadedEnv['apiProvider'] || '/fineract-provider/api',
|
||||
|
||||
@@ -23,7 +23,7 @@ export const environment = {
|
||||
// For connecting to server running elsewhere set the base API URL
|
||||
baseApiUrl:
|
||||
loadedEnv['fineractApiUrl'] ||
|
||||
(loadedEnv['fineractApiUrls']?.length > 0 ? loadedEnv['fineractApiUrls'][0] : window.location.origin),
|
||||
(loadedEnv['fineractApiUrls']?.length > 0 ? loadedEnv['fineractApiUrls'].split(',')[0] : window.location.origin),
|
||||
allowServerSwitch: env.allow_switching_backend_instance,
|
||||
apiProvider: loadedEnv['apiProvider'] || '/fineract-provider/api',
|
||||
apiVersion: loadedEnv['apiVersion'] || '/v1',
|
||||
|
||||
Reference in New Issue
Block a user