diff --git a/package-lock.json b/package-lock.json index c21b6e4f1..52ed90e45 100644 --- a/package-lock.json +++ b/package-lock.json @@ -44,6 +44,7 @@ "moment": "^2.29.4", "ngx-mat-select-search": "^8.0.2", "rxjs": "^7.8.2", + "signature_pad": "^5.1.3", "tinymce": "^8.2.2", "tslib": "^2.8.1", "vkbeautify": "^0.99.3", @@ -21912,6 +21913,12 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/signature_pad": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/signature_pad/-/signature_pad-5.1.3.tgz", + "integrity": "sha512-zyxW5vuJVnQdGcU+kAj9FYl7WaAunY3kA5S7mPg0xJiujL9+sPAWfSQHS5tXaJXDUa4FuZeKhfdCDQ6K3wfkpQ==", + "license": "MIT" + }, "node_modules/sigstore": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-4.1.0.tgz", diff --git a/package.json b/package.json index 99d874ad5..9372d57bf 100644 --- a/package.json +++ b/package.json @@ -71,6 +71,7 @@ "moment": "^2.29.4", "ngx-mat-select-search": "^8.0.2", "rxjs": "^7.8.2", + "signature_pad": "^5.1.3", "tinymce": "^8.2.2", "tslib": "^2.8.1", "vkbeautify": "^0.99.3", diff --git a/src/app/clients/clients-view/clients-view.component.ts b/src/app/clients/clients-view/clients-view.component.ts index 2df575ceb..3c640346b 100644 --- a/src/app/clients/clients-view/clients-view.component.ts +++ b/src/app/clients/clients-view/clients-view.component.ts @@ -18,6 +18,7 @@ import { UnassignStaffDialogComponent } from './custom-dialogs/unassign-staff-di import { UploadSignatureDialogComponent } from './custom-dialogs/upload-signature-dialog/upload-signature-dialog.component'; import { ViewSignatureDialogComponent } from './custom-dialogs/view-signature-dialog/view-signature-dialog.component'; import { DeleteSignatureDialogComponent } from './custom-dialogs/delete-signature-dialog/delete-signature-dialog.component'; +import { DrawSignatureDialogComponent } from './custom-dialogs/draw-signature-dialog/draw-signature-dialog.component'; import { DeleteDialogComponent } from 'app/shared/delete-dialog/delete-dialog.component'; import { UploadImageDialogComponent } from './custom-dialogs/upload-image-dialog/upload-image-dialog.component'; import { CaptureImageDialogComponent } from './custom-dialogs/capture-image-dialog/capture-image-dialog.component'; @@ -313,6 +314,8 @@ export class ClientsViewComponent implements OnInit { viewSignatureDialogRef.afterClosed().subscribe((response: any) => { if (response.upload) { this.uploadSignature(); + } else if (response.draw) { + this.drawSignature(); } else if (response.delete) { this.deleteSignature(); } @@ -334,6 +337,20 @@ export class ClientsViewComponent implements OnInit { }); } + /** + * Opens draw pad for client signature + */ + private drawSignature() { + const drawSignatureDialogRef = this.dialog.open(DrawSignatureDialogComponent); + drawSignatureDialogRef.afterClosed().subscribe((signature: File) => { + if (signature) { + this.clientsService.uploadClientSignatureImage(this.clientViewData.id, signature).subscribe(() => { + this.reload(); + }); + } + }); + } + /** * Deletes client signature */ diff --git a/src/app/clients/clients-view/custom-dialogs/draw-signature-dialog/draw-signature-dialog.component.html b/src/app/clients/clients-view/custom-dialogs/draw-signature-dialog/draw-signature-dialog.component.html new file mode 100644 index 000000000..181ffb8bc --- /dev/null +++ b/src/app/clients/clients-view/custom-dialogs/draw-signature-dialog/draw-signature-dialog.component.html @@ -0,0 +1,28 @@ + + +
+

{{ 'labels.heading.Draw Client Signature' | translate }}

