WEB-332: Advanced accounting rule can be set for each writeoff reason

This commit is contained in:
Jose Alberto Hernandez
2025-10-03 10:25:51 -05:00
parent 2462ea5380
commit 0726e34b80
23 changed files with 192 additions and 29 deletions
@@ -189,10 +189,7 @@ export class TransactionsTabComponent implements OnInit {
if (hideAccrual || hideReversed) {
transactions = this.transactionsData.filter((t: LoanTransaction) => {
return (
!(hideReversed && t.manuallyReversed) &&
!(hideAccrual && (t.type.accrual || t.type.capitalizedIncomeAmortization))
);
return !(hideReversed && t.manuallyReversed) && !(hideAccrual && this.isAccrualKindOf(t.type));
});
}
this.dataSource = new MatTableDataSource(transactions);
@@ -243,10 +240,12 @@ export class TransactionsTabComponent implements OnInit {
* REAMORTIZE:30
* INTEREST REFUND:33
* CAPITALIZED INCOME:35
* CAPITALIZED_INCOME_AMORTIZATION:36
* CAPITALIZED INCOME ADJUSTMENT:37
* CONTRACT_TERMINATION:38
* BUY_DOWN_FEE:40
* BUY_DOWN_FEE_ADJUSTMENT:41
* BUY_DOWN_FEE_AMORTIZATION:42
*/
showTransaction(transactionsData: LoanTransaction): boolean {
return [
@@ -266,10 +265,12 @@ export class TransactionsTabComponent implements OnInit {
32,
33,
35,
36,
37,
38,
40,
41
41,
42
].includes(transactionsData.type.id);
}
@@ -293,7 +294,7 @@ export class TransactionsTabComponent implements OnInit {
if (transaction.transactionRelations && transaction.transactionRelations.length > 0) {
return 'linked';
}
if (this.isAccrual(transaction.type) || this.isCapitalizedIncomeAmortization(transaction.type)) {
if (this.isAccrualKindOf(transaction.type)) {
return 'accrual';
}
if (this.isChargeOff(transaction.type)) {
@@ -427,6 +428,21 @@ export class TransactionsTabComponent implements OnInit {
return transactionType.capitalizedIncome || transactionType.code === 'loanTransactionType.capitalizedIncome';
}
private isBuyDownFeeAmortization(transactionType: LoanTransactionType): boolean {
return (
transactionType.buyDownFeeAmortizationAdjustment ||
transactionType.code === 'loanTransactionType.buyDownFeeAmortizationAdjustment'
);
}
private isAccrualKindOf(transactionType: LoanTransactionType): boolean {
return (
this.isAccrual(transactionType) ||
this.isCapitalizedIncomeAmortization(transactionType) ||
this.isBuyDownFeeAmortization(transactionType)
);
}
private isCapitalizedIncomeAmortization(transactionType: LoanTransactionType): boolean {
return (
transactionType.capitalizedIncomeAmortization ||
@@ -39,4 +39,5 @@ export interface LoanTransactionType {
contractTermination: boolean;
buyDownFee: boolean;
buyDownFeeAdjustment: boolean;
buyDownFeeAmortizationAdjustment: boolean;
}
@@ -45,7 +45,6 @@ export class CreateCollateralComponent implements OnInit {
) {
this.route.data.subscribe((data: { collateralTemplate: any }) => {
this.organizationService.getCurrencies().subscribe((orgCurrencies: any) => {
console.log('Organization currencies response:', orgCurrencies);
let orgCurrencyList = Array.isArray(orgCurrencies.selectedCurrencyOptions)
? orgCurrencies.selectedCurrencyOptions
: [];
@@ -1236,7 +1236,7 @@
<ng-container matColumnDef="chargeOffReasonCodeValueId">
<th mat-header-cell *matHeaderCellDef>{{ 'labels.inputs.Charge-off reason' | translate }}</th>
<td mat-cell *matCellDef="let chargeOffReasonToExpenseAccountMapping">
{{ chargeOffReasonToExpenseAccountMapping.chargeOffReasonCodeValue.name }}
{{ chargeOffReasonToExpenseAccountMapping.reasonCodeValue.name }}
</td>
</ng-container>
@@ -1253,10 +1253,7 @@
</table>
</div>
<div
*ngIf="buydownFeeClassificationToIncomeAccountMappings?.length > 0"
class="flex-100 layout-row-wrap responsive-column"
>
<div class="flex-100 layout-row-wrap responsive-column">
<h4 class="mat-h4 flex-100">
{{ 'labels.heading.Buydown Fee classifications to Income accounts' | translate }}
</h4>
@@ -1318,6 +1315,32 @@
<tr mat-row *matRowDef="let row; columns: chargeOffReasonExpenseDisplayedColumns"></tr>
</table>
</div>
<div *ngIf="writeOffReasonsToExpenseMappings?.length > 0" class="flex-100 layout-row-wrap responsive-column">
<h4 class="mat-h4 flex-100">
{{ 'labels.heading.WriteOff reasons to Expense accounts' | translate }}
</h4>
<table class="mat-elevation-z1 flex-100" mat-table [dataSource]="writeOffReasonsToExpenseMappings">
<ng-container matColumnDef="chargeOffReasonCodeValueId">
<th mat-header-cell *matHeaderCellDef>{{ 'labels.inputs.WriteOff Reason' | translate }}</th>
<td mat-cell *matCellDef="let writeOffReasonsToExpenseMapping">
{{ writeOffReasonsToExpenseMapping.reasonCodeValue.name }}
</td>
</ng-container>
<ng-container matColumnDef="expenseAccountId">
<th mat-header-cell *matHeaderCellDef>{{ 'labels.inputs.Expense Account' | translate }}</th>
<td mat-cell *matCellDef="let writeOffReasonsToExpenseMapping">
({{ writeOffReasonsToExpenseMapping.expenseAccount.glCode }})
{{ writeOffReasonsToExpenseMapping.expenseAccount.name }}
</td>
</ng-container>
<tr mat-header-row *matHeaderRowDef="chargeOffReasonExpenseDisplayedColumns"></tr>
<tr mat-row *matRowDef="let row; columns: chargeOffReasonExpenseDisplayedColumns"></tr>
</table>
</div>
</div>
</div>
</div>
@@ -117,6 +117,7 @@ export class LoanProductSummaryComponent implements OnInit, OnChanges {
chargeOffReasonToExpenseAccountMappings: ChargeOffReasonToExpenseAccountMapping[] = [];
buydownFeeClassificationToIncomeAccountMappings: ClassificationToIncomeAccountMapping[] = [];
capitalizedIncomeClassificationToIncomeAccountMappings: ClassificationToIncomeAccountMapping[] = [];
writeOffReasonsToExpenseMappings: ChargeOffReasonToExpenseAccountMapping[] = [];
constructor(private accounting: Accounting) {}
@@ -152,6 +153,7 @@ export class LoanProductSummaryComponent implements OnInit, OnChanges {
this.loanProduct.buydownFeeClassificationToIncomeAccountMappings || [];
this.capitalizedIncomeClassificationToIncomeAccountMappings =
this.loanProduct.capitalizedIncomeClassificationToIncomeAccountMappings || [];
this.writeOffReasonsToExpenseMappings = this.loanProduct.writeOffReasonsToExpenseMappings || [];
} else {
this.accountingMappings = {};
@@ -166,6 +168,7 @@ export class LoanProductSummaryComponent implements OnInit, OnChanges {
const assetAndLiabilityAccountData =
this.loanProductsTemplate.accountingMappingOptions.assetAndLiabilityAccountOptions || [];
const chargeOffReasonOptions: any = this.loanProductsTemplate.chargeOffReasonOptions || [];
const writeOffReasonOptions: any = this.loanProductsTemplate.writeOffReasonOptions || [];
const buydownFeeClassificationOptions: any = this.loanProductsTemplate.buydownFeeClassificationOptions || [];
const capitalizedIncomeClassificationOptions: any =
this.loanProductsTemplate.capitalizedIncomeClassificationOptions || [];
@@ -269,7 +272,7 @@ export class LoanProductSummaryComponent implements OnInit, OnChanges {
let optionData = this.optionDataLookUp(m.chargeOffReasonCodeValueId, chargeOffReasonOptions);
this.chargeOffReasonToExpenseAccountMappings.push({
expenseAccount: this.glAccountLookUp(m.expenseAccountId, expenseAccountData),
chargeOffReasonCodeValue: {
reasonCodeValue: {
id: optionData.id,
name: optionData.value
} as CodeValue
@@ -279,8 +282,8 @@ export class LoanProductSummaryComponent implements OnInit, OnChanges {
}
this.buydownFeeClassificationToIncomeAccountMappings = [];
if (this.loanProduct.buydownFeeClassificationToIncomeAccountMappings?.length > 0) {
this.loanProduct.buydownFeeClassificationToIncomeAccountMappings.forEach((m: any) => {
if (this.loanProduct.buydownfeeClassificationToIncomeAccountMappings?.length > 0) {
this.loanProduct.buydownfeeClassificationToIncomeAccountMappings.forEach((m: any) => {
let optionData = this.optionDataLookUp(m.classificationCodeValueId, buydownFeeClassificationOptions);
if (optionData !== null) {
this.buydownFeeClassificationToIncomeAccountMappings.push({
@@ -293,6 +296,7 @@ export class LoanProductSummaryComponent implements OnInit, OnChanges {
}
});
}
this.capitalizedIncomeClassificationToIncomeAccountMappings = [];
if (this.loanProduct.capitalizedIncomeClassificationToIncomeAccountMappings?.length > 0) {
this.loanProduct.capitalizedIncomeClassificationToIncomeAccountMappings.forEach((m: any) => {
@@ -308,6 +312,22 @@ export class LoanProductSummaryComponent implements OnInit, OnChanges {
}
});
}
this.writeOffReasonsToExpenseMappings = [];
if (this.loanProduct.writeOffReasonsToExpenseMappings?.length > 0) {
this.loanProduct.writeOffReasonsToExpenseMappings.forEach((m: any) => {
let optionData = this.optionDataLookUp(m.writeOffReasonCodeValueId, writeOffReasonOptions);
if (optionData !== null) {
this.writeOffReasonsToExpenseMappings.push({
expenseAccount: this.glAccountLookUp(m.expenseAccountId, expenseAccountData),
reasonCodeValue: {
id: optionData.id,
name: optionData.value
} as CodeValue
});
}
});
}
}
if (this.loanProduct.isInterestRecalculationEnabled) {
@@ -618,8 +638,9 @@ export class LoanProductSummaryComponent implements OnInit, OnChanges {
this.loanProduct.feeToIncomeAccountMappings?.length > 0 ||
this.loanProduct.penaltyToIncomeAccountMappings?.length > 0 ||
this.loanProduct.chargeOffReasonToExpenseAccountMappings?.length > 0 ||
this.loanProduct.buydownFeeClassificationToIncomeAccountMappings?.length > 0 ||
this.loanProduct.capitalizedIncomeClassificationToIncomeAccountMappings?.length > 0
this.loanProduct.buydownfeeClassificationToIncomeAccountMappings?.length > 0 ||
this.loanProduct.capitalizedIncomeClassificationToIncomeAccountMappings?.length > 0 ||
this.loanProduct.writeOffReasonsToExpenseMappings?.length > 0
);
}
@@ -96,11 +96,25 @@ export class AdvancedAccountingMappingRuleComponent implements OnInit {
const dialogRef = this.dialog.open(FormDialogComponent, { data });
dialogRef.afterClosed().subscribe((response: any) => {
if (response.data) {
const addData: AccountingMappingDTO = {
value: this.getValueData(response.data.value.valueId),
glAccount: this.getGlAccountData(response.data.value.glAccountId)
};
this.tableData.push(addData);
if ([
'ChargeOffReasonExpense',
'WriteOffReasonToExpense'
].includes(this.formType)) {
const addData: AccountingMappingDTO = {
value: this.getValueData(response.data.value.chargeOffReasonCodeValueId),
glAccount: this.getGlAccountData(response.data.value.expenseAccountId)
};
this.addTableData(addData);
} else if ([
'BuydownFeeClassificationToIncome',
'CapitalizedIncomeClassificationToIncome'
].includes(this.formType)) {
const addData: AccountingMappingDTO = {
value: this.getValueData(response.data.value.valueId),
glAccount: this.getGlAccountData(response.data.value.glAccountId)
};
this.addTableData(addData);
}
this.sendParentData();
if (this.formType == 'ChargeOffReasonExpense') {
@@ -110,13 +124,21 @@ export class AdvancedAccountingMappingRuleComponent implements OnInit {
});
}
addTableData(addedData: AccountingMappingDTO): void {
let newData = [
...this.tableData,
addedData
];
this.tableData = newData;
}
delete(index: number) {
const dialogRef = this.dialog.open(DeleteDialogComponent, {
data: { deleteContext: this.translateService.instant('labels.text.this') }
});
dialogRef.afterClosed().subscribe((response: any) => {
if (response.delete) {
this.tableData.splice(index, 1);
this.tableData = this.tableData.filter((_, i) => i !== index);
this.sendParentData();
}
});
@@ -159,6 +181,11 @@ export class AdvancedAccountingMappingRuleComponent implements OnInit {
title: 'Capitalized Income classifications to Income accounts',
formfields: this.getClassificationIncomeFormfields(values)
};
case 'WriteOffReasonToExpense':
return {
title: 'Map Write-off reasons to Expense accounts',
formfields: this.getChargeOffReasonExpenseFormfields(values)
};
}
}
@@ -290,8 +317,15 @@ export class AdvancedAccountingMappingRuleComponent implements OnInit {
}
getGlAccountData(valueId: number): any {
return this.incomeAccountData.find((i: any) => {
const glAccountData = [
this.incomeAccountData,
this.expenseAccountData,
this.assetAccountData,
this.liabilityAccountData
];
return glAccountData.find((i: any) => {
return i.id === valueId;
});
return null;
}
}
@@ -536,6 +536,17 @@
[accountingMappingOptions]="capitalizedIncomeClassificationOptions"
(formChangeEvent)="formChangeEvent($event)"
></mifosx-advanced-accounting-mapping-rule>
<mifosx-advanced-accounting-mapping-rule
class="flex-100 m-t-10"
[textField]="'WriteOff Reason'"
[formType]="'WriteOffReasonToExpense'"
[formArray]="writeOffReasonsToExpenseMappings"
[textHeading]="'WriteOff reasons to Expense accounts'"
[expenseAccountData]="expenseAccountData"
[accountingMappingOptions]="writeOffReasonOptions"
(formChangeEvent)="formChangeEvent($event)"
></mifosx-advanced-accounting-mapping-rule>
</div>
</div>
</div>
@@ -86,6 +86,7 @@ export class LoanProductAccountingStepComponent implements OnInit, OnChanges {
chargeOffReasonOptions: any;
capitalizedIncomeClassificationOptions: any[] = [];
buydownFeeClassificationOptions: any[] = [];
writeOffReasonOptions: any[] = [];
currentFormValues: any[] = [];
allowAddChargeOffReasonExpense = true;
@@ -134,6 +135,7 @@ export class LoanProductAccountingStepComponent implements OnInit, OnChanges {
this.capitalizedIncomeClassificationOptions =
this.loanProductsTemplate.capitalizedIncomeClassificationOptions || [];
this.buydownFeeClassificationOptions = this.loanProductsTemplate.buydownFeeClassificationOptions || [];
this.writeOffReasonOptions = this.loanProductsTemplate.writeOffReasonOptions || [];
this.loanProductAccountingForm.patchValue({
accountingRule: this.loanProductsTemplate.accountingRule.id
@@ -214,7 +216,8 @@ export class LoanProductAccountingStepComponent implements OnInit, OnChanges {
this.loanProductsTemplate.penaltyToIncomeAccountMappings ||
this.loanProductsTemplate.chargeOffReasonToExpenseAccountMappings ||
this.loanProductsTemplate.buydownFeeClassificationToIncomeAccountMappings ||
this.loanProductsTemplate.capitalizedIncomeClassificationToIncomeAccountMappings
this.loanProductsTemplate.capitalizedIncomeClassificationToIncomeAccountMappings ||
this.loanProductsTemplate.writeOffReasonsToExpenseMappings
? true
: false
});
@@ -251,7 +254,7 @@ export class LoanProductAccountingStepComponent implements OnInit, OnChanges {
this.formBuilder.array(
(this.loanProductsTemplate.chargeOffReasonToExpenseAccountMappings || []).map(
(m: ChargeOffReasonToExpenseAccountMapping) => ({
chargeOffReasonCodeValueId: m.chargeOffReasonCodeValue.id,
chargeOffReasonCodeValueId: m.reasonCodeValue.id,
expenseAccountId: m.expenseAccount.id
})
)
@@ -279,6 +282,17 @@ export class LoanProductAccountingStepComponent implements OnInit, OnChanges {
)
)
);
this.loanProductAccountingForm.setControl(
'writeOffReasonsToExpenseMappings',
this.formBuilder.array(
(this.loanProductsTemplate.writeOffReasonsToExpenseMappings || []).map(
(m: ChargeOffReasonToExpenseAccountMapping) => ({
value: m.reasonCodeValue,
glAccount: m.expenseAccount
})
)
)
);
}
}
@@ -384,6 +398,7 @@ export class LoanProductAccountingStepComponent implements OnInit, OnChanges {
'capitalizedIncomeClassificationToIncomeAccountMappings',
this.formBuilder.array([])
);
this.loanProductAccountingForm.addControl('writeOffReasonsToExpenseMappings', this.formBuilder.array([]));
} else {
this.loanProductAccountingForm.setControl(
'paymentChannelToFundSourceMappings',
@@ -403,6 +418,7 @@ export class LoanProductAccountingStepComponent implements OnInit, OnChanges {
'capitalizedIncomeClassificationToIncomeAccountMappings',
this.formBuilder.array([])
);
this.loanProductAccountingForm.setControl('writeOffReasonsToExpenseMappings', this.formBuilder.array([]));
}
});
} else {
@@ -476,6 +492,10 @@ export class LoanProductAccountingStepComponent implements OnInit, OnChanges {
) as UntypedFormArray;
}
get writeOffReasonsToExpenseMappings(): UntypedFormArray {
return this.loanProductAccountingForm.get('writeOffReasonsToExpenseMappings') as UntypedFormArray;
}
setLoanProductAccountingFormDirty() {
if (this.loanProductAccountingForm.pristine) {
this.loanProductAccountingForm.markAsDirty();
@@ -708,7 +728,6 @@ export class LoanProductAccountingStepComponent implements OnInit, OnChanges {
}))
)
);
console.log(this.loanProductAccountingForm.value.buydownfeeClassificationToIncomeAccountMappings);
} else if (accountingData.formType === 'CapitalizedIncomeClassificationToIncome') {
this.loanProductAccountingForm.setControl(
'capitalizedIncomeClassificationToIncomeAccountMappings',
@@ -719,7 +738,16 @@ export class LoanProductAccountingStepComponent implements OnInit, OnChanges {
}))
)
);
console.log(this.loanProductAccountingForm.value.capitalizedIncomeClassificationToIncomeAccountMappings);
} else if (accountingData.formType === 'WriteOffReasonToExpense') {
this.loanProductAccountingForm.setControl(
'writeOffReasonsToExpenseMappings',
this.formBuilder.array(
(accountingData.values || []).map((m: AccountingMappingDTO) => ({
writeOffReasonCodeValueId: m.value.id,
expenseAccountId: m.glAccount.id
}))
)
);
}
this.setLoanProductAccountingFormDirty();
}
@@ -155,8 +155,10 @@ export interface LoanProduct {
enableAccrualActivityPosting?: boolean;
supportedInterestRefundTypes?: StringEnumOptionData[];
chargeOffBehaviour?: StringEnumOptionData;
buydownfeeClassificationToIncomeAccountMappings?: ClassificationToIncomeAccountMapping[];
buydownFeeClassificationToIncomeAccountMappings?: ClassificationToIncomeAccountMapping[];
capitalizedIncomeClassificationToIncomeAccountMappings?: ClassificationToIncomeAccountMapping[];
writeOffReasonsToExpenseMappings?: ChargeOffReasonToExpenseAccountMapping[];
}
export interface AllowAttributeOverrides {
+3 -1
View File
@@ -41,8 +41,10 @@ export interface PaymentChannelToFundSourceMapping {
export interface ChargeOffReasonToExpenseAccountMapping {
chargeOffReasonCodeValueId?: number;
writeOffReasonCodeValueId?: number;
expenseAccountId?: number;
chargeOffReasonCodeValue?: CodeValue;
reasonCodeValue?: CodeValue;
writeOffReasonCodeValue?: CodeValue;
expenseAccount?: AccountingMapping;
}
+2
View File
@@ -1154,6 +1154,7 @@
"View Journal Entry": "Zobrazit záznam deníku",
"Waive Charge": "Zřeknutí se poplatku",
"Welcome to Mifos": "Vítejte v destinaci Mifos",
"WriteOff reasons to Expense accounts": "Odepis důvodů do výdajových účtů",
"Withdraw Money From Saving Account": "Výběr peněz ze spořicího účtu",
"Withhold Tax": "Srážková daň",
"Working Days": "Pracovní dny",
@@ -2455,6 +2456,7 @@
"Within Bank": "V rámci banky",
"Working Days": "Pracovní dny",
"Workflow Jobs": "Workflow Jobs",
"WriteOff Reason": "Důvod odepsání",
"Write Off Date": "Datum odepsání",
"Write off on": "Odepiš dál",
"Write-off": "Odepsat",
+2
View File
@@ -1155,6 +1155,7 @@
"View Journal Entry": "Journaleintrag anzeigen",
"Waive Charge": "Auf Gebühr verzichten",
"Welcome to Mifos": "Willkommen bei Mifos",
"WriteOff reasons to Expense accounts": "Abschreibungsgründe für Aufwandskonten",
"Withdraw Money From Saving Account": "Geld vom Sparkonto abheben",
"Withhold Tax": "Quellensteuer",
"Working Days": "Arbeitstage",
@@ -2455,6 +2456,7 @@
"Within Bank": "Innerhalb der Bank",
"Working Days": "Arbeitstage",
"Workflow Jobs": "Workflow Jobs",
"WriteOff Reason": "Abschreibungsgrund",
"Write Off Date": "Abschreibungsdatum",
"Write off on": "Abschreiben am",
"Write-off": "Abschreiben",
+2
View File
@@ -1159,6 +1159,7 @@
"View Journal Entry": "View Journal Entry",
"Waive Charge": "Waive Charge",
"Welcome to Mifos": "Welcome to Mifos",
"WriteOff reasons to Expense accounts": "WriteOff reasons to Expense accounts",
"Withdraw Money From Saving Account": "Withdraw Money From Saving Account",
"Withhold Tax": "Withhold Tax",
"Working Days": "Working Days",
@@ -2462,6 +2463,7 @@
"Within Bank": "Within Bank",
"Working Days": "Working Days",
"Workflow Jobs": "Workflow Jobs",
"WriteOff Reason": "WriteOff Reason",
"Write Off Date": "Write Off Date",
"Write off on": "Write off on",
"Write-off": "Write-off",
+2
View File
@@ -1154,6 +1154,7 @@
"View Journal Entry": "Ver entrada de diario",
"Waive Charge": "Renunciar a Comisión",
"Welcome to Mifos": "Bienvenido a Mifos",
"WriteOff reasons to Expense accounts": "Razones de cancelación de cuentas de gastos",
"Withdraw Money From Saving Account": "Retirar dinero de una cuenta de ahorro",
"Withhold Tax": "Retener el impuesto",
"Working Days": "Días laborables",
@@ -2455,6 +2456,7 @@
"Within Bank": "Dentro del banco",
"Working Days": "Días laborables",
"Workflow Jobs": "Flujos de Procesos",
"WriteOff Reason": "Motivo de la cancelación",
"Write Off Date": "Fecha de cancelación",
"Write off on": "Cancelar en",
"Write-off": "Cancelaciones",
+2
View File
@@ -1154,6 +1154,7 @@
"View Journal Entry": "Ver entrada de diario",
"Waive Charge": "Renunciar a Comisión",
"Welcome to Mifos": "Bienvenido a Mifos",
"WriteOff reasons to Expense accounts": "Razones de cancelación de cuentas de gastos",
"Withdraw Money From Saving Account": "Retirar dinero de una cuenta de ahorro",
"Withhold Tax": "Retener el impuesto",
"Working Days": "Días laborables",
@@ -2455,6 +2456,7 @@
"Within Bank": "Dentro del banco",
"Working Days": "Días laborables",
"Workflow Jobs": "Flujos de Procesos",
"WriteOff Reason": "Motivo de la cancelación",
"Write Off Date": "Fecha de cancelación",
"Write off on": "Cancelar en",
"Write-off": "Cancelaciones",
+2
View File
@@ -1155,6 +1155,7 @@
"View Journal Entry": "Afficher l'écriture de journal",
"Waive Charge": "Renoncer aux frais",
"Welcome to Mifos": "Bienvenue chez Mifos",
"WriteOff reasons to Expense accounts": "Raisons de radiation des comptes de dépenses",
"Withdraw Money From Saving Account": "Retirer de l'argent d'un compte d'épargne",
"Withhold Tax": "Retenir l'impôt",
"Working Days": "Jours de travail",
@@ -2455,6 +2456,7 @@
"Within Bank": "Au sein de la banque",
"Working Days": "Jours de travail",
"Workflow Jobs": "Tâches de flux de travail",
"WriteOff Reason": "Motif de radiation",
"Write Off Date": "Date de radiation",
"Write off on": "Radier sur",
"Write-off": "Radier",
+2
View File
@@ -1155,6 +1155,7 @@
"View Journal Entry": "Visualizza la voce del diario",
"Waive Charge": "Rinuncia all'addebito",
"Welcome to Mifos": "Benvenuti in Mifos",
"WriteOff reasons to Expense accounts": "Motivi di cancellazione nei conti spese",
"Withdraw Money From Saving Account": "Prelevare denaro dal conto di risparmio",
"Withhold Tax": "Trattenuta fiscale",
"Working Days": "Giorni lavorativi",
@@ -2455,6 +2456,7 @@
"Within Bank": "All'interno della Banca",
"Working Days": "Giorni lavorativi",
"Workflow Jobs": "Lavori del flusso di lavoro",
"WriteOff Reason": "Motivo della cancellazione",
"Write Off Date": "Cancellare la data",
"Write off on": "Cancellare",
"Write-off": "Cancellare",
+2
View File
@@ -1156,6 +1156,7 @@
"View Journal Entry": "분개 항목 보기",
"Waive Charge": "요금 면제",
"Welcome to Mifos": "미포스에 오신 것을 환영합니다",
"WriteOff reasons to Expense accounts": "비용 계정에 대한 WriteOff 이유",
"Withdraw Money From Saving Account": "저축 계좌에서 돈을 인출하세요",
"Withhold Tax": "원천징수세",
"Working Days": "일하는 날",
@@ -2456,6 +2457,7 @@
"Within Bank": "은행 내",
"Working Days": "일하는 날",
"Workflow Jobs": "워크플로 작업",
"WriteOff Reason": "상각 사유",
"Write Off Date": "상각 날짜",
"Write off on": "에 상각",
"Write-off": "상각",
+2
View File
@@ -1155,6 +1155,7 @@
"View Journal Entry": "Žiūrėti žurnalo įrašą",
"Waive Charge": "Atsisakyti mokesčio",
"Welcome to Mifos": "Sveiki atvykę į Mifos",
"WriteOff reasons to Expense accounts": "Išlaidų sąskaitų nurašymo priežastys",
"Withdraw Money From Saving Account": "Išimkite pinigus iš taupomosios sąskaitos",
"Withhold Tax": "Išskaičiuoti mokestį",
"Working Days": "Darbo dienos",
@@ -2455,6 +2456,7 @@
"Within Bank": "Banko viduje",
"Working Days": "Darbo dienos",
"Workflow Jobs": "Darbo eiga Darbai",
"WriteOff Reason": "Nurašymo priežastis",
"Write Off Date": "Nurašymo data",
"Write off on": "Nurašyti",
"Write-off": "Nusirašinėti",
+2
View File
@@ -1155,6 +1155,7 @@
"View Journal Entry": "Skatīt žurnāla ierakstu",
"Waive Charge": "Atteikties no maksas",
"Welcome to Mifos": "Laipni lūdzam Mifos",
"WriteOff reasons to Expense accounts": "Norakstīšanas iemesli izdevumu kontiem",
"Withdraw Money From Saving Account": "Izņemiet naudu no krājkonta",
"Withhold Tax": "Ieturējuma nodoklis",
"Working Days": "Darba dienas",
@@ -2455,6 +2456,7 @@
"Within Bank": "Bankas ietvaros",
"Working Days": "Darba dienas",
"Workflow Jobs": "Darbplūsmas darbi",
"WriteOff Reason": "Norakstīšanas iemesls",
"Write Off Date": "Norakstīšanas datums",
"Write off on": "Norakstīt tālāk",
"Write-off": "Norakstīt",
+2
View File
@@ -1155,6 +1155,7 @@
"View Journal Entry": "जर्नल प्रविष्टि हेर्नुहोस्",
"Waive Charge": "शुल्क छुट",
"Welcome to Mifos": "Mifos मा स्वागत छ",
"WriteOff reasons to Expense accounts": "खर्च खाताहरूमा कारणहरू लेख्नुहोस्",
"Withdraw Money From Saving Account": "बचत खाताबाट पैसा निकाल्नुहोस्",
"Withhold Tax": "कर रोक",
"Working Days": "काम गर्ने दिनहरू",
@@ -2455,6 +2456,7 @@
"Within Bank": "बैंक भित्र",
"Working Days": "काम गर्ने दिनहरू",
"Workflow Jobs": "कार्यप्रवाह कार्यहरू",
"WriteOff Reason": "कारण लेख्नुहोस्",
"Write Off Date": "बन्द मिति लेख्नुहोस्",
"Write off on": "मा लेख्नुहोस्",
"Write-off": "राइट-अफ",
+2
View File
@@ -1155,6 +1155,7 @@
"View Journal Entry": "Ver lançamento contábil manual",
"Waive Charge": "Isenção de cobrança",
"Welcome to Mifos": "Bem-vindo à Mifos",
"WriteOff reasons to Expense accounts": "Motivos de baixa em contas de despesas",
"Withdraw Money From Saving Account": "Retirar dinheiro da conta poupança",
"Withhold Tax": "Taxa administrativa",
"Working Days": "Dias úteis",
@@ -2455,6 +2456,7 @@
"Within Bank": "Dentro do banco",
"Working Days": "Dias úteis",
"Workflow Jobs": "Fluxo de trabalho",
"WriteOff Reason": "Motivo da baixa",
"Write Off Date": "Data de baixa",
"Write off on": "Anote em",
"Write-off": "Eliminar",
+2
View File
@@ -1154,6 +1154,7 @@
"View Journal Entry": "Tazama Ingizo la Jarida",
"Waive Charge": "Kuondoa Malipo",
"Welcome to Mifos": "Karibu na Mifos",
"WriteOff reasons to Expense accounts": "Sababu za Kufuta kwa akaunti za Gharama",
"Withdraw Money From Saving Account": "Toa Pesa kwenye Akaunti ya Kuokoa",
"Withhold Tax": "Kodi ya Kuzuia",
"Working Days": "Siku za kazi",
@@ -2454,6 +2455,7 @@
"Within Bank": "Ndani ya Benki",
"Working Days": "Siku za kazi",
"Workflow Jobs": "Kazi za mtiririko wa kazi",
"WriteOff Reason": "Sababu ya Kufuta",
"Write Off Date": "Tarehe ya Kuzimwa",
"Write off on": "Andika mbali",
"Write-off": "Kufuta",