Merge pull request #2472 from alberto-art3ch/enhancement/loan_contract_termination

Loan Contrac Termination
This commit is contained in:
Jose Alberto Hernandez
2025-05-25 12:33:16 -05:00
committed by GitHub
33 changed files with 4998 additions and 3093 deletions
+1
View File
@@ -58,3 +58,4 @@ Thumbs.db
cypress/
src/assets/env.js
src/environments/.env.ts
+4799 -3029
View File
File diff suppressed because it is too large Load Diff
@@ -75,6 +75,8 @@ export class LoanActionButtonResolver {
return this.loansService.getLoanActionTemplate(loanId, 'charge-off');
} else if (loanActionButton === 'Capitalized Income') {
return this.loansService.getLoanActionTemplate(loanId, 'capitalizedIncome');
} else if (loanActionButton === 'Contract Termination') {
return this.loansService.getLoanActionTemplate(loanId, 'contractTermination');
} else {
return undefined;
}
@@ -5,7 +5,10 @@
[dataObject]="actionButtonData"
></mifosx-assign-loan-officer>
<mifosx-foreclosure [dataObject]="actionButtonData" *ngIf="actions['Foreclosure']"></mifosx-foreclosure>
<mifosx-prepay-loan [dataObject]="actionButtonData" *ngIf="actions['Prepay Loan']"></mifosx-prepay-loan>
<mifosx-prepay-loan
[dataObject]="actionButtonData"
*ngIf="actions['Prepay Loan'] || actions['Contract Termination']"
></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>
@@ -52,6 +52,7 @@ export class LoanAccountActionsComponent {
'Interest Payment Waiver': boolean;
'Add Interest Pause': boolean;
'Capitalized Income': boolean;
'Contract Termination': boolean;
} = {
Close: false,
'Undo Approval': false,
@@ -88,7 +89,8 @@ export class LoanAccountActionsComponent {
'Re-Amortize': false,
'Interest Payment Waiver': false,
'Add Interest Pause': false,
'Capitalized Income': false
'Capitalized Income': false,
'Contract Termination': false
};
actionButtonData: any;
@@ -119,5 +121,7 @@ export class LoanAccountActionsComponent {
}
this.actions[this.actionName as keyof typeof this.actions] = true;
});
this.actionButtonData['actionName'] = this.actionName;
}
}
@@ -81,12 +81,22 @@ export class MakeRepaymentComponent implements OnInit {
note: ''
});
this.repaymentLoanForm.addControl(
'transactionAmount',
new UntypedFormControl('', [
Validators.required,
Validators.min(0.001)])
);
if (this.isCapitalizedIncome()) {
this.repaymentLoanForm.addControl(
'transactionAmount',
new UntypedFormControl('', [
Validators.required,
Validators.min(0.001),
Validators.max(this.dataObject.amount)])
);
} else {
this.repaymentLoanForm.addControl(
'transactionAmount',
new UntypedFormControl('', [
Validators.required,
Validators.min(0.001)])
);
}
}
setRepaymentLoanDetails() {
@@ -3,7 +3,7 @@
<form [formGroup]="prepayLoanForm" (ngSubmit)="submit()">
<mat-card-content>
<div class="layout-column">
<mat-form-field (click)="transactionDatePicker.open()">
<mat-form-field (click)="transactionDatePicker.open()" *ngIf="!contractTermination">
<mat-label>{{ 'labels.inputs.Transaction Date' | translate }}</mat-label>
<input
matInput
@@ -56,6 +56,7 @@
</div>
<mifosx-input-amount
*ngIf="!contractTermination"
[currency]="currency"
[isRequired]="true"
[inputFormControl]="prepayLoanForm.controls.transactionAmount"
@@ -68,7 +69,7 @@
<input matInput formControlName="externalId" />
</mat-form-field>
<mat-form-field>
<mat-form-field *ngIf="!contractTermination">
<mat-label>{{ 'labels.inputs.Payment Type' | translate }}</mat-label>
<mat-select formControlName="paymentTypeId">
<mat-option *ngFor="let paymentType of paymentTypes" [value]="paymentType.id">
@@ -77,7 +78,7 @@
</mat-select>
</mat-form-field>
<div class="flex-fill">
<div class="flex-fill" *ngIf="!contractTermination">
<span class="expandcollapsebutton m-l-10 m-t-40 flex-75" (click)="addPaymentDetails()">
<mat-slide-toggle>
<div [className]="showPaymentDetails ? 'enabled' : 'disabled'">
@@ -38,6 +38,7 @@ export class PrepayLoanComponent implements OnInit {
prepayData: any;
currency: Currency | null = null;
contractTermination: boolean;
/**
* @param {FormBuilder} formBuilder Form Builder.
@@ -62,10 +63,13 @@ export class PrepayLoanComponent implements OnInit {
* and initialize with the required values
*/
ngOnInit() {
this.prepayData = this.dataObject;
this.contractTermination = this.dataObject['actionName'] == 'Contract Termination';
this.maxDate = this.settingsService.businessDate;
this.createprepayLoanForm();
this.setPrepayLoanDetails();
this.prepayData = this.dataObject;
if (!this.contractTermination) {
this.setPrepayLoanDetails();
}
if (this.dataObject.currency) {
this.currency = this.dataObject.currency;
}
@@ -75,19 +79,26 @@ export class PrepayLoanComponent implements OnInit {
* Creates the prepay loan form.
*/
createprepayLoanForm() {
this.prepayLoanForm = this.formBuilder.group({
transactionDate: [
new Date(),
Validators.required
],
transactionAmount: [
'',
Validators.required
],
externalId: [''],
paymentTypeId: [''],
note: ['']
});
if (this.contractTermination) {
this.prepayLoanForm = this.formBuilder.group({
externalId: [''],
note: ['']
});
} else {
this.prepayLoanForm = this.formBuilder.group({
transactionDate: [
new Date(),
Validators.required
],
transactionAmount: [
'',
Validators.required
],
externalId: [''],
paymentTypeId: [''],
note: ['']
});
}
}
/**
@@ -133,7 +144,7 @@ export class PrepayLoanComponent implements OnInit {
/**
* Submits the prepay loan form
*/
submit() {
submitRepayment() {
const prepayLoanFormData = this.prepayLoanForm.value;
const locale = this.settingsService.language.code;
const dateFormat = this.settingsService.dateFormat;
@@ -151,4 +162,21 @@ export class PrepayLoanComponent implements OnInit {
this.router.navigate(['../../general'], { relativeTo: this.route });
});
}
submitContractTermination() {
const data = {
...this.prepayLoanForm.value
};
this.loanService.loanActionButtons(this.loanId, 'contractTermination', data).subscribe((response: any) => {
this.router.navigate(['../../general'], { relativeTo: this.route });
});
}
submit() {
if (this.contractTermination) {
this.submitContractTermination();
} else {
this.submitRepayment();
}
}
}
@@ -1,3 +1,5 @@
import { OptionData } from 'app/shared/models/option-data.model';
/** Recurring Deposits Account Buttons Configuration */
export class LoansAccountButtonConfiguration {
optionArray: {
@@ -16,8 +18,8 @@ export class LoansAccountButtonConfiguration {
taskPermissionName?: string;
}[];
constructor(status: string) {
this.setOptions(status);
constructor(status: string, substatus: OptionData) {
this.setOptions(status, substatus);
this.setButtons(status);
}
@@ -154,7 +156,7 @@ export class LoansAccountButtonConfiguration {
}
}
setOptions(status: string) {
setOptions(status: string, substatus: OptionData) {
switch (status) {
case 'Active':
this.optionArray = [
@@ -199,6 +201,12 @@ export class LoansAccountButtonConfiguration {
taskPermissionName: 'SALE_LOAN'
}
];
if (!this.isContractTermination(substatus)) {
this.optionArray.push({
name: 'Contract Termination',
taskPermissionName: 'CONTRACT_TERMINATION_LOAN'
});
}
this.optionPaymentArray = [
{
name: 'Goodwill Credit',
@@ -281,4 +289,11 @@ export class LoansAccountButtonConfiguration {
addButton(option: { name: string; icon: string; taskPermissionName?: string }) {
this.buttonsArray.push(option);
}
private isContractTermination(substatus: OptionData): boolean {
if (substatus == null) {
return false;
}
return substatus.code === 'loanSubStatus.loanSubStatusType.contractTermination';
}
}
@@ -22,9 +22,7 @@
<i
class="fa fa-stop"
matTooltip="{{ 'labels.status.' + loanDetailsData.status.value | translate }}"
[ngClass]="
loanDetailsData.inArrears ? 'status-active-overdue' : (iconLoanStatusColor() | statusLookup)
"
[ngClass]="iconLoanStatusColor() | statusLookup"
></i>
<span class="m-r-5">{{ 'labels.heading.Loan Product' | translate }} :</span>
<span class="m-r-5"
@@ -17,6 +17,7 @@ import { Currency } from 'app/shared/models/general.model';
import { DelinquencyPausePeriod } from '../models/loan-account.model';
import { TranslateService } from '@ngx-translate/core';
import { LoanTransaction } from 'app/products/loan-products/models/loan-account.model';
import { OptionData } from 'app/shared/models/option-data.model';
@Component({
selector: 'mifosx-loans-view',
@@ -46,6 +47,7 @@ export class LoansViewComponent implements OnInit {
loanDelinquencyClassificationStyle = '';
loanStatus: LoanStatus;
loanSubStatus: OptionData | null = null;
currency: Currency;
loanReAged = false;
loanReAmortized = false;
@@ -63,6 +65,7 @@ export class LoansViewComponent implements OnInit {
this.loanDatatables = data.loanDatatables;
this.loanDisplayArrearsDelinquency = data.loanArrearsDelinquencyConfig.value || 0;
this.loanStatus = this.loanDetailsData.status;
this.loanSubStatus = this.loanDetailsData.subStatus === undefined ? null : this.loanDetailsData.subStatus;
this.currency = this.loanDetailsData.currency;
if (this.loanStatus.active) {
this.loanDetailsData.transactions.forEach((lt: LoanTransaction) => {
@@ -75,6 +78,7 @@ export class LoansViewComponent implements OnInit {
}
});
}
this.setConditionalButtons();
}
);
this.loanId = this.route.snapshot.params['loanId'];
@@ -90,6 +94,8 @@ export class LoansViewComponent implements OnInit {
});
this.recalculateInterest = this.loanDetailsData.recalculateInterest || true;
this.status = this.loanDetailsData.status.value;
this.loanStatus = this.loanDetailsData.status;
this.loanSubStatus = this.loanDetailsData.subStatus === undefined ? null : this.loanDetailsData.subStatus;
if (this.loanStatus.active && this.loanDetailsData.multiDisburseLoan) {
if (this.loanDetailsData && this.loanDetailsData.transactions) {
this.loanDetailsData.transactions.forEach((transaction: any) => {
@@ -112,7 +118,7 @@ export class LoansViewComponent implements OnInit {
// Defines the buttons based on the status of the loan account
setConditionalButtons() {
this.buttonConfig = new LoansAccountButtonConfiguration(this.status);
this.buttonConfig = new LoansAccountButtonConfiguration(this.status, this.loanSubStatus);
if (this.status === 'Submitted and pending approval') {
this.buttonConfig.addOption({
@@ -345,9 +351,32 @@ export class LoansViewComponent implements OnInit {
if (this.loanDetailsData.chargedOff) {
return 'loanStatusType.chargeoff';
}
if (this.isContractTermination(this.loanSubStatus)) {
return 'loanSubStatusType.contractTermination';
}
if (this.loanDetailsData.inArrears) {
return 'loanStatusType.activeOverdue';
}
return this.loanDetailsData.status.code;
}
loanStatusTooltip() {
if (this.loanDetailsData.chargedOff) {
return 'Chargeoff';
}
if (this.loanDetailsData.inArrears) {
return 'activeOverdue';
}
return this.loanDetailsData.status.code;
}
loanSubStatusTooltip() {
if (this.isContractTermination(this.loanSubStatus)) {
return 'contractTermination';
}
return '';
}
/**
* Delete loan Account
*/
@@ -375,4 +404,11 @@ export class LoansViewComponent implements OnInit {
.navigateByUrl(`/clients/${clientId}/loans-accounts`, { skipLocationChange: true })
.then(() => this.router.navigate([url]));
}
private isContractTermination(substatus: OptionData): boolean {
if (substatus == null) {
return false;
}
return substatus.code === 'loanSubStatus.loanSubStatusType.contractTermination';
}
}
@@ -179,6 +179,7 @@ export class TransactionsTabComponent implements OnInit {
* REAGE:29
* REAMORTIZE:30
* INTEREST REFUND:33
* CONTRACT_TERMINATION:90
*/
showTransactions(transactionsData: LoanTransaction) {
if ([
@@ -195,7 +196,8 @@ export class TransactionsTabComponent implements OnInit {
29,
30,
31,
33
33,
90
].includes(transactionsData.type.id)) {
this.router.navigate([transactionsData.id], { relativeTo: this.route });
}
@@ -22,7 +22,7 @@
<div class="flex-100" [ngClass]="loanTransactionColor()"></div>
<div class="flex-50 mat-body-strong">
{{ 'Transaction Id' | translate }}
{{ 'Transaction Id' | translateKey: 'catalogs' }}
</div>
<div class="flex-50">
@@ -30,7 +30,7 @@
</div>
<div class="flex-50 mat-body-strong" *ngIf="transactionData.toLoanTransactionRelation">
{{ 'Repayment Transaction' | translate }}
{{ 'Repayment Transaction' | translateKey: 'catalogs' }}
</div>
<div class="flex-50" *ngIf="transactionData.toLoanTransactionRelation">
@@ -40,15 +40,15 @@
</div>
<div class="flex-50 mat-body-strong">
{{ 'Type' | translate }}
{{ 'Type' | translateKey: 'catalogs' }}
</div>
<div class="flex-50">
{{ transactionData.type.value }}
{{ transactionData.type.value | translateKey: 'catalogs' }}
</div>
<div class="flex-50 mat-body-strong">
{{ 'Transaction Date' | translate }}
{{ 'Transaction Date' | translateKey: 'catalogs' }}
</div>
<div class="flex-50">
@@ -56,7 +56,7 @@
</div>
<div class="flex-50 mat-body-strong">
{{ 'Currency' | translate }}
{{ 'Currency' | translateKey: 'catalogs' }}
</div>
<div class="flex-50">
@@ -64,7 +64,7 @@
</div>
<div class="flex-50 mat-body-strong">
{{ 'Amount' | translate }}
{{ 'Amount' | translateKey: 'catalogs' }}
</div>
<div class="flex-50">
@@ -108,7 +108,7 @@
<ng-container matColumnDef="amount">
<th mat-header-cell *matHeaderCellDef>{{ 'labels.inputs.Amount' | translate }}</th>
<td mat-cell *matCellDef="let transactionRel">
{{ transactionRel.amount | currency }} {{ transactionData.currency.code }}
{{ transactionRel.amount | currency: transactionData.currency.code : 'symbol-narrow' : '1.2-2' }}
</td>
</ng-container>
<tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
+2
View File
@@ -16,6 +16,8 @@ export class StatusLookupPipe implements PipeTransform {
'loanStatusType.active': 'status-active',
'loanStatusType.overpaid': 'status-overpaid',
'loanStatusType.chargeoff': 'status-chargeoff',
'loanStatusType.activeOverdue': 'status-active-overdue',
'loanSubStatusType.contractTermination': 'subStatus-contract-termination',
'savingsAccountStatusType.submitted.and.pending.approval': 'status-pending',
'savingsAccountStatusType.approved': 'status-approved',
'savingsAccountStatusType.active': 'status-active',
@@ -199,8 +199,8 @@
<mat-label>{{ 'labels.inputs.Minimum Charge Cap' | translate }}</mat-label>
<input matInput autofocus formControlName="minCap" mifosxValidateOnFocus />
<mat-error *ngIf="chargeForm.controls.minCap.hasError('maxValue')">
{{ 'errors.validation.msg.loanproduct.maximumGap.not.greater.than.specified.number' | translate }} ({{
chargeForm.controls.minCap.value
{{ 'errors.validation.msg.loanproduct.minimumGap.not.greater.than.specified.number' | translate }} ({{
chargeForm.controls.maxCap.value
}})
</mat-error>
</mat-form-field>
@@ -114,8 +114,8 @@
<mat-label>{{ 'labels.inputs.Minimum Charge Cap' | translate }}</mat-label>
<input matInput autofocus formControlName="minCap" mifosxValidateOnFocus />
<mat-error *ngIf="chargeForm.controls.minCap.hasError('maxValue')">
{{ 'errors.validation.msg.loanproduct.maximumGap.not.greater.than.specified.number' | translate }} ({{
chargeForm.controls.minCap.value
{{ 'errors.validation.msg.loanproduct.minimumGap.not.greater.than.specified.number' | translate }} ({{
chargeForm.controls.maxCap.value
}})
</mat-error>
</mat-form-field>
@@ -879,6 +879,11 @@
<span class="flex-47">{{ 'labels.inputs.Income type' | translate }}:</span>
<span class="flex-53">{{ loanProduct.capitalizedIncomeType?.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 flex-100">{{ 'labels.heading.Accounting' | translate }}</h3>
@@ -1,16 +0,0 @@
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;
};
}
+1
View File
@@ -80,6 +80,7 @@ $status-matured: #ff4000;
$state-done: #2af72a;
$status-transfer-progress: #ff4000;
$status-transfer-hold: #df0101;
$subStatus-contract-termination: #b3b3b3;
$error-log: #ffa726;
+4
View File
@@ -40,6 +40,10 @@
color: $status-matured;
}
.subStatus-contract-termination {
color: $subStatus-contract-termination;
}
.mat-step-header .mat-step-icon-state-done {
background-color: $state-done;
+3
View File
@@ -141,6 +141,7 @@
"validation.msg.loanproduct.maxPrincipal.is.less.than.min": "Maximální částka jistiny {{params[0].value}} je neplatná. Musí být částka větší nebo rovna minimální částce jistiny {{params[1].value}}.",
"validation.msg.loanproduct.maxPrincipal.not.greater.than.zero": "Maximální částka jistiny musí být vyšší než nula, pokud je uvedena.",
"validation.msg.loanproduct.maxPrincipalPerCycle.is.less.than.min": "Maximální částka jistiny {{params[0].value}} je neplatná. Musí být částka větší nebo rovna minimální částce jistiny {{params[1].value}}.",
"validation.msg.loanproduct.minimumGap.not.greater.than.specified.number": "Minimální mezera by měla být nižší než specifikovaná (maximální) hodnota.",
"validation.msg.loanproduct.maximumGap.not.greater.than.specified.number": "Maximální mezera by měla být větší než specifikovaná (minimální) hodnota.",
"validation.msg.loanproduct.minDifferentialLendingRate.cannot.be.blank": "Limit minimální diferenciální úrokové sazby nemůže zůstat prázdný",
"validation.msg.loanproduct.minInterestRatePerPeriod.is.greater.than.max": "Minimální nominální úroková sazba {{params[0].value}} je neplatná. Musí být číslo menší nebo rovné maximální nominální úrokové sazbě {{params[1].value}}.",
@@ -849,6 +850,7 @@
"Collaterals Data": "Údaje o kolaterálech",
"Command": "Příkaz",
"Configuration Wizard": "Průvodce konfigurací",
"Contract Termination": "Ukončení smlouvy",
"Configuration Wizard Setup": "Úspěšně jste dokončili nastavení Průvodce konfigurací.",
"Configurations": "Konfigurace",
"Configure Fund Sources for Payment Channels": "Nakonfigurujte zdroje prostředků pro platební kanály",
@@ -2512,6 +2514,7 @@
"Close": "Zavřít",
"Close (as Rescheduled)": "Zavřít (jako přeplánováno)",
"Configuration Wizard": "Průvodce konfigurací",
"Contract Termination": "Ukončení smlouvy",
"Create Guarantor": "Vytvořit garanta",
"Create Journal Entry": "Vytvořit položku deníku",
"Credit Balance Refund": "Vrácení kreditního zůstatek",
+3
View File
@@ -141,6 +141,7 @@
"validation.msg.loanproduct.maxPrincipal.is.less.than.min": "Der maximale Kapitalbetrag {{params[0].value}} ist ungültig. Muss ein Betrag sein, der größer oder gleich dem Mindestkapitalbetrag {{params[1].value}} ist.",
"validation.msg.loanproduct.maxPrincipal.not.greater.than.zero": "Sofern angegeben, muss der maximale Kapitalbetrag größer als Null sein.",
"validation.msg.loanproduct.maxPrincipalPerCycle.is.less.than.min": "Der maximale Kapitalbetrag {{params[0].value}} ist ungültig. Muss ein Betrag sein, der größer oder gleich dem Mindestkapitalbetrag {{params[1].value}} ist.",
"validation.msg.loanproduct.minimumGap.not.greater.than.specified.number": "Der Mindestabstand sollte kleiner sein als der angegebene (Maximal-)Wert.",
"validation.msg.loanproduct.maximumGap.not.greater.than.specified.number": "Der maximale Abstand sollte größer als der angegebene (Mindest-)Wert sein.",
"validation.msg.loanproduct.minDifferentialLendingRate.cannot.be.blank": "Der Grenzwert für den Mindestdifferenzzinssatz darf nicht leer sein",
"validation.msg.loanproduct.minInterestRatePerPeriod.is.greater.than.max": "Der minimale Nominalzinssatz {{params[0].value}} ist ungültig. Muss eine Zahl sein, die kleiner oder gleich dem maximalen Nominalzinssatz {{params[1].value}} ist.",
@@ -850,6 +851,7 @@
"Collaterals Data": "Daten zu Sicherheiten",
"Command": "Befehl",
"Configuration Wizard": "Konfigurationsassistent",
"Contract Termination": "Vertragsbeendigung",
"Configuration Wizard Setup": "Sie haben die Einrichtung des Konfigurationsassistenten erfolgreich abgeschlossen.",
"Configurations": "Konfigurationen",
"Configure Fund Sources for Payment Channels": "Konfigurieren Sie Geldquellen für Zahlungskanäle",
@@ -2512,6 +2514,7 @@
"Close": "Schließen",
"Close (as Rescheduled)": "Schließen (wie geplant)",
"Configuration Wizard": "Konfigurationsassistent",
"Contract Termination": "Vertragsbeendigung",
"Create Guarantor": "Bürgen erstellen",
"Create Journal Entry": "Journaleintrag erstellen",
"Credit Balance Refund": "Rückerstattung des Kreditsaldos",
+3
View File
@@ -141,6 +141,7 @@
"validation.msg.loanproduct.maxPrincipal.is.less.than.min": "Maximum Principal amount {{params[0].value}} is invalid. Must be an amount greater than or equal to Minimum Principal amount {{params[1].value}}.",
"validation.msg.loanproduct.maxPrincipal.not.greater.than.zero": "Maximum Principal amount must be greater than zero if provided.",
"validation.msg.loanproduct.maxPrincipalPerCycle.is.less.than.min": "Maximum Principal amount {{params[0].value}} is invalid. Must be an amount greater than or equal to Minimum Principal amount {{params[1].value}}.",
"validation.msg.loanproduct.minimumGap.not.greater.than.specified.number": "Minimum gap should be lower than specified(maximum) value.",
"validation.msg.loanproduct.maximumGap.not.greater.than.specified.number": "Maximum gap should be greater than specified(minimum) value.",
"validation.msg.loanproduct.minDifferentialLendingRate.cannot.be.blank": "Minimum Differential Lending Rate limit cannot be blank",
"validation.msg.loanproduct.minInterestRatePerPeriod.is.greater.than.max": "Minimum Nominal interest rate {{params[0].value}} is invalid. Must be a number less than or equal to Maximum Nominal interest rate {{params[1].value}}.",
@@ -855,6 +856,7 @@
"Collaterals Data": "Collaterals Data",
"Command": "Command",
"Configuration Wizard": "Configuration Wizard",
"Contract Termination": "Contract Termination",
"Configuration Wizard Setup": "You have successfully completed the setup of Configuration Wizard.",
"Configurations": "Configurations",
"Configure Fund Sources for Payment Channels": "Configure Fund Sources for Payment Channels",
@@ -2519,6 +2521,7 @@
"Close": "Close",
"Close (as Rescheduled)": "Close (as Rescheduled)",
"Configuration Wizard": "Configuration Wizard",
"Contract Termination": "Contract Termination",
"Create Guarantor": "Create Guarantor",
"Create Journal Entry": "Create Journal Entry",
"Credit Balance Refund": "Credit Balance Refund",
+3
View File
@@ -141,6 +141,7 @@
"validation.msg.loanproduct.maxPrincipal.is.less.than.min": "El importe máximo de capital {{params[0].value}} no es válido. Debe ser un monto mayor o igual al monto mínimo de capital {{params[1].value}}.",
"validation.msg.loanproduct.maxPrincipal.not.greater.than.zero": "El monto máximo de capital debe ser mayor que cero, si se proporciona.",
"validation.msg.loanproduct.maxPrincipalPerCycle.is.less.than.min": "El importe máximo de capital {{params[0].value}} no es válido. Debe ser un monto mayor o igual al monto mínimo de capital {{params[1].value}}.",
"validation.msg.loanproduct.minimumGap.not.greater.than.specified.number": "El valor mínimo debe ser menor que el valor especificado (máximo).",
"validation.msg.loanproduct.maximumGap.not.greater.than.specified.number": "La separación máxima debe ser mayor que el valor especificado (mínimo).",
"validation.msg.loanproduct.minDifferentialLendingRate.cannot.be.blank": "El límite de tasa de Crédito diferencial mínima no puede estar en blanco",
"validation.msg.loanproduct.minInterestRatePerPeriod.is.greater.than.max": "La tasa de interés nominal mínima {{params[0].value}} no es válida. Debe ser un número menor o igual a la tasa de interés nominal máxima {{params[1].value}}.",
@@ -849,6 +850,7 @@
"Collaterals Data": "Datos de garantías",
"Command": "Comando",
"Configuration Wizard": "Asistente de configuración",
"Contract Termination": "Terminación del contrato",
"Configuration Wizard Setup": "Ha completado con éxito la configuración del Asistente de configuración.",
"Configurations": "Configuraciones",
"Configure Fund Sources for Payment Channels": "Configurar fuentes de fondos para canales de pago",
@@ -2512,6 +2514,7 @@
"Close": "Cerrar",
"Close (as Rescheduled)": "Cerrar (según reprogramado)",
"Configuration Wizard": "Asistente de configuración",
"Contract Termination": "Terminación del contrato",
"Create Guarantor": "Crear garante",
"Create Journal Entry": "Crear entrada de diario",
"Credit Balance Refund": "Reembolsar saldo de crédito",
+4 -1
View File
@@ -141,7 +141,8 @@
"validation.msg.loanproduct.maxPrincipal.is.less.than.min": "El importe máximo de capital {{params[0].value}} no es válido. Debe ser un monto mayor o igual al monto mínimo de capital {{params[1].value}}.",
"validation.msg.loanproduct.maxPrincipal.not.greater.than.zero": "El monto máximo de capital debe ser mayor que cero, si se proporciona.",
"validation.msg.loanproduct.maxPrincipalPerCycle.is.less.than.min": "El importe máximo de capital {{params[0].value}} no es válido. Debe ser un monto mayor o igual al monto mínimo de capital {{params[1].value}}.",
"validation.msg.loanproduct.maximumGap.not.greater.than.specified.number": "La separación máxima debe ser mayor que el valor especificado (mínimo).",
"validation.msg.loanproduct.minimumGap.not.greater.than.specified.number": "El valor mínimo debe ser menor que el valor especificado (máximo).",
"validation.msg.loanproduct.maximumGap.not.greater.than.specified.number": "La valor máximo debe ser mayor que el valor especificado (mínimo).",
"validation.msg.loanproduct.minDifferentialLendingRate.cannot.be.blank": "El límite de tasa de Crédito diferencial mínima no puede estar en blanco",
"validation.msg.loanproduct.minInterestRatePerPeriod.is.greater.than.max": "La tasa de interés nominal mínima {{params[0].value}} no es válida. Debe ser un número menor o igual a la tasa de interés nominal máxima {{params[1].value}}.",
"validation.msg.loanproduct.minInterestRatePerPeriod.not.zero.or.greater": "El tipo de interés nominal mínimo no puede ser un número negativo.",
@@ -849,6 +850,7 @@
"Collaterals Data": "Datos de garantías",
"Command": "Comando",
"Configuration Wizard": "Asistente de configuración",
"Contract Termination": "Terminación del contrato",
"Configuration Wizard Setup": "Ha completado con éxito la configuración del Asistente de configuración.",
"Configurations": "Configuraciones",
"Configure Fund Sources for Payment Channels": "Configurar fuentes de fondos para canales de pago",
@@ -2512,6 +2514,7 @@
"Close": "Cerrar",
"Close (as Rescheduled)": "Cerrar (según reprogramado)",
"Configuration Wizard": "Asistente de configuración",
"Contract Termination": "Terminación del contrato",
"Create Guarantor": "Crear garante",
"Create Journal Entry": "Crear entrada de diario",
"Credit Balance Refund": "Reembolsar saldo de crédito",
+3
View File
@@ -141,6 +141,7 @@
"validation.msg.loanproduct.maxPrincipal.is.less.than.min": "Le montant en principal maximum {{params[0].value}} n'est pas valide. Doit être un montant supérieur ou égal au montant principal minimum {{params[1].value}}.",
"validation.msg.loanproduct.maxPrincipal.not.greater.than.zero": "Le montant maximum du capital doit être supérieur à zéro s’il est fourni.",
"validation.msg.loanproduct.maxPrincipalPerCycle.is.less.than.min": "Le montant en principal maximum {{params[0].value}} n'est pas valide. Doit être un montant supérieur ou égal au montant principal minimum {{params[1].value}}.",
"validation.msg.loanproduct.minimumGap.not.greater.than.specified.number": "L'écart minimum doit être inférieur à la valeur spécifiée (maximale).",
"validation.msg.loanproduct.maximumGap.not.greater.than.specified.number": "L'écart maximum doit être supérieur à la valeur spécifiée (minimum).",
"validation.msg.loanproduct.minDifferentialLendingRate.cannot.be.blank": "La limite du taux de prêt différentiel minimum ne peut pas être vide",
"validation.msg.loanproduct.minInterestRatePerPeriod.is.greater.than.max": "Le taux d'intérêt nominal minimum {{params[0].value}} n'est pas valide. Doit être un nombre inférieur ou égal au taux d'intérêt nominal maximum {{params[1].value}}.",
@@ -850,6 +851,7 @@
"Collaterals Data": "Données sur les garanties",
"Command": "Commande",
"Configuration Wizard": "Assistant de configuration",
"Contract Termination": "Résiliation du contrat",
"Configuration Wizard Setup": "Vous avez terminé avec succès la configuration de l'assistant de configuration.",
"Configurations": "Configurations",
"Configure Fund Sources for Payment Channels": "Configurer les sources de fonds pour les canaux de paiement",
@@ -2512,6 +2514,7 @@
"Close": "Fermer",
"Close (as Rescheduled)": "Clôture (comme prévu)",
"Configuration Wizard": "Assistant de configuration",
"Contract Termination": "Résiliation du contrat",
"Create Guarantor": "Créer un garant",
"Create Journal Entry": "Créer une entrée de journal",
"Credit Balance Refund": "Remboursement du solde de crédit",
+3
View File
@@ -141,6 +141,7 @@
"validation.msg.loanproduct.maxPrincipal.is.less.than.min": "L'importo massimo del capitale {{params[0].value}} non è valido. Deve essere un importo maggiore o uguale all'importo del capitale minimo {{params[1].value}}.",
"validation.msg.loanproduct.maxPrincipal.not.greater.than.zero": "L'importo massimo del capitale deve essere maggiore di zero, se fornito.",
"validation.msg.loanproduct.maxPrincipalPerCycle.is.less.than.min": "L'importo massimo del capitale {{params[0].value}} non è valido. Deve essere un importo maggiore o uguale all'importo del capitale minimo {{params[1].value}}.",
"validation.msg.loanproduct.minimumGap.not.greater.than.specified.number": "La distanza minima deve essere inferiore al valore specificato (massimo).",
"validation.msg.loanproduct.maximumGap.not.greater.than.specified.number": "Il divario massimo deve essere maggiore del valore specificato (minimo).",
"validation.msg.loanproduct.minDifferentialLendingRate.cannot.be.blank": "Il limite minimo del tasso di prestito differenziale non può essere vuoto",
"validation.msg.loanproduct.minInterestRatePerPeriod.is.greater.than.max": "Il tasso di interesse nominale minimo {{params[0].value}} non è valido. Deve essere un numero inferiore o uguale al tasso di interesse nominale massimo {{params[1].value}}.",
@@ -850,6 +851,7 @@
"Collaterals Data": "Dati sulle garanzie reali",
"Command": "Comando",
"Configuration Wizard": "Procedura guidata di configurazione",
"Contract Termination": "Risoluzione del contratto",
"Configuration Wizard Setup": "Hai completato con successo l'installazione della Configurazione guidata.",
"Configurations": "Configurazioni",
"Configure Fund Sources for Payment Channels": "Configura le origini dei fondi per i canali di pagamento",
@@ -2512,6 +2514,7 @@
"Close": "Vicino",
"Close (as Rescheduled)": "Chiudi (come riprogrammato)",
"Configuration Wizard": "Procedura guidata di configurazione",
"Contract Termination": "Risoluzione del contratto",
"Create Guarantor": "Creare Garante",
"Create Journal Entry": "Crea voce di diario",
"Credit Balance Refund": "Rimborso del saldo del credito",
+3
View File
@@ -141,6 +141,7 @@
"validation.msg.loanproduct.maxPrincipal.is.less.than.min": "최대 원금 금액 {{params[0].value}}이(가) 잘못되었습니다. 최소 원금 금액 {{params[1].value}}보다 크거나 같아야 합니다.",
"validation.msg.loanproduct.maxPrincipal.not.greater.than.zero": "제공된 경우 최대 원금 금액은 0보다 커야 합니다.",
"validation.msg.loanproduct.maxPrincipalPerCycle.is.less.than.min": "최대 원금 금액 {{params[0].value}}이(가) 잘못되었습니다. 최소 원금 금액 {{params[1].value}}보다 크거나 같아야 합니다.",
"validation.msg.loanproduct.minimumGap.not.greater.than.specified.number": "최소 간격은 지정된(최대) 값보다 낮아야 합니다.",
"validation.msg.loanproduct.maximumGap.not.greater.than.specified.number": "최대 간격은 지정된(최소) 값보다 커야 합니다.",
"validation.msg.loanproduct.minDifferentialLendingRate.cannot.be.blank": "최소 차등 대출 금리 한도는 비워둘 수 없습니다.",
"validation.msg.loanproduct.minInterestRatePerPeriod.is.greater.than.max": "최소 명목 이자율 {{params[0].value}}이(가) 잘못되었습니다. 최대 명목 이자율 {{params[1].value}}보다 작거나 같은 숫자여야 합니다.",
@@ -850,6 +851,7 @@
"Collaterals Data": "담보 데이터",
"Command": "명령",
"Configuration Wizard": "구성 마법사",
"Contract Termination": "계약 종료",
"Configuration Wizard Setup": "구성 마법사 설정을 성공적으로 완료했습니다.",
"Configurations": "구성",
"Configure Fund Sources for Payment Channels": "지불 채널에 대한 자금 출처 구성",
@@ -2513,6 +2515,7 @@
"Close": "닫다",
"Close (as Rescheduled)": "마감(일정 변경됨)",
"Configuration Wizard": "구성 마법사",
"Contract Termination": "계약 종료",
"Create Guarantor": "보증인 만들기",
"Create Journal Entry": "분개 항목 만들기",
"Credit Balance Refund": "신용 잔액 환불",
+3
View File
@@ -141,6 +141,7 @@
"validation.msg.loanproduct.maxPrincipal.is.less.than.min": "Didžiausia pagrindinė suma {{params[0].value}} yra neteisinga. Turi būti suma, didesnė arba lygi minimaliajai pagrindinei sumai {{params[1].value}}.",
"validation.msg.loanproduct.maxPrincipal.not.greater.than.zero": "Jei nurodyta, didžiausia pagrindinė suma turi būti didesnė už nulį.",
"validation.msg.loanproduct.maxPrincipalPerCycle.is.less.than.min": "Didžiausia pagrindinė suma {{params[0].value}} yra neteisinga. Turi būti suma, didesnė arba lygi minimaliajai pagrindinei sumai {{params[1].value}}.",
"validation.msg.loanproduct.minimumGap.not.greater.than.specified.number": "Minimalus tarpas turi būti mažesnis nei nurodyta (maksimali) vertė.",
"validation.msg.loanproduct.maximumGap.not.greater.than.specified.number": "Didžiausias tarpas turi būti didesnis nei nurodyta (minimali) vertė.",
"validation.msg.loanproduct.minDifferentialLendingRate.cannot.be.blank": "Minimalios diferencinės skolinimo normos ribos laukas negali būti tuščias",
"validation.msg.loanproduct.minInterestRatePerPeriod.is.greater.than.max": "Minimali nominali palūkanų norma {{params[0].value}} yra neteisinga. Turi būti skaičius, mažesnis arba lygus maksimaliai nominaliajai palūkanų normai {{params[1].value}}.",
@@ -850,6 +851,7 @@
"Collaterals Data": "Užstato duomenys",
"Command": "komandą",
"Configuration Wizard": "Konfigūracijos vedlys",
"Contract Termination": "Sutarties nutraukimas",
"Configuration Wizard Setup": "Sėkmingai baigėte konfigūracijos vedlio sąranką.",
"Configurations": "Konfigūracijos",
"Configure Fund Sources for Payment Channels": "Konfigūruokite mokėjimo kanalų lėšų šaltinius",
@@ -2512,6 +2514,7 @@
"Close": "Uždaryti",
"Close (as Rescheduled)": "Uždaryti (kaip suplanuota)",
"Configuration Wizard": "Konfigūracijos vedlys",
"Contract Termination": "Sutarties nutraukimas",
"Create Guarantor": "Sukurti garantą",
"Create Journal Entry": "Sukurti žurnalo įrašą",
"Credit Balance Refund": "Kredito balanso grąžinimas",
+3
View File
@@ -141,6 +141,7 @@
"validation.msg.loanproduct.maxPrincipal.is.less.than.min": "Maksimālā pamatsumma {{params[0].value}} nav derīga. Jābūt summai, kas ir lielāka vai vienāda ar minimālo pamatsummu {{params[1].value}}.",
"validation.msg.loanproduct.maxPrincipal.not.greater.than.zero": "Maksimālajai pamatsummai ir jābūt lielākai par nulli, ja tā ir norādīta.",
"validation.msg.loanproduct.maxPrincipalPerCycle.is.less.than.min": "Maksimālā pamatsumma {{params[0].value}} nav derīga. Jābūt summai, kas ir lielāka vai vienāda ar minimālo pamatsummu {{params[1].value}}.",
"validation.msg.loanproduct.minimumGap.not.greater.than.specified.number": "Minimālajai atstarpei jābūt mazākai par norādīto (maksimālo) vērtību.",
"validation.msg.loanproduct.maximumGap.not.greater.than.specified.number": "Maksimālajai atstarpei ir jābūt lielākai par norādīto (minimālo) vērtību.",
"validation.msg.loanproduct.minDifferentialLendingRate.cannot.be.blank": "Minimālās diferencētās aizdevuma likmes ierobežojuma lauks nedrīkst būt tukšs",
"validation.msg.loanproduct.minInterestRatePerPeriod.is.greater.than.max": "Minimālā nominālā procentu likme {{params[0].value}} nav derīga. Jābūt skaitlim, kas ir mazāks vai vienāds ar maksimālo nominālo procentu likmi {{params[1].value}}.",
@@ -850,6 +851,7 @@
"Collaterals Data": "Nodrošinājuma dati",
"Command": "Pavēli",
"Configuration Wizard": "Konfigurācijas vednis",
"Contract Termination": "Līguma laušana",
"Configuration Wizard Setup": "Jūs esat veiksmīgi pabeidzis konfigurācijas vedņa iestatīšanu.",
"Configurations": "Konfigurācijas",
"Configure Fund Sources for Payment Channels": "Konfigurējiet līdzekļu avotus maksājumu kanāliem",
@@ -2512,6 +2514,7 @@
"Close": "Aizvērt",
"Close (as Rescheduled)": "Aizvērt (kā pārplānots)",
"Configuration Wizard": "Konfigurācijas vednis",
"Contract Termination": "Līguma laušana",
"Create Guarantor": "Izveidojiet galvotāju",
"Create Journal Entry": "Izveidojiet žurnāla ierakstu",
"Credit Balance Refund": "Kredīta atlikuma atmaksa",
+3
View File
@@ -141,6 +141,7 @@
"validation.msg.loanproduct.maxPrincipal.is.less.than.min": "अधिकतम मूल रकम {{params[0].value}} अमान्य छ। न्यूनतम प्रिन्सिपल रकम {{params[1].value}} भन्दा बढी वा बराबरको रकम हुनुपर्छ।",
"validation.msg.loanproduct.maxPrincipal.not.greater.than.zero": "यदि प्रदान गरिएको छ भने अधिकतम मूल रकम शून्य भन्दा बढी हुनुपर्छ।",
"validation.msg.loanproduct.maxPrincipalPerCycle.is.less.than.min": "अधिकतम मूल रकम {{params[0].value}} अमान्य छ। न्यूनतम प्रिन्सिपल रकम {{params[1].value}} भन्दा बढी वा बराबरको रकम हुनुपर्छ।",
"validation.msg.loanproduct.minimumGap.not.greater.than.specified.number": "न्यूनतम अन्तर निर्दिष्ट (अधिकतम) मान भन्दा कम हुनुपर्छ।",
"validation.msg.loanproduct.maximumGap.not.greater.than.specified.number": "अधिकतम अन्तर निर्दिष्ट (न्यूनतम) मान भन्दा बढी हुनुपर्छ।",
"validation.msg.loanproduct.minDifferentialLendingRate.cannot.be.blank": "न्यूनतम विभेदक ऋण दर सीमा खाली हुन सक्दैन",
"validation.msg.loanproduct.minInterestRatePerPeriod.is.greater.than.max": "न्यूनतम नाममात्र ब्याज दर {{params[0].value}} अमान्य छ। अधिकतम नाममात्र ब्याज दर {{params[1].value}} भन्दा कम वा बराबरको संख्या हुनुपर्छ।",
@@ -850,6 +851,7 @@
"Collaterals Data": "संपार्श्विक डाटा",
"Command": "आदेश",
"Configuration Wizard": "कन्फिगरेसन विजार्ड",
"Contract Termination": "सम्झौता समाप्ति",
"Configuration Wizard Setup": "तपाईंले कन्फिगरेसन विजार्डको सेटअप सफलतापूर्वक पूरा गर्नुभएको छ।",
"Configurations": "कन्फिगरेसनहरू",
"Configure Fund Sources for Payment Channels": "भुक्तानी च्यानलहरूको लागि कोष स्रोतहरू कन्फिगर गर्नुहोस्",
@@ -2512,6 +2514,7 @@
"Close": "बन्द गर्नुहोस्",
"Close (as Rescheduled)": "बन्द (पुन: तालिका अनुसार)",
"Configuration Wizard": "कन्फिगरेसन विजार्ड",
"Contract Termination": "सम्झौता समाप्ति",
"Create Guarantor": "ग्यारेन्टर सिर्जना गर्नुहोस्",
"Create Journal Entry": "जर्नल प्रविष्टि सिर्जना गर्नुहोस्",
"Credit Balance Refund": "क्रेडिट ब्यालेन्स फिर्ती",
+3
View File
@@ -141,6 +141,7 @@
"validation.msg.loanproduct.maxPrincipal.is.less.than.min": "O valor máximo do principal {{params[0].value}} é inválido. Deve ser um valor maior ou igual ao valor principal mínimo {{params[1].value}}.",
"validation.msg.loanproduct.maxPrincipal.not.greater.than.zero": "O valor máximo do principal deve ser maior que zero, se fornecido.",
"validation.msg.loanproduct.maxPrincipalPerCycle.is.less.than.min": "O valor máximo do principal {{params[0].value}} é inválido. Deve ser um valor maior ou igual ao valor principal mínimo {{params[1].value}}.",
"validation.msg.loanproduct.minimumGap.not.greater.than.specified.number": "A lacuna mínima deve ser menor que o valor especificado (máximo).",
"validation.msg.loanproduct.maximumGap.not.greater.than.specified.number": "A lacuna máxima deve ser maior que o valor especificado (mínimo).",
"validation.msg.loanproduct.minDifferentialLendingRate.cannot.be.blank": "O limite mínimo da taxa de empréstimo diferencial não pode ficar em branco",
"validation.msg.loanproduct.minInterestRatePerPeriod.is.greater.than.max": "A taxa de juros nominal mínima {{params[0].value}} é inválida. Deve ser um número menor ou igual à taxa de juros nominal máxima {{params[1].value}}.",
@@ -850,6 +851,7 @@
"Collaterals Data": "Dados de garantias",
"Command": "Comando",
"Configuration Wizard": "Assistente de configuração",
"Contract Termination": "Rescisão de contrato",
"Configuration Wizard Setup": "Você concluiu com êxito a configuração do Assistente de Configuração.",
"Configurations": "Configurações",
"Configure Fund Sources for Payment Channels": "Configurar fontes de fundos para canais de pagamento",
@@ -2512,6 +2514,7 @@
"Close": "Fechar",
"Close (as Rescheduled)": "Fechar (conforme reprogramado)",
"Configuration Wizard": "Assistente de configuração",
"Contract Termination": "Rescisão de contrato",
"Create Guarantor": "Criar fiador",
"Create Journal Entry": "Criar lançamento contábil manual",
"Credit Balance Refund": "Reembolso do saldo do crédito",
+3
View File
@@ -141,6 +141,7 @@
"validation.msg.loanproduct.maxPrincipal.is.less.than.min": "Kiwango cha juu cha Pesa Kuu {{params[0].value}} ni batili. Ni lazima kiwe kiasi kikubwa kuliko au sawa na Kiasi cha Chini cha Msingi {{params[1].value}}.",
"validation.msg.loanproduct.maxPrincipal.not.greater.than.zero": "Kiasi cha juu kabisa cha Malipo lazima kiwe zaidi ya sifuri ikiwa kimetolewa.",
"validation.msg.loanproduct.maxPrincipalPerCycle.is.less.than.min": "Kiwango cha juu cha Pesa Kuu {{params[0].value}} ni batili. Ni lazima kiwe kiasi kikubwa kuliko au sawa na Kiasi cha Chini cha Msingi {{params[1].value}}.",
"validation.msg.loanproduct.minimumGap.not.greater.than.specified.number": "Pengo la chini linapaswa kuwa chini ya thamani iliyobainishwa (ya juu).",
"validation.msg.loanproduct.maximumGap.not.greater.than.specified.number": "Pengo la juu linafaa kuwa kubwa kuliko thamani iliyobainishwa(kiwango cha chini).",
"validation.msg.loanproduct.minDifferentialLendingRate.cannot.be.blank": "Kikomo cha Kiwango cha Chini cha Kiwango cha Utoaji cha Tofauti hakiwezi kuwa tupu",
"validation.msg.loanproduct.minInterestRatePerPeriod.is.greater.than.max": "Kiwango cha chini cha riba cha Kawaida {{params[0].value}} ni batili. Lazima iwe nambari iliyo chini ya au sawa na Kiwango cha juu cha riba cha Kawaida {{params[1].value}}.",
@@ -850,6 +851,7 @@
"Collaterals Data": "Data ya Dhamana",
"Command": "Amri",
"Configuration Wizard": "Mchawi wa Usanidi",
"Contract Termination": "Kusitishwa kwa Mkataba",
"Configuration Wizard Setup": "Umekamilisha usanidi wa Mchawi wa Usanidi.",
"Configurations": "Mipangilio",
"Configure Fund Sources for Payment Channels": "Sanidi Vyanzo vya Fedha vya Njia za Malipo",
@@ -2512,6 +2514,7 @@
"Close": "Funga",
"Close (as Rescheduled)": "Funga (Kama Ilivyoratibiwa Upya)",
"Configuration Wizard": "Mchawi wa Usanidi",
"Contract Termination": "Kusitishwa kwa Mkataba",
"Create Guarantor": "Unda Mdhamini",
"Create Journal Entry": "Unda Ingizo la Jarida",
"Credit Balance Refund": "Marejesho ya Mizani ya Mkopo",