+ +
+ +
+ +
+ +
+ + + + + +
diff --git a/src/app/clients/clients-view/custom-dialogs/draw-signature-dialog/draw-signature-dialog.component.scss b/src/app/clients/clients-view/custom-dialogs/draw-signature-dialog/draw-signature-dialog.component.scss new file mode 100644 index 000000000..1a432c32c --- /dev/null +++ b/src/app/clients/clients-view/custom-dialogs/draw-signature-dialog/draw-signature-dialog.component.scss @@ -0,0 +1,21 @@ +/** + * Copyright since 2025 Mifos Initiative + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +.signature-canvas-container { + border: 1px solid #ccc; + border-radius: 4px; + margin: 0 auto; + width: 100%; + max-width: 500px; +} + +.signature-canvas { + width: 100%; + height: 200px; + display: block; +} diff --git a/src/app/clients/clients-view/custom-dialogs/draw-signature-dialog/draw-signature-dialog.component.ts b/src/app/clients/clients-view/custom-dialogs/draw-signature-dialog/draw-signature-dialog.component.ts new file mode 100644 index 000000000..debc9700b --- /dev/null +++ b/src/app/clients/clients-view/custom-dialogs/draw-signature-dialog/draw-signature-dialog.component.ts @@ -0,0 +1,90 @@ +/** + * Copyright since 2025 Mifos Initiative + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +/** Angular Imports */ +import { Component, ViewChild, ElementRef, AfterViewInit, OnDestroy, inject } from '@angular/core'; +import { MatDialogRef, MatDialogTitle, MatDialogActions, MatDialogClose } from '@angular/material/dialog'; +import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; + +/** External Imports */ +import SignaturePad from 'signature_pad'; + +/** + * Draw signature dialog component. + */ +@Component({ + selector: 'mifosx-draw-signature-dialog', + templateUrl: './draw-signature-dialog.component.html', + styleUrls: ['./draw-signature-dialog.component.scss'], + imports: [ + ...STANDALONE_SHARED_IMPORTS, + MatDialogTitle, + MatDialogActions, + MatDialogClose + ] +}) +export class DrawSignatureDialogComponent implements AfterViewInit, OnDestroy { + dialogRef = inject>(MatDialogRef); + + /** Canvas element reference */ + @ViewChild('signatureCanvas', { static: true }) signatureCanvas: ElementRef; + + /** Signature pad instance */ + private signaturePad: SignaturePad; + + /** Whether the pad has content */ + isEmpty = true; + + ngAfterViewInit() { + const canvas = this.signatureCanvas.nativeElement; + this.signaturePad = new SignaturePad(canvas, { + backgroundColor: 'rgb(255, 255, 255)' + }); + + this.signaturePad.addEventListener('endStroke', () => { + this.isEmpty = this.signaturePad.isEmpty(); + }); + + this.resizeCanvas(); + } + + ngOnDestroy() { + if (this.signaturePad) { + this.signaturePad.off(); + } + } + + /** Resizes canvas to match its display size for crisp rendering */ + private resizeCanvas() { + const canvas = this.signatureCanvas.nativeElement; + const ratio = Math.max(window.devicePixelRatio || 1, 1); + canvas.width = canvas.offsetWidth * ratio; + canvas.height = canvas.offsetHeight * ratio; + canvas.getContext('2d').scale(ratio, ratio); + this.signaturePad.clear(); + } + + /** Clears the signature pad */ + clear() { + this.signaturePad.clear(); + this.isEmpty = true; + } + + /** Converts the drawn signature to a File and closes the dialog */ + confirm() { + if (this.signaturePad.isEmpty()) { + return; + } + + const canvas = this.signatureCanvas.nativeElement; + canvas.toBlob((blob: Blob) => { + const file = new File([blob], 'clientSignature.png', { type: 'image/png' }); + this.dialogRef.close(file); + }, 'image/png'); + } +} diff --git a/src/app/clients/clients-view/custom-dialogs/view-signature-dialog/view-signature-dialog.component.html b/src/app/clients/clients-view/custom-dialogs/view-signature-dialog/view-signature-dialog.component.html index 9c7eb41f3..c70c76d4b 100644 --- a/src/app/clients/clients-view/custom-dialogs/view-signature-dialog/view-signature-dialog.component.html +++ b/src/app/clients/clients-view/custom-dialogs/view-signature-dialog/view-signature-dialog.component.html @@ -31,5 +31,8 @@ + } diff --git a/src/assets/translations/cs-CS.json b/src/assets/translations/cs-CS.json index 9532f8fcb..de1b3e338 100644 --- a/src/assets/translations/cs-CS.json +++ b/src/assets/translations/cs-CS.json @@ -359,6 +359,7 @@ "Change Password": "Změnit heslo", "Chargeback": "Zpětné zúčtování", "Charges Overview": "Přehled poplatků", + "Clear": "Vymazat", "Client Screen Reports": "Zprávy na obrazovce klienta", "Close": "Zavřít", "Close Config. Wizard": "Zavřete Config. kouzelník", @@ -424,6 +425,7 @@ "Dividends": "Dividendy", "Download": "Stažení", "Download CSV": "Stáhnout CSV", + "Draw": "Kreslit", "Edit": "Upravit", "Edit Code": "Upravit kód", "Edit Criteria Definition": "Upravit definici kritérií", @@ -1014,6 +1016,7 @@ "Disable Withhold Tax": "Zakázat zadržení daně", "Documents": "Dokumenty", "Down Payment": "Záloha", + "Draw Client Signature": "Nakreslit podpis", "Due Collections": "Splatné sbírky", "Due Savings Collections": "Splatné spořící sbírky", "Edit": "Upravit", diff --git a/src/assets/translations/de-DE.json b/src/assets/translations/de-DE.json index 8b591a221..f3751090b 100644 --- a/src/assets/translations/de-DE.json +++ b/src/assets/translations/de-DE.json @@ -359,6 +359,7 @@ "Change Password": "Kennwort ändern", "Chargeback": "Rückbuchung", "Charges Overview": "Gebührenübersicht", + "Clear": "Löschen", "Client Screen Reports": "Kundenbildschirmberichte", "Close": "Schließen", "Close Config. Wizard": "Konfiguration schließen. Magier", @@ -424,6 +425,7 @@ "Dividends": "Dividenden", "Download": "Herunterladen", "Download CSV": "CSV herunterladen", + "Draw": "Zeichnen", "Edit": "Bearbeiten", "Edit Code": "Code bearbeiten", "Edit Criteria Definition": "Kriteriendefinition bearbeiten", @@ -1015,6 +1017,7 @@ "Disable Withhold Tax": "Deaktivieren Sie die Quellensteuer", "Documents": "Unterlagen", "Down Payment": "Anzahlung", + "Draw Client Signature": "Unterschrift zeichnen", "Due Collections": "Fällige Sammlungen", "Due Savings Collections": "Fällige Spareinzüge", "Edit": "Bearbeiten", diff --git a/src/assets/translations/en-US.json b/src/assets/translations/en-US.json index 92a84ddc3..160fad453 100644 --- a/src/assets/translations/en-US.json +++ b/src/assets/translations/en-US.json @@ -397,6 +397,7 @@ "Change Password": "Change Password", "Chargeback": "Chargeback", "Charges Overview": "Charges Overview", + "Clear": "Clear", "Client Screen Reports": "Client Screen Reports", "Close": "Close", "Close Config. Wizard": "Close Config. Wizard", @@ -462,6 +463,7 @@ "Dividends": "Dividends", "Download": "Download", "Download CSV": "Download CSV", + "Draw": "Draw", "Edit": "Edit", "Edit Code": "Edit Code", "Edit Criteria Definition": "Edit Criteria Definition", @@ -1055,6 +1057,7 @@ "Disable Withhold Tax": "Disable Withhold Tax", "Documents": "Documents", "Down Payment": "Down Payment", + "Draw Client Signature": "Draw Signature", "Due Collections": "Due Collections", "Due Savings Collections": "Due Savings Collections", "Edit": "Edit", diff --git a/src/assets/translations/es-CL.json b/src/assets/translations/es-CL.json index ec9cdf1ee..7a05222f7 100644 --- a/src/assets/translations/es-CL.json +++ b/src/assets/translations/es-CL.json @@ -359,6 +359,7 @@ "Change Password": "Cambiar la contraseña", "Chargeback": "Contracargo", "Charges Overview": "Resumen de cargos", + "Clear": "Borrar", "Client Screen Reports": "Reportes de pantalla del cliente", "Close": "Cerrar", "Close Config. Wizard": "Cerrar", @@ -424,6 +425,7 @@ "Dividends": "Dividendos", "Download": "Descargar", "Download CSV": "Descargar CSV", + "Draw": "Dibujar", "Edit": "Editar", "Edit Code": "Editar Código", "Edit Criteria Definition": "Editar Definición de Criterios", @@ -1014,6 +1016,7 @@ "Disable Withhold Tax": "Desactivar retención de impuestos", "Documents": "Documentos", "Down Payment": "Pago Inicial", + "Draw Client Signature": "Dibujar firma", "Due Collections": "Cobros vencidos", "Due Savings Collections": "Cobros de ahorros vencidos", "Edit": "Editar", diff --git a/src/assets/translations/es-MX.json b/src/assets/translations/es-MX.json index 7b87258e3..b659248ad 100644 --- a/src/assets/translations/es-MX.json +++ b/src/assets/translations/es-MX.json @@ -359,6 +359,7 @@ "Change Password": "Cambiar la contraseña", "Chargeback": "Contracargo", "Charges Overview": "Resumen de cargos", + "Clear": "Borrar", "Client Screen Reports": "Reportes de pantalla del cliente", "Close": "Cerrar", "Close Config. Wizard": "Cerrar", @@ -424,6 +425,7 @@ "Dividends": "Dividendos", "Download": "Descargar", "Download CSV": "Descargar CSV", + "Draw": "Dibujar", "Edit": "Editar", "Edit Code": "Editar Código", "Edit Criteria Definition": "Editar Definición de Criterios", @@ -1017,6 +1019,7 @@ "Disable Withhold Tax": "Desactivar retención de impuestos", "Documents": "Documentos", "Down Payment": "Pago Inicial", + "Draw Client Signature": "Dibujar firma", "Due Collections": "Cobros vencidos", "Due Savings Collections": "Cobros de ahorros vencidos", "Edit": "Editar", diff --git a/src/assets/translations/fr-FR.json b/src/assets/translations/fr-FR.json index 8c7257dae..5fecdb5c5 100644 --- a/src/assets/translations/fr-FR.json +++ b/src/assets/translations/fr-FR.json @@ -359,6 +359,7 @@ "Change Password": "Changer le mot de passe", "Chargeback": "Rétrofacturation", "Charges Overview": "Aperçu des frais", + "Clear": "Effacer", "Client Screen Reports": "Rapports d'écran client", "Close": "Fermer", "Close Config. Wizard": "Fermez la configuration. Magicien", @@ -424,6 +425,7 @@ "Dividends": "Dividendes", "Download": "Télécharger", "Download CSV": "Télécharger CSV", + "Draw": "Dessiner", "Edit": "Modifier", "Edit Code": "Modifier le code", "Edit Criteria Definition": "Modifier la définition des critères", @@ -1018,6 +1020,7 @@ "Disable Withhold Tax": "Désactiver la retenue des impôts", "Documents": "Documents", "Down Payment": "Acompte", + "Draw Client Signature": "Dessiner la signature", "Due Collections": "Recouvrements dus", "Due Savings Collections": "Recouvrement des économies dues", "Edit": "Modifier", diff --git a/src/assets/translations/it-IT.json b/src/assets/translations/it-IT.json index e8f01dff6..578e1a472 100644 --- a/src/assets/translations/it-IT.json +++ b/src/assets/translations/it-IT.json @@ -359,6 +359,7 @@ "Change Password": "Cambiare la password", "Chargeback": "Riaddebito", "Charges Overview": "Panoramica delle tariffe", + "Clear": "Cancella", "Client Screen Reports": "Rapporti sullo schermo del cliente", "Close": "Vicino", "Close Config. Wizard": "Chiudi Config. Procedura guidata", @@ -424,6 +425,7 @@ "Dividends": "Dividendi", "Download": "Scaricamento", "Download CSV": "Scarica CSV", + "Draw": "Disegna", "Edit": "Modificare", "Edit Code": "Modifica codice", "Edit Criteria Definition": "Modifica Definizione Criteri", @@ -1014,6 +1016,7 @@ "Disable Withhold Tax": "Disabilitare la ritenuta a trattenere l'imposta", "Documents": "Documenti", "Down Payment": "Acconto", + "Draw Client Signature": "Disegna firma", "Due Collections": "Collezioni dovute", "Due Savings Collections": "Collezioni di risparmio dovute", "Edit": "Modificare", diff --git a/src/assets/translations/ko-KO.json b/src/assets/translations/ko-KO.json index a2bba7e05..9a74fc5f0 100644 --- a/src/assets/translations/ko-KO.json +++ b/src/assets/translations/ko-KO.json @@ -359,6 +359,7 @@ "Change Password": "비밀번호 변경", "Chargeback": "지불 거절", "Charges Overview": "요금 개요", + "Clear": "지우기", "Client Screen Reports": "클라이언트 화면 보고서", "Close": "닫다", "Close Config. Wizard": "구성을 닫습니다. 마법사", @@ -424,6 +425,7 @@ "Dividends": "배당금", "Download": "다운로드", "Download CSV": "CSV 다운로드", + "Draw": "그리기", "Edit": "편집하다", "Edit Code": "코드 편집", "Edit Criteria Definition": "기준 정의 편집", @@ -1015,6 +1017,7 @@ "Disable Withhold Tax": "원천 징수 세금을 비활성화합니다", "Documents": "서류", "Down Payment": "계약금", + "Draw Client Signature": "서명 그리기", "Due Collections": "만기 징수", "Due Savings Collections": "미납액 징수", "Edit": "편집하다", diff --git a/src/assets/translations/lt-LT.json b/src/assets/translations/lt-LT.json index ec089bb73..42d1a2ce3 100644 --- a/src/assets/translations/lt-LT.json +++ b/src/assets/translations/lt-LT.json @@ -359,6 +359,7 @@ "Change Password": "Pakeisti slaptažodį", "Chargeback": "Mokėjimo grąžinimas", "Charges Overview": "Mokesčių apžvalga", + "Clear": "Išvalyti", "Client Screen Reports": "Kliento ekrano ataskaitos", "Close": "Uždaryti", "Close Config. Wizard": "Uždaryti konfigūraciją. burtininkas", @@ -424,6 +425,7 @@ "Dividends": "Dividendai", "Download": "parsisiųsti", "Download CSV": "Atsisiųskite CSV", + "Draw": "Piešti", "Edit": "Redaguoti", "Edit Code": "Redaguoti kodą", "Edit Criteria Definition": "Redaguoti kriterijų apibrėžimą", @@ -1013,6 +1015,7 @@ "Disable Withhold Tax": "Išjungti išskaičiavimo mokestį", "Documents": "Dokumentai", "Down Payment": "Pradinė įmoka", + "Draw Client Signature": "Nupiešti parašą", "Due Collections": "Sumokėtos kolekcijos", "Due Savings Collections": "Sumokėtos santaupų kolekcijos", "Edit": "Redaguoti", diff --git a/src/assets/translations/lv-LV.json b/src/assets/translations/lv-LV.json index 50173edcb..be77caacf 100644 --- a/src/assets/translations/lv-LV.json +++ b/src/assets/translations/lv-LV.json @@ -359,6 +359,7 @@ "Change Password": "Mainīt paroli", "Chargeback": "Atmaksa", "Charges Overview": "Izmaksu pārskats", + "Clear": "Notīrīt", "Client Screen Reports": "Klienta ekrāna pārskati", "Close": "Aizvērt", "Close Config. Wizard": "Aizvērt konfigurāciju. Vednis", @@ -424,6 +425,7 @@ "Dividends": "Dividendes", "Download": "Lejupielādēt", "Download CSV": "Lejupielādēt CSV", + "Draw": "Zīmēt", "Edit": "Rediģēt", "Edit Code": "Rediģēt kodu", "Edit Criteria Definition": "Rediģēt kritēriju definīciju", @@ -1015,6 +1017,7 @@ "Disable Withhold Tax": "Atspējot aizturēšanas nodokli", "Documents": "Dokumenti", "Down Payment": "Pirmā iemaksa", + "Draw Client Signature": "Zīmēt parakstu", "Due Collections": "Pienākamās kolekcijas", "Due Savings Collections": "Pienākamās ietaupījumu kolekcijas", "Edit": "Rediģēt", diff --git a/src/assets/translations/ne-NE.json b/src/assets/translations/ne-NE.json index df0cd7454..f5b5eb0c4 100644 --- a/src/assets/translations/ne-NE.json +++ b/src/assets/translations/ne-NE.json @@ -359,6 +359,7 @@ "Change Password": "पासवर्ड परिवर्तन गर्नुहोस्", "Chargeback": "चार्जब्याक", "Charges Overview": "शुल्क अवलोकन", + "Clear": "मेटाउनुहोस्", "Client Screen Reports": "ग्राहक स्क्रिन रिपोर्टहरू", "Close": "बन्द गर्नुहोस्", "Close Config. Wizard": "कन्फिग बन्द गर्नुहोस्। जादूगर", @@ -424,6 +425,7 @@ "Dividends": "लाभांश", "Download": "डाउनलोड गर्नुहोस्", "Download CSV": "CSV डाउनलोड गर्नुहोस्", + "Draw": "कोर्नुहोस्", "Edit": "सम्पादन गर्नुहोस्", "Edit Code": "कोड सम्पादन गर्नुहोस्", "Edit Criteria Definition": "मापदण्ड परिभाषा सम्पादन गर्नुहोस्", @@ -1013,6 +1015,7 @@ "Disable Withhold Tax": "प्रयोग गर्ने कर अक्षम गर्नुहोस्", "Documents": "कागजातहरू", "Down Payment": "डाउन पेमेन्ट", + "Draw Client Signature": "हस्ताक्षर कोर्नुहोस्", "Due Collections": "बाँकी संग्रहहरू", "Due Savings Collections": "देय बचत संग्रह", "Edit": "सम्पादन गर्नुहोस्", diff --git a/src/assets/translations/pt-PT.json b/src/assets/translations/pt-PT.json index abd0e163c..fadb975fc 100644 --- a/src/assets/translations/pt-PT.json +++ b/src/assets/translations/pt-PT.json @@ -359,6 +359,7 @@ "Change Password": "Alterar a senha", "Chargeback": "Estorno", "Charges Overview": "Visão geral das cobranças", + "Clear": "Limpar", "Client Screen Reports": "Relatórios de tela do cliente", "Close": "Fechar", "Close Config. Wizard": "Feche a configuração. Mago", @@ -424,6 +425,7 @@ "Dividends": "Dividendos", "Download": "Download", "Download CSV": "Baixar CSV", + "Draw": "Desenhar", "Edit": "Editar", "Edit Code": "Editar código", "Edit Criteria Definition": "Editar Definição de Critérios", @@ -1014,6 +1016,7 @@ "Disable Withhold Tax": "Desativar o imposto retido", "Documents": "Documentos", "Down Payment": "Pagamento inicial", + "Draw Client Signature": "Desenhar assinatura", "Due Collections": "Cobranças devidas", "Due Savings Collections": "Coleções de poupança devidas", "Edit": "Editar", diff --git a/src/assets/translations/sw-SW.json b/src/assets/translations/sw-SW.json index 1a9672473..8c1a769c2 100644 --- a/src/assets/translations/sw-SW.json +++ b/src/assets/translations/sw-SW.json @@ -359,6 +359,7 @@ "Change Password": "Badilisha neno la siri", "Chargeback": "Urejeshaji malipo", "Charges Overview": "Muhtasari wa Gharama", + "Clear": "Futa", "Client Screen Reports": "Ripoti za Skrini ya Mteja", "Close": "Funga", "Close Config. Wizard": "Funga Usanidi. Mchawi", @@ -424,6 +425,7 @@ "Dividends": "Gawio", "Download": "Pakua", "Download CSV": "Pakua CSV", + "Draw": "Chora", "Edit": "Hariri", "Edit Code": "Badilisha Msimbo", "Edit Criteria Definition": "Hariri Ufafanuzi wa Vigezo", @@ -1012,6 +1014,7 @@ "Disable Withhold Tax": "Lemaza Ushuru", "Documents": "Nyaraka", "Down Payment": "Malipo ya Chini", + "Draw Client Signature": "Chora saini", "Due Collections": "Mikusanyiko Inastahili", "Due Savings Collections": "Makusanyo ya Akiba Zinazodaiwa", "Edit": "Hariri",