Merge branch 'development' into 518

This commit is contained in:
Sk Niyaj Ali 2026-01-26 12:44:45 +05:30 committed by GitHub
commit d0a1bf4394
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
69 changed files with 3349 additions and 751 deletions

View File

@ -0,0 +1,528 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2024 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 https://mozilla.org/MPL/2.0/.
See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md
-->
<resources>
<string name="feature_about_app_name">മിഫോസ് മൊബൈൽ</string>
<string name="login">ലോഗിൻ ചെയ്യുക</string>
<string name="toast_welcome">സ്വാഗതം %1$s</string>
<string name="unable_to_connect">ഇന്റർനെറ്റ് കണക്ഷൻ ഇല്ല</string>
<string name="basic">അടിസ്ഥാനം</string>
<string name="username">ഉപയോക്തൃനാമം</string>
<string name="progress_message_login">ലോഗിൻ ചെയ്യുന്നു</string>
<string name="progress_message_loading">ലോഡ് ചെയ്യുന്നു</string>
<string name="password">പാസ്‌വേഡ്</string>
<string name="email">ഇമെയിൽ</string>
<string name="accounts">അക്കൗണ്ട്</string>
<string name="clients">ഉപഭോക്താക്കൾ</string>
<string name="funds_transfer">ഫണ്ട് ട്രാൻസ്ഫർ</string>
<string name="recent_transactions">സമീപകാല ഇടപാടുകൾ</string>
<string name="charges">ചാർജുകൾ</string>
<string name="questionnaire">ചോദ്യാവലി</string>
<string name="feature_about_about_us">ഞങ്ങളെക്കുറിച്ച്</string>
<string name="saving_account_details">സേവിംഗ്സ് അക്കൗണ്ട് വിശദാംശങ്ങൾ</string>
<string name="feature_account_savings_account">സേവിംഗ്സ് അക്കൗണ്ട്</string>
<string name="error_loan_account_details_loading">വായ്പാ അക്കൗണ്ട് വിശദാംശങ്ങൾ ലോഡ് ചെയ്യുന്നതിൽ പിശക്</string>
<string name="nominal_interest_rate">നാമമാത്ര പലിശ നിരക്ക്</string>
<string name="create_an_account">അക്കൗണ്ട് ഉണ്ടാക്കുക</string>
<string name="account_number">അക്കൗണ്ട് നമ്പർ</string>
<string name="account_balance">അക്കൗണ്ട് ബാലൻസ്</string>
<string name="total_deposits">ആകെ നിക്ഷേപം</string>
<string name="open_drawer">ഡ്രോയർ തുറക്കുക</string>
<string name="close_drawer">ഡ്രോയർ അടയ്ക്കുക</string>
<string name="home">ഹോം</string>
<string name="medium_text">മധ്യസ്ഥ വാചകം</string>
<string name="small_text">ചെറിയ വാചകം</string>
<string name="client_accounts">ഉപഭോക്തൃ അക്കൗണ്ടുകൾ</string>
<string name="splash">സ്പ്ലാഷ്</string>
<string name="feature_account_savings">സേവിംഗ്സ്</string>
<string name="feature_account_loan">ലോൺ</string>
<string name="feature_account_loan_account">വായ്പ അക്കൗണ്ട്</string>
<string name="savings_charges">സേവിംഗ്സ് ചാർജുകൾ</string>
<string name="feature_account_share">ഷെയർ</string>
<string name="feature_account_share_account">ഷെയർ അക്കൗണ്ട്</string>
<string name="clients_list">ഒരു ഉപഭോക്താവിനെ തിരഞ്ഞെടുക്കുക</string>
<string name="core_common_working">പ്രവർത്തിക്കുന്നു</string>
<string name="feature_account_submitted">സമർപ്പിച്ചു</string>
<string name="feature_account_disbursement">വിതരണം</string>
<string name="status_image">സ്റ്റാറ്റസ് ചിത്രം</string>
<string name="loan_repayment_schedule">തിരിച്ചടവ് ഷെഡ്യൂൾ</string>
<string name="last_transaction">കഴിഞ്ഞ ഇടപാട്</string>
<string name="made_on">ഉണ്ടാക്കിയത്</string>
<string name="make_transfer">ട്രാൻസ്ഫർ ചെയ്യുക</string>
<string name="last_name">കുടുംബപ്പേര്</string>
<string name="phone_number">ഫോൺ നമ്പർ</string>
<string name="rb_email">ഇമെയിൽ</string>
<string name="rb_mobile">മൊബൈൽ</string>
<string name="verification_mode">പരിശോധനാ രീതി</string>
<string name="select_loan_product">ലോൺ ഉൽപ്പന്നം തിരഞ്ഞെടുക്കുക*</string>
<string name="purpose_of_loan">വായ്പയുടെ ഉദ്ദേശ്യം*</string>
<string name="principal_amount">അടിസ്ഥാന തുക*</string>
<string name="amount">തുക</string>
<string name="remark">പരാമർശം</string>
<string name="expected_disbursement_date">പ്രതീക്ഷിക്കുന്ന വിതരണ തീയതി</string>
<string name="submission_date">സമർപ്പണ തീയതി</string>
<string name="transfer_date">ട്രാൻസ്ഫർ തീയതി</string>
<string name="apply_for_loan">വായ്പയ്ക്ക് അപേക്ഷിക്കുക</string>
<string name="update_loan">വായ്പ അപ്‌ഡേറ്റ് ചെയ്യുക</string>
<string name="withdraw_loan">വായ്പ പിൻവലിക്കുക</string>
<string name="withdraw_loan_reason">വായ്പ പിൻവലിക്കുന്നതിനുള്ള കാരണം</string>
<string name="loan_account_withdrawn_successfully">വായ്പ അക്കൗണ്ട് വിജയകരമായി പിൻവലിച്ചു</string>
<string name="review">അവലോകനം</string>
<string name="submit_loan">വായ്പ സമർപ്പിക്കുക</string>
<string name="new_loan_application">പുതിയ വായ്പാ അപേക്ഷ:</string>
<string name="update_loan_application">വായ്പാ അപേക്ഷ അപ്‌ഡേറ്റ് ചെയ്യുക:</string>
<string name="loan_interest_type">പലിശ തരം</string>
<string name="amortization">അമോർട്ടൈസേഷൻ</string>
<string name="interest_calculation_period">പലിശ കണക്കാക്കുന്ന കാലയളവ്</string>
<string name="repayment_strategy">തിരിച്ചടവ് തന്ത്രം</string>
<string name="pay_to">ഇതിലേക്ക് നൽകുക</string>
<string name="pay_from">ഇതിൽ നിന്ന് നൽകുക</string>
<string name="feature_account_cancel">റദ്ദാക്കുക</string>
<string name="review_transfer">ട്രാൻസ്ഫർ അവലോകനം</string>
<string name="transfer_to">ഇതിലേക്ക് ട്രാൻസ്ഫർ ചെയ്യുക</string>
<string name="transfer_from">ഇതിൽ നിന്ന് ട്രാൻസ്ഫർ ചെയ്യുക</string>
<string name="making_transfer">ട്രാൻസ്ഫർ ചെയ്യുന്നു</string>
<string name="feature_account_deposit">നിക്ഷേപം</string>
<string name="enter_amount">തുക നൽകുക</string>
<string name="enter_remarks">ട്രാൻസ്ഫറിനുള്ള പരാമർശം നൽകുക</string>
<string name="select_beneficiary">ഗുണഭോക്താവിനെ തിരഞ്ഞെടുക്കുക</string>
<string name="remark_is_mandatory">പരാമർശം നിർബന്ധമാണ്</string>
<string name="feature_account_approved">അംഗീകരിച്ചു</string>
<string name="shares_pending">തീർപ്പുകല്പിക്കാത്തവ</string>
<string name="loan_amount_paid">അടച്ച തുക</string>
<string name="balance">ബാക്കി തുക</string>
<string name="rejected">നിരസിച്ചു</string>
<string name="waiting">കാത്തിരിക്കുന്നു</string>
<string name="register">രജിസ്റ്റർ ചെയ്യുക</string>
<string name="request_id">അഭ്യർത്ഥന ഐഡി</string>
<string name="feature_account_overpaid">അധിക തുക നൽകി</string>
<string name="feature_account_in_arrears">കുടിശ്ശിക</string>
<string name="feature_account_select_you_want">നിങ്ങൾ അപേക്ഷിക്കാൻ ആഗ്രഹിക്കുന്നവ തിരഞ്ഞെടുക്കുക</string>
<string name="filter_savings">സേവിംഗ്സ് അക്കൗണ്ട് ഫിൽട്ടർ ചെയ്യുക</string>
<string name="filter_loan">വായ്പാ അക്കൗണ്ടുകൾ ഫിൽട്ടർ ചെയ്യുക</string>
<string name="filter_share">ഷെയർ അക്കൗണ്ടുകൾ ഫിൽട്ടർ ചെയ്യുക</string>
<string name="search">തിരയുക</string>
<string name="choose_transfer_type">ട്രാൻസ്ഫർ തരം തിരഞ്ഞെടുക്കുക</string>
<string name="feature_account_active">സജീവം</string>
<string name="feature_account_closed">അടച്ചു</string>
<string name="need_approval">അംഗീകാരം ആവശ്യമാണ്</string>
<string name="feature_account_pending">തീർപ്പുകല്പിക്കാത്തവ</string>
<string name="feature_account_matured">കാലാവധി പൂർത്തിയായി</string>
<string name="continue_str">തുടരുക</string>
<string name="close">അടയ്ക്കുക</string>
<string name="transfer_to_savings">സേവിംഗ്സ് അക്കൗണ്ടിലേക്ക് ട്രാൻസ്ഫർ</string>
<string name="transfer_from_savings">സേവിംഗ്സ് അക്കൗണ്ടിൽ നിന്ന് ട്രാൻസ്ഫർ</string>
<string name="feature_account_withdrawn">പിൻവലിച്ചു</string>
<string name="blank">&#160;</string>
<string name="import_qr">ക്യുആർ ഇമ്പോർട്ട് ചെയ്യുക</string>
<string name="authentication_token">ഓതന്റിക്കേഷൻ ടോക്കൺ</string>
<string name="verify">പരിശോധിക്കുക</string>
<string name="verifying">പരിശോധിക്കുന്നു</string>
<string name="sign_up">സൈൻ അപ്പ് ചെയ്യുന്നു</string>
<string name="verified">ഉപയോക്താവിനെ വിജയകരമായി പരിശോധിച്ചു</string>
<string name="use_touch_id">ടച്ച് ഐഡി ഉപയോഗിക്കുക</string>
<string name="view_guarantor">ജാമ്യക്കാരനെ കാണുക</string>
<string name="add_guarantor">ജാമ്യക്കാരനെ ചേർക്കുക</string>
<string name="delete_guarantor">ജാമ്യക്കാരനെ നീക്കം ചെയ്യുക</string>
<string name="update_guarantor">ജാമ്യക്കാരനെ അപ്‌ഡേറ്റ് ചെയ്യുക</string>
<string name="guarantor_type">ജാമ്യ തരം</string>
<string name="no_guarantors">ജാമ്യക്കാർ ഇല്ല</string>
<string name="tap_to_add_guarantor">ജാമ്യക്കാരനെ ചേർക്കാൻ ടാപ്പുചെയ്യുക</string>
<string name="guarantor_details">ജാമ്യക്കാരന്റെ വിവരങ്ങൾ</string>
<string name="joined_date">ചേർന്ന തീയതി</string>
<string name="submit">സമർപ്പിക്കുക</string>
<string name="select_product_id">ഉൽപ്പന്ന ഐഡി തിരഞ്ഞെടുക്കുക</string>
<string name="account_id">അക്കൗണ്ട് ഐഡി</string>
<string name="new_saving_account_application">പുതിയ സേവിംഗ്സ് അക്കൗണ്ട് അപേക്ഷ</string>
<string name="update_savings_account">സേവിംഗ്സ് അക്കൗണ്ട് അപ്‌ഡേറ്റ് ചെയ്യുക</string>
<string name="withdraw_savings_account">സേവിംഗ്സ് അക്കൗണ്ട് പിൻവലിക്കുക</string>
<string name="withdrawal_date">പിൻവലിക്കൽ തീയതി</string>
<string name="new_saving_account_created_successfully">പുതിയ സേവിംഗ്സ് അക്കൗണ്ട് വിജയകരമായി സൃഷ്ടിച്ചു.</string>
<string name="saving_account_updated_successfully">സേവിംഗ്സ് അക്കൗണ്ട് വിജയകരമായി അപ്‌ഡേറ്റ് ചെയ്തു</string>
<string name="savings_account_withdraw_successful">സേവിംഗ്സ് അക്കൗണ്ടിൽ നിന്നുള്ള പിൻവലിക്കൽ വിജയകരം</string>
<string name="string_savings_account">%1$s സേവിംഗ്സ് അക്കൗണ്ട്</string>
<string name="apply">അപേക്ഷിക്കുക</string>
<string name="apply_savings_account">സേവിംഗ്സ് അക്കൗണ്ടിന് അപേക്ഷിക്കുക</string>
<string name="update">അപ്‌ഡേറ്റ് ചെയ്യുക</string>
<string name="edit">എഡിറ്റ് ചെയ്യുക</string>
<string name="passcode">പാസ്‌കോഡ്</string>
<string name="other">മറ്റുള്ളവ</string>
<string name="gender">ലിംഗഭേദം</string>
<string name="no">അല്ല</string>
<string name="found">കണ്ടെത്തി</string>
<string name="feature_account_empty_savings_accounts">നിങ്ങൾക്ക് സേവിംഗ്സ് അക്കൗണ്ടുകൾ ഒന്നുമില്ല</string>
<string name="feature_account_empty_loan_accounts">നിങ്ങൾക്ക് വായ്പാ അക്കൗണ്ടുകൾ ഒന്നുമില്ല</string>
<string name="feature_account_empty_share_accounts">നിങ്ങൾക്ക് ഷെയർ അക്കൗണ്ടുകൾ ഒന്നുമില്ല</string>
<string name="empty_transactions">നിങ്ങളുടെ അക്കൗണ്ടുമായി ബന്ധപ്പെട്ട ഇടപാടുകൾ ഒന്നുമില്ല</string>
<string name="empty_repayment_schedule">നിങ്ങളുടെ അക്കൗണ്ടുമായി ബന്ധപ്പെട്ട തിരിച്ചടവ് ഷെഡ്യൂളുകൾ ഒന്നുമില്ല</string>
<string name="no_more_transactions_available">കൂടുതൽ ഇടപാടുകൾ ലഭ്യമല്ല</string>
<string name="no_transaction">ഇടപാടുകൾ ഇല്ല</string>
<string name="no_dob_found">ജനനത്തീയതി കണ്ടെത്തിയില്ല.</string>
<string name="not_assigned_with_any_group">ഒരു ഗ്രൂപ്പിലുമായി ബന്ധിപ്പിച്ചിട്ടില്ല</string>
<string name="transfer_error">ട്രാൻസ്ഫർ പൂർത്തിയാക്കാൻ കഴിഞ്ഞില്ല, ദയവായി പിന്നീട് വീണ്ടും ശ്രമിക്കുക</string>
<string name="error_unauthorised">തെറ്റായ ഉപയോക്തൃനാമം / പാസ്‌വേഡ്</string>
<string name="error_message_server">സെർവറിൽ നിന്നുള്ള പ്രതികരണം ലോഡ് ചെയ്യുന്നതിൽ പിശക്</string>
<string name="error_validation_blank">%1$s ശൂന്യമാകാൻ പാടില്ല</string>
<string name="error_validation_minimum_chars">%1$s %2$d അക്ഷരങ്ങളിൽ കുറയാൻ പാടില്ല</string>
<string name="error_validation_cannot_contain_spaces">%1$s ൽ %2$s അടങ്ങാൻ പാടില്ല</string>
<string name="error_internal_server">ഇന്റേണൽ സെർവർ പിശക്, ദയവായി വീണ്ടും ശ്രമിക്കുക</string>
<string name="error_client_loading">ഉപഭോക്തൃ പട്ടിക ലോഡ് ചെയ്യുന്നതിൽ പിശക്</string>
<string name="error_loan_accounts_list_loading">വായ്പാ അക്കൗണ്ടുകളുടെ പട്ടിക ലോഡ് ചെയ്യുന്നതിൽ പിശക്</string>
<string name="error_saving_accounts_list_loading">സേവിംഗ്സ് അക്കൗണ്ടുകളുടെ പട്ടിക ലോഡ് ചെയ്യുന്നതിൽ പിശക്</string>
<string name="error_saving_account_details_loading">സേവിംഗ്സ് അക്കൗണ്ട് വിശദാംശങ്ങൾ ലോഡ് ചെയ്യുന്നതിൽ പിശക്</string>
<string name="qr_code">ക്യുആർ കോഡ്</string>
<string name="error_recent_transactions_loading">സമീപകാല ഇടപാടുകൾ ലോഡ് ചെയ്യുന്നതിൽ പിശക്</string>
<string name="error_client_charge_loading">ഉപഭോക്തൃ ചാർജ് ലോഡ് ചെയ്യുന്നതിൽ പിശക്</string>
<string name="error_no_charge">ചാർജുകൾ ഒന്നും കണ്ടെത്തിയില്ല</string>
<string name="error_client_not_found">ഉപഭോക്താവിനെ കണ്ടെത്തിയില്ല</string>
<string name="error_fetching_client">ഉപഭോക്താവിനെ ലഭ്യമാക്കുന്നതിൽ പരാജയപ്പെട്ടു</string>
<string name="error_fetching_user_profile">ഉപയോക്തൃ പ്രൊഫൈൽ ലഭ്യമാക്കുന്നതിൽ പരാജയപ്പെട്ടു</string>
<string name="error_fetching_accounts">അക്കൗണ്ടുകൾ ലഭ്യമാക്കുന്നതിൽ പരാജയപ്പെട്ടു</string>
<string name="error_fetching_repayment_schedule">തിരിച്ചടവ് ഷെഡ്യൂൾ ലഭ്യമാക്കുന്നതിൽ പരാജയപ്പെട്ടു</string>
<string name="error_same_account_transfer">ഒരേ അക്കൗണ്ടിലേക്ക് ട്രാൻസ്ഫർ ചെയ്യാൻ കഴിയില്ല</string>
<string name="error_fetching_account_transfer_template">അക്കൗണ്ട് ട്രാൻസ്ഫർ ടെംപ്ലേറ്റ് ലഭ്യമാക്കുന്നതിൽ പിശക്</string>
<string name="error_fetching_beneficiaries">ഗുണഭോക്താക്കളെ ലഭ്യമാക്കുന്നതിൽ പരാജയപ്പെട്ടു</string>
<string name="error_fetching_beneficiary_template">ഗുണഭോക്തൃ ടെംപ്ലേറ്റ് ലഭ്യമാക്കുന്നതിൽ പരാജയപ്പെട്ടു</string>
<string name="user_details">ഉപയോക്തൃ വിവരങ്ങൾ</string>
<string name="activation_date">ആക്ടിവേഷൻ തീയതി</string>
<string name="client_type">ഉപഭോക്തൃ തരം</string>
<string name="groups">ഗ്രൂപ്പുകൾ</string>
<string name="client_classification">ഉപഭോക്തൃ വർഗ്ഗീകരണം</string>
<string name="error_fetching_template">ടെംപ്ലേറ്റ് ലഭ്യമാക്കുന്നതിൽ പരാജയപ്പെട്ടു</string>
<string name="error_creating_beneficiary">ഗുണഭോക്താവിനെ സൃഷ്ടിക്കുന്നതിൽ പരാജയപ്പെട്ടു</string>
<string name="error_updating_beneficiary">ഗുണഭോക്താവിനെ അപ്‌ഡേറ്റ് ചെയ്യുന്നതിൽ പരാജയപ്പെട്ടു</string>
<string name="error_deleting_beneficiary">ഗുണഭോക്താവിനെ നീക്കം ചെയ്യുന്നതിൽ പരാജയപ്പെട്ടു</string>
<string name="error_loan_account_withdraw">വായ്പാ അക്കൗണ്ട് പിൻവലിക്കുന്നതിൽ പിശക്</string>
<string name="no_beneficiary_found_please_add">നിലവിൽ, നിങ്ങൾക്ക് ഗുണഭോക്താക്കൾ ആരുമില്ല. ദയവായി ഗുണഭോക്താവിനെ ചേർക്കുക</string>
<string name="unauthorized_client">നിങ്ങൾക്ക് അനുമതിയില്ല</string>
<string name="invalid_qr">നിങ്ങൾക്ക് സ്വന്തം അക്കൗണ്ടിൽ നിന്ന് പ്രവർത്തിക്കാൻ കഴിയില്ല, ദയവായി മറ്റൊരു ഉപയോക്താവിന്റെ സേവിംഗ്സ് അല്ലെങ്കിൽ വായ്പാ അക്കൗണ്ടിന്റെ ക്യുആർ സ്കാൻ ചെയ്യുക</string>
<string name="add">ചേർക്കുക</string>
<string name="scan">സ്കാൻ ചെയ്യുക</string>
<string name="select_mode">മോഡ് തിരഞ്ഞെടുക്കുക</string>
<string name="share_msg">ഇവിടെ സെൽഫ് സർവീസ് ആപ്പ് ഡൗൺലോഡ് ചെയ്യുക: https://play.google.com/store/apps/details?id=</string>
<string name="enter_passcode">4 അക്ക പാസ്‌കോഡ് നൽകുക</string>
<string name="error_passcode">പാസ്‌കോഡിൽ 4 അക്കങ്ങൾ ഉണ്ടായിരിക്കണം</string>
<string name="incorrect_passcode">പാസ്‌കോഡ് തെറ്റാണ്</string>
<string name="incorrect_passcode_more_than_three">നിങ്ങൾ 3 തവണയിൽ കൂടുതൽ തെറ്റായ പാസ്‌കോഡ് നൽകി</string>
<string name="forgot_passcode">പാസ്‌കോഡ് മറന്നോ, നേരിട്ട് ലോഗിൻ ചെയ്യുക</string>
<string name="proceed">മുന്നോട്ട് പോകുക</string>
<string name="skip">ഒഴിവാക്കുക</string>
<string name="save">സേവ് ചെയ്യുക</string>
<string name="amount_greater_than_zero">തുക പൂജ്യത്തേക്കാൾ കൂടുതലായിരിക്കണം</string>
<string name="help_under_construction">സഹായം നിർമ്മാണത്തിലാണ്</string>
<string name="logout">ലോഗൗട്ട്</string>
<string name="loan_charges">വായ്പാ ചാർജുകൾ</string>
<string name="view_transactions">ഇടപാടുകൾ കാണുക</string>
<string name="view_charges">ചാർജുകൾ കാണുക</string>
<string name="view_loan_summary">വായ്പാ സംഗ്രഹം കാണുക</string>
<string name="view_repayment">തിരിച്ചടവ് ഷെഡ്യൂൾ കാണുക</string>
<string name="share_qr_code">ക്യുആർ കോഡ് പങ്കിടുക</string>
<string name="monitor">നിരീക്ഷിക്കുക</string>
<string name="choose_option">ഓപ്ഷൻ തിരഞ്ഞെടുക്കുക</string>
<string name="view_qr_code">ഈ അക്കൗണ്ടിനുള്ള ക്യുആർ കോഡ് കാണുക</string>
<string name="last_trans">അവസാന ഇടപാട് വിവരങ്ങൾ</string>
<string name="passcode_setup">ലോഗിൻ ചെയ്യുന്നതിന് ഒരു പാസ്‌കോഡ് സജ്ജീകരിക്കുക</string>
<string name="reenter_passcode">ദയവായി നിങ്ങളുടെ പാസ്‌കോഡ് വീണ്ടും നൽകുക</string>
<string name="passcode_does_not_match">പാസ്‌കോഡ് പൊരുത്തപ്പെടുന്നില്ല</string>
<string name="error_fetching_third_party_transfer_template">തേർഡ് പാർട്ടി ട്രാൻസ്ഫർ ടെംപ്ലേറ്റ് ലഭ്യമാക്കുന്നതിൽ പിശക്</string>
<string name="choose">ആപ്ലിക്കേഷൻ തിരഞ്ഞെടുക്കുക</string>
<string name="upload_qr_code">ക്യുആർ അപ്‌ലോഡ് ചെയ്യുക</string>
<string name="select_region_qr">ക്യുആർ കോഡ് ഉള്ള ഭാഗം തിരഞ്ഞെടുക്കുക</string>
<string name="error_username_greater_than_six">ഉപയോക്തൃനാമം 6 അക്ഷരങ്ങളിൽ കൂടുതലായിരിക്കണം</string>
<string name="error_invalid_email">അസാധുവായ ഇമെയിൽ ഐഡി</string>
<string name="error_server_down">സെർവർ പ്രവർത്തനരഹിതമാണ്, അൽപ്പസമയത്തിന് ശേഷം ശ്രമിക്കുക</string>
<string name="client_charges">ഉപഭോക്തൃ ചാർജുകൾ</string>
<string name="error_reading_qr">ക്യുആർ റീഡ് ചെയ്യുന്നതിൽ പിശക്, നിങ്ങൾ ശരിയായ ഭാഗം തിരഞ്ഞെടുത്തുവെന്ന് ഉറപ്പാക്കുക</string>
<string name="error_fetching_image">ചിത്രം ലഭ്യമാക്കുന്നതിൽ പിശക്</string>
<string name="invalid_phn_number">അസാധുവായ ഫോൺ നമ്പർ</string>
<string name="fetching_client">ഉപഭോക്താവിനെ ലഭ്യമാക്കുന്നു</string>
<string name="not_contain_username">സ്പേസുകൾ</string>
<string name="client_name">ഉപഭോക്താവിന്റെ പേര്</string>
<string name="account_status">അക്കൗണ്ട് നില</string>
<string name="saving_product_name">ഉൽപ്പന്നത്തിന്റെ പേര്</string>
<string name="total_withdrawal">ആകെ പിൻവലിക്കൽ</string>
<string name="min_required_balance">ആവശ്യമായ കുറഞ്ഞ ബാലൻസ്</string>
<string name="loan_product_name">ഉൽപ്പന്നത്തിന്റെ പേര്</string>
<string name="loan_purpose">വായ്പയുടെ ഉദ്ദേശ്യം</string>
<string name="principal">അടിസ്ഥാന തുക</string>
<string name="principal_disbursed">വിതരണം ചെയ്ത അടിസ്ഥാന തുക</string>
<string name="annual_interest_rate">വാർഷിക പലിശ നിരക്ക്</string>
<string name="interest_charged">ഈടാക്കിയ പലിശ</string>
<string name="interest_paid">അടച്ച പലിശ</string>
<string name="loan_account_details">വായ്പാ അക്കൗണ്ട് വിവരങ്ങൾ</string>
<string name="loan_summary">വായ്പാ സംഗ്രഹം</string>
<string name="loan_name">വായ്പയുടെ പേര്</string>
<string name="interest">പലിശ</string>
<string name="fees">ഫീസ്</string>
<string name="penalties">പിഴകൾ</string>
<string name="total_repayment">മൊത്തം പ്രതീക്ഷിക്കുന്ന തിരിച്ചടവ്</string>
<string name="total_paid">മൊത്തം അടച്ച തുക</string>
<string name="interest_waived">ഒഴിവാക്കിയ പലിശ</string>
<string name="penalties_waived">ഒഴിവാക്കിയ പിഴകൾ</string>
<string name="fees_waived">ഒഴിവാക്കിയ ഫീസ്</string>
<string name="outstanding_balance">കുടിശ്ശിക തുക</string>
<string name="next_installment">അടുത്ത ഗഡു</string>
<string name="due_date">അടയ്ക്കേണ്ട തീയതി</string>
<string name="make_payment">പണമടയ്ക്കുക</string>
<string name="loan_type">വായ്പ തരം</string>
<string name="currency">കറൻസി</string>
<string name="repayment_schedule">തിരിച്ചടവ് ഷെഡ്യൂൾ</string>
<string name="transactions">ഇടപാടുകൾ</string>
<string name="transfer">ട്രാൻസ്ഫർ</string>
<string name="feature_account_approval_pending">അംഗീകാരം ലഭിക്കാൻ കാത്തിരിക്കുന്നു</string>
<string name="feature_account_disburse">വിതരണം ചെയ്യാൻ കാത്തിരിക്കുന്നു</string>
<string name="closed_because_of_obligation">ചില ബാധ്യതകൾ കാരണം അടച്ചു</string>
<string name="loan_closed">വായ്പ അടച്ചു</string>
<string name="due_date_in_charges">അടയ്ക്കേണ്ട തീയതി:</string>
<string name="amount_due">നൽകേണ്ട തുക:</string>
<string name="amount_paid">അടച്ച തുക:</string>
<string name="amount_waived">ഒഴിവാക്കിയ തുക:</string>
<string name="amount_outstanding">കുടിശ്ശിക:</string>
<string name="appwidget_text">ഉദാഹരണം</string>
<string name="add_widget">വിജറ്റ് ചേർക്കുക</string>
<string name="help">സഹായം</string>
<string name="mifos_initiative">മിഫോസ് ഇനിഷ്യേറ്റീവ്</string>
<string name="mifos_location">മിഫോസ് ഇനിഷ്യേറ്റീവ്, സിയാറ്റിൽ, വാഷിംഗ്ടൺ 98121</string>
<string name="map_marker_heading">സിയാറ്റിൽ</string>
<string name="map_marker_desc">വലിയ ടെക് വ്യവസായത്തിന്റെ ആസ്ഥാനം</string>
<string name="loan_transaction_details">വായ്പാ അക്കൗണ്ട് വിവരങ്ങൾ</string>
<string name="loan_application_submitted_successfully">വായ്പാ അപേക്ഷ വിജയകരമായി സമർപ്പിച്ചു</string>
<string name="loan_application_updated_successfully">വായ്പാ അപേക്ഷ വിജയകരമായി അപ്‌ഡേറ്റ് ചെയ്തു</string>
<string name="loan_application_withdrawn_successfully">വായ്പാ അപേക്ഷ വിജയകരമായി പിൻവലിച്ചു</string>
<string name="none">ഒന്നുമില്ല</string>
<string name="all">എല്ലാം</string>
<string name="four_weeks">4 ആഴ്ച</string>
<string name="three_months">3 മാസം</string>
<string name="six_months">6 മാസം</string>
<string name="feature_account_filter">ഫിൽട്ടർ</string>
<string name="start_date">ആരംഭ തീയതി</string>
<string name="end_date">അവസാന തീയതി</string>
<string name="filtered">ഫിൽറ്റർ ചെയ്‌തത്</string>
<string name="select_date">ആരംഭ തീയതിയും അവസാന തീയതിയും തിരഞ്ഞെടുക്കുക</string>
<string name="end_date_must_be_greater">അവസാന തീയതി ആരംഭ തീയതിയേക്കാൾ വലുതായിരിക്കണം</string>
<string name="saving_account_transactions_details">സേവിംഗ്സ് അക്കൗണ്ട് ഇടപാട്</string>
<string name="no_internet_connection">ഇന്റർനെറ്റ് കണക്ഷൻ ഇല്ല</string>
<string name="disbursement_date">വിതരണ തീയതി</string>
<string name="no_of_payments">പേയ്മെന്റുകളുടെ എണ്ണം</string>
<string name="date">തീയതി</string>
<string name="loan_balance">വായ്പ ബാലൻസ്</string>
<string name="repayment">തിരിച്ചടവ്</string>
<string name="loan_repayment">വായ്പാ തിരിച്ചടവ്</string>
<string name="quick_transfer">ദ്രുത ട്രാൻസ്ഫർ</string>
<string name="internet_not_connected">നിങ്ങൾ ഇന്റർനെറ്റുമായി കണക്റ്റുചെയ്‌തിട്ടുണ്ടെന്ന് ഉറപ്പാക്കുക</string>
<string name="beneficiary">ഗുണഭോക്താവ്</string>
<string name="manage_beneficiaries">ഗുണഭോക്താക്കളെ നിയന്ത്രിക്കുക</string>
<string name="beneficiaries">ഗുണഭോക്താക്കൾ</string>
<string name="beneficiary_detail">ഗുണഭോക്താവിന്റെ വിവരങ്ങൾ</string>
<string name="beneficiary_name">ഗുണഭോക്താവിന്റെ പേര്</string>
<string name="account_type">അക്കൗണ്ട് തരം</string>
<string name="transfer_limit">ട്രാൻസ്ഫർ പരിധി</string>
<string name="add_beneficiary">ഗുണഭോക്താവിനെ ചേർക്കുക</string>
<string name="office_name">ഓഫീസ് പേര്</string>
<string name="add_beneficiary_option">നിങ്ങളുടെ അക്കൗണ്ടിലേക്ക് തേർഡ് പാർട്ടി ഗുണഭോക്താക്കളെ ചേർക്കുക, നേരിട്ട് നൽകുകയോ അക്കൗണ്ട് ക്യുആർ കോഡ് സ്കാൻ ചെയ്യുകയോ ചെയ്യാം</string>
<string name="income_generating_loan">വരുമാനം ഉണ്ടാക്കുന്ന വായ്പ</string>
<string name="not_applicable">ബാധകമല്ല</string>
<string name="dummy_principal_amount">143.00</string>
<string name="select_account_type">അക്കൗണ്ട് തരം തിരഞ്ഞെടുക്കുക*</string>
<string name="submit_beneficiary">ഗുണഭോക്താവിനെ സമർപ്പിക്കുക</string>
<string name="enter_office_name">ഗുണഭോക്താവിന്റെ ഓഫീസ് പേര് നൽകുക</string>
<string name="enter_beneficiary_name">ഗുണഭോക്താവിന്റെ പേര് നൽകുക</string>
<string name="enter_transfer_limit">ട്രാൻസ്ഫർ പരിധി നൽകുക</string>
<string name="enter_account_number">ഗുണഭോക്താവിന്റെ അക്കൗണ്ട് നമ്പർ നൽകുക</string>
<string name="choose_account_type">ഡ്രോപ്പ്ഡൗണിൽ നിന്ന് അക്കൗണ്ട് തരം തിരഞ്ഞെടുക്കുക</string>
<string name="beneficiary_created_successfully">ഗുണഭോക്താവിനെ വിജയകരമായി സൃഷ്ടിച്ചു</string>
<string name="beneficiary_updated_successfully">ഗുണഭോക്താവിനെ വിജയകരമായി അപ്‌ഡേറ്റ് ചെയ്തു</string>
<string name="update_beneficiary">ഗുണഭോക്താവിനെ അപ്‌ഡേറ്റ് ചെയ്യുക</string>
<string name="delete_beneficiary">ഗുണഭോക്താവിനെ നീക്കം ചെയ്യുക</string>
<string name="total_loan">ആകെ വായ്പ</string>
<string name="total_saving">ആകെ സമ്പാദ്യം</string>
<string name="accounts_overview">അക്കൗണ്ട് അവലോകനം</string>
<string name="show_hide_total_saving_amount">ആകെ സമ്പാദ്യ തുക കാണിക്കുകയോ മറയ്ക്കുകയോ ചെയ്യുക</string>
<string name="show_hide_total_loan_amount">ആകെ വായ്പാ തുക കാണിക്കുകയോ മറയ്ക്കുകയോ ചെയ്യുക</string>
<string name="hidden_amount">*****</string>
<string name="survey">സർവേ</string>
<string name="first_name">ആദ്യ പേര്</string>
<string name="delete_beneficiary_confirmation">ഈ ഗുണഭോക്താവിനെ നീക്കം ചെയ്യണമെന്ന് നിങ്ങൾക്ക് ഉറപ്പാണോ</string>
<string name="login_using_password_confirmation">പാസ്‌വേഡ് ഉപയോഗിച്ച് ലോഗിൻ ചെയ്യണമെന്ന് നിങ്ങൾക്ക് ഉറപ്പാണോ?</string>
<string name="delete">നീക്കം ചെയ്യുക</string>
<string name="about_us_under_construction">"ഞങ്ങളെക്കുറിച്ച്" നിർമ്മാണത്തിലാണ്</string>
<string name="beneficiary_deleted_successfully">ഗുണഭോക്താവിനെ വിജയകരമായി നീക്കം ചെയ്തു</string>
<string name="third_party_transfer">തേർഡ് പാർട്ടി ട്രാൻസ്ഫർ</string>
<!--Customer care details-->
<string name="need_help">ഞങ്ങളെ ബന്ധപ്പെടുക</string>
<string name="transferred_successfully">വിജയകരമായി ട്രാൻസ്ഫർ ചെയ്തു</string>
<string name="total">ആകെ: </string>
<string name="account_short">അക്കൗണ്ട്</string>
<string name="loan_product">വായ്പാ ഉൽപ്പന്നം</string>
<string name="inactive">നിഷ്ക്രിയ</string>
<string name="active_uc">സജീവം</string>
<string name="inactive_uc">നിഷ്ക്രിയ</string>
<!--Material Dialog-->
<string name="dialog_logout">നിങ്ങൾക്ക് ലോഗൗട്ട് ചെയ്യണോ?</string>
<string name="dialog_action_ok">ശരി</string>
<string name="dialog_action_cancel">റദ്ദാക്കുക</string>
<string name="dialog_action_back">തിരികെ</string>
<string name="dialog_permission_denied">അനുമതി നിഷേധിച്ചു</string>
<string name="dialog_action_i_am_sure">എനിക്ക് ഉറപ്പാണ്</string>
<string name="dialog_action_re_try">വീണ്ടും ശ്രമിക്കുക</string>
<string name="dialog_action_app_settings">ആപ്പ് ക്രമീകരണങ്ങൾ</string>
<string name="dialog_message_camera_permission_denied_prompt">ക്യാമറ അനുമതിയില്ലാതെ നിങ്ങൾക്ക് ഗുണഭോക്താവിനെ ചേർക്കാൻ ക്യുആർ കോഡ് സ്കാൻ ചെയ്യാൻ കഴിയില്ല. ഈ അനുമതി നിഷേധിക്കണമെന്ന് നിങ്ങൾക്ക് ഉറപ്പാണോ?</string>
<string name="dialog_message_storage_permission_denied_prompt">സ്റ്റോറേജ് അനുമതിയില്ലാതെ നിങ്ങൾക്ക് ഗുണഭോക്താവിനെ ചേർക്കാൻ ക്യുആർ കോഡ് അപ്‌ലോഡ് ചെയ്യാൻ കഴിയില്ല. ഈ അനുമതി നിഷേധിക്കണമെന്ന് നിങ്ങൾക്ക് ഉറപ്പാണോ?</string>
<string name="dialog_message_read_storage_permission_never_ask_again">സ്റ്റോറേജ് റീഡ് ചെയ്യാനുള്ള അനുമതി നിങ്ങൾ നിഷേധിച്ചു. ഈ അനുമതിയില്ലാതെ ക്യുആർ കോഡ് ഉപയോഗിച്ച് നിങ്ങൾക്ക് ഗുണഭോക്താക്കളെ ചേർക്കാൻ കഴിയില്ല. ക്രമീകരണങ്ങളിൽ ഇത് പ്രവർത്തനക്ഷമമാക്കുക.</string>
<string name="dialog_message_write_storage_permission_never_ask_again">സ്റ്റോറേജ് റൈറ്റ് ചെയ്യാനുള്ള അനുമതി നിങ്ങൾ നിഷേധിച്ചു. ഈ അനുമതിയില്ലാതെ ക്യുആർ കോഡ് ഉപയോഗിച്ച് നിങ്ങൾക്ക് ഗുണഭോക്താക്കളെ ചേർക്കാൻ കഴിയില്ല. ക്രമീകരണങ്ങളിൽ ഇത് പ്രവർത്തനക്ഷമമാക്കുക.</string>
<string name="dialog_message_camera_permission_never_ask_again">ഈ അനുമതിയില്ലാതെ, ക്യാമറ ഉപയോഗിക്കുന്നതിനുള്ള അനുമതി നിഷേധിക്കപ്പെട്ടു, നിങ്ങൾക്ക് ക്യുആർ കോഡ് ഉപയോഗിച്ച് ഗുണഭോക്താക്കളെ ചേർക്കാൻ കഴിയില്ല. ക്രമീകരണങ്ങളിൽ ഇത് പ്രവർത്തനക്ഷമമാക്കുക.</string>
<string name="dialog_message_phone_state_permission_denied_prompt">നിങ്ങളുടെ രാജ്യത്തിനനുസരിച്ചുള്ള കറൻസി കാണിക്കാൻ ഈ അനുമതി ആവശ്യമാണ്. ഇത് നിഷേധിക്കണമെന്ന് നിങ്ങൾക്ക് ഉറപ്പാണോ?</string>
<string name="dialog_message_phone_state_permission_never_ask_again">ഫോൺ സ്റ്റേറ്റ് ലഭ്യമാക്കാനുള്ള അനുമതി നിങ്ങൾ നിഷേധിച്ചു. ഈ അനുമതിയില്ലാതെ കറൻസി ശരിയായ ഫോർമാറ്റിൽ കാണിക്കാൻ കഴിയില്ല. ക്രമീകരണങ്ങളിൽ ഇത് പ്രവർത്തനക്ഷമമാക്കുക.</string>
<string name="msg_setting_activity_not_found">ക്രമീകരണ ആക്റ്റിവിറ്റി കണ്ടെത്തുന്നതിൽ എന്തോ തെറ്റ് സംഭവിച്ചു. ക്രമീകരണങ്ങളിലേക്ക് പോയി സ്വയം അനുമതി നൽകുക.</string>
<string name="permission_denied_storage">സ്റ്റോറേജ് അനുമതി നൽകിയിട്ടില്ല</string>
<string name="dialog_are_you_sure_that_you_want_to_string">ഇങ്ങനെ ചെയ്യാൻ ആഗ്രഹിക്കുന്നുവെന്ന് നിങ്ങൾക്ക് ഉറപ്പാണോ %1$s?</string>
<string name="err_during_login">ലോഗിൻ ചെയ്യുന്നതിനിടെ പിശക് സംഭവിച്ചു</string>
<!--Format Strings-->
<string name="hello_client">ഹലോ, %1$s</string>
<string name="double_and_string">%1$.2f %2$s</string>
<string name="feature_account_string_and_string">%1$s %2$s</string>
<string name="string_and_double">%1$s: %2$.2f</string>
<string name="string_and_int">%1$s: %2$d</string>
<string name="invalid_amount">അസാധുവായ തുക</string>
<string name="exit_message">പുറത്തുകടക്കാൻ ബാക്ക് ബട്ടൺ വീണ്ടും അമർത്തുക</string>
<string name="one">1</string>
<string name="two">2</string>
<string name="three">3</string>
<string name="four">4</string>
<string name="five">5</string>
<string name="six">6</string>
<string name="seven">7</string>
<string name="eight">8</string>
<string name="nine">9</string>
<string name="zero">0</string>
<string name="faq">പതിവുചോദ്യങ്ങൾ</string>
<string name="user_query">ഉപയോക്തൃ അന്വേഷണം</string>
<string name="call_now">ഇപ്പോൾ വിളിക്കുക</string>
<string name="leave_email">ഒരു ഇമെയിൽ അയയ്ക്കുക</string>
<string name="find_locations">ലൊക്കേഷനുകൾ കണ്ടെത്തുക</string>
<string name="settings">ക്രമീകരണങ്ങൾ</string>
<string name="language">ഭാഷ</string>
<string name="choose_language">നിങ്ങളുടെ ഭാഷ തിരഞ്ഞെടുക്കുക</string>
<string name="permission_denied_camera">ക്യാമറ ഉപയോഗിക്കാനുള്ള അനുമതി നിഷേധിച്ചു</string>
<string name="no_withdrawals">പിൻവലിക്കലുകൾ ഇല്ല</string>
<string name="feature_account_clear_filters">ഫിൽട്ടറുകൾ നീക്കം ചെയ്യുക</string>
<string name="notification">അറിയിപ്പുകൾ</string>
<string name="base_url">ബേസ് URL</string>
<string name="tenant">ടെനന്റ്</string>
<string name="no_saving_account">സേവിംഗ്സ് അക്കൗണ്ട് ഇല്ല</string>
<string name="no_loan_account">വായ്പാ അക്കൗണ്ടുകൾ ഇല്ല</string>
<string name="no_sharing_account">ഷെയറിംഗ് അക്കൗണ്ടുകൾ ഇല്ല</string>
<string name="select_loan_product_field">വായ്പാ ഉൽപ്പന്നം തിരഞ്ഞെടുക്കുക</string>
<string name="sign_in_fingerprint">ഫിംഗർപ്രിന്റ് ഉപയോഗിച്ച് സൈൻ ഇൻ ചെയ്യുക</string>
<string name="scan_your_fingerprint">നിങ്ങളുടെ ഫിംഗർപ്രിന്റ് സ്കാൻ ചെയ്യുക</string>
<string name="manage_accounts">അക്കൗണ്ടുകൾ നിയന്ത്രിക്കുക</string>
<string name="more">കൂടുതൽ</string>
<string name="total_saving_balance">ആകെ സമ്പാദ്യ ബാലൻസ്</string>
<string name="total_loan_balance">ആകെ വായ്പ ബാലൻസ്</string>
<string name="total_loan_savings_description">മുകളിലുള്ള വായ്പ, സേവിംഗ്സ് അക്കൗണ്ട് ബാലൻസുകൾ നിങ്ങളുടെ എല്ലാ സേവിംഗ്സ്, വായ്പാ അക്കൗണ്ടുകളെയും അടിസ്ഥാനപ്പെടുത്തി കണക്കാക്കിയതാണ്.
</string>
<string name="cancel_transfer">ട്രാൻസ്ഫർ റദ്ദാക്കണമെന്ന് നിങ്ങൾക്ക് ഉറപ്പാണോ?</string>
<string name="yes">അതെ</string>
<string name="confirm_password">പാസ്‌വേഡ് സ്ഥിരീകരിക്കുക</string>
<string name="error_password_not_match">പാസ്‌വേഡ് പൊരുത്തപ്പെടുന്നില്ല.</string>
<string name="app_version">പതിപ്പ് %1$s</string>
<string name="feature_about_copyright_mifos">©2016-%1$s മിഫോസ് ഇനിഷ്യേറ്റീവ്.</string>
<string name="all_rights_reserved">എല്ലാ അവകാശങ്ങളും നിക്ഷിപ്തം.</string>
<string name="feature_about_licenses">ലൈസൻസുകൾ</string>
<string name="feature_about_privacy_policy">സ്വകാര്യതാ നയം</string>
<string name="change_passcode">പാസ്‌കോഡ് മാറ്റുക</string>
<string name="change_app_passcode">ആപ്പ് പാസ്‌കോഡ് മാറ്റുക</string>
<string name="change_password">പാസ്‍വേഡ് മാറ്റുക</string>
<string name="change_account_password">നിങ്ങളുടെ അക്കൗണ്ട് പാസ്‌വേഡ് മാറ്റുക</string>
<string name="current_password">നിലവിലെ പാസ്‍വേഡ്</string>
<string name="new_password">പുതിയ പാസ്‍വേഡ്</string>
<string name="string_changed_successfully">%1$s വിജയകരമായി മാറ്റി</string>
<string name="message">സന്ദേശം</string>
<string name="no_notification">അറിയിപ്പുകൾ ഒന്നുമില്ല</string>
<string name="account_not_active_to_perform_deposit">നിക്ഷേപം നടത്താൻ അക്കൗണ്ട് സജീവമായിരിക്കണം</string>
<string name="account_not_active_to_perform_transfer">ട്രാൻസ്ഫർ നടത്താൻ അക്കൗണ്ട് സജീവമായിരിക്കണം</string>
<string-array name="faq_qs">
<item>പുതിയ ലോൺ അക്കൗണ്ടിനായി എങ്ങനെ അപേക്ഷിക്കാം?</item>
<item>എന്റെ പ്രൊഫൈൽ വിവരങ്ങൾ എവിടെ കാണാൻ കഴിയും?</item>
<item>എന്റെ സേവിംഗ്സ് അക്കൗണ്ട് ഇടപാടുകൾ എവിടെ കാണാൻ കഴിയും?</item>
<item>QR കോഡ് കൊണ്ടുള്ള ഉപയോഗം എന്താണ്?</item>
<item>QR കോഡ് ഉപയോഗിച്ച് എങ്ങനെ ഒരു ഗുണഭോക്താവിനെ (beneficiary) സൃഷ്ടിക്കാം?</item>
<item>ഒരു ലോൺ അക്കൗണ്ടിലേക്ക് എങ്ങനെ പണമടയ്ക്കാം?</item>
</string-array>
<string-array name="faq_ans">
<item>വായ്പാ അക്കൗണ്ടിനായി അപേക്ഷിക്കാൻ, ഹോം സ്‌ക്രീനിൽ നൽകിയിരിക്കുന്ന \"വായ്‌പയ്‌ക്ക് അപേക്ഷിക്കുക\" ക്ലിക്ക് ചെയ്യുക.</item>
<item>ഹോം സ്‌ക്രീനിലുള്ള യൂസർ ഇമേജിൽ ക്ലിക്ക് ചെയ്‌ത് നിങ്ങൾക്ക് പ്രൊഫൈൽ വിവരങ്ങൾ കാണാനാകും.</item>
<item>സേവിംഗ്‌സ് അക്കൗണ്ട് ഇടപാടുകൾ കാണുന്നതിന്, അക്കൗണ്ട്‌സ് വിഭാഗത്തിലേക്ക് പോയി, ആവശ്യമുള്ള സേവിംഗ്‌സ് അക്കൗണ്ടിൽ ക്ലിക്ക് ചെയ്യുക, മുകളിൽ വലതുവശത്തുള്ള മൂന്ന് ഡോട്ടുകളിൽ ക്ലിക്ക് ചെയ്‌ത് ഇടപാടുകൾ (Transactions) ഓപ്‌ഷൻ തിരഞ്ഞെടുക്കുക.</item>
<item>ഏതൊരു വായ്പ അല്ലെങ്കിൽ സേവിംഗ്‌സ് അക്കൗണ്ടിനുമുള്ള QR കോഡ് മറ്റ് ഉപയോക്താക്കളുമായി പങ്കിടാം, ഇത് ഒരു ഗുണഭോക്താവിനെ (beneficiary) സൃഷ്ടിക്കാൻ അവരെ അനുവദിക്കും.</item>
<item>ഒരു ഗുണഭോക്താവിനെ സൃഷ്ടിക്കാൻ, ഹോം സ്‌ക്രീനിൽ നിന്ന് ബെനിഫിഷ്യറി ഓപ്ഷനിലേക്ക് പോകുക, താഴെ വലതുവശത്തുള്ള വട്ടത്തിലുള്ള ബട്ടൺ ക്ലിക്ക് ചെയ്യുക, സ്കാൻ ചെയ്യാനുള്ള ഓപ്ഷൻ തിരഞ്ഞെടുക്കുക (ഇത് ക്യാമറ തുറക്കും), ഗുണഭോക്താവിനെ ചേർക്കേണ്ട വ്യക്തിയുടെ QR കോഡ് സ്കാൻ ചെയ്യുക. ആവശ്യമായ മറ്റ് വിവരങ്ങൾ നൽകിയ ശേഷം QR കോഡ് ഉപയോഗിച്ച് നിങ്ങൾക്ക് ഗുണഭോക്താവിനെ സൃഷ്ടിക്കാൻ കഴിയും.</item>
<item>വായ്പാ അക്കൗണ്ടിലേക്ക് പണമടയ്ക്കാൻ, അക്കൗണ്ട്‌സ് വിഭാഗത്തിലേക്ക് പോയി, LOAN തിരഞ്ഞെടുക്കുക, ആവശ്യമുള്ള വായ്പാ അക്കൗണ്ട് തുറന്ന് \'Make Payment\' ഓപ്ഷൻ ക്ലിക്ക് ചെയ്യുക.</item>
</string-array>
<string name="please_wait">ദയവായി കാത്തിരിക്കൂ</string>
<string name="app_info">ആപ്പ് വിവരങ്ങൾ</string>
<string name="login_failed">ലോഗിൻ പരാജയപ്പെട്ടു, ദയവായി പിന്നീട് ശ്രമിക്കുക.</string>
<string name="pref_base_url_title">എൻഡ്‌പോയിന്റ് അപ്‌ഡേറ്റ് ചെയ്യുക</string>
<string name="pref_base_url_desc">നിങ്ങളുടെ എൻഡ്‌പോയിന്റ് കോൺഫിഗറേഷനുകൾ മാറ്റാൻ ഇവിടെ ക്ലിക്ക് ചെയ്യുക</string>
<string name="enter_base_url">ബേസ് URL നൽകുക</string>
<string name="enter_tenant">ടെനന്റ് നൽകുക</string>
<string name="refresh">പുതുക്കുക</string>
<!--Password strength strings-->
<string name="password_strength_weak">ദുർബലം</string>
<string name="password_strength_medium">ഇടത്തരം</string>
<string name="password_strength_strong">ശക്തം</string>
<string name="password_strength_very_strong">വളരെ ശക്തം</string>
<string name="loan_purpose_not_provided">ലഭ്യമാക്കിയിട്ടില്ല</string>
<string name="details">വിശദാംശങ്ങൾ</string>
<string name="product">ഉൽപ്പന്നം</string>
<string name="feature_account_dividend_payout">ലാഭവിഹിത വിതരണം</string>
<string name="feature_account_withdrawal">പിൻവലിക്കൽ</string>
<string name="feature_account_interest_posting">പലിശ രേഖപ്പെടുത്തൽ</string>
<string name="feature_account_fee_deduction">ഫീസ് കിഴിവ്</string>
<string name="feature_account_withdrawal_transfer">പിൻവലിക്കൽ ട്രാൻസ്ഫർ</string>
<string name="feature_account_rejected_transfer">നിരസിച്ച ട്രാൻസ്ഫർ</string>
<string name="feature_account_overdraft_fee">ഓവർഡ്രാഫ്റ്റ് ഫീസ്</string>
<string name="savings_account_transaction">സേവിംഗ്സ് അക്കൗണ്ട് ഇടപാട്</string>
<string name="transaction_period">ഇടപാട് കാലയളവ്</string>
<string name="transaction_type">ഇടപാട് തരം</string>
<string name="questions">ചോദ്യങ്ങൾ</string>
<string name="logged_out_successfully">വിജയകരമായി ലോഗൗട്ട് ചെയ്തു</string>
<string name="dialog_cancel_registration_message">പുതിയ അക്കൗണ്ട് രജിസ്ട്രേഷൻ റദ്ദാക്കണമെന്ന് നിങ്ങൾക്ക് ഉറപ്പാണോ?</string>
<string name="dialog_cancel_registration_title">രജിസ്ട്രേഷൻ റദ്ദാക്കുക</string>
</resources>

View File

@ -42,7 +42,7 @@ expect fun LocalManagerProvider(
* Provides access to the app review manager throughout the app.
*/
val LocalAppReviewManager: ProvidableCompositionLocal<AppReviewManager> = compositionLocalOf {
error("CompositionLocal AppReviewManager not present")
NoOpAppReviewManager
}
/**
@ -58,3 +58,8 @@ val LocalIntentManager: ProvidableCompositionLocal<IntentManager> = compositionL
val LocalAppUpdateManager: ProvidableCompositionLocal<AppUpdateManager> = compositionLocalOf {
error("CompositionLocal LocalAppUpdateManager not present")
}
object NoOpAppReviewManager : AppReviewManager {
override fun promptForReview() = Unit
override fun promptForCustomReview() = Unit
}

View File

@ -1,84 +0,0 @@
/*
* Copyright 2026 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 https://mozilla.org/MPL/2.0/.
*
* See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md
*/
package org.mifos.mobile.core.data.mapper
import org.mifos.mobile.core.model.entity.TransactionBalances
import org.mifos.mobile.core.model.entity.TransactionDetails
import org.mifos.mobile.core.model.entity.accounts.loan.LoanTransactionDetails
import org.mifos.mobile.core.model.entity.accounts.savings.SavingsTransactionDetails
fun LoanTransactionDetails.toDomain(): TransactionDetails {
val type = this.loanType
val isCreditResolved = when {
type?.disbursement == true -> false
type?.repayment == true -> false
type?.value?.contains("Transfer", ignoreCase = true) == true -> false
else -> true
}
return TransactionDetails(
id = this.id ?: -1L,
transactionName = type?.value ?: "Loan Transaction",
isCredit = isCreditResolved,
amount = this.amount ?: 0.0,
currencyCode = this.currency?.code ?: "USD",
date = this.date ?: emptyList(),
accountNo = "N/A",
isReversed = this.manuallyReversed == true,
transferDescription = this.transfer?.transferDescription,
balances = TransactionBalances(
running = this.outstandingLoanBalance,
principal = this.principalPortion,
interest = this.interestPortion,
fee = this.feeChargesPortion,
penalty = this.penaltyChargesPortion,
),
)
}
fun SavingsTransactionDetails.toDomain(): TransactionDetails {
val type = this.savingsType
val code = type?.code?.lowercase().orEmpty()
val value = type?.value?.lowercase().orEmpty()
val isCreditResolved = when {
type?.withdrawal == true -> false
type?.feeDeduction == true -> false
type?.initiateTransfer == true -> false
type?.approveTransfer == true -> false
type?.withdrawTransfer == true -> false
type?.deposit == true -> true
type?.rejectTransfer == true -> true
(code.contains("transfer") || value.contains("transfer")) &&
!value.contains("incoming") &&
!value.contains("reject") -> false
else -> true
}
return TransactionDetails(
id = this.id ?: -1L,
transactionName = type?.value ?: "Savings Transaction",
isCredit = isCreditResolved,
amount = this.amount ?: 0.0,
currencyCode = this.currency?.code ?: "USD",
date = this.date ?: emptyList(),
accountNo = this.accountNo ?: "N/A",
isReversed = this.reversed == true,
transferDescription = this.transfer?.transferDescription,
balances = TransactionBalances(
running = this.runningBalance,
),
)
}

View File

@ -18,4 +18,6 @@ fun BeneficiaryPayload.toDto(): BeneficiaryCreatePayloadDto =
name = name,
accountNumber = accountNumber,
accountType = accountType,
transferLimit = transferLimit,
officeName = officeName,
)

View File

@ -19,4 +19,8 @@ fun RegisterPayload.toDto(): RegisterPayloadDto =
username = username,
email = email,
password = password,
authenticationMode = authenticationMode,
accountNumber = accountNumber,
middleName = middleName,
mobileNumber = mobileNumber,
)

View File

@ -32,6 +32,7 @@ fun LoanTransactionDetailsResponseDto.toModel(): TransactionDetails {
date = this.date ?: emptyList(),
accountNo = "N/A",
isReversed = this.manuallyReversed == true,
transferDescription = this.transfer?.transferDescription,
balances = TransactionBalances(
running = this.outstandingLoanBalance,
principal = this.principalPortion,

View File

@ -45,6 +45,7 @@ fun SavingsTransactionDetailsResponseDto.toModel(): TransactionDetails {
date = this.date ?: emptyList(),
accountNo = this.accountNo ?: "N/A",
isReversed = this.reversed == true,
transferDescription = this.transfer?.transferDescription,
balances = TransactionBalances(
running = this.runningBalance,
),

View File

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2026 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 https://mozilla.org/MPL/2.0/.
See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md
-->
<resources>
<string name="feature_upload_id_remove_file">ഫയൽ നീക്കം ചെയ്യുക</string>
<string name="feature_upload_id_view_file">ഫയൽ കാണുക</string>
<string name="feature_upload_id_select_new_file">പുതിയ ഫയൽ തിരഞ്ഞെടുക്കുക</string>
</resources>

View File

@ -85,6 +85,10 @@ enum class LanguageConfig(
localName = "fa",
languageName = "Farsi (فارسی)",
),
MALAYALAM(
localName = "ml",
languageName = "Malayalam (മലയാളം)",
),
;
companion object {

View File

@ -18,6 +18,7 @@ enum class SavingStatus(val status: String) {
INACTIVE("Inactive"),
CLOSED("Closed"),
SUBMIT_AND_PENDING_APPROVAL("Submitted and pending approval"),
APPROVED("Approved"),
;
companion object {

View File

@ -25,6 +25,8 @@ data class LoanTransactionDetailsResponseDto(
val feeChargesPortion: Double? = null,
val penaltyChargesPortion: Double? = null,
val currency: CurrencyResponseDto? = null,
@SerialName("transfer")
val transfer: TransferDetailDto? = null,
@SerialName("type")
val loanType: LoanTransactionTypeResponseDto? = null,
)

View File

@ -22,6 +22,8 @@ data class SavingsTransactionDetailsResponseDto(
val reversed: Boolean? = null,
val runningBalance: Double? = null,
val currency: CurrencyResponseDto? = null,
@SerialName("transfer")
val transfer: TransferDetailDto? = null,
@SerialName("transactionType")
val savingsType: SavingsTransactionTypeResponseDto? = null,
)

View File

@ -0,0 +1,19 @@
/*
* Copyright 2026 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 https://mozilla.org/MPL/2.0/.
*
* See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md
*/
package org.mifos.mobile.core.network.dto.transaction
import kotlinx.serialization.Serializable
@Serializable
data class TransferDetailDto(
val id: Long? = null,
val transferAmount: Double? = null,
val transferDescription: String? = null,
)

View File

@ -14,6 +14,9 @@
<string name="no_data">لا توجد بيانات</string>
<string name="something_went_wrong">حدث خطأ ما</string>
<string name="core_common_working">العمل المشترك الأساسي</string>
<string name="customer_name">اسم العميل</string>
<string name="product">المنتج</string>
<string name="error_loading_balance">خطأ في تحميل الرصيد</string>
<string name="powered_by">مدعوم من</string>
@ -114,7 +117,7 @@
<string name="validation_amount_invalid_increment">يجب أن يكون المبلغ في زيادات صحيحة لهذه العملة</string>
<string name="savings_account">حساب التوفير</string>
<string name="available_balance">اسم العميل</string>
<string name="available_balance">الرصيد المتاح</string>
<string name="select_other_payment_account">اختر حساب دفع آخر</string>
<string name="available_balance_formatted">الرصيد المتاح - %1$s</string>

View File

@ -14,6 +14,9 @@
<string name="no_data">Keine Daten</string>
<string name="something_went_wrong">Etwas ist schiefgelaufen</string>
<string name="core_common_working">Kern gemeinsame Arbeit</string>
<string name="customer_name">Kundenname</string>
<string name="product">Produkt</string>
<string name="error_loading_balance">Fehler beim Laden des Kontostands</string>
<string name="powered_by">Unterstützt von</string>
@ -114,7 +117,7 @@
<string name="validation_amount_invalid_increment">Betrag muss in gültigen Schritten für diese Währung sein</string>
<string name="savings_account">Sparkonto</string>
<string name="available_balance">Kundenname</string>
<string name="available_balance">Verfügbares Guthaben</string>
<string name="select_other_payment_account">Anderes Zahlungskonto auswählen</string>
<string name="available_balance_formatted">Verfügbares Guthaben - %1$s</string>

View File

@ -14,6 +14,9 @@
<string name="no_data">No Data</string>
<string name="something_went_wrong">Something went wrong</string>
<string name="core_common_working">Core Common Working</string>
<string name="customer_name">Customer Name</string>
<string name="product">Product</string>
<string name="error_loading_balance">Error</string>
<string name="powered_by">Powered by</string>
@ -114,7 +117,7 @@
<string name="validation_amount_invalid_increment">Amount must be in valid increments for this currency</string>
<string name="savings_account">Savings Account</string>
<string name="available_balance">Customer Name</string>
<string name="available_balance">Available balance</string>
<string name="select_other_payment_account">Select Other Payment Account</string>
<string name="available_balance_formatted">Available Balance - %1$s</string>

View File

@ -15,6 +15,9 @@
<string name="no_data">Sin información</string>
<string name="something_went_wrong">Ocurrió un error</string>
<string name="core_common_working">Core Common Funcionando</string>
<string name="customer_name">Nombre del cliente</string>
<string name="product">Producto</string>
<string name="error_loading_balance">Error al cargar el saldo</string>
<string name="powered_by">Desarrollado por</string>

View File

@ -14,6 +14,9 @@
<string name="no_data">Aucune donnée</string>
<string name="something_went_wrong">Quelque chose s'est mal passé</string>
<string name="core_common_working">Travail commun au cœur</string>
<string name="customer_name">Nom du client</string>
<string name="product">Produit</string>
<string name="error_loading_balance">Erreur lors du chargement du solde</string>
<string name="powered_by">Propulsé par</string>
@ -114,7 +117,7 @@
<string name="validation_amount_invalid_increment">Le montant doit être dans des pas valides pour cette devise</string>
<string name="savings_account">Compte d'épargne</string>
<string name="available_balance">Nom du client</string>
<string name="available_balance">Solde disponible</string>
<string name="select_other_payment_account">Sélectionner un autre compte de paiement</string>
<string name="available_balance_formatted">Solde disponible - %1$s</string>

View File

@ -14,6 +14,9 @@
<string name="no_data">કોઈ ડેટા નથી</string>
<string name="something_went_wrong">કંઈક ખોટું થયું</string>
<string name="core_common_working">કોર કૉમન વર્કિંગ</string>
<string name="customer_name">ગ્રાહકનું નામ</string>
<string name="product">ઉત્પાદન</string>
<string name="error_loading_balance">બેલેન્સ લોડ કરવામાં ભૂલ</string>
<string name="powered_by">દ્વારા સમર્થિત</string>
@ -114,7 +117,7 @@
<string name="validation_amount_invalid_increment">આ ચલણ માટે રકમ માન્ય વધારામાં હોવી જરૂરી છે</string>
<string name="savings_account">બચત ખાતું</string>
<string name="available_balance">ગ્રાહકનું નામ</string>
<string name="available_balance">ઉપલબ્ધ બેલેન્સ</string>
<string name="select_other_payment_account">બીજું ચૂકવણી ખાતું પસંદ કરો</string>
<string name="available_balance_formatted">ઉપલબ્ધ શેષ - %1$s</string>

View File

@ -14,6 +14,9 @@
<string name="no_data">कोई डेटा नहीं</string>
<string name="something_went_wrong">कुछ गलत हो गया</string>
<string name="core_common_working">कोर सामान्य कार्य</string>
<string name="customer_name">ग्राहक का नाम</string>
<string name="product">उत्पाद</string>
<string name="error_loading_balance">बैलेंस लोड करने में त्रुटि</string>
<string name="powered_by">द्वारा संचालित</string>
@ -114,7 +117,7 @@
<string name="validation_amount_invalid_increment">राशि इस मुद्रा के लिए मान्य वृद्धि में होनी चाहिए</string>
<string name="savings_account">बचत खाता</string>
<string name="available_balance">ग्राहक का नाम</string>
<string name="available_balance">उपलब्ध बैलेंस</string>
<string name="select_other_payment_account">अन्य भुगतान खाता चुनें</string>
<string name="available_balance_formatted">उपलब्ध शेष - %1$s</string>

View File

@ -14,6 +14,9 @@
<string name="no_data">Nincs adat</string>
<string name="something_went_wrong">Valami hiba történt</string>
<string name="core_common_working">Alapvető közös munka</string>
<string name="customer_name">Ügyfél neve</string>
<string name="product">Termék</string>
<string name="error_loading_balance">Hiba az egyenleg betöltésekor</string>
<string name="powered_by">Működteti</string>
@ -114,7 +117,7 @@
<string name="validation_amount_invalid_increment">Az összegnek érvényes lépésekben kell lennie ehhez a pénznemhez</string>
<string name="savings_account">Megtakarítási számla</string>
<string name="available_balance">Ügyfél neve</string>
<string name="available_balance">Elérhető egyenleg</string>
<string name="select_other_payment_account">Másik fizetési számla kiválasztása</string>
<string name="available_balance_formatted">Elérhető egyenleg - %1$s</string>

View File

@ -14,6 +14,9 @@
<string name="no_data">Tidak Ada Data</string>
<string name="something_went_wrong">Ada yang Salah</string>
<string name="core_common_working">Kerja Inti Umum</string>
<string name="customer_name">Nama Pelanggan</string>
<string name="product">Produk</string>
<string name="error_loading_balance">Gagal memuat saldo</string>
<string name="powered_by">Dipersembahkan oleh</string>
@ -114,7 +117,7 @@
<string name="validation_amount_invalid_increment">Jumlah harus dalam peningkatan yang valid untuk mata uang ini</string>
<string name="savings_account">Rekening Tabungan</string>
<string name="available_balance">Nama Pelanggan</string>
<string name="available_balance">Saldo tersedia</string>
<string name="select_other_payment_account">Pilih Rekening Pembayaran Lain</string>
<string name="available_balance_formatted">Saldo Tersedia - %1$s</string>

View File

@ -14,6 +14,9 @@
<string name="no_data">ಡೇಟಾ ಇಲ್ಲ</string>
<string name="something_went_wrong">ಏನೋ ತಪ್ಪಾಗಿದೆ</string>
<string name="core_common_working">ಕೋರ್ ಸಾಮಾನ್ಯ ಕೆಲಸ</string>
<string name="customer_name">ಗ್ರಾಹಕರ ಹೆಸರು</string>
<string name="product">ಉತ್ಪನ್ನ</string>
<string name="error_loading_balance">ಬ್ಯಾಲೆನ್ಸ್ ಲೋಡ್ ಮಾಡುವಲ್ಲಿ ದೋಷ</string>
<string name="powered_by">ಇವರು ಒದಗಿಸಿದ್ದಾರೆ</string>
@ -114,7 +117,7 @@
<string name="validation_amount_invalid_increment">ಮೊತ್ತವು ಈ ಕರೆನ್ಸಿಗಾಗಿ ಮಾನ್ಯವಾದ ಹೆಚ್ಚಳದಲ್ಲಿರಬೇಕು</string>
<string name="savings_account">ಉಳಿತಾಯ ಖಾತೆ</string>
<string name="available_balance">ಗ್ರಾಹಕರ ಹೆಸರು</string>
<string name="available_balance">ಲಭ್ಯವಿರುವ ಬ್ಯಾಲೆನ್ಸ್</string>
<string name="select_other_payment_account">ಇತರ ಪಾವತಿ ಖಾತೆಯನ್ನು ಆಯ್ಕೆಮಾಡಿ</string>
<string name="available_balance_formatted">ಲಭ್ಯವಿರುವ ಶಿಲ್ಕು - %1$s</string>

View File

@ -10,10 +10,14 @@
-->
<resources>
<string name="no_internet">ഇന്റർനെറ്റ് ഇല്ല</string>
<string name="back_online">ഓൺലൈനിൽ തിരിച്ചെത്തി</string>
<string name="retry">വീണ്ടും ശ്രമിക്കുക</string>
<string name="no_data">ഡാറ്റ ഇല്ല</string>
<string name="something_went_wrong">എന്തോ കുറ്റം സംഭവിച്ചിരിക്കുന്നു</string>
<string name="core_common_working">കോർ പൊതുവായ പ്രവർത്തനം</string>
<string name="customer_name">ഉപഭോക്താവിന്റെ പേര്</string>
<string name="product">ഉൽപ്പന്നം</string>
<string name="error_loading_balance">බാലൻസ് ലോഡ് ചെയ്യുന്നതിൽ പിශക്</string>
<string name="powered_by">പവേർഡ് ബൈ</string>
@ -114,10 +118,16 @@
<string name="validation_amount_invalid_increment">ഈ കറൻസിക്കായി തുക സാധുവായ വർദ്ധനവിൽ ഉണ്ടായിരിക്കണം</string>
<string name="savings_account">സേവിംഗ്സ് അക്കൗണ്ട്</string>
<string name="available_balance">കസ്റ്റമർ പേര</string>
<string name="available_balance">ലഭ്യമായ ബാലൻസ</string>
<string name="select_other_payment_account">മറ്റൊരു പേയ്‌മെന്റ് അക്കൗണ്ട് തിരഞ്ഞെടുക്കുക</string>
<string name="pay_from">ഇതിൽ നിന്ന് പണമടയ്ക്കുക</string>
<string name="available_balance_formatted">ലഭ്യമായ ബാലൻസ് - %1$s</string>
<string name="feature_dashboard_welcome_back">മിഫോസിലേക്ക് വീണ്ടും സ്വാഗതം</string>
<string name="feature_dashboard_no_accounts_title">അക്കൗണ്ടുകളൊന്നുമില്ല</string>
<string name="feature_dashboard_no_accounts_description">ഞങ്ങളോടൊപ്പം നിങ്ങളുടെ ആദ്യ അക്കൗണ്ട് തുറന്ന് നിങ്ങളുടെ സാമ്പത്തിക യാത്ര ആരംഭിക്കുക.</string>
<string name="feature_dashboard_open_account">അക്കൗണ്ട് തുറക്കുക</string>
<string name="feature_savings_filter">ഫിൽട്ടർ</string>
<string name="feature_savings_reset">പുനഃക്രമീകരിക്കുക</string>
<string name="feature_savings_apply">പ്രയോഗിക്കുക</string>

View File

@ -14,6 +14,9 @@
<string name="no_data">डेटा नाही</string>
<string name="something_went_wrong">काहीतरी चुकले</string>
<string name="core_common_working">कोर सामान्य कार्य</string>
<string name="customer_name">ग्राहकाचे नाव</string>
<string name="product">उत्पादन</string>
<string name="error_loading_balance">शिल्लक लोड करताना त्रुटी</string>
<string name="powered_by">द्वारे संचालित</string>
@ -114,7 +117,7 @@
<string name="validation_amount_invalid_increment">या चलनासाठी रक्कम वैध वाढीत असणे आवश्यक आहे</string>
<string name="savings_account">जतन खाते</string>
<string name="available_balance">ग्राहकाचे नाव</string>
<string name="available_balance">उपलब्ध शिल्लक</string>
<string name="select_other_payment_account">इतर पेमेंट खाते निवडा</string>
<string name="available_balance_formatted">उपलब्ध शिल्लक - %1$s</string>

View File

@ -14,6 +14,9 @@
<string name="no_data">Tiada data</string>
<string name="something_went_wrong">Ada sesuatu yang tidak kena</string>
<string name="core_common_working">Kerja Biasa Teras</string>
<string name="customer_name">Nama Pelanggan</string>
<string name="product">Produk</string>
<string name="error_loading_balance">Ralat memuatkan baki</string>
<string name="powered_by">Dikuasakan oleh</string>
@ -114,7 +117,7 @@
<string name="validation_amount_invalid_increment">Jumlah mestilah dalam kenaikan yang sah untuk mata wang ini</string>
<string name="savings_account">Akaun Simpanan</string>
<string name="available_balance">Nama Pelanggan</string>
<string name="available_balance">Baki tersedia</string>
<string name="select_other_payment_account">Pilih akaun pembayaran lain</string>
<string name="available_balance_formatted">Baki yang ada - %1$s</string>

View File

@ -14,6 +14,9 @@
<string name="no_data">Sem dados</string>
<string name="something_went_wrong">Alguma coisa deu errado</string>
<string name="core_common_working">Trabalho Comum do Núcleo</string>
<string name="customer_name">Nome do cliente</string>
<string name="product">Produto</string>
<string name="error_loading_balance">Erro ao carregar o saldo</string>
<string name="powered_by">Distribuído por</string>
@ -114,7 +117,7 @@
<string name="validation_amount_invalid_increment">O valor deve estar em incrementos válidos para esta moeda</string>
<string name="savings_account">Conta Poupança</string>
<string name="available_balance">Nome do Cliente</string>
<string name="available_balance">Saldo disponível</string>
<string name="select_other_payment_account">Selecione outra conta de pagamento</string>
<string name="available_balance_formatted">Saldo disponível - %1$s</string>

View File

@ -14,6 +14,9 @@
<string name="no_data">දත්ත නැත</string>
<string name="something_went_wrong">යමක් වැරදී ඇත</string>
<string name="core_common_working">හරියටම නිවැරදි කොර් දේවල්</string>
<string name="customer_name">පාරිභෝගිකයාගේ නම</string>
<string name="product">නිෂ්පාදනය</string>
<string name="error_loading_balance">ශේෂය ලබා ගැනීමේ දෝෂයකි</string>
<string name="powered_by">බලගෙන ඇති</string>
@ -114,7 +117,7 @@
<string name="validation_amount_invalid_increment">මුදල් ප්‍රමාණය මෙම කාසි වර්ගය සඳහා වලංගු වර්ධනයක් තුළ තියෙන්න යුතුය</string>
<string name="savings_account">ඉඩුම් ගිණුම</string>
<string name="available_balance">්‍රයෝජනය කළ හැකි ශේෂය</string>
<string name="available_balance">වතින ශේෂය</string>
<string name="select_other_payment_account">වෙනත් ගිණුමක් තෝරන්න</string>
<string name="available_balance_formatted">ප්‍රයෝජනය කළ හැකි ශේෂය - %1$s</string>

View File

@ -14,6 +14,9 @@
<string name="no_data">Hakuna Data</string>
<string name="something_went_wrong">Kuna kitu kilichokwenda vibaya</string>
<string name="core_common_working">Kazi ya Msingi ya Kawaida</string>
<string name="customer_name">Jina la Mteja</string>
<string name="product">Bidhaa</string>
<string name="error_loading_balance">Hitilafu wakati wa kupakia salio</string>
<string name="powered_by">Imewezeshwa na</string>
@ -114,7 +117,7 @@
<string name="validation_amount_invalid_increment">Kiasi kinapaswa kuwa katika viwango sahihi vya sarafu hii</string>
<string name="savings_account">Akaunti ya Akiba</string>
<string name="available_balance">Jina la Mteja</string>
<string name="available_balance">Salio lililopo</string>
<string name="select_other_payment_account">Chagua akaunti nyingine ya malipo</string>
<string name="available_balance_formatted">Salio linalopatikana - %1$s</string>

View File

@ -15,6 +15,9 @@
<string name="no_data">No Data</string>
<string name="something_went_wrong">Something went wrong</string>
<string name="core_common_working">Core Common Working</string>
<string name="customer_name">Customer Name</string>
<string name="product">Product</string>
<string name="error_loading_balance">Error</string>
<string name="powered_by">Powered By</string>
@ -115,7 +118,7 @@
<string name="validation_amount_invalid_increment">Amount must be in valid increments for this currency</string>
<string name="savings_account">Savings Account</string>
<string name="available_balance">Client Name</string>
<string name="available_balance">Available balance</string>
<string name="select_other_payment_account">Select other payment account</string>
<string name="pay_from">Pay from</string>
<string name="available_balance_formatted">Available Balance - %1$s</string>

View File

@ -18,12 +18,14 @@ import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.offset
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.Icon
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
@ -35,11 +37,16 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.sp
import androidx.compose.ui.zIndex
import mifos_mobile.core.ui.generated.resources.Res
import mifos_mobile.core.ui.generated.resources.available_balance
import mifos_mobile.core.ui.generated.resources.customer_name
import mifos_mobile.core.ui.generated.resources.error_loading_balance
import mifos_mobile.core.ui.generated.resources.ic_icon_dashboard
import mifos_mobile.core.ui.generated.resources.pay_from
import mifos_mobile.core.ui.generated.resources.product
import mifos_mobile.core.ui.generated.resources.savings_account
import mifos_mobile.core.ui.generated.resources.select_other_payment_account
import org.jetbrains.compose.resources.painterResource
@ -49,7 +56,6 @@ import org.mifos.mobile.core.designsystem.icon.MifosIcons
import org.mifos.mobile.core.designsystem.theme.AppColors
import org.mifos.mobile.core.designsystem.theme.DesignToken
import org.mifos.mobile.core.designsystem.theme.MifosMobileTheme
import org.mifos.mobile.core.designsystem.theme.MifosTypography
import template.core.base.designsystem.theme.KptTheme
@Composable
@ -59,6 +65,11 @@ fun MifosPayFromDropdownUI(
modifier: Modifier = Modifier,
selectedAccountNo: String = "",
selectedAccountName: String = "",
showExtendedDetails: Boolean = false,
productName: String? = null,
availableBalance: String? = null,
isBalanceLoading: Boolean = false,
balanceError: Boolean = false,
label: String = stringResource(Res.string.pay_from),
) {
Column {
@ -67,6 +78,11 @@ fun MifosPayFromDropdownUI(
customerName = selectedAccountName,
modifier = modifier,
label = label,
showExtendedDetails = showExtendedDetails,
productName = productName,
availableBalance = availableBalance,
isBalanceLoading = isBalanceLoading,
balanceError = balanceError,
)
AccountDropdownList(
accounts = accounts,
@ -84,6 +100,11 @@ fun MifosDropDownPayFromComponent(
customerName: String,
label: String,
modifier: Modifier = Modifier,
showExtendedDetails: Boolean = false,
productName: String? = null,
availableBalance: String? = null,
isBalanceLoading: Boolean = false,
balanceError: Boolean = false,
) {
Box(modifier = modifier.padding(top = KptTheme.spacing.sm)) {
Box(
@ -99,40 +120,21 @@ fun MifosDropDownPayFromComponent(
contentScale = ContentScale.Crop,
)
Column(
modifier = Modifier
.fillMaxSize()
.padding(
horizontal = KptTheme.spacing.md,
vertical = DesignToken.padding.largeIncreased,
),
verticalArrangement = Arrangement.SpaceBetween,
) {
Column {
Text(
text = stringResource(Res.string.savings_account),
style = MifosTypography.bodySmall,
color = AppColors.customWhite.copy(alpha = 0.5f),
if (showExtendedDetails) {
ExtendedCardContent(
accountNumber = accountNumber,
customerName = customerName,
productName = productName,
availableBalance = availableBalance,
isBalanceLoading = isBalanceLoading,
balanceError = balanceError,
)
Text(
text = accountNumber,
style = MifosTypography.titleMediumEmphasized,
color = AppColors.customWhite,
} else {
DefaultCardContent(
accountNumber = accountNumber,
customerName = customerName,
)
}
Column {
Text(
text = stringResource(Res.string.available_balance),
style = MifosTypography.bodySmall,
color = AppColors.customWhite.copy(alpha = 0.5f),
)
Text(
text = customerName,
style = MifosTypography.titleMediumEmphasized,
color = AppColors.customWhite,
)
}
}
}
Box(
@ -148,7 +150,7 @@ fun MifosDropDownPayFromComponent(
) {
Text(
text = label,
style = MifosTypography.bodySmall,
style = KptTheme.typography.bodySmall,
color = KptTheme.colorScheme.onSurfaceVariant,
)
}
@ -170,18 +172,169 @@ fun AccountDropdownItem(
) {
Text(
text = accountNumber,
style = MifosTypography.titleMediumEmphasized,
style = KptTheme.typography.titleSmall,
color = KptTheme.colorScheme.onPrimary,
)
Spacer(modifier = Modifier.height(KptTheme.spacing.xs))
Text(
text = balance,
style = MifosTypography.bodySmall,
style = KptTheme.typography.bodySmall,
color = KptTheme.colorScheme.onPrimary,
)
}
}
@Composable
private fun DefaultCardContent(
accountNumber: String,
customerName: String,
) {
Column(
modifier = Modifier
.fillMaxSize()
.padding(
horizontal = KptTheme.spacing.md,
vertical = KptTheme.spacing.lg,
),
verticalArrangement = Arrangement.SpaceBetween,
) {
Column {
Text(
text = stringResource(Res.string.savings_account),
style = KptTheme.typography.bodySmall,
color = AppColors.customWhite.copy(alpha = 0.5f),
)
Text(
text = accountNumber,
style = KptTheme.typography.titleSmall,
color = AppColors.customWhite,
)
}
Column {
Text(
text = stringResource(Res.string.customer_name),
style = KptTheme.typography.bodySmall,
color = AppColors.customWhite.copy(alpha = 0.5f),
)
Text(
text = customerName,
style = KptTheme.typography.titleSmall,
color = AppColors.customWhite,
)
}
}
}
@Composable
private fun ExtendedCardContent(
accountNumber: String,
customerName: String,
productName: String?,
availableBalance: String?,
isBalanceLoading: Boolean,
balanceError: Boolean,
) {
Row(
modifier = Modifier
.fillMaxSize()
.padding(
horizontal = KptTheme.spacing.md,
vertical = KptTheme.spacing.lg,
),
horizontalArrangement = Arrangement.SpaceBetween,
) {
Column(
modifier = Modifier
.weight(1f)
.fillMaxHeight(),
verticalArrangement = Arrangement.SpaceBetween,
) {
Column {
Text(
text = stringResource(Res.string.savings_account),
style = KptTheme.typography.bodySmall,
color = AppColors.customWhite.copy(alpha = 0.5f),
)
Text(
text = accountNumber.ifEmpty { "--" },
style = KptTheme.typography.titleSmall,
color = AppColors.customWhite,
)
}
Column {
Text(
text = stringResource(Res.string.customer_name),
style = KptTheme.typography.bodySmall,
color = AppColors.customWhite.copy(alpha = 0.5f),
)
Text(
text = customerName.ifEmpty { "--" },
style = KptTheme.typography.titleSmall,
color = AppColors.customWhite,
)
}
}
Column(
modifier = Modifier
.weight(1f)
.fillMaxHeight(),
verticalArrangement = Arrangement.SpaceBetween,
horizontalAlignment = Alignment.End,
) {
Column(
horizontalAlignment = Alignment.End,
) {
Text(
text = stringResource(Res.string.product),
style = KptTheme.typography.bodySmall,
color = AppColors.customWhite.copy(alpha = 0.5f),
)
Text(
text = productName ?: "--",
style = KptTheme.typography.titleSmall,
color = AppColors.customWhite,
)
}
Column(
horizontalAlignment = Alignment.End,
) {
Text(
text = stringResource(Res.string.available_balance),
style = KptTheme.typography.bodySmall,
color = AppColors.customWhite.copy(alpha = 0.5f),
)
when {
isBalanceLoading -> {
CircularProgressIndicator(
modifier = Modifier.size(DesignToken.sizes.iconSmall),
color = AppColors.customWhite,
strokeWidth = DesignToken.strokes.thin,
)
}
balanceError -> {
Text(
text = stringResource(Res.string.error_loading_balance),
style = KptTheme.typography.titleMedium,
color = AppColors.customWhite.copy(alpha = 0.7f),
)
}
else -> {
Text(
text = availableBalance ?: "--",
style = KptTheme.typography.titleSmall.copy(
fontSize = 18.sp,
fontWeight = FontWeight.Bold,
),
color = AppColors.customWhite,
)
}
}
}
}
}
}
@Composable
fun AccountDropdownList(
selectedAccount: String,
@ -194,7 +347,7 @@ fun AccountDropdownList(
Column(
modifier = modifier
.fillMaxWidth()
.clip(DesignToken.shapes.bottomCornerDp12)
.clip(KptTheme.shapes.medium)
.background(KptTheme.colorScheme.tertiary),
) {
Column(
@ -204,7 +357,7 @@ fun AccountDropdownList(
Modifier
.fillMaxWidth()
.height(KptTheme.spacing.sm)
.clip(DesignToken.shapes.bottomCornerDp12)
.clip(KptTheme.shapes.medium)
.background(KptTheme.colorScheme.background),
)
Row(
@ -217,7 +370,7 @@ fun AccountDropdownList(
) {
Text(
text = stringResource(Res.string.select_other_payment_account),
style = MifosTypography.labelSmall,
style = KptTheme.typography.labelSmall,
color = AppColors.customWhite,
)
Icon(
@ -232,7 +385,7 @@ fun AccountDropdownList(
AnimatedVisibility(visible = expanded) {
Column(
Modifier
.padding(bottom = DesignToken.padding.medium),
.padding(bottom = KptTheme.spacing.md),
) {
accounts.forEach { (accountNumber, balance) ->
AccountDropdownItem(
@ -274,6 +427,21 @@ private fun MifosDropDownPayFromComponentPreview() {
_, _ ->
},
)
MifosPayFromDropdownUI(
accounts = listOf(
"267282972" to "$ 23,786.00",
"6572992762" to "$ 123,786.00",
"52682926" to "$ 78,786.00",
"678292726" to "$ 923,786.00",
),
onAccountSelected = { _, _ -> },
selectedAccountNo = "267282972",
selectedAccountName = "Mark R",
showExtendedDetails = true,
productName = "WALLET",
availableBalance = "$572.98",
)
}
}
}

View File

@ -14,19 +14,21 @@ import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.text.BasicText
import androidx.compose.foundation.text.TextAutoSize
import androidx.compose.material3.CardDefaults
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.sp
import org.jetbrains.compose.ui.tooling.preview.Preview
import org.mifos.mobile.core.designsystem.component.CardVariant
import org.mifos.mobile.core.designsystem.component.MifosCustomCard
import org.mifos.mobile.core.designsystem.theme.AppColors
import org.mifos.mobile.core.designsystem.theme.DesignToken
import org.mifos.mobile.core.designsystem.theme.MifosMobileTheme
import org.mifos.mobile.core.designsystem.theme.MifosTypography
import template.core.base.designsystem.theme.KptTheme
@Composable
@ -58,15 +60,19 @@ fun MifosLabelValueCard(
) {
Text(
text = label,
style = MifosTypography.bodySmall,
style = KptTheme.typography.bodySmall,
color = KptTheme.colorScheme.secondary,
)
Text(
BasicText(
text = value,
style = MifosTypography.bodyMediumEmphasized,
color = color,
style = KptTheme.typography.bodyMedium.copy(color = color),
autoSize = TextAutoSize.StepBased(
minFontSize = 10.sp,
maxFontSize = 60.sp,
stepSize = 10.sp,
),
)
}
}

View File

@ -0,0 +1,97 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2026 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 https://mozilla.org/MPL/2.0/.
See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md
-->
<resources>
<string name="feature_account_title">അക്കൗണ്ടുകൾ</string>
<string name="feature_loan_account_title">വായ്പ അക്കൗണ്ടുകൾ</string>
<string name="feature_saving_account_title">സേവിംഗ്സ് അക്കൗണ്ടുകൾ</string>
<string name="feature_share_account_title">ഓഹരി അക്കൗണ്ടുകൾ</string>
<string name="feature_accounts_filter_status">സ്റ്റാറ്റസ്</string>
<string name="feature_accounts_filter_type">തരം</string>
<!-- Loan Account Filters-->
<string name="feature_loan_account_filter_active">സജീവം</string>
<string name="feature_loan_account_filter_approval_pending">അംഗീകാരം കാത്തിരിക്കുന്നു</string>
<string name="feature_loan_account_filter_closed">അടച്ചവ</string>
<string name="feature_loan_account_filter_disburse">വിതരണത്തിനായി കാത്തിരിക്കുന്നു</string>
<string name="feature_loan_account_filter_overpaid">അധികം അടച്ചത്</string>
<string name="feature_loan_account_filter_in_arrears">കുടിശ്ശിക</string>
<string name="feature_loan_account_filter_withdrawn">പിൻവലിച്ചു</string>
<string name="feature_loan_account_filter_matured">കാലാവധി പൂർത്തിയായി</string>
<string name="feature_loan_account_filter_rejected">നിരസിച്ചു</string>
<string name="feature_loan_account_filter_personal">വ്യക്തിഗതം</string>
<string name="feature_loan_account_filter_bronze">വെങ്കലം</string>
<!-- Savings account filters-->
<string name="feature_savings_filter_wallet_account">വാലറ്റ് അക്കൗണ്ട്</string>
<string name="feature_savings_filter_bank_account">ബാങ്ക് അക്കൗണ്ട്</string>
<string name="feature_savings_filter_group_account">ഗ്രൂപ്പ് അക്കൗണ്ട്</string>
<string name="feature_savings_filter_nb_account">NB അക്കൗണ്ട്</string>
<string name="feature_savings_filter_active_account">സജീവം</string>
<string name="feature_savings_filter_pending_account">അംഗീകാരം കാത്തിരിക്കുന്നു</string>
<string name="feature_savings_filter_closed_account">അടച്ചവ</string>
<string name="feature_savings_filter_matured_account">കാലാവധി പൂർത്തിയായി</string>
<string name="feature_savings_filter_approved_account">അംഗീകരിച്ചു</string>
<string name="feature_savings_filter">ഫിൽട്ടറുകൾ</string>
<string name="feature_savings_reset">റീസെറ്റ്</string>
<string name="feature_savings_apply">പ്രയോഗിക്കുക</string>
<string name="feature_filters_count">%1$s തിരഞ്ഞെടുത്തു</string>
<string name="feature_transaction_transaction_history">ഇടപാട് ചരിത്രം</string>
<string name="feature_transaction_statement">സ്റ്റേറ്റ്‌മെന്റ്</string>
<string name="feature_transaction_download_icon_description">ഡൗൺലോഡ് ഐക്കൺ</string>
<string name="feature_transaction_filter">ഫിൽട്ടർ</string>
<string name="feature_transaction_filter_icon_description">ഫിൽട്ടർ ഐക്കൺ</string>
<!-- Transaction filters -->
<string name="feature_transaction_filter_credit">ക്രെഡിറ്റ്</string>
<string name="feature_transaction_filter_debit">ഡെബിറ്റ്</string>
<string name="feature_transaction_filter_past_month">കഴിഞ്ഞ മാസം</string>
<string name="feature_transaction_filter_past_3_months">കഴിഞ്ഞ 3 മാസങ്ങൾ</string>
<string name="feature_transaction_filter_past_6_months">കഴിഞ്ഞ 6 മാസങ്ങൾ</string>
<string name="feature_transaction_filter_past_1_year">കഴിഞ്ഞ 1 വർഷം</string>
<string name="feature_transaction_filter_past_2_years">കഴിഞ്ഞ 2 വർഷങ്ങൾ</string>
<string name="feature_transaction_type">ഇടപാട് തരം</string>
<string name="feature_duration">കാലയളവ്</string>
<string name="feature_no_transactions_found">ഇടപാടുകളൊന്നും കണ്ടെത്തിയില്ല</string>
<string name="feature_no__filtered_transactions_found">തിരഞ്ഞെടുത്ത ഫിൽട്ടറുകൾക്കായി ഇടപാടുകളൊന്നും കണ്ടെത്തിയില്ല</string>
<string name="feature_generic_error_server">സെർവർ തകരാർ കാരണം മുന്നോട്ട് പോകാനാവില്ല, കുറച്ചു കഴിഞ്ഞ് വീണ്ടും ശ്രമിക്കുക</string>
<!-- Transaction Details -->
<string name="feature_transaction_details">ഇടപാട് വിവരങ്ങൾ</string>
<string name="feature_transaction_detail_id">ഇടപാട് ഐഡി</string>
<string name="feature_transaction_detail_transfer_description">കൈമാറ്റ വിവരണം</string>
<string name="feature_transaction_detail_date">തീയതി</string>
<string name="feature_transaction_detail_status">സ്റ്റാറ്റസ്</string>
<string name="feature_transaction_detail_status_success">വിജയിച്ചു</string>
<string name="feature_transaction_detail_account_ref">അക്കൗണ്ട് റഫറൻസ്</string>
<string name="feature_transaction_detail_payment_method">പേയ്മെന്റ് രീതി</string>
<string name="feature_transaction_detail_type">തരം</string>
<string name="feature_transaction_detail_status_reversed">തിരിച്ചെടുത്തു</string>
<string name="feature_transaction_detail_receipt">രസീത് #</string>
<string name="feature_transaction_detail_external_id">എക്സ്റ്റേണൽ ഐഡി</string>
<string name="feature_transaction_detail_breakdown">വിശദാംശങ്ങൾ</string>
<string name="feature_transaction_detail_principal">മുതൽ</string>
<string name="feature_transaction_detail_interest">പലിശ</string>
<string name="feature_transaction_detail_fees">ഫീസുകൾ</string>
<string name="feature_transaction_detail_penalties">പിഴകൾ</string>
<string name="feature_transaction_detail_balance">ബാക്കി തുക</string>
<string name="feature_transaction_detail_default_type">ഇടപാട്</string>
</resources>

View File

@ -11,101 +11,100 @@
<resources>
<string name="no_internet_connection">ഇന്റർനെറ്റ് കണക്ഷൻ ഇല്ല</string>
<string name="register">രജിസ്റ്റർ ചെയ്യുക</string>
<string name="login_failed">ലോഗിൻ പരാജയപ്പെട്ടു, പിന്നീട് വീണ്ടും ശ്രമിക്കുക.</string>
<string name="login_failed">ലോഗിൻ പരാജയപ്പെട്ടു, ദയവായി പിന്നീട് വീണ്ടും ശ്രമിക്കുക.</string>
<string name="toast_welcome">സ്വാഗതം %1$s</string>
<string name="password">പാസ്സ്‌വേഡ്</string>
<string name="password">പാസ്‌വേഡ്</string>
<string name="login">ലോഗിൻ</string>
<string name="create_an_account">ഒരു അക്കൗണ്ട് സൃഷ്ടിക്കുക</string>
<string name="create_an_account">അക്കൗണ്ട് ഉണ്ടാക്കുക</string>
<string name="rb_mobile">മൊബൈൽ</string>
<string name="rb_email">ഇമെയിൽ</string>
<string name="account_number">അക്കൗണ്ട് നമ്പർ</string>
<string name="username">ഉപയോക്തൃനാമം</string>
<string name="first_name">പ്രഥമനാമം</string>
<string name="last_name">അവസാനനാമം</string>
<string name="first_name">ആദ്യ പേര്</string>
<string name="last_name">അവസാന പേര്</string>
<string name="phone_number">ഫോൺ നമ്പർ</string>
<string name="email">ഇമെയിൽ</string>
<string name="confirm_password">പാസ്സ്‌വേഡ് സ്ഥിരീകരിക്കുക</string>
<string name="confirm_password">പാസ്‌വേഡ് സ്ഥിരീകരിക്കുക</string>
<string name="verification_mode">പരിശോധനാ രീതി</string>
<string name="dialog_cancel_registration_message">നിങ്ങൾക്ക് പുതിയ അക്കൗണ്ട് രജിസ്റ്റർ ചെയ്യൽ റദ്ദാക്കണോ?</string>
<string name="dialog_cancel_registration_title">രജിസ്റ്റർ ചെയ്യൽ റദ്ദാക്കുക</string>
<string name="request_id">റിക്വസ്റ്റ് ഐഡി</string>
<string name="empty_requestid">റിക്വസ്റ്റ് ഐഡി ശൂന്യമായിരിക്കാൻ പാടില്ല</string>
<string name="authentication_token">പ്രാമാണീകരണ ടോക്കൺ</string>
<string name="empty_authentication_token">പ്രാമാണീകരണ ടോക്കൺ ശൂന്യമായിരിക്കാൻ പാടില്ല</string>
<string name="dialog_cancel_registration_message">പുതിയ അക്കൗണ്ട് രജിസ്ട്രേഷൻ റദ്ദാക്കണമെന്ന് നിങ്ങൾക്ക് ഉറപ്പാണോ?</string>
<string name="dialog_cancel_registration_title">രജിസ്ട്രേഷൻ റദ്ദാക്കുക</string>
<string name="request_id">അഭ്യർത്ഥന ഐഡി</string>
<string name="empty_requestid">അഭ്യർത്ഥന ഐഡി ശൂന്യമാകാൻ പാടില്ല</string>
<string name="authentication_token">ഓതന്റിക്കേഷൻ ടോക്കൺ</string>
<string name="empty_authentication_token">ഓതന്റിക്കേഷൻ ടോക്കൺ ശൂന്യമാകാൻ പാടില്ല</string>
<string name="verify">പരിശോധിക്കുക</string>
<string name="verified">ഉപയോക്താവിനെ വിജയകരമായി പരിശോധിച്ചു</string>
<string name="yes">അതെ</string>
<string name="no">അല്ല</string>
<string name="could_not_register_user_error">ഉപയോക്താവിനെ രജിസ്റ്റർ ചെയ്യാൻ കഴിഞ്ഞില്ല.</string>
<string name="could_not_register_user_error">ഉപയോക്താവിനെ രജിസ്റ്റർ ചെയ്യാൻ ഞങ്ങൾക്ക് കഴിഞ്ഞില്ല.</string>
<string name="password_strength_weak">ദുർബലം</string>
<string name="password_strength_medium">ഇടത്തരം</string>
<string name="password_strength_strong">ശക്തിയുള്ളത്</string>
<string name="password_strength_very_strong">വളരെ ശക്തിയുള്ളത്</string>
<string name="error_message_server">സെർവർ പ്രതികരണം ലോഡുചെയ്യുന്നതിൽ പിശക്</string>
<string name="error_validation_blank">%1$s ശൂന്യമായിരിക്കാൻ പാടില്ല</string>
<string name="error_validation_minimum_chars">%1$s എണ്ണം %2$d പേരിൽ കുറവായിരിക്കാൻ പാടില്ല</string>
<string name="error_validation_cannot_contain_spaces">%1$s എണ്ണം %2$s ഉൾപ്പെടുത്താൻ പാടില്ല</string>
<string name="error_validation_cannot_contain_leading_or_trailing_spaces">%1$s എണ്ണം ആദ്യത്തിലോ അവസാനത്തിലോ ശൂന്യമായിരിക്കാൻ പാടില്ല</string>
<string name="error_username_greater_than_six">ഉപയോക്തൃനാമം ആറ് അക്ഷരങ്ങൾക്ക് മേലേയായിരിക്കണം</string>
<string name="not_contain_username">സ്പേസ്</string>
<string name="password_strength_strong">ശക്ത</string>
<string name="password_strength_very_strong">വളരെ ശക്ത</string>
<string name="error_message_server">സെർവറിൽ നിന്നുള്ള പ്രതികരണം ലോഡ് ചെയ്യുന്നതിൽ പിശക്</string>
<string name="error_validation_blank">%1$s ശൂന്യമാകാൻ പാടില്ല</string>
<string name="error_validation_minimum_chars">%1$s %2$d അക്ഷരങ്ങളിൽ കുറയാൻ പാടില്ല</string>
<string name="error_validation_cannot_contain_spaces">%1$s ൽ %2$s അടങ്ങാൻ പാടില്ല</string>
<string name="error_validation_cannot_contain_leading_or_trailing_spaces">%1$s ന്റെ തുടക്കത്തിലോ ഒടുവിലോ സ്‌പെയ്‌സ് ഉണ്ടാകാൻ പാടില്ല</string>
<string name="error_username_greater_than_six">ഉപയോക്തൃനാമം 6 അക്ഷരങ്ങളിൽ കൂടുതലായിരിക്കണം</string>
<string name="not_contain_username">സ്‌പെയ്‌സുകൾ</string>
<string name="invalid_phn_number">അസാധുവായ ഫോൺ നമ്പർ</string>
<string name="error_invalid_password">പാസ്സ്‌വേഡ് കുറഞ്ഞത് 8 അക്ഷരങ്ങൾ നീളമുള്ളതായിരിക്കണം</string>
<string name="error_invalid_password">പാസ്‌വേഡ് കുറഞ്ഞത് 8 അക്ഷരങ്ങളെങ്കിലും ഉണ്ടായിരിക്കണം</string>
<string name="error_invalid_email">അസാധുവായ ഇമെയിൽ ഐഡി</string>
<string name="error_password_not_match">പാസ്സ്‌വേഡ് പൊരുത്തപ്പെടുന്നില്ല</string>
<string name="error_enter_email">സാധുവായ ഇമെയിൽ നൽകുക</string>
<string name="error_mobile_length">ഫോൺ നമ്പർ 10 അക്കങ്ങളായിരിക്കണം</string>
<string name="error_enter_account_number">നിങ്ങളുടെ അക്കൗണ്ട് നമ്പർ നൽകുക</string>
<string name="error_enter_mobile_number">നിങ്ങളുടെ മൊബൈൽ നമ്പർ നൽകുക</string>
<string name="error_enter_first_name">നിങ്ങളുടെ പ്രഥമനാമം നൽകുക</string>
<string name="error_enter_last_name">നിങ്ങളുടെ അവസാനനാമം നൽകുക</string>
<string name="error_enter_user_name">നിങ്ങളുടെ ഉപയോക്തൃനാമം നൽകുക</string>
<string name="error_enter_country">നിങ്ങളുടെ രാജ്യം നൽകുക</string>
<string name="error_password_not_match">പാസ്‌വേഡ് പൊരുത്തപ്പെടുന്നില്ല</string>
<string name="error_enter_email">ദയവായി സാധുവായ ഇമെയിൽ നൽകുക</string>
<string name="error_mobile_length">മൊബൈൽ നമ്പർ 10 അക്കങ്ങളായിരിക്കണം</string>
<string name="error_enter_account_number">ദയവായി നിങ്ങളുടെ അക്കൗണ്ട് നമ്പർ നൽകുക</string>
<string name="error_enter_mobile_number">ദയവായി നിങ്ങളുടെ മൊബൈൽ നമ്പർ നൽകുക</string>
<string name="error_enter_first_name">ദയവായി നിങ്ങളുടെ ആദ്യ പേര് നൽകുക</string>
<string name="error_enter_last_name">ദയവായി നിങ്ങളുടെ അവസാന പേര് നൽകുക</string>
<string name="error_enter_user_name">ദയവായി നിങ്ങളുടെ ഉപയോക്തൃനാമം നൽകുക</string>
<string name="error_enter_country">ദയവായി നിങ്ങളുടെ രാജ്യം നൽകുക</string>
<string name="feature_sign_in_title">സൈൻ ഇൻ</string>
<string name="feature_sign_in_sub_title">സൈൻ ഇൻ ചെയ്യാൻ നിങ്ങളുടെ ഇമെയിൽ, പാസ്സ്‌വേഡ് നൽകുക</string>
<string name="feature_sign_in_sub_title">ലോഗിൻ ചെയ്യാൻ നിങ്ങളുടെ ഇമെയിലും പാസ്‌വേഡും നൽകുക</string>
<string name="feature_sign_in_username_label">ഉപയോക്തൃനാമം അല്ലെങ്കിൽ ഇമെയിൽ</string>
<string name="feature_sign_in_password_label">പാസ്സ്‌വേഡ്</string>
<string name="feature_sign_in_forgot_password">പാസ്സ്‌വേഡ് മറന്നുപോയോ?</string>
<string name="feature_sign_in_password_label">പാസ്‌വേഡ്</string>
<string name="feature_sign_in_forgot_password">പാസ്‌വേഡ് മറന്നോ?</string>
<string name="feature_sign_in_Sign_in">സൈൻ ഇൻ</string>
<string name="feature_sign_in_dont_have_an_account">അക്കൗണ്ട് ഇല്ലേ?</string>
<string name="feature_sign_in_sign_up">രജിസ്റ്റർ ചെയ്യുക!</string>
<string name="feature_sign_in_sign_up">സൈൻ അപ്പ്!</string>
<string name="feature_sign_in_username_error">ഇമെയിൽ വിലാസം കണ്ടെത്തിയില്ല</string>
<string name="feature_sign_in_password_error">നിങ്ങളുടെ പാസ്സ്‌വേഡ് ശരിയല്ല!</string>
<string name="feature_sign_in_password_error">നിങ്ങളുടെ പാസ്‌വേഡ് ശരിയല്ല!</string>
<string name="feature_signup_title">സൈൻ അപ്പ്</string>
<string name="feature_signup_sub_title">തുടരാൻ ഒരു അക്കൗണ്ട് സൃഷ്ടിക്കുക!</string>
<string name="feature_signup_first_name_label">പ്രഥമനാമം</string>
<string name="feature_signup_middle_name_label">ദ്ധ്യനാമ</string>
<string name="feature_signup_last_name_label">അവസാനനാമം</string>
<string name="feature_signup_sub_title">തുടരാൻ ഒരു അക്കൗണ്ട് ഉണ്ടാക്കുക!</string>
<string name="feature_signup_first_name_label">ആദ്യ പേര്</string>
<string name="feature_signup_middle_name_label">ിഡിൽ നെയി</string>
<string name="feature_signup_last_name_label">അവസാന പേര്</string>
<string name="feature_signup_email_label">ഇമെയിൽ</string>
<string name="feature_signup_cell_phone_label">മൊബൈൽ ഫോൺ</string>
<string name="feature_signup_customer_account_label">കസ്റ്റമർ അക്കൗണ്ട്</string>
<string name="feature_signup_password_label">പാസ്സ്‌വേഡ്</string>
<string name="feature_signup_confirm_password_label">പാസ്സ്‌വേഡ് സ്ഥിരീകരിക്കുക</string>
<string name="feature_signup_password_label">പാസ്‌വേഡ്</string>
<string name="feature_signup_confirm_password_label">പാസ്‌വേഡ് സ്ഥിരീകരിക്കുക</string>
<string name="feature_signup_submit">സമർപ്പിക്കുക</string>
<string name="feature_signup_already_have_an_account">നിങ്ങൾക്ക് അക്കൗണ്ട് ഉണ്ടോ?</string>
<string name="feature_signup_log_in">ലോഗിൻ ചെയ്യുക!</string>
<string name="feature_signup_character_rules">അക്ഷരങ്ങളുടെ നിയമങ്ങൾ</string>
<string name="feature_signup_already_have_an_account">ഇതിനകം ഒരു അക്കൗണ്ട് ഉണ്ടോ?</string>
<string name="feature_signup_log_in">ലോഗിൻ!</string>
<string name="feature_signup_character_rules">അക്ഷര നിയമങ്ങൾ</string>
<!-- Error messages -->
<string name="feature_signup_error_invalid_name">നാമത്തിൽ അസാധുവായ അക്ഷരങ്ങൾ ഉണ്ട്</string>
<string name="feature_signup_error_first_name_empty">പ്രഥമനാമം ശൂന്യമായിരിക്കാൻ പാടില്ല</string>
<string name="feature_signup_error_middle_name_empty">മദ്ധ്യനാമം ശൂന്യമായിരിക്കാൻ പാടില്ല</string>
<string name="feature_signup_error_last_name_empty">അവസാനനാമം ശൂന്യമായിരിക്കാൻ പാടില്ല</string>
<string name="feature_signup_error_invalid_name">പേരിൽ അസാധുവായ അക്ഷരം അടങ്ങിയിരിക്കുന്നു</string>
<string name="feature_signup_error_first_name_empty">ആദ്യ പേര് ശൂന്യമായിരിക്കരുത്</string>
<string name="feature_signup_error_middle_name_empty">മിഡിൽ നെയിം ശൂന്യമായിരിക്കരുത്</string>
<string name="feature_signup_error_last_name_empty">അവസാന പേര് ശൂന്യമായിരിക്കരുത്</string>
<string name="feature_signup_error_invalid_email">അസാധുവായ ഇമെയിൽ വിലാസം</string>
<string name="feature_signup_error_invalid_mobile_number">അസാധുവായ മൊബൈൽ നമ്പർ</string>
<string name="feature_signup_error_customer_account_empty">കസ്റ്റമർ അക്കൗണ്ട് ആവശ്യമാണ്</string>
<string name="feature_signup_error_customer_account_not_valid">സാധുവായ കസ്റ്റമർ അക്കൗണ്ട് നൽകുക</string>
<string name="feature_signup_error_password_required_error">പാസ്സ്‌വേഡ് ആവശ്യമാണ്</string>
<string name="feature_signup_error_password_short">പാസ്സ്‌വേഡ് കുറഞ്ഞത് 6 അക്ഷരങ്ങൾ നീളമുള്ളതായിരിക്കണം</string>
<string name="feature_signup_error_password_mismatch">പാസ്സ്‌വേഡ് പൊരുത്തപ്പെടുന്നില്ല</string>
<string name="feature_signup_error_name_contains_digits">നാമത്തിൽ അക്കങ്ങൾ ഉൾപ്പെടുത്താൻ പാടില്ല</string>
<string name="feature_signup_error_name_contains_symbols">നാമത്തിൽ ചിഹ്നങ്ങളും ശൂന്യസ്ഥാനങ്ങളും ഉൾപ്പെടുത്താൻ പാടില്ല</string>
<string name="feature_signup_error_name_contains_emoji">വാചകത്തിൽ ഇമോജികളോ അസാധുവായ അക്ഷരങ്ങളോ ഉൾപ്പെടുത്താൻ പാടില്ല</string>
<string name="feature_signup_user_registered_successfully">ഉപയോക്താവിനെ വിജയകരമായി രജിസ്റ്റർ ചെയ്തു</string>
<string name="feature_signup_user_registered_successfully_tip">നിങ്ങൾക്ക് ഇപ്പോൾ നിങ്ങളുടെ ഉപയോക്തൃനാമം (ഫോൺ നമ്പർ) ഉം പാസ്സ്‌വേഡ് ഉം ഉപയോഗിച്ച് ലോഗിൻ ചെയ്യാം.</string>
<string name="feature_signup_user_registered_failed">ഉപയോക്താവിനെ രജിസ്റ്റർ ചെയ്യൽ പരാജയപ്പെട്ടു</string>
<string name="feature_signup_user_registered_failed_tip">ഉപയോക്താവിനെ രജിസ്റ്റർ ചെയ്യുന്നതിൽ പിശക് സംഭവിച്ചു. വീണ്ടും ശ്രമിക്കുക.</string>
<string name="feature_signup_error_password_required_error">പാസ്‌വേഡ് ആവശ്യമാണ്</string>
<string name="feature_signup_error_password_short">പാസ്‌വേഡ് കുറഞ്ഞത് 6 അക്ഷരങ്ങൾ ഉണ്ടായിരിക്കണം</string>
<string name="feature_signup_error_password_mismatch">പാസ്‌വേഡുകൾ പൊരുത്തപ്പെടുന്നില്ല</string>
<string name="feature_signup_error_name_contains_digits">പേരിൽ അക്കങ്ങൾ അടങ്ങിയിരിക്കരുത്</string>
<string name="feature_signup_error_name_contains_symbols">പേരിൽ ചിഹ്നങ്ങളും സ്‌പെയ്‌സുകളും അടങ്ങിയിരിക്കരുത്</string>
<string name="feature_signup_error_name_contains_emoji">ടെക്‌സ്റ്റിൽ ഇമോജിയോ അസാധുവായ അക്ഷരങ്ങളോ അടങ്ങിയിരിക്കരുത്</string>
<string name="feature_signup_user_registered_successfully">ഉപയോക്താവ വിജയകരമായി രജിസ്റ്റർ ചെയ്തു</string>
<string name="feature_signup_user_registered_successfully_tip">ഇപ്പോൾ നിങ്ങൾക്ക് നിങ്ങളുടെ യൂസർനെയിം (ഫോൺ നമ്പർ), പാസ്‌വേഡ് ഉപയോഗിച്ച് ലോഗിൻ ചെയ്യാം.</string>
<string name="feature_signup_user_registered_failed">ഉപയോക്താവിനെ രജിസ്റ്റർ ചെയ്യുന്നതിൽ പരാജയപ്പെട്ടു</string>
<string name="feature_signup_user_registered_failed_tip">ഉപയോക്താവിനെ രജിസ്റ്റർ ചെയ്യുന്നതിൽ പിശക്. ദയവായി വീണ്ടും ശ്രമിക്കുക.</string>
<string name="feature_upload_id_title">ഐഡി അപ്‌ലോഡ് ചെയ്യുക</string>
<string name="feature_upload_id_subtitle">പരിശോധനയ്ക്കായി നിങ്ങളുടെ ഐഡിയും ഫോട്ടോയും അപ്‌ലോഡ് ചെയ്യുക!</string>
@ -114,58 +113,56 @@
<string name="feature_upload_id_remove_file">ഫയൽ നീക്കംചെയ്യുക</string>
<string name="feature_upload_id_view_file">ഫയൽ കാണുക</string>
<string name="feature_upload_id_select_new_file">പുതിയ ഫയൽ തിരഞ്ഞെടുക്കുക</string>
<string name="feature_upload_id_identification_doc_label">തിരിച്ചറിയൽ പ്രമാണം</string>
<string name="feature_upload_id_identification_doc_label">തിരിച്ചറിയൽ രേഖ</string>
<string name="feature_upload_id_profile_photo_label">പ്രൊഫൈൽ ഫോട്ടോ</string>
<string name="feature_upload_id_mobile_label">മൊബൈൽ ഫോൺ</string>
<string name="feature_upload_id_national_id_label">ദേശീയ ഐഡി നമ്പർ</string>
<string name="feature_upload_id_dob_label">ജനന തീയതി</string>
<string name="feature_upload_id_edit_prompt">നിങ്ങളുടെ വ്യക്തിഗത വിവരങ്ങൾ എഡിറ്റ് ചെയ്യണോ?</string>
<string name="feature_upload_id_take_me_back">എന്നെ തിരിച്ചയയ്ക്കുക</string>
<string name="feature_upload_id_dob_label">ജനനത്തീയതി</string>
<string name="feature_upload_id_edit_prompt">നിങ്ങളുടെ വ്യക്തിഗത വിവരങ്ങൾ എഡിറ്റുചെയ്യാൻ ആഗ്രഹിക്കുന്നുണ്ടോ?</string>
<string name="feature_upload_id_take_me_back">എന്നെ തിരികെ കൊണ്ടുപോകൂ</string>
<string name="feature_upload_id_ok">ശരി</string>
<string name="feature_upload_id_cancel">റദ്ദാക്കുക</string>
<string name="feature_common_submit">സമർപ്പിക്കുക</string>
<string name="feature_upload_id_error_field_empty">ഈ ഫീൽഡ് ശൂന്യമായിരിക്കാൻ പാടില്ല</string>
<string name="feature_upload_id_error_field_empty">ഈ ഫീൽഡ് ശൂന്യമായിരിക്കരുത്</string>
<string name="feature_upload_id_error_mobile_not_valid">സാധുവായ 10-അക്ക മൊബൈൽ നമ്പർ നൽകുക</string>
<string name="feature_upload_id_error_id_required">നിങ്ങളുടെ ഐഡി അപ്‌ലോഡ് ചെയ്യുക</string>
<string name="feature_upload_id_error_photo_required">നിങ്ങളുടെ ഫോട്ടോ അപ്‌ലോഡ് ചെയ്യുക</string>
<string name="feature_upload_id_error_dob_required">ജനന തീയതി ആവശ്യമാണ്</string>
<string name="feature_upload_id_error_id_required">ദയവായി നിങ്ങളുടെ ഐഡി അപ്‌ലോഡ് ചെയ്യുക</string>
<string name="feature_upload_id_error_photo_required">ദയവായി നിങ്ങളുടെ ഫോട്ടോ അപ്‌ലോഡ് ചെയ്യുക</string>
<string name="feature_upload_id_error_dob_required">ജനനത്തീയതി ആവശ്യമാണ്</string>
<string name="feature_upload_id_upload_success">ഫയൽ വിജയകരമായി അപ്‌ലോഡ് ചെയ്തു</string>
<string name="feature_upload_id_upload_failed">ഫയൽ അപ്‌ലോഡ് ചെയ്യൽ പരാജയപ്പെട്ടു. വീണ്ടും ശ്രമിക്കുക.</string>
<string name="feature_upload_id_error_invalid_dob">ജനന തീയതി ഇന്നോ ഭാവിയോ ആയിരിക്കാൻ പാടില്ല</string>
<string name="feature_upload_id_generic_error">എന്തോ കുഴപ്പം സംഭവിച്ചു. പിന്നീട് വീണ്ടും ശ്രമിക്കുക.</string>
<string name="feature_upload_id_upload_failed">ഫയൽ അപ്‌ലോഡ് ചെയ്യുന്നതിൽ പരാജയപ്പെട്ടു. ദയവായി വീണ്ടും ശ്രമിക്കുക.</string>
<string name="feature_upload_id_error_invalid_dob">ജനനത്തീയതി ഇന്നത്തേക്കോ അല്ലെങ്കിൽ ഭാവിയിലുള്ള തീയതിയോ ആകാൻ പാടില്ല</string>
<string name="feature_upload_id_generic_error">എന്തോ കുഴപ്പം സംഭവിച്ചു. ദയവായി പിന്നീട് വീണ്ടും ശ്രമിക്കുക.</string>
<string name="feature_otp_title">ഒടിപി പ്രാമാണീകരണം</string>
<string name="feature_otp_title">OTP ഓതന്റിക്കേഷൻ</string>
<string name="feature_otp_subtitle">നിങ്ങളുടെ ഇമെയിൽ പരിശോധിക്കുക!</string>
<string name="feature_otp_message">നിങ്ങളുടെ രജിസ്ട്രേഷൻ പൂർത്തിയാക്കാൻ, നിങ്ങളുടെ ഇമെയിൽ പരിശോധിക്കുക. നിങ്ങൾക്ക് ഒരു പ്രാമാണീകരണ കോഡ് ലഭിച്ചിട്ടുണ്ടാകു (ഇമെയിൽ ലഭിച്ചില്ലെങ്കിൽ, റീസെൻഡ് ഓപ്ഷൻ തിരഞ്ഞെടുക്കുക). നിങ്ങൾ അത് താഴെ നൽകണം.</string>
<string name="feature_otp_message">രജിസ്ട്രേഷൻ പൂർത്തിയാക്കാൻ, നിങ്ങളുടെ ഇമെയിൽ പരിശോധിക്കുക. നിങ്ങൾക്ക് ഒരു ഓതന്റിക്കേഷൻ കോഡ് ലഭിച്ചിട്ടുണ്ടാകണ (ഇമെയിൽ ലഭിച്ചില്ലെങ്കിൽ, റീസെൻഡ് ഓപ്ഷൻ തിരഞ്ഞെടുക്കുക). അത് താഴെ നൽകുക.</string>
<string name="feature_otp_tip">കോഡ് ലഭിച്ചില്ലേ?</string>
<string name="feature_otp_action_tip">ഇപ്പോൾ റീസെൻഡ് ചെയ്യുക</string>
<string name="feature_otp_authentication_code_label">പ്രാമാണീകരണ കോഡ്</string>
<string name="feature_otp_request_id_label">റിക്വസ്റ്റ് ഐഡി</string>
<string name="feature_otp_action_tip">ഇപ്പോൾ വീണ്ടും അയയ്ക്കുക</string>
<string name="feature_otp_authentication_code_label">ഓതന്റിക്കേഷൻ കോഡ്</string>
<string name="feature_otp_request_id_label">അഭ്യർത്ഥന ഐഡി</string>
<string name="feature_common_next">അടുത്തത്</string>
<string name="feature_common_cancel">റദ്ദാക്കുക</string>
<string name="feature_otp_required_error">ഒടിപി ആവശ്യമാണ്</string>
<string name="feature_otp_invalid_error">സാധുവായ ഒടിപി നൽകുക</string>
<string name="feature_otp_request_id_error">റിക്വസ്റ്റ് ഐഡി ആവശ്യമാണ്</string>
<!--Set New Password-->
<string name="feature_otp_required_error">OTP ആവശ്യമാണ്</string>
<string name="feature_otp_invalid_error">സാധുവായ OTP നൽകുക</string>
<string name="feature_otp_request_id_error">അഭ്യർത്ഥന ഐഡി ആവശ്യമാണ്</string>
<string name="feature_set_new_password_title">പാസ്സ്‌വേഡ് സജ്ജമാക്കുക</string>
<string name="feature_set_new_password_message">നിങ്ങളുടെ പുതിയ ഉയർന്ന സുരക്ഷാ പാസ്സ്‌വേഡ് ഇപ്പോൾ സജ്ജമാക്കുക!</string>
<string name="feature_set_new_password_new_password_label">പുതിയ പാസ്സ്‌വേഡ്</string>
<string name="feature_set_new_password_confirm_password_label">പുതിയ പാസ്സ്‌വേഡ് സ്ഥിരീകരിക്കുക</string>
<string name="feature_set_new_password_title">പാസ്‌വേഡ് സജ്ജമാക്കുക</string>
<string name="feature_set_new_password_message">നിങ്ങളുടെ പുതിയ, ഉയർന്ന സുരക്ഷയുള്ള പാസ്‌വേഡ് ഇപ്പോൾ സജ്ജമാക്കുക!</string>
<string name="feature_set_new_password_new_password_label">പുതിയ പാസ്‌വേഡ്</string>
<string name="feature_set_new_password_confirm_password_label">പുതിയ പാസ്‌വേഡ് സ്ഥിരീകരിക്കുക</string>
<string name="feature_set_new_password_submit">സമർപ്പിക്കുക</string>
<string name="feature_set_new_password_tip">നിങ്ങളുടെ പാസ്സ്‌വേഡ് ഓർമ്മയുണ്ടോ?</string>
<string name="feature_set_new_password_action_tip">ലോഗിൻ ചെയ്യുക</string>
<string name="feature_set_new_password_tip">പാസ്‌വേഡ് ഓർമ്മയുണ്ടോ?</string>
<string name="feature_set_new_password_action_tip">ലോഗിൻ</string>
<string name="feature_common_error_password_required_error">പാസ്സ്‌വേഡ് ആവശ്യമാണ്</string>
<string name="feature_common_error_password_short">പാസ്സ്‌വേഡ് കുറഞ്ഞത് 6 അക്ഷരങ്ങൾ നീളമുള്ളതായിരിക്കണം</string>
<string name="feature_common_error_password_mismatch">പാസ്സ്‌വേഡുകൾ പൊരുത്തപ്പെടുന്നില്ല</string>
<string name="feature_common_error_password_required_error">പാസ്‌വേഡ് ആവശ്യമാണ്</string>
<string name="feature_common_error_password_short">പാസ്‌വേഡ് കുറഞ്ഞത് 6 അക്ഷരങ്ങൾ ഉണ്ടായിരിക്കണം</string>
<string name="feature_common_error_password_mismatch">പാസ്‌വേഡുകൾ പൊരുത്തപ്പെടുന്നില്ല</string>
<!--Recover Password-->
<string name="feature_recover_now_title">ഇപ്പോൾ വീണ്ടെടുക്കുക</string>
<string name="feature_recover_now_message">പാസ്സ്‌വേഡ് മറന്നുപോയോ, ആശങ്കപ്പെടണ്ടെ!, ഞങ്ങൾ നിങ്ങളെ സഹായിക്കും. നിങ്ങളുടെ പാസ്സ്‌വേഡ് ഇപ്പോൾ പുനഃക്രമീകരിക്കുക!</string>
<string name="feature_recover_now_message">പാസ്‌വേഡ് മറന്നോ? വിഷമിക്കേണ്ട!, ഞങ്ങൾ സഹായിക്കാം. നിങ്ങളുടെ പാസ്‌വേഡ് ഇപ്പോൾ റീസെറ്റ് ചെയ്യുക!</string>
<string name="feature_recover_now_phone_number_label">ഫോൺ നമ്പർ</string>
<string name="feature_recover_now_email_label">ഇമെയിൽ</string>
<string name="feature_recover_now_verifying">പരിശോധിക്കുന്നു</string>
@ -173,12 +170,13 @@
<string name="feature_recover_now_phone_number_required">ഫോൺ നമ്പർ ആവശ്യമാണ്</string>
<string name="feature_recover_now_email_format_error">അസാധുവായ ഇമെയിൽ</string>
<string name="feature_recover_now_phone_number_error">അസാധുവായ ഫോൺ നമ്പർ</string>
<string name="feature_recover_now_invalid_phone_number_error">ഫോൺ നമ്പറിൽ അക്ഷരങ്ങളോ ചിഹ്നങ്ങളോ അനുവദനീയമല്ല</string>
<string name="feature_recover_now_remember_your_password">നിങ്ങളുടെ പാസ്സ്‌വേഡ് ഓർമ്മയുണ്ടോ?</string>
<string name="feature_recover_now_log_in">ലോഗിൻ ചെയ്യുക!</string>
<string name="feature_recover_now_invalid_phone_number_error">ഫോൺ നമ്പറിൽ അക്ഷരങ്ങളോ ചിഹ്നങ്ങളോ അടങ്ങാൻ പാടില്ല</string>
<string name="feature_recover_now_remember_your_password">പാസ്‌വേഡ് ഓർമ്മയുണ്ടോ?</string>
<string name="feature_recover_now_log_in">ലോഗിൻ!</string>
<string name="feature_recover_now_recovered_successfully">പാസ്‌വേഡ് വീണ്ടെടുക്കൽ വിജയകരം</string>
<string name="feature_recover_now_recovered_successfully_tip">ഇപ്പോൾ നിങ്ങൾക്ക് നിങ്ങളുടെ യൂസർനെയിം (ഫോൺ നമ്പർ), പാസ്‌വേഡ് ഉപയോഗിച്ച് ലോഗിൻ ചെയ്യാം.</string>
<string name="feature_recover_now_recovered_failed">പാസ്‌വേഡ് വീണ്ടെടുക്കൽ പരാജയപ്പെട്ടു</string>
<string name="feature_recover_now_registered_failed_tip">ഉപയോക്താവിന്റെ പാസ്‌വേഡ് വീണ്ടെടുക്കുന്നതിൽ പിശക്. ദയവായി വീണ്ടും ശ്രമിക്കുക.</string>
<string name="feature_recover_now_recovered_successfully">പാസ്സ്‌വേഡ് വീണ്ടെടുക്കൽ വിജയകരമായി</string>
<string name="feature_recover_now_recovered_successfully_tip">നിങ്ങൾക്ക് ഇപ്പോൾ നിങ്ങളുടെ ഉപയോക്തൃനാമം (ഫോൺ നമ്പർ) ഉം പാസ്സ്‌വേഡ് ഉം ഉപയോഗിച്ച് ലോഗിൻ ചെയ്യാം.</string>
<string name="feature_recover_now_recovered_failed">പാസ്സ്‌വേഡ് വീണ്ടെടുക്കൽ പരാജയപ്പെട്ടു</string>
<string name="feature_recover_now_registered_failed_tip">ഉപയോക്താവിന്റെ പാസ്സ്‌വേഡ് വീണ്ടെടുക്കുന്നതിൽ പിശക് സംഭവിച്ചു. വീണ്ടും ശ്രമിക്കുക.</string>
</resources>

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2026 Mifos Initiative
Copyright 2024 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,
@ -9,112 +9,115 @@
See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md
-->
<resources>
<string name="error_fetching_beneficiaries">ആനുകൂല്യങ്ങൾ ശേഖരിക്കുന്നതിൽ പരാജയപ്പെട്ടു</string>
<string name="error_fetching_beneficiary_template">ആനുകൂല്യ ടെമ്പ്ലേറ്റ് ശേഖരിക്കുന്നതിൽ പരാജയപ്പെട്ടു</string>
<string name="error_fetching_template">ടെമ്പ്ലേറ്റ് ശേഖരിക്കുന്നതിൽ പരാജയപ്പെട്ടു</string>
<string name="error_creating_beneficiary">ആനുകൂല്യം സൃഷ്ടിക്കുന്നതിൽ പരാജയപ്പെട്ടു</string>
<string name="error_updating_beneficiary">ആനുകൂല്യം അപ്ഡേറ്റ് ചെയ്യുന്നതിൽ പരാജയപ്പെട്ടു</string>
<string name="error_deleting_beneficiary">ആനുകൂല്യം ഇല്ലാതാക്കുന്നതിൽ പരാജയപ്പെട്ടു</string>
<string name="error_loan_account_withdraw">ലോൺ അക്കൗണ്ട് വിതരണം ചെയ്യുന്നതിൽ പിശക്</string>
<string name="error_fetching_third_party_transfer_template">തേർഡ് പാർട്ടി ട്രാൻസ്ഫർ ടെമ്പ്ലേറ്റ് ശേഖരിക്കുന്നതിൽ പിശക്</string>
<string name="no_beneficiary_found_please_add">നിങ്ങൾക്ക് ഇപ്പോൾ ആനുകൂല്യങ്ങളൊന്നുമില്ല. ദയവായി ആനുകൂല്യങ്ങൾ ചേർക്കുക</string>
<string name="no_filtered_beneficiary_found">നൽകിയ ഫിൽട്ടറിന് ആനുകൂല്യങ്ങൾ ഒന്നും കണ്ടെത്തിയില്ല</string>
<string name="beneficiary">ആനുകൂല്യം</string>
<string name="manage_beneficiaries">ആനുകൂല്യങ്ങൾ കൈകാര്യം ചെയ്യുക</string>
<string name="beneficiaries">ആനുകൂല്യങ്ങ</string>
<string name="beneficiary_detail">ആനുകൂല്യ വിശദാംശങ്ങൾ</string>
<string name="beneficiary_name">ആനുകൂല്യത്തിന്റെ പേര്</string>
<string name="error_fetching_beneficiaries">ഗുണഭോക്താക്കളെ ലഭ്യമാക്കുന്നതിൽ പരാജയപ്പെട്ടു</string>
<string name="error_fetching_beneficiary_template">ഗുണഭോക്തൃ ടെംപ്ലേറ്റ് ലഭ്യമാക്കുന്നതിൽ പരാജയപ്പെട്ടു</string>
<string name="error_fetching_template">ടെംപ്ലേറ്റ് ലഭ്യമാക്കുന്നതിൽ പരാജയപ്പെട്ടു</string>
<string name="error_creating_beneficiary">ഗുണഭോക്താവിനെ സൃഷ്ടിക്കുന്നതിൽ പരാജയപ്പെട്ടു</string>
<string name="error_updating_beneficiary">ഗുണഭോക്താവിനെ അപ്‌ഡേറ്റ് ചെയ്യുന്നതിൽ പരാജയപ്പെട്ടു</string>
<string name="error_deleting_beneficiary">ഗുണഭോക്താവിനെ നീക്കം ചെയ്യുന്നതിൽ പരാജയപ്പെട്ടു</string>
<string name="error_loan_account_withdraw">വായ്പാ അക്കൗണ്ടിൽ നിന്ന് പിൻവലിക്കുന്നതിൽ പിശക്</string>
<string name="error_fetching_third_party_transfer_template">തേർഡ് പാർട്ടി ട്രാൻസ്ഫർ ടെംപ്ലേറ്റ് ലഭ്യമാക്കുന്നതിൽ പിശക്</string>
<string name="no_beneficiary_found_please_add">ഇപ്പോൾ, നിങ്ങൾക്ക് ഗുണഭോക്താക്കളില്ല. ദയവായി ഗുണഭോക്താവിനെ ചേർക്കുക</string>
<string name="no_filtered_beneficiary_found">നൽകിയിരിക്കുന്ന ഫിൽട്ടറിനായി ഗുണഭോക്താക്കളെ കണ്ടെത്തിയില്ല</string>
<string name="beneficiary">ഗുണഭോക്താവ്</string>
<string name="manage_beneficiaries">ഗുണഭോക്താക്കളെ നിയന്ത്രിക്കുക</string>
<string name="beneficiaries">ഗുണഭോക്താക്ക</string>
<string name="beneficiary_detail">ഗുണഭോക്താവിന്റെ വിവരങ്ങൾ</string>
<string name="beneficiary_name">ഗുണഭോക്താവിന്റെ പേര്</string>
<string name="account_type">അക്കൗണ്ട് തരം</string>
<string name="transfer_limit">ട്രാൻസ്ഫർ പരിധി</string>
<string name="add_beneficiary">ആനുകൂല്യം ചേർക്കുക</string>
<string name="add_beneficiary">ഗുണഭോക്താവിനെ ചേർക്കുക</string>
<string name="office_name">ഓഫീസ് പേര്</string>
<string name="select_account_type">അക്കൗണ്ട് തരം തിരഞ്ഞെടുക്കുക*</string>
<string name="submit_beneficiary">ആനുകൂല്യം സമർപ്പിക്കുക</string>
<string name="enter_office_name">ആനുകൂല്യത്തിന്റെ ഓഫീസ് പേര് നൽകുക</string>
<string name="enter_beneficiary_name">ആനുകൂല്യത്തിന്റെ പേര് നൽകുക</string>
<string name="submit_beneficiary">ഗുണഭോക്താവിനെ സമർപ്പിക്കുക</string>
<string name="enter_office_name">ഗുണഭോക്താവിന്റെ ഓഫീസ് പേര് നൽകുക</string>
<string name="enter_beneficiary_name">ഗുണഭോക്താവിന്റെ പേര് നൽകുക</string>
<string name="enter_transfer_limit">ട്രാൻസ്ഫർ പരിധി നൽകുക</string>
<string name="enter_account_number">ആനുകൂല്യത്തിന്റെ അക്കൗണ്ട് നമ്പർ നൽകുക</string>
<string name="choose_account_type">ഡ്രോപ്പ്ഡൗൺ ലിസ്റ്റിൽ നിന്ന് അക്കൗണ്ട് തരം തിരഞ്ഞെടുക്കുക</string>
<string name="beneficiary_created_successfully">ആനുകൂല്യം വിജയകരമായി സൃഷ്ടിച്ചു</string>
<string name="beneficiary_updated_successfully">ആനുകൂല്യം വിജയകരമായി അപ്ഡേറ്റ് ചെയ്തു</string>
<string name="update_beneficiary">ആനുകൂല്യം അപ്ഡേറ്റ് ചെയ്യുക</string>
<string name="delete_beneficiary">ആനുകൂല്യം ഇല്ലാതാക്കുക</string>
<string name="delete_beneficiary_confirmation">ആനുകൂല്യം ഇല്ലാതാക്കണമെന്ന് നിങ്ങൾക്ക് ഉറപ്പാണോ?</string>
<string name="enter_account_number">ഗുണഭോക്താവിന്റെ അക്കൗണ്ട് നമ്പർ നൽകുക</string>
<string name="choose_account_type">ഡ്രോപ്പ്ഡൗിൽ നിന്ന് അക്കൗണ്ട് തരം തിരഞ്ഞെടുക്കുക</string>
<string name="beneficiary_created_successfully">ഗുണഭോക്താവിനെ വിജയകരമായി സൃഷ്ടിച്ചു</string>
<string name="beneficiary_updated_successfully">ഗുണഭോക്താവിനെ വിജയകരമായി അപ്‌ഡേറ്റ് ചെയ്തു</string>
<string name="update_beneficiary">ഗുണഭോക്താവിനെ അപ്‌ഡേറ്റ് ചെയ്യുക</string>
<string name="delete_beneficiary">ഗുണഭോക്താവിനെ നീക്കം ചെയ്യുക</string>
<string name="delete_beneficiary_confirmation">ഗുണഭോക്താവിനെ നീക്കം ചെയ്യണമെന്ന് നിങ്ങൾക്ക് ഉറപ്പാണോ</string>
<string name="login_using_password_confirmation">പാസ്‌വേഡ് ഉപയോഗിച്ച് ലോഗിൻ ചെയ്യണമെന്ന് നിങ്ങൾക്ക് ഉറപ്പാണോ?</string>
<string name="delete">ഇല്ലാതാക്കുക</string>
<string name="beneficiary_deleted_successfully">ആനുകൂല്യം വിജയകരമായി ഇല്ലാതാക്കി</string>
<string name="delete">നീക്കം ചെയ്യുക</string>
<string name="beneficiary_deleted_successfully">ഗുണഭോക്താവിനെ വിജയകരമായി നീക്കം ചെയ്തു</string>
<string name="third_party_transfer">തേർഡ് പാർട്ടി ട്രാൻസ്ഫർ</string>
<string name="total_loan">ആകെ ലോൺ</string>
<string name="total_saving">ആകെ സേവിംഗ്</string>
<string name="accounts_overview">അക്കൗണ്ടുകളുടെ അവലോകനം</string>
<string name="show_hide_total_saving_amount">ആകെ സേവിംഗ് തുക കാണിക്കുക അല്ലെങ്കിൽ മറയ്ക്കുക</string>
<string name="show_hide_total_loan_amount">ആകെ ലോൺ തുക കാണിക്കുക അല്ലെങ്കിൽ മറയ്ക്കുക</string>
<string name="total_loan">ആകെ വായ്പ</string>
<string name="total_saving">ആകെ സമ്പാദ്യം</string>
<string name="accounts_overview">അക്കൗണ്ട അവലോകനം</string>
<string name="show_hide_total_saving_amount">ആകെ സമ്പാദ്യ തുക കാണിക്കുകയോ മറയ്ക്കുകയോ ചെയ്യുക</string>
<string name="show_hide_total_loan_amount">ആകെ വായ്പാ തുക കാണിക്കുകയോ മറയ്ക്കുകയോ ചെയ്യുക</string>
<string name="hidden_amount">*****</string>
<string name="survey">സർവേ</string>
<string name="activation_date">സജീവമാക്കൽ തീയതി</string>
<string name="survey">സർവേകൾ</string>
<string name="activation_date">ആക്ടിവേഷൻ തീയതി</string>
<string name="groups">ഗ്രൂപ്പുകൾ</string>
<string name="user_details">ഉപയോക്തൃ വിശദാംശങ്ങൾ</string>
<string name="user_details">ഉപയോക്തൃ വിവരങ്ങൾ</string>
<string name="client_type">ക്ലയന്റ് തരം</string>
<string name="client_classification">ക്ലയന്റ് വർഗ്ഗീകരണം</string>
<string name="select_mode">മോഡ് തിരഞ്ഞെടുക്കുക</string>
<string name="add_beneficiary_option">നിങ്ങളുടെ അക്കൗണ്ടിലേക്ക് തേർഡ് പാർട്ടി ആനുകൂല്യങ്ങൾ ചേർക്കുക.\nസ്വമേധയാ നൽകുക അല്ലെങ്കിൽ അക്കൗണ്ട് QR കോഡ് സ്കാൻ ചെയ്യുക</string>
<string name="add_beneficiary_option">നിങ്ങളുടെ അക്കൗണ്ടിലേക്ക് തേർഡ് പാർട്ടി ഗുണഭോക്താക്കളെ ചേർക്കുക.\nനേരിട്ട് നൽകുകയോ ക്യുആർ കോഡ് സ്കാൻ ചെയ്യുകയോ ചെയ്യാം</string>
<string name="invalid_amount">അസാധുവായ തുക</string>
<string name="account_number">അക്കൗണ്ട് നമ്പർ</string>
<string name="client_name">ക്ലയന്റ് പേര്</string>
<string name="cancel">റദ്ദാക്കുക</string>
<string name="internet_not_connected">ദയവായി നിങ്ങൾ ഇന്റർനെറ്റിലാണെന്ന് ഉറപ്പുവരുത്തുക</string>
<string name="internet_not_connected">നിങ്ങൾ ഇന്റർനെറ്റുമായി ബന്ധിപ്പിച്ചിട്ടുണ്ടെന്ന് ഉറപ്പാക്കുക</string>
<string name="add">ചേർക്കുക</string>
<string name="scan">സ്കാൻ ചെയ്യുക</string>
<string name="upload_qr_code">QR ോഡ് അപ്‌ലോഡ് ചെയ്യുക</string>
<string name="scan">സ്കാൻ</string>
<string name="upload_qr_code">ക്യുആർ അപ്‌ലോഡ് ചെയ്യുക</string>
<string name="beneficiary_name_label">ആനുകൂല്യത്തിന്റെ പേര്</string>
<string name="beneficiary_name_label">ഗുണഭോക്താവിന്റെ പേര്</string>
<string name="office_label">ഓഫീസ്</string>
<string name="account_type_label">അക്കൗണ്ട് തരം</string>
<string name="account_number_label">അക്കൗണ്ട് നമ്പർ</string>
<string name="transfer_limit_label">ട്രാൻസ്ഫർ പരിധി</string>
<!-- Account Type Values -->
<string name="account_type_savings">സേവിംഗ്</string>
<string name="account_type_savings">സേവിംഗ്സ്</string>
<string name="account_type_loan">ലോൺ</string>
<string name="account_type_share">ഷെയർ</string>
<!-- Labels -->
<string name="validate_details">വിശദാംശങ്ങൾ സാധൂകരിക്കുക</string>
<string name="validate_details">വിശദാംശങ്ങൾ പരിശോധിക്കുക</string>
<string name="confirm_details">വിശദാംശങ്ങൾ സ്ഥിരീകരിക്കുക</string>
<!-- Dialog Titles & Messages -->
<string name="beneficiary_creation_failed">ആനുകൂല്യ സൃഷ്ടിക്കൽ പരാജയപ്പെട്ടു</string>
<string name="beneficiary_updation_failed">ആനുകൂല്യ അപ്ഡേറ്റ് ചെയ്യൽ പരാജയപ്പെട്ടു</string>
<string name="beneficiary_creation_failed">ഗുണഭോക്താവിനെ സൃഷ്ടിക്കുന്നത് പരാജയപ്പെട്ടു</string>
<string name="beneficiary_updation_failed">ഗുണഭോക്താവിനെ അപ്‌ഡേറ്റ് ചെയ്യുന്നത് പരാജയപ്പെട്ടു</string>
<string name="try_again">വീണ്ടും ശ്രമിക്കുക</string>
<string name="back_to_home">ഹോ പേജിലേക്ക് പോകുക</string>
<string name="back_to_home">ഹോമിലേക്ക് മടങ്ങുക</string>
<!-- Filter -->
<string name="feature_savings_filter">ഫിൽട്ടർ</string>
<string name="feature_savings_reset">പുനഃക്രമീകരിക്കുക</string>
<string name="feature_savings_apply">പ്രയോഗിക്കുക</string>
<string name="feature_savings_filter">ഫിൽട്ടറുകൾ</string>
<string name="feature_savings_reset">റീസെറ്റ്</string>
<string name="feature_savings_apply">അപ്ലൈ</string>
<string name="feature_filters_count">%1$s തിരഞ്ഞെടുത്തു</string>
<!-- Beneficiary Filter Types -->
<string name="filter_account_type">അക്കൗണ്ട് തരം</string>
<string name="filter_loan_account">ലോൺ അക്കൗണ്ട്</string>
<string name="filter_savings_account">സേവിംഗ് അക്കൗണ്ട്</string>
<string name="filter_linked_with">ബന്ധപ്പെടുത്തിയത്</string>
<string name="filter_savings_account">സേവിംഗ്സ് അക്കൗണ്ട്</string>
<string name="filter_linked_with">ഇതുമായി ബന്ധിപ്പിച്ചത്</string>
<string name="filter_self">സ്വയം</string>
<string name="filter_other_clients">മറ്റ് ക്ലയന്റുകൾ</string>
<string name="filter_other_clients">മറ്റുള ക്ലയന്റുകൾ</string>
<string name="beneficiary_created_successfully_account">
%2$s പേരിനുള്ള ആനുകൂല്യം %1$s അക്കൗണ്ടിനായി വിജയകരമായി സൃഷ്ടിച്ചു.
%1$s എന്ന അക്കൗണ്ടിനായി %2$s എന്ന പേരിൽ ഗുണഭോക്താവിനെ വിജയകരമായി സൃഷ്ടിച്ചു.
</string>
<string name="beneficiary_updated_successfully_account">
%2$d ട്രാൻസ്ഫർ പരിധിയുമായി %1$s പേരിനുള്ള ആനുകൂല്യം വിജയകരമായി അപ്ഡേറ്റ് ചെയ്തു.
%1$s എന്ന ഗുണഭോക്താവിനെ %2$d ട്രാൻസ്ഫർ പരിധിയോടെ വിജയകരമായി അപ്‌ഡേറ്റ് ചെയ്തു.
</string>
<string name="skip_the_form">ഫോം ഒഴിവാക്കുക</string>
<string name="upload_or_scan_qr_code">QR കോഡ് അപ്‌ലോഡ് ചെയ്യുക അല്ലെങ്കിൽ സ്കാൻ ചെയ്യുക</string>
<string name="upload_or_scan_qr_code">ക്യുആർ കോഡ് അപ്‌ലോഡ് ചെയ്യുക അല്ലെങ്കിൽ സ്കാൻ ചെയ്യുക</string>
<string name="filter">ഫിൽട്ടർ</string>
<string name="linked_with">ബന്ധപ്പെടുത്തിയത്</string>
<string name="linked_with">ഇതുമായി ബന്ധിപ്പിച്ചത്</string>
<string name="type_of_account">അക്കൗണ്ട് തരം</string>
<string name="selected_count">%1$d തിരഞ്ഞെടുത്തു</string>
<string name="filter_icon_description">ഫിൽട്ടർ ഐക്കൺ</string>
<string name="feature_generic_error_server">സെർവർ പ്രശ്നം കാരണം മുന്നോട്ട് പോകാൻ കഴിയില്ല, അല്പസമയത്തിന് ശേഷം വീണ്ടും ശ്രമിക്കുക</string>
</resources>

View File

@ -22,6 +22,20 @@
<string name="amount_paid">Paid:</string>
<string name="feature_client_charge_share_charges">Share Charges</string>
<string name="feature_client_charges_filter_charges">Filter Charges</string>
<string name="feature_client_charges_clear_all">Clear All</string>
<string name="feature_client_charges_account_type">Account Type:</string>
<string name="feature_client_charges_select_account">Select Account:</string>
<string name="feature_client_charges_all_accounts">All Accounts</string>
<string name="feature_client_charges_account_label">Account</string>
<string name="feature_client_charges_charge_status">Charge Status:</string>
<string name="feature_client_charges_apply_filters">Apply Filters</string>
<string name="feature_client_charges_account_type_savings">Savings</string>
<string name="feature_client_charges_account_type_loan">Loan</string>
<string name="feature_client_charges_account_type_shares">Shares</string>
<string name="feature_client_charges_charge_id">ChargeId : %1$s</string>
<string name="charge_details">Charge Details</string>
<string name="paid_success_message">You have successfully paid this charge completely</string>

View File

@ -22,6 +22,20 @@
<string name="amount_paid">Paid:</string>
<string name="feature_client_charge_share_charges">Share Charges</string>
<string name="feature_client_charges_filter_charges">Filter Charges</string>
<string name="feature_client_charges_clear_all">Clear All</string>
<string name="feature_client_charges_account_type">Account Type:</string>
<string name="feature_client_charges_select_account">Select Account:</string>
<string name="feature_client_charges_all_accounts">All Accounts</string>
<string name="feature_client_charges_account_label">Account</string>
<string name="feature_client_charges_charge_status">Charge Status:</string>
<string name="feature_client_charges_apply_filters">Apply Filters</string>
<string name="feature_client_charges_account_type_savings">Savings</string>
<string name="feature_client_charges_account_type_loan">Loan</string>
<string name="feature_client_charges_account_type_shares">Shares</string>
<string name="feature_client_charges_charge_id">ChargeId : %1$s</string>
<string name="charge_details">Charge Details</string>
<string name="paid_success_message">You have successfully paid this charge completely</string>

View File

@ -9,30 +9,70 @@
*/
package org.mifos.mobile.feature.charge.charges
import androidx.compose.foundation.BorderStroke
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.navigationBarsPadding
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.Card
import androidx.compose.material3.CardDefaults
import androidx.compose.material3.DropdownMenu
import androidx.compose.material3.DropdownMenuItem
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.ModalBottomSheet
import androidx.compose.material3.SnackbarHostState
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.material3.rememberModalBottomSheetState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.font.FontWeight
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import kotlinx.coroutines.launch
import mifos_mobile.feature.client_charge.generated.resources.Res
import mifos_mobile.feature.client_charge.generated.resources.database_warning
import mifos_mobile.feature.client_charge.generated.resources.error_no_charge
import mifos_mobile.feature.client_charge.generated.resources.feature_client_charges_account_label
import mifos_mobile.feature.client_charge.generated.resources.feature_client_charges_account_type
import mifos_mobile.feature.client_charge.generated.resources.feature_client_charges_account_type_loan
import mifos_mobile.feature.client_charge.generated.resources.feature_client_charges_account_type_savings
import mifos_mobile.feature.client_charge.generated.resources.feature_client_charges_account_type_shares
import mifos_mobile.feature.client_charge.generated.resources.feature_client_charges_all_accounts
import mifos_mobile.feature.client_charge.generated.resources.feature_client_charges_apply_filters
import mifos_mobile.feature.client_charge.generated.resources.feature_client_charges_charge_status
import mifos_mobile.feature.client_charge.generated.resources.feature_client_charges_clear_all
import mifos_mobile.feature.client_charge.generated.resources.feature_client_charges_filter_charges
import mifos_mobile.feature.client_charge.generated.resources.feature_client_charges_select_account
import org.jetbrains.compose.resources.stringResource
import org.jetbrains.compose.ui.tooling.preview.Preview
import org.koin.compose.viewmodel.koinViewModel
import org.mifos.mobile.core.designsystem.component.BasicDialogState
import org.mifos.mobile.core.designsystem.component.MifosBasicDialog
import org.mifos.mobile.core.designsystem.component.MifosElevatedScaffold
import org.mifos.mobile.core.designsystem.icon.MifosIcons
import org.mifos.mobile.core.designsystem.theme.DesignToken
import org.mifos.mobile.core.designsystem.theme.MifosMobileTheme
import org.mifos.mobile.core.model.entity.Charge
import org.mifos.mobile.core.model.enums.ChargeType
@ -42,17 +82,10 @@ import org.mifos.mobile.core.ui.component.MifosPoweredCard
import org.mifos.mobile.core.ui.component.MifosProgressIndicator
import org.mifos.mobile.core.ui.utils.EventsEffect
import org.mifos.mobile.core.ui.utils.ScreenUiState
import org.mifos.mobile.feature.charge.components.ChargeFilterUtil
import org.mifos.mobile.feature.charge.components.ClientChargeItem
import template.core.base.designsystem.theme.KptTheme
/**
* Composable function that displays the Client Charges Screen.
*
* @param navigateBack A lambda function that is called when the user navigates back.
* @param onChargeClick A lambda function that is called when the user clicks on a charge.
* @param modifier Modifier to be applied to the layout.
* @param viewModel ViewModel that provides the state and actions for the screen.
*/
@Composable
internal fun ClientChargeScreen(
navigateBack: () -> Unit,
@ -95,23 +128,30 @@ internal fun ClientChargeScreen(
)
}
/**
* Composable function that displays the Client Charges Screen.
*
* @param state State of the screen.
* @param modifier Modifier to be applied to the layout.
* @param onAction A lambda function that is called when the user performs an action.
*/
@OptIn(ExperimentalMaterial3Api::class)
@Composable
private fun ClientChargeScreen(
state: ClientChargeState,
modifier: Modifier = Modifier,
onAction: (ClientChargeAction) -> Unit,
) {
val sheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true)
val title = stringResource(state.topBarTitleResId) +
(state.selectedAccountNo?.let { " - $it" } ?: "")
MifosElevatedScaffold(
topBarTitle = stringResource(state.topBarTitleResId),
onNavigateBack = { onAction(ClientChargeAction.OnNavigate) },
modifier = modifier,
topBarTitle = title,
onNavigateBack = { onAction(ClientChargeAction.OnNavigate) },
actions = {
IconButton(onClick = { onAction(ClientChargeAction.ToggleFilter) }) {
Icon(
imageVector = MifosIcons.Filter,
contentDescription = "Filter",
)
}
},
bottomBar = {
Surface {
MifosPoweredCard(
@ -121,14 +161,14 @@ private fun ClientChargeScreen(
)
}
},
) {
content = {
Box(modifier = Modifier.fillMaxSize()) {
when (state.uiState) {
ScreenUiState.Empty -> {
EmptyDataView(
modifier = Modifier.fillMaxSize(),
image = Res.drawable.database_warning,
error = Res.string.error_no_charge,
)
}
@ -152,25 +192,43 @@ private fun ClientChargeScreen(
ScreenUiState.Success -> {
ClientChargeContent(
modifier = Modifier.padding(KptTheme.spacing.md),
modifier = Modifier.padding(KptTheme.spacing.lg),
chargesList = state.charges,
onChargeClick = {
onAction(ClientChargeAction.OnChargeClick(it))
},
)
}
else -> {}
}
}
if (state.showFilter) {
ModalBottomSheet(
onDismissRequest = { onAction(ClientChargeAction.ToggleFilter) },
sheetState = sheetState,
) {
ChargeFilterSheetContent(
state = state,
onApply = { target, filter ->
onAction(
ClientChargeAction.ApplyFilter(
target = target,
filter = filter,
),
)
},
onClear = {
onAction(ClientChargeAction.ClearFilter)
},
)
}
}
},
)
}
/**
* Composable function that displays the content of the Client Charges Screen.
*
* @param chargesList List of charges to be displayed.
* @param onChargeClick A lambda function that is called when the user clicks on a charge.
* @param modifier Modifier to be applied to the layout.
*/
@Composable
private fun ClientChargeContent(
chargesList: List<Charge>,
@ -186,12 +244,6 @@ private fun ClientChargeContent(
}
}
/**
* Composable function that displays the dialogs of the Client Charges Screen.
*
* @param dialogState Dialog state used for showing loading or error.
* @param onDismissRequest A lambda function that is called when the user dismisses the dialog.
*/
@Composable
private fun ClientChargeDialogs(
dialogState: ClientChargeState.DialogState?,
@ -206,11 +258,357 @@ private fun ClientChargeDialogs(
onDismissRequest = onDismissRequest,
)
}
null -> Unit
}
}
@Composable
fun ChargeFilterSheetContent(
state: ClientChargeState,
onApply: (ChargeAccountTarget, ChargeFilterUtil) -> Unit,
onClear: () -> Unit,
modifier: Modifier = Modifier,
) {
val savingsLabel = stringResource(Res.string.feature_client_charges_account_type_savings)
val loanLabel = stringResource(Res.string.feature_client_charges_account_type_loan)
val sharesLabel = stringResource(Res.string.feature_client_charges_account_type_shares)
var selectedTabLabel by rememberSaveable {
mutableStateOf(
when {
state.selectedLoanAccount != null || state.chargeType == ChargeType.LOAN -> loanLabel
state.selectedShareAccount != null || state.chargeType == ChargeType.SHARE -> sharesLabel
else -> savingsLabel
},
)
}
var selectedTarget by remember {
mutableStateOf(
when {
state.selectedSavingsAccount != null ->
ChargeAccountTarget.Savings(state.selectedSavingsAccount)
state.selectedLoanAccount != null ->
ChargeAccountTarget.Loan(state.selectedLoanAccount)
state.selectedShareAccount != null ->
ChargeAccountTarget.Share(state.selectedShareAccount)
else -> ChargeAccountTarget.AllAccounts
},
)
}
var selectedFilter by remember { mutableStateOf(state.activeFilter) }
val currentAccountList: List<ChargeAccountTarget> = when (selectedTabLabel) {
savingsLabel -> state.savingsAccounts.map { ChargeAccountTarget.Savings(it) }
loanLabel -> state.loanAccounts.map { ChargeAccountTarget.Loan(it) }
sharesLabel -> state.shareAccounts.map { ChargeAccountTarget.Share(it) }
else -> emptyList()
}
Column(
modifier = modifier
.fillMaxWidth()
.padding(
horizontal = KptTheme.spacing.xl,
vertical = KptTheme.spacing.lg,
),
) {
FilterHeader(onClear = onClear)
HorizontalDivider(modifier = Modifier.padding(vertical = KptTheme.spacing.sm))
if (state.canSwitchAccounts) {
AccountTypeSection(
selectedTabLabel = selectedTabLabel,
onTabSelected = { newTab ->
selectedTabLabel = newTab
selectedTarget = ChargeAccountTarget.AllAccounts
},
)
if (currentAccountList.isNotEmpty()) {
AccountDropdownSection(
accounts = currentAccountList,
selectedTarget = selectedTarget,
onTargetSelected = { selectedTarget = it },
)
}
}
ChargeStatusSection(
selectedFilter = selectedFilter,
onFilterSelected = { selectedFilter = it },
)
Spacer(modifier = Modifier.height(KptTheme.spacing.md))
FilterApplyButton(
onClick = {
onApply(selectedTarget, selectedFilter)
},
)
Spacer(modifier = Modifier.height(KptTheme.spacing.lg))
}
}
@Composable
private fun FilterHeader(onClear: () -> Unit) {
Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically,
) {
Text(
text = stringResource(Res.string.feature_client_charges_filter_charges),
style = KptTheme.typography.titleLarge,
)
TextButton(onClick = onClear) {
Text(
text = stringResource(Res.string.feature_client_charges_clear_all),
style = KptTheme.typography.bodyMedium.copy(
color = KptTheme.colorScheme.primary,
fontWeight = FontWeight.SemiBold,
),
)
}
}
}
@Composable
private fun AccountTypeSection(
selectedTabLabel: String,
onTabSelected: (String) -> Unit,
) {
Column {
Text(
text = stringResource(Res.string.feature_client_charges_account_type),
style = KptTheme.typography.bodyMedium.copy(fontWeight = FontWeight.Medium),
modifier = Modifier.padding(vertical = KptTheme.spacing.sm),
)
Row(horizontalArrangement = Arrangement.spacedBy(KptTheme.spacing.sm)) {
val types = listOf(
stringResource(Res.string.feature_client_charges_account_type_savings),
stringResource(Res.string.feature_client_charges_account_type_loan),
stringResource(Res.string.feature_client_charges_account_type_shares),
)
types.forEach { type ->
FilterOptionChip(
label = type,
isSelected = selectedTabLabel == type,
onClick = { onTabSelected(type) },
modifier = Modifier.weight(1f),
)
}
}
Spacer(modifier = Modifier.height(KptTheme.spacing.lg))
}
}
@Composable
private fun AccountDropdownSection(
accounts: List<ChargeAccountTarget>,
selectedTarget: ChargeAccountTarget,
onTargetSelected: (ChargeAccountTarget) -> Unit,
) {
var isExpanded by remember { mutableStateOf(false) }
Column {
Text(
text = stringResource(Res.string.feature_client_charges_select_account),
style = KptTheme.typography.bodyMedium.copy(fontWeight = FontWeight.Medium),
modifier = Modifier.padding(bottom = KptTheme.spacing.sm),
)
Box {
Card(
modifier = Modifier
.fillMaxWidth()
.clickable { isExpanded = true },
shape = KptTheme.shapes.medium,
border = BorderStroke(DesignToken.strokes.thin, color = KptTheme.colorScheme.onSecondaryContainer),
elevation = CardDefaults.cardElevation(KptTheme.elevation.level0),
) {
Row(
modifier = Modifier
.fillMaxWidth()
.padding(KptTheme.spacing.md),
horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically,
) {
val (_, accNo) = getAccountDetails(selectedTarget)
Text(
text = accNo ?: stringResource(
Res.string.feature_client_charges_all_accounts,
),
style = KptTheme.typography.bodyLarge.copy(fontWeight = FontWeight.Bold),
)
Icon(
imageVector = MifosIcons.ArrowDropDown,
contentDescription = null,
)
}
}
DropdownMenu(
expanded = isExpanded,
onDismissRequest = { isExpanded = false },
modifier = Modifier.fillMaxWidth(0.9f),
) {
DropdownMenuItem(
text = {
Text(
text = stringResource(Res.string.feature_client_charges_all_accounts),
fontWeight = FontWeight.Bold,
)
},
onClick = {
onTargetSelected(ChargeAccountTarget.AllAccounts)
isExpanded = false
},
)
accounts.forEach { account ->
val (productName, accountNo) = getAccountDetails(account)
DropdownMenuItem(
text = {
Column {
Text(
text = productName
?: stringResource(
Res.string.feature_client_charges_account_label,
),
fontWeight = FontWeight.Bold,
)
Text(
text = accountNo ?: "",
style = KptTheme.typography.bodySmall,
)
}
},
onClick = {
onTargetSelected(account)
isExpanded = false
},
)
}
}
}
Spacer(modifier = Modifier.height(KptTheme.spacing.sm))
}
}
@Composable
private fun ChargeStatusSection(
selectedFilter: ChargeFilterUtil,
onFilterSelected: (ChargeFilterUtil) -> Unit,
) {
Column {
Text(
text = stringResource(Res.string.feature_client_charges_charge_status),
style = KptTheme.typography.bodyMedium.copy(fontWeight = FontWeight.Medium),
modifier = Modifier.padding(bottom = KptTheme.spacing.md),
)
val filtersFirstRow = listOf(ChargeFilterUtil.ALL, ChargeFilterUtil.PAID)
val filtersSecondRow = listOf(ChargeFilterUtil.PENDING, ChargeFilterUtil.WAIVED)
Column(verticalArrangement = Arrangement.spacedBy(KptTheme.spacing.sm)) {
Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.spacedBy(KptTheme.spacing.md),
) {
filtersFirstRow.forEach { filter ->
FilterOptionChip(
label = stringResource(filter.label),
isSelected = selectedFilter == filter,
onClick = { onFilterSelected(filter) },
modifier = Modifier.weight(1f),
)
}
}
Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.spacedBy(KptTheme.spacing.md),
) {
filtersSecondRow.forEach { filter ->
FilterOptionChip(
label = stringResource(filter.label),
isSelected = selectedFilter == filter,
onClick = { onFilterSelected(filter) },
modifier = Modifier.weight(1f),
)
}
}
}
}
}
@Composable
private fun FilterApplyButton(onClick: () -> Unit) {
Button(
onClick = onClick,
modifier = Modifier.fillMaxWidth(),
shape = KptTheme.shapes.extraLarge,
colors = ButtonDefaults.buttonColors(containerColor = KptTheme.colorScheme.primary),
) {
Text(
text = stringResource(Res.string.feature_client_charges_apply_filters),
fontStyle = KptTheme.typography.bodyLarge.fontStyle,
)
}
}
private fun getAccountDetails(target: ChargeAccountTarget): Pair<String?, String?> {
return when (target) {
is ChargeAccountTarget.Savings -> target.account.productName to target.account.accountNo
is ChargeAccountTarget.Loan -> target.account.productName to target.account.accountNo
is ChargeAccountTarget.Share -> target.account.productName to target.account.accountNo
ChargeAccountTarget.AllAccounts -> null to null
}
}
@Composable
fun FilterOptionChip(
label: String,
isSelected: Boolean,
onClick: () -> Unit,
modifier: Modifier = Modifier,
) {
Surface(
modifier = modifier.height(KptTheme.spacing.xl),
shape = KptTheme.shapes.extraLarge,
color = if (isSelected) KptTheme.colorScheme.primary else KptTheme.colorScheme.surface,
border = if (!isSelected) {
BorderStroke(
DesignToken.strokes.thin,
KptTheme.colorScheme.outline.copy(alpha = 0.5f),
)
} else {
null
},
onClick = onClick,
) {
Box(
contentAlignment = Alignment.Center,
modifier = Modifier.fillMaxSize(),
) {
Text(
text = label,
color = if (isSelected) {
KptTheme.colorScheme.onPrimary
} else {
KptTheme.colorScheme.onSurface
},
fontWeight = if (isSelected) FontWeight.Bold else FontWeight.Normal,
)
}
}
}
@Preview
@Composable
private fun ClientChargeScreenPreview() {

View File

@ -19,36 +19,28 @@ import kotlinx.io.IOException
import mifos_mobile.feature.client_charge.generated.resources.Res
import mifos_mobile.feature.client_charge.generated.resources.charges
import mifos_mobile.feature.client_charge.generated.resources.client_charges
import mifos_mobile.feature.client_charge.generated.resources.feature_client_charge_share_charges
import mifos_mobile.feature.client_charge.generated.resources.feature_generic_error_server
import mifos_mobile.feature.client_charge.generated.resources.loan_charges
import mifos_mobile.feature.client_charge.generated.resources.savings_charges
import org.jetbrains.compose.resources.StringResource
import org.mifos.mobile.core.common.Constants
import org.mifos.mobile.core.common.DataState
import org.mifos.mobile.core.data.repository.AccountsRepository
import org.mifos.mobile.core.data.repository.ClientChargeRepository
import org.mifos.mobile.core.data.util.NetworkMonitor
import org.mifos.mobile.core.datastore.UserPreferencesRepository
import org.mifos.mobile.core.model.entity.Charge
import org.mifos.mobile.core.model.entity.Page
import org.mifos.mobile.core.model.entity.accounts.loan.LoanAccount
import org.mifos.mobile.core.model.entity.accounts.savings.SavingAccount
import org.mifos.mobile.core.model.entity.accounts.share.ShareAccount
import org.mifos.mobile.core.model.enums.ChargeType
import org.mifos.mobile.core.ui.utils.BaseViewModel
import org.mifos.mobile.core.ui.utils.ScreenUiState
import org.mifos.mobile.feature.charge.components.ChargeFilterUtil
/**
* ViewModel responsible for managing the state of client, loan, and savings charges.
*
* Handles:
* - Fetching charges based on charge type (CLIENT, LOAN, SAVINGS)
* - Displaying loading or error states
* - Listening to network status updates
* - Emitting UI events (toast, navigation)
*
* @property clientChargeRepositoryImp Repository for retrieving charge data
* @property networkMonitor Used to observe current network connectivity
* @property userPreferencesRepositoryImpl Provides client-specific information like clientId
* @property savedStateHandle Retrieves navigation arguments via `ClientChargesRoute`
*/
internal class ClientChargeViewModel(
private val accountsRepositoryImpl: AccountsRepository,
private val clientChargeRepositoryImp: ClientChargeRepository,
userPreferencesRepositoryImpl: UserPreferencesRepository,
private val networkMonitor: NetworkMonitor,
@ -56,20 +48,23 @@ internal class ClientChargeViewModel(
) : BaseViewModel<ClientChargeState, ClientChargeEvent, ClientChargeAction>(
initialState = run {
val chargeRoute = savedStateHandle.toRoute<ClientChargesRoute>()
val chargeType = ChargeType.valueOf(chargeRoute.chargeType.uppercase())
val initialType = ChargeType.valueOf(chargeRoute.chargeType.uppercase())
val topBarId = when (chargeType) {
val topBarId = when (initialType) {
ChargeType.CLIENT -> Res.string.client_charges
ChargeType.SAVINGS -> Res.string.savings_charges
ChargeType.LOAN -> Res.string.loan_charges
ChargeType.SHARE -> Res.string.feature_client_charge_share_charges
else -> Res.string.charges
}
val canSwitch = initialType == ChargeType.CLIENT
ClientChargeState(
chargeType = ChargeType.valueOf(chargeRoute.chargeType),
chargeType = initialType,
chargeTypeId = chargeRoute.chargeTypeId,
clientId = requireNotNull(userPreferencesRepositoryImpl.clientId.value),
topBarTitleResId = topBarId,
canSwitchAccounts = canSwitch,
isOnline = false,
)
},
@ -79,66 +74,237 @@ internal class ClientChargeViewModel(
observeNetworkStatus()
}
/**
* Observes the network connectivity status and updates the UI state accordingly.
* If the network is unavailable, it sets the `networkStatus` flag in the state
* and shows a network-related dialog.
*/
private fun observeNetworkStatus() {
viewModelScope.launch {
networkMonitor.isOnline
.distinctUntilChanged()
.collect { isOnline ->
sendAction(ClientChargeAction.ReceiveNetworkResult(isOnline = isOnline))
}
}
}
/**
* Updates the UI state by applying a transformation.
*/
private fun updateState(update: (ClientChargeState) -> ClientChargeState) {
mutableStateFlow.update(update)
}
/**
* Handles all dispatched actions.
*/
override fun handleAction(action: ClientChargeAction) {
when (action) {
is ClientChargeAction.RefreshCharges -> refreshCharges()
is ClientChargeAction.OnNavigate -> sendEvent(ClientChargeEvent.Navigate)
is ClientChargeAction.OnDismissDialog -> mutableStateFlow.update {
it.copy(dialogState = null)
}
is ClientChargeAction.OnChargeClick -> sendEvent(
ClientChargeEvent.OnChargeClick(action.charge),
)
is ClientChargeAction.OnDismissDialog -> dismissDialog()
is ClientChargeAction.OnChargeClick -> sendEvent(ClientChargeEvent.OnChargeClick(action.charge))
is ClientChargeAction.RefreshCharges -> loadCharges()
is ClientChargeAction.Retry -> {
viewModelScope.launch {
if (!state.networkStatus) {
updateState { it.copy(uiState = ScreenUiState.Network) }
} else {
loadCharges()
}
}
}
is ClientChargeAction.ReceiveNetworkResult -> handleNetworkResult(action.isOnline)
is ClientChargeAction.Retry -> retry()
is ClientChargeAction.ToggleFilter,
is ClientChargeAction.ClearFilter,
is ClientChargeAction.ApplyFilter,
-> handleFilterAction(action)
is ClientChargeAction.Internal -> handleInternalAction(action)
}
}
private fun handleFilterAction(action: ClientChargeAction) {
when (action) {
is ClientChargeAction.ToggleFilter -> {
updateState { it.copy(showFilter = !it.showFilter) }
}
is ClientChargeAction.ClearFilter -> performClearFilter()
is ClientChargeAction.ApplyFilter -> performApplyFilter(action)
else -> Unit
}
}
private fun handleInternalAction(action: ClientChargeAction.Internal) {
when (action) {
is ClientChargeAction.Internal.ReceiveClientChargesResult ->
handleClientChargesResult(action.result)
is ClientChargeAction.Internal.ReceiveLoanOrSavingsChargesResult ->
handleLoanOrSavingsChargesResult(action.result)
is ClientChargeAction.Internal.ReceiveShareChargesResult ->
handleShareChargesResult(action.result)
is ClientChargeAction.Internal.SavingsAccountsLoaded ->
updateSavingsAccounts(action.accounts)
is ClientChargeAction.Internal.LoanAccountsLoaded ->
updateLoanAccounts(action.accounts)
is ClientChargeAction.Internal.ShareAccountsLoaded ->
updateShareAccounts(action.accounts)
}
}
/**
* Handles the result of the network status.
*
* @param isOnline Boolean indicating if the network is online.
*/
private fun handleNetworkResult(isOnline: Boolean) {
private fun performClearFilter() {
if (state.canSwitchAccounts) {
updateState {
it.copy(networkStatus = isOnline)
it.copy(
selectedSavingsAccount = null,
selectedLoanAccount = null,
selectedShareAccount = null,
activeFilter = ChargeFilterUtil.ALL,
chargeType = ChargeType.CLIENT,
chargeTypeId = null,
topBarTitleResId = Res.string.client_charges,
showFilter = false,
)
}
loadCharges()
} else {
updateState {
it.copy(
activeFilter = ChargeFilterUtil.ALL,
showFilter = false,
)
}
applyLocalFilter()
}
}
private fun performApplyFilter(action: ClientChargeAction.ApplyFilter) {
val previousId = state.chargeTypeId
val previousType = state.chargeType
val newFilter = action.filter
val newChargeType = when (action.target) {
is ChargeAccountTarget.Savings -> ChargeType.SAVINGS
is ChargeAccountTarget.Loan -> ChargeType.LOAN
is ChargeAccountTarget.Share -> ChargeType.SHARE
ChargeAccountTarget.AllAccounts -> ChargeType.CLIENT
}
val newId = when (val target = action.target) {
is ChargeAccountTarget.Savings -> target.account.id
is ChargeAccountTarget.Loan -> target.account.id
is ChargeAccountTarget.Share -> target.account.id
ChargeAccountTarget.AllAccounts -> null
}
val newTitle = when (newChargeType) {
ChargeType.SAVINGS -> Res.string.savings_charges
ChargeType.LOAN -> Res.string.loan_charges
ChargeType.SHARE -> Res.string.charges
else -> Res.string.client_charges
}
updateState {
it.copy(
selectedSavingsAccount = (action.target as? ChargeAccountTarget.Savings)?.account,
selectedLoanAccount = (action.target as? ChargeAccountTarget.Loan)?.account,
selectedShareAccount = (action.target as? ChargeAccountTarget.Share)?.account,
activeFilter = newFilter,
showFilter = false,
chargeType = newChargeType,
topBarTitleResId = newTitle,
chargeTypeId = newId,
)
}
if (previousId != newId || previousType != newChargeType) {
loadCharges()
} else {
applyLocalFilter()
}
}
private fun updateSavingsAccounts(accounts: List<SavingAccount>) {
if (accounts.isEmpty()) return
updateState { state ->
val default = accounts.firstOrNull { it.id == state.chargeTypeId }
val shouldSelectDefault = !state.canSwitchAccounts && state.chargeType == ChargeType.SAVINGS
state.copy(
savingsAccounts = accounts,
selectedSavingsAccount = if (shouldSelectDefault) default else state.selectedSavingsAccount,
)
}
}
private fun updateLoanAccounts(accounts: List<LoanAccount>) {
if (accounts.isEmpty()) return
updateState { state ->
val default = accounts.firstOrNull { it.id == state.chargeTypeId }
val shouldSelectDefault = !state.canSwitchAccounts && state.chargeType == ChargeType.LOAN
state.copy(
loanAccounts = accounts,
selectedLoanAccount = if (shouldSelectDefault) default else state.selectedLoanAccount,
)
}
}
private fun updateShareAccounts(accounts: List<ShareAccount>) {
if (accounts.isEmpty()) return
updateState { state ->
val default = accounts.firstOrNull { it.id == state.chargeTypeId }
val shouldSelectDefault = !state.canSwitchAccounts && state.chargeType == ChargeType.SHARE
state.copy(
shareAccounts = accounts,
selectedShareAccount = if (shouldSelectDefault) default else state.selectedShareAccount,
)
}
}
private fun fetchAccounts(accountType: String) {
viewModelScope.launch {
accountsRepositoryImpl.loadAccounts(
clientId = state.clientId,
accountType = accountType,
).collect { dataState ->
if (dataState is DataState.Success) {
val accounts = when (accountType) {
Constants.SAVINGS_ACCOUNTS -> dataState.data.savingsAccounts.orEmpty()
.filter { it.status?.active == true }
Constants.LOAN_ACCOUNTS ->
dataState.data.loanAccounts
.filter { it.status?.active == true }
Constants.SHARE_ACCOUNTS ->
dataState.data.shareAccounts
.filter { it.status?.active == true }
else -> emptyList()
}
when (accountType) {
Constants.SAVINGS_ACCOUNTS -> sendAction(
ClientChargeAction.Internal.SavingsAccountsLoaded(
accounts.filterIsInstance<SavingAccount>(),
),
)
Constants.LOAN_ACCOUNTS -> sendAction(
ClientChargeAction.Internal.LoanAccountsLoaded(
accounts.filterIsInstance<LoanAccount>(),
),
)
Constants.SHARE_ACCOUNTS -> sendAction(
ClientChargeAction.Internal.ShareAccountsLoaded(
accounts.filterIsInstance<ShareAccount>(),
),
)
}
}
}
}
}
private fun handleNetworkResult(isOnline: Boolean) {
updateState { it.copy(networkStatus = isOnline) }
if (!isOnline) {
updateState { current ->
if (current.uiState is ScreenUiState.Loading ||
@ -153,70 +319,21 @@ internal class ClientChargeViewModel(
}
} else {
loadCharges()
}
}
/**
* Retries loading charges if the network is available.
* If the network is not available, it sets the UI state to Network.
*/
private fun retry() {
viewModelScope.launch {
if (!state.networkStatus) {
updateState { it.copy(uiState = ScreenUiState.Network) }
if (state.canSwitchAccounts) {
fetchAccounts(Constants.SAVINGS_ACCOUNTS)
fetchAccounts(Constants.LOAN_ACCOUNTS)
fetchAccounts(Constants.SHARE_ACCOUNTS)
} else {
loadCharges()
if (state.chargeType == ChargeType.SAVINGS) fetchAccounts(Constants.SAVINGS_ACCOUNTS)
if (state.chargeType == ChargeType.LOAN) fetchAccounts(Constants.LOAN_ACCOUNTS)
if (state.chargeType == ChargeType.SHARE) fetchAccounts(Constants.SHARE_ACCOUNTS)
}
}
}
/**
* Clears any active dialog.
*/
private fun dismissDialog() {
mutableStateFlow.update {
it.copy(dialogState = null)
}
}
/**
* Handles result of loan/savings charge API.
*/
private fun handleLoanOrSavingsChargesResult(result: DataState<List<Charge>>) {
when (result) {
is DataState.Loading -> updateState {
it.copy(uiState = ScreenUiState.Loading)
}
is DataState.Error -> updateState {
it.copy(
uiState = if (result.exception.cause is IOException) {
ScreenUiState.Network
} else {
ScreenUiState.Error(Res.string.feature_generic_error_server)
},
)
}
is DataState.Success -> updateState {
if (result.data.isEmpty()) {
it.copy(uiState = ScreenUiState.Empty, charges = emptyList())
} else {
it.copy(uiState = ScreenUiState.Success, charges = result.data)
}
}
}
}
/**
*
* Handles result of Share charge API.
*/
private fun handleShareChargesResult(result: DataState<List<Charge>>) {
when (result) {
is DataState.Loading -> updateState { it.copy(uiState = ScreenUiState.Loading) }
is DataState.Error -> updateState {
it.copy(
uiState = if (result.exception.cause is IOException) {
@ -226,26 +343,16 @@ internal class ClientChargeViewModel(
},
)
}
is DataState.Success -> updateState {
if (result.data.isEmpty()) {
it.copy(uiState = ScreenUiState.Empty, charges = emptyList())
} else {
it.copy(uiState = ScreenUiState.Success, charges = result.data)
}
is DataState.Success -> {
updateState { it.copy(originalCharges = result.data) }
applyLocalFilter()
}
}
}
/**
* Handles result of client charge API.
*/
private fun handleClientChargesResult(result: DataState<Page<Charge>>) {
when (result) {
is DataState.Loading -> updateState {
it.copy(uiState = ScreenUiState.Loading)
}
is DataState.Loading -> updateState { it.copy(uiState = ScreenUiState.Loading) }
is DataState.Error -> updateState {
it.copy(
uiState = if (result.exception.cause is IOException) {
@ -255,38 +362,41 @@ internal class ClientChargeViewModel(
},
)
}
is DataState.Success -> {
updateState { it.copy(originalCharges = result.data.pageItems) }
applyLocalFilter()
}
}
}
is DataState.Success -> updateState {
if (result.data.pageItems.isEmpty()) {
it.copy(uiState = ScreenUiState.Empty, charges = emptyList())
private fun applyLocalFilter() {
val filter = state.activeFilter
val originalList = state.originalCharges
val filteredList = if (filter == ChargeFilterUtil.ALL) {
originalList
} else {
it.copy(uiState = ScreenUiState.Success, charges = result.data.pageItems)
}
originalList.filter { filter.matchCondition(it) }
}
updateState {
it.copy(
charges = filteredList,
uiState = if (filteredList.isEmpty()) ScreenUiState.Empty else ScreenUiState.Success,
)
}
}
/**
* Starts loading charges based on the charge type.
*/
private fun loadCharges() {
updateState { it.copy(uiState = ScreenUiState.Loading) }
viewModelScope.launch {
when (state.chargeType) {
ChargeType.CLIENT -> processClientCharges()
ChargeType.LOAN, ChargeType.SAVINGS -> processLoanOrSavingsCharges()
ChargeType.SHARE -> processShareCharges()
ChargeType.LOAN, ChargeType.SAVINGS, ChargeType.SHARE -> processLoanOrSavingsCharges()
}
}
}
/**
* Reloads charge list on refresh.
*/
private fun refreshCharges() = loadCharges()
/**
* Processes charges when type is CLIENT.
*/
private fun processClientCharges() {
viewModelScope.launch {
clientChargeRepositoryImp.getCharges(state.clientId)
@ -296,48 +406,27 @@ internal class ClientChargeViewModel(
}
}
/**
* Processes charges when type is LOAN or SAVINGS.
*/
private fun processLoanOrSavingsCharges() {
viewModelScope.launch {
clientChargeRepositoryImp.getLoanOrSavingsCharges(
state.chargeType,
state.chargeTypeId ?: -1L,
).collect { result ->
val idToFetch = state.chargeTypeId
if (idToFetch == null) {
updateState { it.copy(uiState = ScreenUiState.Empty) }
return@launch
}
val flow = if (state.chargeType == ChargeType.SHARE) {
clientChargeRepositoryImp.getShareAccountCharges(idToFetch)
} else {
clientChargeRepositoryImp.getLoanOrSavingsCharges(state.chargeType, idToFetch)
}
flow.collect { result ->
sendAction(ClientChargeAction.Internal.ReceiveLoanOrSavingsChargesResult(result))
}
}
}
/**
* Processes charges when type is Share.
* Uses the dedicated repository function we created.
*/
private fun processShareCharges() {
viewModelScope.launch {
clientChargeRepositoryImp.getShareAccountCharges(
state.chargeTypeId ?: -1L,
).collect { result ->
sendAction(ClientChargeAction.Internal.ReceiveShareChargesResult(result))
}
}
}
}
/**
* Represents the UI state of the Client Charges screen.
*
* @property clientId ID of the current client.
* @property chargeType Type of charge (CLIENT, LOAN, SAVINGS).
* @property chargeTypeId Optional ID used for LOAN or SAVINGS charge types.
* @property isOnline Whether the device is currently connected to the internet.
* @property isEmpty Whether there are no charges to display.
* @property topBarTitleResId Title shown in the app bar.
* @property dialogState Dialog state used for showing loading or error.
* @property charges List of fetched charges.
* @property uiState holds the state of screen
*/
data class ClientChargeState(
val networkStatus: Boolean = false,
val clientId: Long,
@ -347,58 +436,52 @@ data class ClientChargeState(
val isEmpty: Boolean = false,
val topBarTitleResId: StringResource = Res.string.charges,
val charges: List<Charge> = emptyList(),
val originalCharges: List<Charge> = emptyList(),
val savingsAccounts: List<SavingAccount> = emptyList(),
val loanAccounts: List<LoanAccount> = emptyList(),
val shareAccounts: List<ShareAccount> = emptyList(),
val selectedSavingsAccount: SavingAccount? = null,
val selectedLoanAccount: LoanAccount? = null,
val selectedShareAccount: ShareAccount? = null,
val activeFilter: ChargeFilterUtil = ChargeFilterUtil.ALL,
val showFilter: Boolean = false,
val canSwitchAccounts: Boolean = true,
val dialogState: DialogState? = null,
val uiState: ScreenUiState? = ScreenUiState.Loading,
) {
/**
* Represents the possible dialog states in the UI.
*/
val selectedAccountNo: String?
get() = selectedSavingsAccount?.accountNo
?: selectedLoanAccount?.accountNo
?: selectedShareAccount?.accountNo
sealed interface DialogState {
/** Error dialog with a message */
data class Error(val message: String) : DialogState
}
}
/**
* UI events emitted from the ViewModel to be handled by the UI layer.
*
* @property ShowToast Shows a toast message.
* @property Navigate Navigates to the charge creation screen.
* @property OnChargeClick Triggered when a user clicks on a charge item.
*/
sealed interface ClientChargeEvent {
data class ShowToast(val message: String) : ClientChargeEvent
data object Navigate : ClientChargeEvent
data class OnChargeClick(val charge: Charge) : ClientChargeEvent
}
/**
* Actions dispatched from the UI or internal processes.
*
* @property RefreshCharges Refreshes the list of charges.
* @property OnNavigate Navigates to the charge creation screen.
* @property OnDismissDialog Dismisses any open dialog (error/loading).
* @property OnChargeClick Triggered when a user clicks on a charge item.
*/
sealed interface ClientChargeAction {
data object RefreshCharges : ClientChargeAction
data object OnNavigate : ClientChargeAction
data object OnDismissDialog : ClientChargeAction
data class OnChargeClick(val charge: Charge) : ClientChargeAction
data class ReceiveNetworkResult(val isOnline: Boolean) : ClientChargeAction
data object Retry : ClientChargeAction
sealed class Internal : ClientChargeAction {
data object ToggleFilter : ClientChargeAction
data object ClearFilter : ClientChargeAction
data class ApplyFilter(
val target: ChargeAccountTarget,
val filter: ChargeFilterUtil,
) : ClientChargeAction
sealed class Internal : ClientChargeAction {
data class ReceiveLoanOrSavingsChargesResult(
val result: DataState<List<Charge>>,
) : Internal()
@ -407,8 +490,23 @@ sealed interface ClientChargeAction {
val result: DataState<Page<Charge>>,
) : Internal()
data class ReceiveShareChargesResult(
val result: DataState<List<Charge>>,
) : Internal()
data class SavingsAccountsLoaded(val accounts: List<SavingAccount>) : Internal()
data class LoanAccountsLoaded(val accounts: List<LoanAccount>) : Internal()
data class ShareAccountsLoaded(val accounts: List<ShareAccount>) : Internal()
}
}
sealed interface ClientChargeEvent {
data class ShowToast(val message: String) : ClientChargeEvent
data object Navigate : ClientChargeEvent
data class OnChargeClick(val charge: Charge) : ClientChargeEvent
}
sealed class ChargeAccountTarget {
data object AllAccounts : ChargeAccountTarget()
data class Savings(val account: SavingAccount) : ChargeAccountTarget()
data class Loan(val account: LoanAccount) : ChargeAccountTarget()
data class Share(val account: ShareAccount) : ChargeAccountTarget()
}

View File

@ -0,0 +1,47 @@
/*
* Copyright 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 https://mozilla.org/MPL/2.0/.
*
* See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md
*/
package org.mifos.mobile.feature.charge.components
import mifos_mobile.feature.client_charge.generated.resources.Res
import mifos_mobile.feature.client_charge.generated.resources.charges
import mifos_mobile.feature.client_charge.generated.resources.outstanding
import mifos_mobile.feature.client_charge.generated.resources.paid
import mifos_mobile.feature.client_charge.generated.resources.waived
import org.jetbrains.compose.resources.StringResource
import org.mifos.mobile.core.model.entity.Charge
/**
* Enum class representing different filters that can be applied to Charges.
*/
enum class ChargeFilterUtil(
val label: StringResource,
val matchCondition: (Charge) -> Boolean,
) {
ALL(
label = Res.string.charges,
matchCondition = { true },
),
PAID(
label = Res.string.paid,
matchCondition = { it.paid },
),
PENDING(
label = Res.string.outstanding,
matchCondition = { !it.paid && !it.waived },
),
WAIVED(
label = Res.string.waived,
matchCondition = { it.waived },
),
}

View File

@ -26,9 +26,14 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import mifos_mobile.feature.client_charge.generated.resources.Res
import mifos_mobile.feature.client_charge.generated.resources.amount_due
import mifos_mobile.feature.client_charge.generated.resources.amount_paid
import mifos_mobile.feature.client_charge.generated.resources.database_checkmark
import mifos_mobile.feature.client_charge.generated.resources.database_warning
import mifos_mobile.feature.client_charge.generated.resources.error_no_charge
import mifos_mobile.feature.client_charge.generated.resources.feature_client_charges_charge_id
import org.jetbrains.compose.resources.painterResource
import org.jetbrains.compose.resources.stringResource
import org.jetbrains.compose.ui.tooling.preview.Preview
import org.mifos.mobile.core.common.CurrencyFormatter
import org.mifos.mobile.core.common.DateHelper
@ -81,7 +86,7 @@ fun ClientChargeItem(
.padding(KptTheme.spacing.sm),
)
Spacer(Modifier.width(DesignToken.padding.medium))
Spacer(Modifier.width(KptTheme.spacing.md))
Column(
modifier = Modifier.weight(1f),
) {
@ -91,19 +96,23 @@ fun ClientChargeItem(
)
// TODO: in Figma account Number is there instead of charge id. Refactor it
Text(
text = "ChargeId : ${charge.chargeId}",
text = stringResource(
Res.string.feature_client_charges_charge_id,
charge.chargeId.toString(),
),
style = MifosTypography.bodySmall,
)
Text(
text = if (charge.dueDate.isNotEmpty()) {
text = if (!charge.dueDate.isEmpty() && charge.dueDate.size >= 3) {
DateHelper.getDateAsString(charge.dueDate.mapNotNull { it })
} else {
""
stringResource(Res.string.error_no_charge)
},
style = MifosTypography.bodySmall,
)
}
Spacer(Modifier.width(DesignToken.padding.medium))
Spacer(Modifier.width(KptTheme.spacing.md))
Row(
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.spacedBy(KptTheme.spacing.xs),
@ -113,9 +122,9 @@ fun ClientChargeItem(
) {
Text(
text = if (charge.isChargePaid) {
"Paid"
stringResource(Res.string.amount_paid)
} else {
"Due"
stringResource(Res.string.amount_due)
},
style = MifosTypography.labelSmall,
color = if (charge.isChargePaid) {
@ -152,7 +161,7 @@ fun ClientChargeItem(
}
Icon(
imageVector = MifosIcons.ChevronRight,
contentDescription = "",
contentDescription = "Navigation Icon",
modifier = Modifier.size(DesignToken.sizes.iconDp20),
)
}

View File

@ -0,0 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2026 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 https://mozilla.org/MPL/2.0/.
See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md
-->
<resources>
<string name="view_guarantor">ജാമ്യക്കാരനെ കാണുക</string>
<string name="add_guarantor">ജാമ്യക്കാരനെ ചേർക്കുക</string>
<string name="delete_guarantor">ജാമ്യക്കാരനെ നീക്കം ചെയ്യുക</string>
<string name="update_guarantor">ജാമ്യക്കാരനെ അപ്‌ഡേറ്റ് ചെയ്യുക</string>
<string name="guarantor_type">ജാമ്യക്കാരന്റെ തരം</string>
<string name="no_guarantors">ജാമ്യക്കാർ ആരുമില്ല</string>
<string name="tap_to_add_guarantor">ജാമ്യക്കാരനെ ചേർക്കാൻ ടാപ്പ് ചെയ്യുക</string>
<string name="guarantor_details">ജാമ്യക്കാരന്റെ വിശദാംശങ്ങൾ</string>
<string name="screen_guarantor_list">സ്ക്രീൻ ജാമ്യക്കാരുടെ ലിസ്റ്റ്</string>
<string name="screen_guarantor_details">സ്ക്രീൻ ജാമ്യക്കാരന്റെ വിശദാംശങ്ങൾ</string>
<string name="screen_guarantor_add">സ്ക്രീൻ ജാമ്യക്കാരനെ ചേർക്കൽ</string>
<string name="city">നഗരം</string>
<string name="guarantor_deleted_successfully">ജാമ്യക്കാരനെ വിജയകരമായി നീക്കം ചെയ്തു</string>
<string name="guarantor_created_successfully">ജാമ്യക്കാരനെ വിജയകരമായി സൃഷ്ടിച്ചു</string>
<string name="guarantor_updated_successfully">ജാമ്യക്കാരന്റെ വിവരങ്ങൾ വിജയകരമായി അപ്‌ഡേറ്റ് ചെയ്തു</string>
<string name="error_validation_blank">%1$s ശൂന്യമായി ഇടരുത്</string>
<string name="first_name">ആദ്യ പേര്</string>
<string name="last_name">അവസാന പേര്</string>
<string name="phone_number">ഫോൺ നമ്പർ</string>
<string name="internet_not_connected">ദയവായി വൈഫൈ അല്ലെങ്കിൽ മൊബൈൽ ഡാറ്റ ഓൺ ചെയ്യുക</string>
<string name="office_name">ഓഫീസിന്റെ പേര്</string>
<string name="submit">സമർപ്പിക്കുക</string>
<string name="dialog_are_you_sure_that_you_want_to_string">നിങ്ങൾക്ക് %1$s ചെയ്യണമെന്ന് ഉറപ്പാണോ?</string>
<string name="yes">ശരി</string>
<string name="dismiss">നിരസിക്കുക</string>
</resources>

View File

@ -0,0 +1,69 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2024 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 https://mozilla.org/MPL/2.0/.
See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md
-->
<resources>
<string name="beneficiaries">ഗുണഭോക്താക്കൾ</string>
<string name="survey">സർവേകൾ</string>
<string name="apply_for_loan">ലോൺ A/c അപേക്ഷിക്കുക</string>
<string name="apply_for_savings">സേവിംഗ്സ് A/c അപേക്ഷിക്കുക</string>
<string name="apply_for_share">ഷെയർ A/c അപേക്ഷിക്കുക</string>
<string name="charges">ചാർജുകൾ</string>
<string name="transfer">ട്രാൻസ്ഫർ</string>
<string name="accounts">അക്കൗണ്ടുകൾ</string>
<string name="recent_transactions">സമീപകാല ഇടപാടുകൾ</string>
<string name="error_fetching_client">ക്ലയന്റിനെ ലഭ്യമാക്കുന്നതിൽ പരാജയപ്പെട്ടു</string>
<string name="no_internet_connection">ഇന്റർനെറ്റ് കണക്ഷൻ ഇല്ല</string>
<string name="hello_client">ഹലോ, %1$s</string>
<string name="accounts_overview">അക്കൗണ്ട് അവലോകനം</string>
<string name="total_saving">ആകെ സമ്പാദ്യം</string>
<string name="hidden_amount">*****</string>
<string name="total_loan">ആകെ വായ്പ</string>
<string name="need_help">ഞങ്ങളെ ബന്ധപ്പെടുക</string>
<string name="home">ഹോം</string>
<string name="help_line_number" translatable="false">8000000000</string>
<string name="contact_email" translatable="false">support@mifos.org</string>
<string name="app_name">മിഫോസ് മൊബൈൽ</string>
<string name="third_party_transfer">തേർഡ് പാർട്ടി ട്രാൻസ്ഫർ</string>
<string name="manage_beneficiaries">ഗുണഭോക്താക്കളെ നിയന്ത്രിക്കുക</string>
<string name="settings">ക്രമീകരണങ്ങൾ</string>
<string name="about_us">ഞങ്ങളെക്കുറിച്ച്</string>
<string name="help">സഹായം</string>
<string name="share">പങ്കിടുക</string>
<string name="app_info">ആപ്പ് വിവരങ്ങൾ</string>
<string name="logout">ലോഗൗട്ട്</string>
<string name="user_query">ഉപയോക്തൃ അന്വേഷണം</string>
<string name="no_app_to_support_action">ഈ പ്രവർത്തനം പിന്തുണയ്ക്കാൻ ആപ്പുകളൊന്നുമില്ല</string>
<string name="cancel">റദ്ദാക്കുക</string>
<string name="dialog_logout">നിങ്ങൾക്ക് ലോഗൗട്ട് ചെയ്യണമെന്ന് ഉറപ്പാണോ?</string>
<string name="feature_home_greet">ഹലോ %1$s,</string>
<string name="feature_home_services">സേവനങ്ങൾ</string>
<string name="feature_home_saving_accounts">സേവിംഗ്സ് അക്കൗണ്ടുകൾ</string>
<string name="feature_home_loan_accounts">ലോൺ അക്കൗണ്ടുകൾ</string>
<string name="feature_home_share_accounts">ഷെയർ അക്കൗണ്ടുകൾ</string>
<string name="feature_home_apply_for_loan">വായ്പയ്ക്ക് അപേക്ഷിക്കുക</string>
<string name="feature_home_transaction_history">ഇടപാട് ചരിത്രം</string>
<string name="feature_home_charges">ചാർജുകൾ</string>
<string name="feature_home_beneficiary">ഗുണഭോക്താവ്</string>
<string name="feature_home_faq">പതിവുചോദ്യങ്ങൾ</string>
<string name="feature_home_saving_account">സേവിംഗ്സ് അക്കൗണ്ട്</string>
<string name="feature_home_loan_account">ലോൺ അക്കൗണ്ട്</string>
<string name="feature_home_savings_tip">നിങ്ങളുടെ നിക്ഷേപങ്ങൾക്ക് പലിശ നേടുക, എപ്പോൾ വേണമെങ്കിലും പണം ലഭ്യമാക്കാനുള്ള സൗകര്യം.</string>
<string name="feature_home_loan_tip">വ്യക്തിഗത, ബിസിനസ്, അല്ലെങ്കിൽ വിദ്യാഭ്യാസ ആവശ്യങ്ങൾക്കായി നിങ്ങൾക്ക് ആവശ്യമായ ഫണ്ട് നേടുക.</string>
<string name="feature_home_total_available_savings">ആകെ ലഭ്യമായ സേവിംഗ്സ്</string>
<string name="feature_home_total_available_loan">ആകെ ലഭ്യമായ ലോൺ</string>
<string name="feature_home_common_error">എന്തോ കുഴപ്പം സംഭവിച്ചു</string>
<string name="feature_server_error">ഞങ്ങളുടെ സെർവറിൽ അപ്രതീക്ഷിത പിശക് സംഭവിച്ചു. ദയവായി പിന്നീട് വീണ്ടും ശ്രമിക്കുക.</string>
</resources>

View File

@ -9,101 +9,108 @@
See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md
-->
<resources>
<string name="feature_loan_account_filter_active">സജീവം</string>
<string name="feature_loan_account_filter_approval_pending">അംഗീകാരം മന്ത്രിച്ചിരിക്കുന്നു</string>
<string name="feature_loan_account_filter_closed">വസാനിപ്പിച്ചു</string>
<string name="feature_loan_account_filter_disburse">വിതരണം നടക്കാൻ കാത്തിരിക്കുന്നു</string>
<string name="feature_loan_account_filter_overpaid">അധിക അടച്ചു</string>
<string name="feature_loan_account_filter_in_arrears">ബാക്കിയുള്ള</string>
<string name="feature_loan_account_filter_approval_pending">അംഗീകാരം കാത്തിരിക്കുന്നു</string>
<string name="feature_loan_account_filter_closed">ച്ചു</string>
<string name="feature_loan_account_filter_disburse">വിതരണം കാത്തിരിക്കുന്നു</string>
<string name="feature_loan_account_filter_overpaid">അധിക പണം നൽകി</string>
<string name="feature_loan_account_filter_in_arrears">കുടിശ്ശിക</string>
<string name="feature_loan_account_filter_withdrawn">പിൻവലിച്ചു</string>
<string name="feature_loan_account_filter_matured">പഴകിയത്</string>
<string name="feature_loan_account_filter_matured">കാലാവധി പൂർത്തിയായി</string>
<string name="feature_loan_account_filter_rejected">നിരസിച്ചു</string>
<string name="feature_loan_account_filter_personal">വ്യക്തിഗതം</string>
<string name="feature_loan_account_filter_bronze">ബ്രോൺസ്</string>
<string name="feature_loan_account_filter_bronze">വെങ്കലം</string>
<string name="feature_account_empty_loan_accounts">നിങ്ങളുമായി ബന്ധപ്പെട്ട ലോൺ അക്കൗണ്ടുകൾ ഒന്നും ഇല്ല</string>
<string name="feature_account_empty_filtered_loan_accounts">നിങ്ങൾ തിരഞ്ഞെടുത്ത ഫിൽട്ടറുകളുമായി ബന്ധപ്പെട്ട ലോൺ അക്കൗണ്ടുകൾ ഒന്നും ഇല്ല</string>
<string name="feature_account_empty_loan_accounts">നിങ്ങളുമായി ബന്ധപ്പെട്ട ലോൺ അക്കൗണ്ടുകളൊന്നുമില്ല</string>
<string name="feature_account_empty_filtered_loan_accounts">തിരഞ്ഞെടുത്ത ഫിൽട്ടറുകളുമായി ബന്ധപ്പെട്ട ലോൺ അക്കൗണ്ടുകളൊന്നുമില്ല</string>
<string name="feature_loan_account_dashboard">ആകെ ലോൺ</string>
<string name="feature_loan_account_dashboard">ആകെ വായ്പകൾ</string>
<string name="feature_loan_account">ലോൺ അക്കൗണ്ട്</string>
<string name="feature_loan_account_items">%1$d ഇനങ്ങൾ</string>
<string name="feature_account_details_top_bar_title">ലോൺ അക്കൗണ്ട് വിശദാംശങ്ങൾ</string>
<string name="feature_account_details_action">പ്രവർത്തനം</string>
<string name="feature_account_action_make_payment">േയ്മെന്റ് നടത്തുക</string>
<string name="feature_account_action_make_payment_tip">നിങ്ങളുടെ ബാക്കിയുള്ള തവണ പാവപ്പെടുത്തുക</string>
<string name="feature_account_action_loan_summary">ലോൺ ചുരുക്ക</string>
<string name="feature_account_action_loan_summary_tip">നിങ്ങളുടെ ലോൺ വിശദാംശങ്ങൾ ചുരുക്കത്തിൽ കാണുക</string>
<string name="feature_account_action_repayment_schedule">പാവപ്പെടുത്തൽ ഷെഡ്യൂൾ</string>
<string name="feature_account_action_repayment_schedule_tip">പാവപ്പെടുത്തൽ ഷെഡ്യൂളിന്റെ ചാർട്ട് കാണുക</string>
<string name="feature_account_details_top_bar_title">ലോൺ അക്കൗണ്ട് വിവരങ്ങൾ</string>
<string name="feature_account_details_action">പ്രവർത്തി</string>
<string name="feature_account_action_make_payment">ണമടയ്ക്കുക</string>
<string name="feature_account_action_make_payment_tip">നിങ്ങളുടെ തവണ അടയ്ക്കുക</string>
<string name="feature_account_action_loan_summary">വായ്പാ സംഗ്രഹ</string>
<string name="feature_account_action_loan_summary_tip">വായ്പാ വിവരങ്ങൾ ചുരുക്കത്തിൽ കാണുക</string>
<string name="feature_account_action_repayment_schedule">തിരിച്ചടവ് ഷെഡ്യൂൾ</string>
<string name="feature_account_action_repayment_schedule_tip">തിരിച്ചടവ് ഷെഡ്യൂൾ ചാർട്ട് കാണുക</string>
<string name="feature_account_action_transactions">ഇടപാടുകൾ</string>
<string name="feature_account_action_transactions_tip">ഈ അക്കൗണ്ടിൽ നിന്നുള്ള പുതിയ ഇടപാടുകൾ</string>
<string name="feature_account_action_transactions_tip">ഈ അക്കൗണ്ടിലെ സമീപകാല ഇടപാടുകൾ</string>
<string name="feature_account_action_charges">ചാർജുകൾ</string>
<string name="feature_account_action_charges_tip">ഈ അക്കൗണ്ടിൽ നിലനിൽക്കുന്ന ഫീസ് അല്ലെങ്കിൽ ചാർജുകൾ</string>
<string name="feature_account_action_qr">QR കോഡ്</string>
<string name="feature_account_action_qr_tip">QR കോഡ് സൃഷ്ടിക്കുക</string>
<string name="feature_account_action_charges_tip">ഈ അക്കൗണ്ടിലെ ഫീസ് അല്ലെങ്കിൽ ചാർജുകൾ</string>
<string name="feature_account_action_qr">ക്യുആർ കോഡ്</string>
<string name="feature_account_action_qr_tip">ക്യുആർ കോഡ് സൃഷ്ടിക്കുക</string>
<string name="feature_loan_account_number_label">അക്കൗണ്ട് നമ്പർ</string>
<string name="feature_loan_outstanding_balance_label">ബാക്കിയുള്ള ബാലൻസ്</string>
<string name="feature_loan_product_type_label">പ്രൊഡക്ട് തരം</string>
<string name="feature_loan_outstanding_balance_label">കുടിശ്ശിക ബാലൻസ്</string>
<string name="feature_loan_product_type_label">ഉൽപ്പന്ന തരം</string>
<string name="feature_loan_currency_label">കറൻസി</string>
<string name="feature_loan_next_installment_label">അടുത്ത തവണ</string>
<string name="feature_loan_installment_amount_label">തവണ തുക</string>
<string name="feature_loan_due_date_label">വസാന തീയതി</string>
<string name="feature_loan_next_installment_label">അടുത്ത ഗഡു</string>
<string name="feature_loan_installment_amount_label">ഗഡു തുക</string>
<string name="feature_loan_due_date_label">ടയ്ക്കേണ്ട തീയതി</string>
<!-- Account Summary -->
<string name="feature_loan_account_details_title">അക്കൗണ്ട് വിശദാംശങ്ങൾ</string>
<string name="feature_loan_payoff_details_title">പാവപ്പെടുത്തൽ വിശദാംശങ്ങൾ</string>
<string name="feature_loan_account_details_title">അക്കൗണ്ട് വിവരങ്ങൾ</string>
<string name="feature_loan_payoff_details_title">പേ-ഓഫ് വിവരങ്ങൾ</string>
<string name="feature_loan_charges_title">ചാർജുകൾ</string>
<string name="feature_loan_waivers_title">വേഴ്ച്ചകൾ</string>
<string name="feature_loan_paid_off_details_title">പാവപ്പെടുത്തിയ വിശദാംശങ്ങൾ</string>
<string name="feature_loan_outstanding_details_title">ബാക്കിയുള്ള വിശദാംശങ്ങൾ</string>
<string name="feature_loan_installment_details_title">തവണ വിശദാംശങ്ങൾ</string>
<string name="feature_loan_waivers_title">ഒഴിവാക്കലുകൾ</string>
<string name="feature_loan_paid_off_details_title">അടച്ചുതീർത്ത വിവരങ്ങൾ</string>
<string name="feature_loan_outstanding_details_title">കുടിശ്ശിക വിവരങ്ങൾ</string>
<string name="feature_loan_installment_details_title">ഗഡു വിവരങ്ങൾ</string>
<!-- Account Details -->
<string name="feature_loan_type_label">ലോൺ തരം</string>
<string name="feature_loan_scheme_label">ലോൺ പദ്ധതി</string>
<string name="feature_loan_type_label">വായ്പ തരം</string>
<string name="feature_loan_scheme_label">വായ്പ സ്കീം</string>
<string name="feature_loan_account_status_label">അക്കൗണ്ട് നില</string>
<!-- Pay-off Details -->
<string name="feature_loan_expected_payoff_label">പ്രതീക്ഷിച്ച പാവപ്പെടുത്തൽ</string>
<string name="feature_loan_interest_payoff_label">പലിശ പാവപ്പെടുത്തൽ</string>
<string name="feature_loan_principal_label">ലോൺ മുതൽ</string>
<string name="feature_loan_interest_rate_label">പലിശ നിരക്ക്</string>
<string name="feature_loan_expected_payoff_label">പ്രതീക്ഷിക്കുന്ന പേ-ഓഫ്</string>
<string name="feature_loan_interest_payoff_label">പലിശ പേ-ഓഫ്</string>
<string name="feature_loan_principal_label">കടം അടിസ്ഥാന തുക</string>
<string name="feature_loan_interest_rate_label">നിരക്ക്</string>
<!-- Charges -->
<string name="feature_loan_fees_label">ഫീസ്</string>
<string name="feature_loan_penalties_label">ശിക്ഷകൾ</string>
<string name="feature_loan_penalties_label">പിഴകൾ</string>
<!-- Waivers -->
<string name="feature_loan_interest_waived_label">പലിശ വേഴ്ച്ച ചെയ്തു</string>
<string name="feature_loan_penalty_waived_label">ശിക്ഷ വേഴ്ച്ച ചെയ്തു</string>
<string name="feature_loan_fees_waived_label">ഫീസ് വേഴ്ച്ച ചെയ്തു</string>
<string name="feature_loan_interest_waived_label">പലിശ ഒഴിവാക്കി</string>
<string name="feature_loan_penalty_waived_label">പിഴകൾ ഒഴിവാക്കി</string>
<string name="feature_loan_fees_waived_label">ഫീസ് ഒഴിവാക്കി</string>
<!-- Paid-off Details -->
<string name="feature_loan_interest_paid_off_label">പലിശ പാവപ്പെടുത്തി</string>
<string name="feature_loan_principal_paid_off_label">മുതൽ പാവപ്പെടുത്തി</string>
<string name="feature_loan_interest_paid_off_label">അടച്ച പലിശ</string>
<string name="feature_loan_principal_paid_off_label">അടച്ച അടിസ്ഥാന തുക</string>
<!-- Outstanding Details -->
<string name="feature_loan_interest_outstanding_label">ബാക്കിയുള്ള പലിശ</string>
<string name="feature_loan_principal_outstanding_label">ബാക്കിയുള്ള മുതൽ</string>
<string name="feature_loan_total_outstanding_label">ആകെ ബാക്കിയുള്ള തു</string>
<string name="feature_loan_interest_outstanding_label">പലിശ കുടിശ്ശിക</string>
<string name="feature_loan_principal_outstanding_label">അടിസ്ഥാന തുക കുടിശ്ശിക</string>
<string name="feature_loan_total_outstanding_label">ആകെ കുടിശ്ശി</string>
<!-- Installment Details -->
<string name="feature_loan_regular_payment_label">സാധാരണ പേയ്മെന്റ്</string>
<string name="feature_loan_regular_payment_label">പതിവ് പേയ്മെന്റ്</string>
<string name="feature_loan_next_payment_label">അടുത്ത പേയ്മെന്റ്</string>
<string name="feature_loan_months_left_label">ബാക്കിയുള്ള മാസങ്ങൾ</string>
<string name="feature_loan_auto_debit_label">സ്വയം ഡെബിറ്റ്</string>
<string name="feature_loan_auto_debit_label">ഓട്ടോ ഡെബിറ്റ്</string>
<string name="feature_loan_linked_account_label">ലിങ്ക് ചെയ്ത അക്കൗണ്ട്</string>
<string name="repayment_schedule">പാവപ്പെടുത്തൽ ഷെഡ്യൂൾ</string>
<string name="feature_loan_disbursement_date_label">വിതരണം നടക്കുന്ന തീയതി</string>
<string name="feature_loan_installments_paid_label">പാവപ്പെടുത്തിയ തവണകൾ</string>
<string name="feature_loan_installments_left_label">ബാക്കിയുള്ള തവണകൾ</string>
<string name="feature_loan_total_installments_label">ആകെ തവണകൾ</string>
<string name="repayment_schedule">തിരിച്ചടവ് ഷെഡ്യൂൾ</string>
<string name="feature_loan_disbursement_date_label">വിതരണ തീയതി</string>
<string name="feature_loan_installments_paid_label">അടച്ച ഗഡുക്കൾ</string>
<string name="feature_loan_installments_left_label">ബാക്കിയുള്ള ഗഡുക്കൾ</string>
<string name="feature_loan_total_installments_label">ആകെ ഗഡുക്കൾ</string>
<string name="feature_loan_installment_number">%1$s ഗഡു</string>
<string name="feature_loan_repayment_pay">അടയ്ക്കുക %1$s</string>
<string name="feature_loan_paid">അടച്ചത്</string>
<string name="feature_loan_due">അടയ്ക്കേണ്ടത്</string>
<string name="feature_loan_pay">അടയ്ക്കുക</string>
<string name="feature_generic_error_server">സെർവർ പ്രശ്നം കാരണം മുന്നോട്ട് പോകാൻ കഴിയില്ല, അല്പസമയത്തിന് ശേഷം വീണ്ടും ശ്രമിക്കുക</string>
<string name="feature_loan_paid">പാവപ്പെടുത്തി</string>
<string name="feature_loan_due">ബാക്കിയുള്ള</string>
<string name="feature_loan_pay">പേയ്മെന്റ് ചെയ്യുക</string>
</resources>

View File

@ -47,6 +47,7 @@ import org.mifos.mobile.core.designsystem.theme.AppColors
import org.mifos.mobile.core.designsystem.theme.DesignToken
import org.mifos.mobile.core.designsystem.theme.MifosMobileTheme
import org.mifos.mobile.core.designsystem.theme.MifosTypography
import org.mifos.mobile.core.model.LoanStatus
import template.core.base.designsystem.theme.KptTheme
import kotlin.collections.component1
import kotlin.collections.component2
@ -127,7 +128,13 @@ fun AccountSummaryCard(
style = MifosTypography.labelMedium,
textAlign = TextAlign.Right,
color = if (key == Res.string.feature_loan_account_status_label) {
AppColors.customEnable
when (value) {
LoanStatus.ACTIVE.status -> AppColors.customEnable
LoanStatus.SUBMIT_AND_PENDING_APPROVAL.status -> AppColors.customYellow
LoanStatus.WITHDRAWN.status, LoanStatus.MATURED.status ->
KptTheme.colorScheme.error
else -> KptTheme.colorScheme.secondary
}
} else {
KptTheme.colorScheme.secondary
},

View File

@ -12,9 +12,9 @@ package org.mifos.mobile.feature.loanaccount.loanAccountDetails
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.FlowRow
import androidx.compose.foundation.layout.defaultMinSize
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.navigationBarsPadding
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.rememberScrollState
@ -247,7 +247,7 @@ internal fun AccountDetailsGrid(
details.forEach { item ->
MifosLabelValueCard(
modifier = Modifier
.height(DesignToken.sizes.cardDp64)
.defaultMinSize(minHeight = DesignToken.sizes.cardDp64)
.weight(1f),
label = stringResource(item.label),
value = item.value,

View File

@ -0,0 +1,157 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2026 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 https://mozilla.org/MPL/2.0/.
See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md
-->
<resources>
<!-- Titles -->
<string name="feature_apply_loan_title">പുതിയ വായ്പയ്ക്ക് അപേക്ഷിക്കുക</string>
<!-- Sections -->
<string name="feature_apply_loan_section_fill_details">വായ്പ അപേക്ഷ</string>
<!-- Labels -->
<string name="feature_apply_loan_label_applicant_name">അപേക്ഷകന്റെ പേര്</string>
<string name="feature_apply_loan_label_loan_product">വായ്പ ഉൽപ്പന്നം</string>
<string name="feature_apply_loan_label_purpose">വായ്പയുടെ ഉദ്ദേശ്യം</string>
<string name="feature_apply_loan_label_disbursement_date">വിതരണ തീയതി</string>
<string name="feature_apply_loan_label_principal_amount">മുതൽ തുക</string>
<string name="feature_apply_loan_label_currency">കറൻസി</string>
<!-- Buttons -->
<string name="feature_apply_loan_button_continue">തുടരുക</string>
<string name="feature_apply_loan_button_ok">ശരി</string>
<string name="feature_apply_loan_button_cancel">റദ്ദാക്കുക</string>
<string name="feature_apply_loan_button_apply">വായ്പയ്ക്ക് അപേക്ഷിക്കുക</string>
<string name="feature_button_next">അടുത്തത്</string>
<!-- Applicant Name Validation -->
<string name="feature_apply_loan_error_name_empty">അപേക്ഷകന്റെ പേര് ആവശ്യമാണ്</string>
<string name="feature_apply_loan_error_name_too_short">അപേക്ഷകന്റെ പേരിൽ കുറഞ്ഞത് 4 അക്ഷരങ്ങളെങ്കിലും ഉണ്ടായിരിക്കണം</string>
<string name="feature_apply_loan_error_name_too_long">അപേക്ഷകന്റെ പേര് 100 അക്ഷരങ്ങളിൽ കൂടാൻ പാടില്ല</string>
<string name="feature_apply_loan_error_name_invalid_format">അപേക്ഷകന്റെ പേരിൽ അസാധുവായ അക്ഷരങ്ങൾ അടങ്ങിയിരിക്കുന്നു</string>
<!-- Loan Product Validation -->
<string name="feature_apply_loan_error_product_empty">വായ്പ ഉൽപ്പന്നം ആവശ്യമാണ്</string>
<!-- Principal Amount Validation -->
<string name="feature_apply_loan_error_amount_empty">മുതൽ തുക ആവശ്യമാണ്</string>
<string name="feature_apply_loan_error_amount_invalid_format">ദയവായി ശരിയായ തുക ഫോർമാറ്റ് നൽകുക</string>
<string name="feature_apply_loan_error_amount_too_small">മുതൽ തുക വളരെ ചെറുതാണ്</string>
<string name="feature_apply_loan_error_amount_too_large">മുതൽ തുക പരമാവധി പരിധി കവിയുന്നു</string>
<string name="feature_apply_loan_error_amount_invalid_decimal">തിരഞ്ഞെടുത്ത കറൻസിക്ക് തുകയിൽ ധാരാളം ദശാംശ സ്ഥാനങ്ങളുണ്ട്</string>
<string name="feature_apply_loan_error_amount_multiple">തുക സാധുവായ ഗുണിതങ്ങളിലല്ല</string>
<!-- Disbursement Date Validation -->
<string name="feature_apply_loan_error_date_empty">വിതരണ തീയതി ആവശ്യമാണ്</string>
<string name="feature_apply_loan_error_date_invalid_format">ദയവായി സാധുവായ ഒരു തീയതി ഫോർമാറ്റ് നൽകുക (DD/MM/YYYY)</string>
<string name="feature_apply_loan_error_date_future">വിതരണ തീയതി ഭാവിയിലായിരിക്കണം</string>
<string name="feature_apply_loan_error_date_out_of_range">വിതരണ തീയതി വളരെ ദൂരെയുള്ള ഭാവിയിലാണ് (പരമാവധി 10 വർഷം)</string>
<!-- Error Dialogs -->
<string name="feature_apply_loan_error_server">സെർവർ തകരാർ കാരണം മുന്നോട്ട് പോകാനാവില്ല, കുറച്ചു കഴിഞ്ഞ് വീണ്ടും ശ്രമിക്കുക</string>
<string name="feature_apply_loan_error_too_many_attempts">ഒരുപാട് പരാജയപ്പെട്ട ശ്രമങ്ങൾ. ദയവായി പിന്നീട് വീണ്ടും ശ്രമിക്കുക.</string>
<string name="feature_apply_loan_error_submit_failed">വായ്പ അപേക്ഷ സമർപ്പിക്കുന്നതിൽ പരാജയപ്പെട്ടു. ദയവായി വീണ്ടും ശ്രമിക്കുക.</string>
<!-- Success Messages -->
<string name="feature_apply_loan_success_submit">വായ്പ അപേക്ഷ വിജയകരമായി സമർപ്പിച്ചു!</string>
<string name="feature_apply_loan_success_draft_saved">അപേക്ഷയുടെ ഡ്രാഫ്റ്റ് വിജയകരമായി സേവ് ചെയ്തു</string>
<!-- Dialog Titles & Messages -->
<string name="feature_apply_loan_unsaved_changes_title">സേവ് ചെയ്യാത്ത മാറ്റങ്ങൾ!</string>
<string name="feature_apply_loan_unsaved_changes_message">നിങ്ങൾക്ക് സേവ് ചെയ്യാത്ത മാറ്റങ്ങളുണ്ട്. നിങ്ങൾക്ക് തിരികെ പോകണമെന്ന് ഉറപ്പാണോ?</string>
<!-- Dialog Actions -->
<string name="feature_apply_loan_action_discard">നിരസിക്കുക</string>
<string name="feature_apply_loan_action_save_draft">ഡ്രാഫ്റ്റ് സേവ് ചെയ്യുക</string>
<string name="feature_apply_loan_action_retry">വീണ്ടും ശ്രമിക്കുക</string>
<string name="feature_apply_loan_action_cancel">റദ്ദാക്കുക</string>
<string name="feature_apply_loan_action_continue">തുടരുക</string>
<!-- Hints -->
<string name="feature_apply_loan_hint_applicant_name">നിങ്ങളുടെ മുഴുവൻ പേര് നൽകുക</string>
<string name="feature_apply_loan_hint_loan_product">വായ്പ ഉൽപ്പന്നം തിരഞ്ഞെടുക്കുക</string>
<string name="feature_apply_loan_hint_principal_amount">വായ്പ തുക നൽകുക</string>
<string name="feature_apply_loan_hint_disbursement_date">വിതരണ തീയതി തിരഞ്ഞെടുക്കുക</string>
<string name="feature_apply_loan_hint_purpose">ഉദ്ദേശ്യം ചുരുക്കത്തിൽ വിവരിക്കുക</string>
<!-- Info -->
<string name="feature_apply_loan_info_currency_revalidation">കറൻസി മാറി. തുക വീണ്ടും സാധൂകരിക്കും.</string>
<string name="feature_apply_loan_info_min_amount">കുറഞ്ഞ വായ്പ തുക: %1$s</string>
<string name="feature_apply_loan_info_max_amount">കൂടിയ വായ്പ തുക: %1$s</string>
<string name="feature_apply_loan_info_confirm_details">വിശദാംശങ്ങൾ സ്ഥിരീകരിക്കുക</string>
<string name="feature_apply_loan_status_success">അപേക്ഷ വിജയകരമായി സമർപ്പിച്ചു</string>
<string name="feature_apply_loan_status_success_tip">നിങ്ങളുടെ വായ്പ അപേക്ഷ സമർപ്പിച്ചു. ഇത് പരിശോധിച്ചുകഴിഞ്ഞാൽ നിങ്ങളെ അറിയിക്കും.</string>
<string name="feature_apply_loan_status_success_action">തിരികെ ഹോമിലേക്ക്</string>
<string name="feature_apply_loan_status_failure">അപേക്ഷ സമർപ്പിക്കുന്നതിൽ പരാജയപ്പെട്ടു</string>
<string name="feature_apply_loan_status_failure_tip">നിങ്ങളുടെ വായ്പ അപേക്ഷ സമർപ്പിക്കുന്നതിനിടെ എന്തോ തകരാറുണ്ടായി. ദയവായി വീണ്ടും ശ്രമിക്കുക.</string>
<string name="feature_apply_loan_status_failure_action">വീണ്ടും ശ്രമിക്കുക</string>
<!-- New Flow -->
<string name="feature_select_loan_type_top_bar_title">പുതിയ വായ്പയ്ക്ക് അപേക്ഷിക്കുക</string>
<string name="feature_select_loan_type_choose_loan">വായ്പ തരം തിരഞ്ഞെടുക്കുക</string>
<string name="feature_select_loan_type_empty">നിലവിൽ വായ്പ ഉൽപ്പന്നങ്ങൾ ലഭ്യമല്ല</string>
<string name="feature_select_loan_type_network_issue">നിങ്ങൾ ഇന്റർനെറ്റുമായി ബന്ധിപ്പിച്ചിട്ടുണ്ടെന്ന് ഉറപ്പുവരുത്തുക</string>
<string name="feature_loan_product_details_terms">നിബന്ധനകളും വ്യവസ്ഥകളും അംഗീകരിക്കുക</string>
<string name="feature_loan_apply_loan">%1$s വായ്പയ്ക്ക് അപേക്ഷിക്കുക</string>
<string name="feature_loan_get_loan">%1$s വായ്പ നേടുക</string>
<string name="feature_loan_up_to">%1$s വരെ</string>
<string name="feature_loan_interest_rate_in_numbers">%1$s മുതൽ %2$s വരെ പലിശ</string>
<string name="feature_loan_terms_and_conditions">നിബന്ധനകളും വ്യവസ്ഥകളും</string>
<string name="feature_loan_sanction_and_disbursement">വായ്പ അനുവദിക്കലും വിതരണവും</string>
<string name="feature_loan_interest_rate">പലിശ നിരക്ക്</string>
<string name="feature_loan_continue">തുടരുക</string>
<string name="feature_loan_repayment">തിരിച്ചടവ്</string>
<string name="feature_loan_security_and_collateral">സെക്യൂരിറ്റിയും കൊളാറ്ററലും</string>
<string name="feature_loan_insurance">ഇൻഷുറൻസ്</string>
<string name="feature_loan_default">വീഴ്ച വരുത്തൽ</string>
<string name="feature_loan_documentation">ഡോക്യുമെന്റേഷൻ</string>
<string name="feature_loan_continue_legal_compliance">നിയമപരമായ അനുസരണം</string>
<string name="feature_loan_amendments_and_termination">ഭേദഗതികളും അവസാനിപ്പിക്കലും</string>
<string name="feature_loan_jurisdiction">നിയമപരിധി</string>
<string name="feature_personal_loan_sanction_and_disbursement_details">അപേക്ഷകന്റെ യോഗ്യത, വരുമാന സ്ഥിരത, ക്രെഡിറ്റ് യോഗ്യത, വായ്പ നൽകുന്നയാളുടെ ആന്തരിക ക്രെഡിറ്റ് നയങ്ങൾ എന്നിവ അടിസ്ഥാനമാക്കിയാണ് വ്യക്തിഗത വായ്പ അനുവദിക്കുന്നത്. യാതൊരു കാരണവും കൂടാതെ ഏത് വ്യക്തിഗത വായ്പ അപേക്ഷയും അംഗീകരിക്കാനോ നിരസിക്കാനോ ഉള്ള അധികാരം വായ്പ നൽകുന്നയാളിനുണ്ട്. അനുവദിച്ച വായ്പ തുക വായ്പ കരാറും ഡോക്യുമെന്റേഷൻ ആവശ്യകതകളും അനുസരിച്ച് പൂർണ്ണമായോ ഭാഗികമായോ വിതരണം ചെയ്യാം. കെവൈസി നടപടിക്രമങ്ങൾ വിജയകരമായി പൂർത്തിയാക്കൽ, സമർപ്പിച്ച രേഖകളുടെ പരിശോധന, അനുമതി കത്തിൽ വ്യക്തമാക്കിയിട്ടുള്ള എല്ലാ നിബന്ധനകളും പാലിക്കൽ എന്നിവയ്ക്ക് വിധേയമാണ് വിതരണം.</string>
<string name="feature_personal_loan_interest_rate_description">വായ്പ കരാർ സമയത്ത് വായ്പയെടുക്കുന്നയാൾ തിരഞ്ഞെടുക്കുന്നതനുസരിച്ച് വ്യക്തിഗത വായ്പയ്ക്ക് സ്ഥിരമായതോ മാറ്റം വരാവുന്നതോ ആയ പലിശ നിരക്ക് ഉണ്ടായിരിക്കാം. ഫ്ലോട്ടിംഗ് പലിശ നിരക്ക് വായ്പകളുടെ കാര്യത്തിൽ, വായ്പ നൽകുന്നയാളുടെ ബെഞ്ച്മാർക്ക് അല്ലെങ്കിൽ റഫറൻസ് നിരക്കിലെ മാറ്റങ്ങൾക്കനുസരിച്ച് ബാധകമായ നിരക്ക് കാലാകാലങ്ങളിൽ പരിഷ്കരിക്കുന്നതാണ്. അത്തരം മാറ്റങ്ങൾ വായ്പയെടുക്കുന്നയാളിന് ബാധകമായിരിക്കും, കൂടാതെ വായ്പ നൽകുന്നയാൾക്ക് ആവശ്യമെന്ന് തോന്നുന്ന പക്ഷം ഇഎംഐ തുകയിലും/അല്ലെങ്കിൽ വായ്പ കാലാവധിയിലും മാറ്റം വരുത്താവുന്നതാണ്.</string>
<string name="feature_personal_loan_repayment_details">വ്യക്തിഗത വായ്പയുടെ തിരിച്ചടവ് മുതലും പലിശയും അടങ്ങുന്ന ഇക്വേറ്റഡ് മന്ത്ലി ഇൻസ്റ്റാൾമെന്റുകൾ (ഇഎംഐ) വഴിയായിരിക്കും. വായ്പ കരാറിൽ വ്യക്തമാക്കിയിട്ടുള്ള തീയതി മുതൽ ഇഎംഐകൾ ആരംഭിക്കുകയും ബാധകമായ പലിശയോടൊപ്പം മുഴുവൻ വായ്പ തുകയും തിരിച്ചടയ്ക്കുന്നതുവരെ പ്രതിമാസ അടിസ്ഥാനത്തിൽ തുടരുകയും ചെയ്യും. വായ്പ നൽകുന്നയാളുടെ നിലവിലുള്ള നയങ്ങൾക്കനുസൃതമായി മുൻകൂട്ടി അടയ്ക്കലോ ഭാഗികമായി അടയ്ക്കലോ അനുവദിക്കാവുന്നതാണ്, പ്രത്യേകിച്ച് സ്ഥിര നിരക്ക് വായ്പകൾക്ക് ചില ചാർജുകൾ ഈടാക്കാം.</string>
<string name="feature_personal_loan_security_and_collateral_details">വ്യക്തിഗത വായ്പകൾക്ക് സാധാരണയായി ഈട് (collateral) ആവശ്യമില്ല. എന്നിരുന്നാലും, അപേക്ഷകന്റെ ക്രെഡിറ്റ് പ്രൊഫൈലും വായ്പ തുകയും അനുസരിച്ച്, അപൂർവ്വ സാഹചര്യങ്ങളിൽ അധിക ഗ്യാരണ്ടികളോ സെക്യൂരിറ്റിയോ ആവശ്യപ്പെടാനുള്ള അധികാരം വായ്പ നൽകുന്നയാളിനുണ്ട്. അത്തരം ആവശ്യകതകൾ എന്തെങ്കിലും ഉണ്ടെങ്കിൽ അത് അനുമതി കത്തിൽ വ്യക്തമായി രേഖപ്പെടുത്തിയിരിക്കും. ബാധകമാണെങ്കിൽ ഡോക്യുമെന്റേഷൻ അല്ലെങ്കിൽ നിയമപരമായ നടപടിക്രമങ്ങൾ എന്നിവയുമായി ബന്ധപ്പെട്ട എല്ലാ ചിലവുകളും വായ്പയെടുക്കുന്നയാൾ വഹിക്കേണ്ടതാണ്.</string>
<string name="feature_personal_loan_insurance_details">വ്യക്തിഗത വായ്പകൾക്ക് സാധാരണയായി അസറ്റ് ഇൻഷുറൻസ് ആവശ്യമില്ലെങ്കിലും, വായ്പയെടുക്കുന്നയാളുടെ മരണമുണ്ടായാൽ കുടിശ്ശികയുള്ള വായ്പ തുക സംരക്ഷിക്കുന്നതിനായി ഒരു ലൈഫ് ഇൻഷുറൻസ് പോളിസി തിരഞ്ഞെടുക്കാൻ വായ്പ നൽകുന്നയാൾ ശുപാർശ ചെയ്തേക്കാം. ഇത് നിർബന്ധമല്ലെങ്കിലും വായ്പയെടുക്കുന്നയാളുടെ കുടുംബത്തിനോ ആശ്രിതർക്കോ ഒരു സാമ്പത്തിക സംരക്ഷണ നടപടിയായി ഇത് അഭികാമ്യമാണ്.</string>
<string name="feature_personal_loan_default_details">ഇഎംഐകൾ അടയ്ക്കാതിരിക്കുകയോ വൈകിപ്പിക്കുകയോ ചെയ്യുന്നത് വീഴ്ചയായി കണക്കാക്കും. അത്തരം സന്ദർഭങ്ങളിൽ, കുടിശ്ശിക പിരിച്ചെടുക്കുന്നതിന് നിയമനടപടികൾ ഉൾപ്പെടെയുള്ള വീണ്ടെടുക്കൽ നടപടികൾ വായ്പ നൽകുന്നയാൾ ആരംഭിച്ചേക്കാം. കുടിശ്ശികയുള്ള തുകയ്ക്ക് പിഴ പലിശയും മറ്റ് ചാർജുകളും ഈടാക്കിയേക്കാം. തുടർച്ചയായ അല്ലെങ്കിൽ ആവർത്തിച്ചുള്ള വീഴ്ച വായ്പയെടുക്കുന്നയാളുടെ ക്രെഡിറ്റ് സ്കോറിനെയും ഭാവിയിൽ വായ്പ എടുക്കാനുള്ള കഴിവിനെയും ദോഷകരമായി ബാധിക്കും.</string>
<string name="feature_personal_loan_documentation_details">തിരിച്ചറിയൽ രേഖ, വിലാസ രേഖ, വരുമാന വിവരങ്ങൾ, ബാങ്ക് സ്റ്റേറ്റ്‌മെന്റുകൾ, വായ്പ നൽകുന്നയാൾ ആവശ്യപ്പെടുന്ന മറ്റ് രേഖകൾ എന്നിവയുൾപ്പെടെ കൃത്യവും പൂർണ്ണവുമായ രേഖകൾ വായ്പയെടുക്കുന്നയാൾ സമർപ്പിക്കേണ്ടതാണ്. സമർപ്പിച്ച രേഖകളിലെ എന്തെങ്കിലും പൊരുത്തക്കേടുകൾ, തെറ്റായ വിവരങ്ങൾ അല്ലെങ്കിൽ തിരിമറികൾ എന്നിവ വായ്പ അപേക്ഷ നിരസിക്കുന്നതിനോ വായ്പ കരാർ അവസാനിപ്പിക്കുന്നതിനോ കാരണമായേക്കാം, ഒപ്പം നിയമനടപടികൾക്കും സാധ്യതയുണ്ട്.</string>
<string name="feature_personal_loan_continue_legal_compliance_details">വായ്പയെടുക്കുന്നയാൾ അവരുടെ സാമ്പത്തിക ബാധ്യതകളുമായി ബന്ധപ്പെട്ട ബാധകമായ എല്ലാ പ്രാദേശിക, സംസ്ഥാന, ദേശീയ നിയമങ്ങളും പൂർണ്ണമായി പാലിക്കുന്നുണ്ടെന്ന് ഉറപ്പാക്കണം. നികുതികൾ കൃത്യസമയത്ത് അടയ്ക്കൽ, റെഗുലേറ്ററി ആവശ്യകതകൾ പാലിക്കൽ, സാധുവായ രേഖകൾ സമർപ്പിക്കൽ എന്നിവ ഇതിൽ ഉൾപ്പെടുന്നു. വായ്പയെടുക്കുന്നയാൾ നടത്തുന്ന നിയമലംഘനങ്ങൾക്ക് വായ്പ നൽകുന്നയാൾ ഉത്തരവാദിയായിരിക്കില്ല.</string>
<string name="feature_personal_loan_amendments_and_termination_details">വായ്പയെടുക്കുന്നയാളിന് മതിയായ മുൻകൂൂർ അറിയിപ്പ് നൽകിക്കൊണ്ട്, ഈ നിബന്ധനകളും വ്യവസ്ഥകളും വായ്പ നൽകുന്നയാൾക്ക് കാലാകാലങ്ങളിൽ പരിഷ്കരിക്കാവുന്നതാണ്. വായ്പ തുക പൂർണ്ണമായി തിരിച്ചടയ്ക്കുമ്പോഴോ വീഴ്ച കാരണം ആരംഭിച്ച ജപ്തി നടപടികളിലൂടെയോ വായ്പ കരാർ അവസാനിച്ചതായി കണക്കാക്കും.</string>
<string name="feature_personal_loan_jurisdiction_details">വ്യക്തിഗത വായ്പ കരാറുമായി ബന്ധപ്പെട്ട് ഉണ്ടാകുന്ന എല്ലാ തർക്കങ്ങളും, കരാറിൽ മറ്റെന്തെങ്കിലും വ്യക്തമാക്കിയിട്ടില്ലെങ്കിൽ, വായ്പ നൽകുന്നയാളുടെ രജിസ്റ്റർ ചെയ്ത ഓഫീസ് സ്ഥിതിചെയ്യുന്ന സ്ഥലത്തെ കോടതികളുടെ പ്രത്യേക അധികാരപരിധിയിൽ വരുന്നതാണ്.</string>
<!-- Upload docs -->
<string name="feature_upload_docs_bank_account">ബാങ്ക് അക്കൗണ്ട് സ്റ്റേറ്റ്‌മെന്റുകൾ അപ്‌ലോഡ് ചെയ്യുക</string>
<string name="feature_upload_docs_collateral">ഈട് രേഖകൾ അപ്‌ലോഡ് ചെയ്യുക</string>
<string name="feature_upload_docs_signature">ഒപ്പ് അപ്‌ലോഡ് ചെയ്യുക</string>
<string name="feature_upload_file_error">എന്തോ കുഴപ്പം സംഭവിച്ചു! ഫയൽ അപ്‌ലോഡ് ചെയ്യാൻ കഴിയുന്നില്ല</string>
<string name="feature_upload_statement_error">ദയവായി ഒരു ബാങ്ക് സ്റ്റേറ്റ്‌മെന്റ് അപ്‌ലോഡ് ചെയ്യുക</string>
<string name="feature_upload_property_document_error">ദയവായി ഒരു പ്രോപ്പർട്ടി ഡോക്യുമെന്റ് അപ്‌ലോഡ് ചെയ്യുക</string>
<string name="feature_upload_signature_error">ദയവായി ഒരു ഒപ്പ് അപ്‌ലോഡ് ചെയ്യുക</string>
<string name="feature_upload_documents_success_title">രേഖകൾ വിജയകരമായി അപ്‌ലോഡ് ചെയ്തു!</string>
<string name="sign_here">ഇവിടെ ഒപ്പിടുക</string>
<string name="reset">റീസെറ്റ്</string>
<string name="sign">ഒപ്പിടുക</string>
<string name="capture">ക്യാപ്‌ചർ</string>
<string name="attach">അറ്റാച്ചുചെയ്യുക</string>
<string name="upload_signature">ഒപ്പ് അപ്‌ലോഡ് ചെയ്യുക</string>
<string name="save_and_submit">സേവ് &amp; സബ്മിറ്റ്</string>
</resources>

View File

@ -9,21 +9,27 @@
*/
package org.mifos.mobile.feature.loan.application.loanType
import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.navigationBarsPadding
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.staggeredgrid.LazyVerticalStaggeredGrid
import androidx.compose.foundation.lazy.staggeredgrid.StaggeredGridCells
import androidx.compose.foundation.lazy.staggeredgrid.items
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.material3.CardDefaults
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.ColorFilter
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import mifos_mobile.feature.loan_application.generated.resources.Res
import mifos_mobile.feature.loan_application.generated.resources.feature_select_loan_type_choose_loan
@ -32,9 +38,10 @@ import mifos_mobile.feature.loan_application.generated.resources.feature_select_
import org.jetbrains.compose.resources.stringResource
import org.koin.compose.viewmodel.koinViewModel
import org.mifos.mobile.core.designsystem.component.BasicDialogState
import org.mifos.mobile.core.designsystem.component.CardVariant
import org.mifos.mobile.core.designsystem.component.MifosBasicDialog
import org.mifos.mobile.core.designsystem.component.MifosCustomCard
import org.mifos.mobile.core.designsystem.component.MifosElevatedScaffold
import org.mifos.mobile.core.designsystem.component.MifosExploreCard
import org.mifos.mobile.core.designsystem.icon.MifosIcons
import org.mifos.mobile.core.designsystem.theme.DesignToken
import org.mifos.mobile.core.designsystem.theme.MifosTypography
@ -112,7 +119,7 @@ internal fun SelectLoanTypeDialog(
}
/**
* Displays the visual layout including the header and a staggered grid of available loan products.
* Displays the visual layout including the header and a vertical list of available loan products.
* Handles Loading, Error, Empty, and Success UI states.
*
* @param state The current UI state containing the list of loan options.
@ -168,48 +175,100 @@ internal fun SelectLoanTypeScreenContent(
}
ScreenUiState.Success -> {
Box(
modifier = Modifier
.fillMaxSize()
.padding(KptTheme.spacing.md)
.padding(top = KptTheme.spacing.md),
) {
Column(
verticalArrangement = Arrangement.spacedBy(DesignToken.spacing.medium),
) {
val productOptions = state.productOptions ?: emptyList()
if (productOptions.isNotEmpty()) {
Column(
modifier = Modifier
.fillMaxSize()
.padding(top = KptTheme.spacing.md),
) {
Text(
text = stringResource(Res.string.feature_select_loan_type_choose_loan),
style = MifosTypography.labelLargeEmphasized,
modifier = Modifier.padding(horizontal = KptTheme.spacing.md),
)
LazyVerticalStaggeredGrid(
columns = StaggeredGridCells.Fixed(2),
horizontalArrangement = Arrangement.spacedBy(DesignToken.spacing.medium),
verticalItemSpacing = DesignToken.spacing.medium,
content = {
items(productOptions) { loanType ->
MifosExploreCard(
LazyColumn(
contentPadding = PaddingValues(KptTheme.spacing.md),
verticalArrangement = Arrangement.spacedBy(KptTheme.spacing.md),
) {
items(productOptions, key = { it.id ?: -1 }) { loanType ->
val loanName = loanType.name.orEmpty()
LoanTypeListCard(
icon = MifosIcons.Money,
text = loanType.name ?: "",
title = loanName,
onClick = {
loanType.id?.let { id ->
onAction(
SelectLoanTypeAction.NavigateTo(
loanType.id ?: -1,
loanType.name ?: "",
id,
loanName,
),
)
},
)
}
},
)
}
}
}
} else {
MifosErrorComponent(
isRetryEnabled = true,
message = stringResource(Res.string.feature_select_loan_type_empty),
onRetry = { onAction(SelectLoanTypeAction.Retry) },
)
}
}
else -> { }
}
}
}
@Composable
internal fun LoanTypeListCard(
icon: ImageVector,
title: String,
onClick: () -> Unit,
modifier: Modifier = Modifier,
) {
MifosCustomCard(
modifier = modifier.fillMaxWidth(),
onClick = onClick,
variant = CardVariant.ELEVATED,
shape = KptTheme.shapes.medium,
elevation = CardDefaults.elevatedCardElevation(
defaultElevation = KptTheme.elevation.level1,
),
colors = CardDefaults.elevatedCardColors(
containerColor = KptTheme.colorScheme.surface,
contentColor = KptTheme.colorScheme.onSurface,
),
) {
Row(
modifier = Modifier
.fillMaxWidth()
.padding(KptTheme.spacing.md),
horizontalArrangement = Arrangement.spacedBy(KptTheme.spacing.md),
verticalAlignment = Alignment.CenterVertically,
) {
Image(
imageVector = icon,
contentDescription = title,
modifier = Modifier.size(DesignToken.sizes.iconLarge),
colorFilter = ColorFilter.tint(KptTheme.colorScheme.primary),
)
Column(
modifier = Modifier.weight(1f),
verticalArrangement = Arrangement.spacedBy(KptTheme.spacing.xs),
) {
Text(
text = title,
style = MifosTypography.titleMediumEmphasized,
color = KptTheme.colorScheme.onSurface,
)
}
}
}
}

View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2026 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 https://mozilla.org/MPL/2.0/.
See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md
-->
<resources>
<string name="notification">അറിയിപ്പ്</string>
<string name="dialog_action_ok">ശരി</string>
<string name="no_notification">അറിയിപ്പുകളൊന്നുമില്ല</string>
</resources>

View File

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2026 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 https://mozilla.org/MPL/2.0/.
See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md
-->
<resources>
<string name="feature_passcode_setup">ഓതന്റിക്കേഷൻ കോഡ് സജ്ജീകരിക്കുക</string>
<string name="feature_passcode_tip">ഓതന്റിക്കേഷൻ ലെയർ സജ്ജീകരിക്കുന്നതിനായി നിങ്ങളുടെ 4-അക്ക ഓതന്റിക്കേഷൻ കോഡ് നൽകുക</string>
<string name="feature_passcode_confirm">ഓതന്റിക്കേഷൻ കോഡ് സ്ഥിരീകരിക്കുക</string>
<string name="feature_passcode_setup_successful">വിജയകരം</string>
<string name="feature_passcode_setup_successful_msg">ഓതന്റിക്കേഷൻ കോഡ് വിജയകരമായി സജ്ജീകരിച്ചു. ആപ്പിൽ ഇത് ഇടയ്ക്കിടെ ഉപയോഗിക്കേണ്ടി വരും</string>
<string name="feature_passcode_setup_failure">പരാജയപ്പെട്ടു</string>
<string name="feature_passcode_setup_failure_msg">ഓതന്റിക്കേഷൻ കോഡ് സജ്ജീകരിക്കുന്നതിൽ പരാജയപ്പെട്ടു. ആപ്പിൽ ഇത് ഇടയ്ക്കിടെ ഉപയോഗിക്കേണ്ടി വരുമെന്നതിനാൽ ദയവായി വീണ്ടും ശ്രമിക്കുക.</string>
<string name="feature_passcode_common_continue">തുടരുക</string>
<string name="feature_passcode_common_try_again">വീണ്ടും ശ്രമിക്കുക</string>
<string name="feature_passcode_authenticate">ഓതന്റിക്കേഷൻ കോഡ് നൽകുക</string>
<string name="feature_passcode_authenticate_tip">നിങ്ങളുടെ പ്രവർത്തനം പൂർത്തിയാക്കാൻ 4-അക്ക ഓതന്റിക്കേഷൻ കോഡ് നൽകി ഇത് നിങ്ങളാണെന്ന് സ്ഥിരീകരിക്കുക</string>
</resources>

View File

@ -13,6 +13,12 @@ import org.koin.core.module.dsl.viewModelOf
import org.koin.dsl.module
import org.mifos.mobile.feature.recent.transaction.viewmodel.RecentTransactionViewModel
/**
* Koin module providing dependency injection definitions for the recent transactions feature.
*
* Registers the following ViewModel for lifecycle-aware injection:
* - [RecentTransactionViewModel]: Manages state and logic for displaying recent transaction history.
*/
val recentTransactionModule = module {
viewModelOf(::RecentTransactionViewModel)
}

View File

@ -13,18 +13,34 @@ package org.mifos.mobile.feature.recent.transaction.navigation
import androidx.navigation.NavController
import androidx.navigation.NavGraphBuilder
import androidx.navigation.compose.navigation
import kotlinx.serialization.Serializable
import org.mifos.mobile.core.ui.composableWithSlideTransitions
import org.mifos.mobile.feature.recent.transaction.screen.RecentTransactionScreen
/**
* Navigation configuration for the recent transactions feature.
*
* Defines the type-safe [RecentTransactionRoute] and provides extension functions
* to handle navigation and graph registration.
*/
@Serializable
data object RecentTransactionRoute
/**
* Navigates to the [RecentTransactionRoute].
*/
fun NavController.navigateToRecentTransactionScreen() {
this.navigate(RecentTransactionRoute)
}
/**
* Adds the recent transaction destination to the [NavGraphBuilder].
*
* @param navigateBack Callback to return to the previous screen.
* @param navigateToDetails Callback to navigate to transaction details, providing
* account ID, type, and transaction ID.
*/
fun NavGraphBuilder.recentTransactionDestination(
navigateBack: () -> Unit,
navigateToDetails: (String, String, Long) -> Unit,

View File

@ -91,6 +91,14 @@ import template.core.base.designsystem.theme.KptTheme
import kotlin.collections.component1
import kotlin.collections.component2
/**
* Main entry point for the Recent Transaction screen.
* * Orchestrates state observation from [RecentTransactionViewModel], navigation
* event handling, and the visibility of modal components.
*
* @param navigateBack Callback to return to the previous screen.
* @param navigateToDetails Callback to navigate to a specific transaction detail.
*/
@OptIn(ExperimentalMaterial3Api::class)
@Composable
internal fun RecentTransactionScreen(
@ -127,6 +135,15 @@ internal fun RecentTransactionScreen(
)
}
/**
* Core UI layout for the Recent Transaction screen.
*
* Displays a grouped list of transactions with support for pull-to-refresh,
* empty/error states, and filter triggering.
*
* @param state The current [RecentTransactionUiState] to be rendered.
* @param onAction Callback to propagate UI interactions to the ViewModel.
*/
@Composable
internal fun RecentTransactionScreenContent(
state: RecentTransactionUiState,
@ -486,6 +503,13 @@ internal fun TransactionFilterSheetContent(
}
}
/**
* A specialized selection chip used for toggling filter categories.
*
* @param label The text displayed on the chip.
* @param isSelected Whether the chip is currently in the active state.
* @param onClick Triggered when the user interacts with the chip.
*/
@Composable
fun FilterOptionChip(
label: String,

View File

@ -28,6 +28,17 @@ import org.mifos.mobile.core.model.entity.accounts.savings.Transactions
import org.mifos.mobile.core.ui.utils.BaseViewModel
import org.mifos.mobile.core.ui.utils.ScreenUiState
/**
* ViewModel for managing the state and business logic of the Recent Transactions feature.
*
* Handles account fetching, transaction synchronization, and complex filtering logic
* based on transaction type (Credit/Debit) and specific savings accounts.
*
* @property accountsRepositoryImpl Accesses general account listing data.
* @property savingsAccountRepositoryImpl Fetches detailed savings associations and transactions.
* @property networkMonitor Observes real-time connectivity status.
* @property userPreferencesRepository Retrieves stored user-specific identifiers like Client ID.
*/
internal class RecentTransactionViewModel(
private val accountsRepositoryImpl: AccountsRepository,
private val savingsAccountRepositoryImpl: SavingsAccountRepository,
@ -115,6 +126,10 @@ internal class RecentTransactionViewModel(
}
}
/**
* Handles incoming [RecentTransactionAction] from the UI.
* Includes navigation requests, filter applications, and data refresh triggers.
*/
override fun handleAction(action: RecentTransactionAction) {
when (action) {
is RecentTransactionAction.OnNavigateBackClick ->
@ -442,7 +457,6 @@ internal data class RecentTransactionUiState(
* Defines all possible user interactions and internal events for the RecentTransactionScreen.
*/
sealed interface RecentTransactionAction {
// User-initiated actions
data object OnNavigateBackClick : RecentTransactionAction
data object Refresh : RecentTransactionAction
data object ToggleFilter : RecentTransactionAction

View File

@ -103,4 +103,46 @@
<string name="feature_savings_update_select_product_id">പ്രോഡക്ട് ഐഡി തിരഞ്ഞെടുക്കുക</string>
<string name="feature_savings_update_submit">സമർപ്പിക്കുക</string>
<string name="feature_savings_update_cancel">റദ്ദാക്കുക</string>
<string name="feature_account_action_transactions">ഇടപാടുകൾ</string>
<string name="feature_account_action_transactions_tip">ഈ അക്കൗണ്ടിലെ സമീപകാല ഇടപാടുകൾ</string>
<string name="feature_account_action_charges">ചാർജുകൾ</string>
<string name="feature_account_action_charges_tip">ഈ അക്കൗണ്ടിലെ ഫീസ് അല്ലെങ്കിൽ ചാർജുകൾ</string>
<string name="feature_account_action_qr">QR കോഡ്</string>
<string name="feature_account_action_qr_tip">QR കോഡ് സൃഷ്ടിക്കുക</string>
<string name="feature_savings_account_number_label">അക്കൗണ്ട് നമ്പർ</string>
<string name="feature_savings_available_balance_label">ലഭ്യമായ ബാലൻസ്</string>
<string name="feature_savings_status_label">അവസ്ഥ</string>
<string name="feature_savings_nominal_interest_rate_label">നാമമാത്ര പലിശ നിരക്ക്</string>
<string name="feature_savings_total_deposits_label">ആകെ നിക്ഷേപങ്ങൾ</string>
<string name="feature_savings_total_withdrawals_label">ആകെ പിൻവലിക്കലുകൾ</string>
<string name="feature_savings_transaction_amount_label">തുക</string>
<string name="feature_savings_transaction_date_label">തീയതി</string>
<string name="feature_savings_update_account_number_label">അക്കൗണ്ട് നമ്പർ</string>
<string name="feature_savings_update_product_label">ഉൽപ്പന്നം</string>
<string name="feature_savings_update_request_update">അപ്ഡേറ്റ് അഭ്യർത്ഥിക്കുക</string>
<string name="feature_savings_new_product_label">പുതിയ ഉൽപ്പന്നം</string>
<string name="feature_savings_savings_product_empty">സേവിംഗ്സ് ഉൽപ്പന്നങ്ങൾ ഇപ്പോൾ ലഭ്യമല്ല</string>
<string name="feature_savings_update_request_successful">അഭ്യർത്ഥന വിജയകരമായി സമർപ്പിച്ചു</string>
<string name="feature_savings_update_request_successful_message">അക്കൗണ്ട് വിവരങ്ങൾ അപ്ഡേറ്റ് ചെയ്യാനുള്ള അഭ്യർത്ഥന വിജയകരമായി സമർപ്പിച്ചു</string>
<string name="feature_savings_update_request_back_to_home">ഹോമിലേക്ക് മടങ്ങുക</string>
<string name="feature_savings_update_request_failed">അഭ്യർത്ഥന സമർപ്പിക്കുന്നതിൽ പരാജയപ്പെട്ടു</string>
<string name="feature_savings_update_request_failed_message">അക്കൗണ്ട് വിവരങ്ങൾ അപ്ഡേറ്റ് ചെയ്യാനുള്ള അഭ്യർത്ഥന പരാജയപ്പെട്ടു. ദയവായി വീണ്ടും ശ്രമിക്കുക</string>
<string name="feature_savings_update_request_try_again">വീണ്ടും ശ്രമിക്കുക</string>
<string name="feature_savings_withdraw_account_topbar_title">അക്കൗണ്ട് പിൻവലിക്കുക</string>
<string name="feature_savings_withdraw_remarks_label">അഭിപ്രായങ്ങൾ</string>
<string name="feature_savings_withdraw_request_withdraw">പിൻവലിക്കൽ അഭ്യർത്ഥിക്കുക</string>
<string name="feature_savings_withdraw_request_successful">അഭ്യർത്ഥന വിജയകരമായി സമർപ്പിച്ചു</string>
<string name="feature_savings_withdraw_request_successful_message">അക്കൗണ്ട് പിൻവലിക്കാനുള്ള അഭ്യർത്ഥന വിജയകരമായി സമർപ്പിച്ചു</string>
<string name="feature_savings_withdraw_request_failed">അഭ്യർത്ഥന സമർപ്പിക്കുന്നതിൽ പരാജയപ്പെട്ടു</string>
<string name="feature_savings_withdraw_request_failed_message">അക്കൗണ്ട് പിൻവലിക്കാനുള്ള അഭ്യർത്ഥന പരാജയപ്പെട്ടു. ദയവായി വീണ്ടും ശ്രമിക്കുക</string>
<string name="feature_savings_no_accounts_found">സേവിംഗ്സ് അക്കൗണ്ടുകൾ ഒന്നും കണ്ടെത്തിയില്ല</string>
<string name="feature_generic_error_server">സെർവർ പ്രശ്നം കാരണം മുന്നോട്ട് പോകാൻ കഴിയില്ല, അല്പസമയത്തിന് ശേഷം വീണ്ടും ശ്രമിക്കുക</string>
</resources>

View File

@ -46,6 +46,7 @@ import org.mifos.mobile.core.designsystem.theme.AppColors
import org.mifos.mobile.core.designsystem.theme.DesignToken
import org.mifos.mobile.core.designsystem.theme.MifosMobileTheme
import org.mifos.mobile.core.designsystem.theme.MifosTypography
import org.mifos.mobile.core.model.SavingStatus
import org.mifos.mobile.core.model.enums.ChargeType
import org.mifos.mobile.core.ui.component.MifosActionCard
import org.mifos.mobile.core.ui.component.MifosErrorComponent
@ -191,14 +192,12 @@ internal fun SavingsAccountDetailsContent(
AccountDetailsGrid(
details = state.displayItems,
isActive = state.isActive,
)
if (state.transactionList.isNotEmpty()) {
AccountDetailsGrid(
label = "Last Transactions",
details = state.transactionList,
isActive = state.isActive,
)
}
@ -278,13 +277,11 @@ internal fun ActionBar(
*
* @param label An optional string for the section's title.
* @param details A list of [LabelValueItem]s to display in the grid.
* @param isActive A boolean to conditionally color the status field.
*/
@Composable
internal fun AccountDetailsGrid(
label: String? = null,
details: List<LabelValueItem>? = emptyList(),
isActive: Boolean = false,
) {
Column(
modifier = Modifier
@ -312,12 +309,15 @@ internal fun AccountDetailsGrid(
.weight(1f),
label = stringResource(item.label),
value = item.value,
color = if (isActive && item.label == Res.string.feature_savings_status_label) {
AppColors
.customEnable
color = if (item.label == Res.string.feature_savings_status_label) {
when (item.value) {
SavingStatus.ACTIVE.status -> AppColors.customEnable
SavingStatus.SUBMIT_AND_PENDING_APPROVAL.status -> AppColors.customYellow
SavingStatus.INACTIVE.status -> KptTheme.colorScheme.error
else -> KptTheme.colorScheme.onSurface
}
} else {
KptTheme
.colorScheme.onBackground
KptTheme.colorScheme.onBackground
},
)
}

View File

@ -345,6 +345,10 @@ val SavingStatus.allowedActions: Set<SavingsActionItems>
SavingsActionItems.Transfer,
SavingsActionItems.Transactions,
)
SavingStatus.APPROVED -> setOf(
SavingsActionItems.QrCode,
SavingsActionItems.Transfer,
)
SavingStatus.SUBMIT_AND_PENDING_APPROVAL -> setOf(
SavingsActionItems.QrCode,
)

View File

@ -0,0 +1,82 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2026 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 https://mozilla.org/MPL/2.0/.
See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md
-->
<resources>
<!-- Titles -->
<string name="feature_apply_savings_title">Detalles de Solicitud de Cuenta de Ahorros</string>
<!-- Sections -->
<string name="feature_apply_savings_section_fill_details">Complete los detalles de la solicitud</string>
<!-- Labels -->
<string name="feature_apply_savings_label_applicant_name">Nombre del solicitante</string>
<string name="feature_apply_savings_label_savings_product">Nombre del producto</string>
<string name="feature_apply_savings_label_field_officer">Oficial de campo</string>
<string name="feature_apply_savings_label_submission_date">Fecha de envío</string>
<string name="feature_apply_savings_label_fill_application_details">Complete los detalles de la solicitud</string>
<string name="feature_apply_savings_label_details">Detalles</string>
<string name="feature_apply_savings_label_currency">Divisa</string>
<string name="feature_apply_savings_label_minimum_opening_balance">Saldo mínimo de apertura</string>
<string name="feature_apply_savings_label_lock_in_period">Período de bloqueo</string>
<string name="feature_apply_savings_label_frequency">Frecuencia</string>
<string name="feature_apply_savings_label_frequency_type">Tipo de frecuencia</string>
<string name="feature_apply_savings_label_overdraft">Sobregiro</string>
<string name="feature_apply_savings_label_request_to_allow_overdraft">Solicitud para permitir sobregiro</string>
<!-- Buttons -->
<string name="feature_apply_savings_button_continue">Continuar</string>
<string name="feature_apply_savings_button_ok">De acuerdo</string>
<string name="feature_apply_savings_button_cancel">Cancelar</string>
<string name="feature_apply_savings_button_apply">Solicitar Cuenta de Ahorros</string>
<string name="feature_button_next">Siguiente</string>
<!-- Principal Amount Validation -->
<string name="feature_apply_savings_error_amount_empty">Se requiere monto de capital</string>
<string name="feature_apply_savings_error_amount_invalid_format">Por favor, introduzca un formato de importe válido</string>
<string name="feature_apply_savings_error_amount_too_small">El monto de capital es demasiado pequeño</string>
<string name="feature_apply_savings_error_amount_too_large">El monto de capital excede el límite máximo</string>
<string name="feature_apply_savings_error_amount_invalid_decimal">El monto tiene demasiados decimales para la moneda seleccionada</string>
<!-- Savings Product Validation -->
<string name="feature_apply_savings_error_product_empty">Se requiere producto de Cuenta de Ahorros</string>
<!-- Error Dialogs -->
<string name="feature_apply_savings_error_server">Error interno del servidor. Inténtelo de nuevo</string>
<string name="feature_apply_savings_error_too_many_attempts">Demasiados intentos fallidos. Inténtelo de nuevo más tarde.</string>
<string name="feature_apply_savings_error_submit_failed">No se pudo enviar la solicitud de Cuenta de Ahorros. Inténtelo de nuevo.</string>
<!-- Success Messages -->
<string name="feature_apply_savings_success_submit">¡Solicitud de Cuenta de Ahorros enviada!</string>
<string name="feature_apply_savings_success_draft_saved">Borrador de solicitud guardado</string>
<!-- Dialog Titles & Messages -->
<string name="feature_apply_savings_unsaved_changes_title">¡Cambios no guardados!</string>
<string name="feature_apply_savings_unsaved_changes_message">Tienes cambios sin guardar. ¿Está seguro de que quiere volver atrás?</string>
<string name="feature_apply_savings_label_next">Siguiente</string>
<string name="feature_apply_savings_error_currency_required">Se requiere moneda</string>
<string name="feature_apply_savings_error_minimum_opening_balance_required">Se requiere un saldo mínimo de apertura</string>
<string name="feature_apply_savings_error_lock_in_period_required">Se requiere un período de bloqueo</string>
<string name="feature_apply_savings_error_frequency_required">Se requiere frecuencia</string>
<string name="feature_apply_savings_error_frequency_invalid">Introduzca una frecuencia válida</string>
<string name="feature_apply_savings_status_success">Solicitud enviada</string>
<string name="feature_apply_savings_status_success_tip">Ha solicitado con éxito una Cuenta de Ahorros de %1$s.</string>
<string name="feature_apply_savings_status_success_action">Regresar al Inicio</string>
<string name="feature_apply_savings_status_failure">La solicitud no se pudo enviar</string>
<string name="feature_apply_savings_status_failure_tip">No se pudo solicitar una Cuenta de Ahorros de %1$s.</string>
<string name="feature_apply_savings_status_failure_action">Intentar otra vez</string>
</resources>

View File

@ -0,0 +1,82 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2026 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 https://mozilla.org/MPL/2.0/.
See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md
-->
<resources>
<!-- Titles -->
<string name="feature_apply_savings_title">സേവിംഗ്സ് അപേക്ഷ വിവരങ്ങൾ</string>
<!-- Sections -->
<string name="feature_apply_savings_section_fill_details">അപേക്ഷ വിവരങ്ങൾ പൂരിപ്പിക്കുക</string>
<!-- Labels -->
<string name="feature_apply_savings_label_applicant_name">അപേക്ഷകന്റെ പേര്</string>
<string name="feature_apply_savings_label_savings_product">ഉൽപ്പന്നത്തിന്റെ പേര്</string>
<string name="feature_apply_savings_label_field_officer">ഫീൽഡ് ഓഫീസർ</string>
<string name="feature_apply_savings_label_submission_date">സമർപ്പിച്ച തീയതി</string>
<string name="feature_apply_savings_label_fill_application_details">അപേക്ഷ വിവരങ്ങൾ പൂരിപ്പിക്കുക</string>
<string name="feature_apply_savings_label_details">വിശദാംശങ്ങൾ</string>
<string name="feature_apply_savings_label_currency">കറൻസി</string>
<string name="feature_apply_savings_label_minimum_opening_balance">മിനിമം ഓപ്പണിംഗ് ബാലൻസ്</string>
<string name="feature_apply_savings_label_lock_in_period">ലോക്ക്-ഇൻ കാലയളവ്</string>
<string name="feature_apply_savings_label_frequency">ആവൃത്തി</string>
<string name="feature_apply_savings_label_frequency_type">ആവൃത്തി തരം</string>
<string name="feature_apply_savings_label_overdraft">ഓവർഡ്രാഫ്റ്റ്</string>
<string name="feature_apply_savings_label_request_to_allow_overdraft">ഓവർഡ്രാഫ്റ്റ് അനുവദിക്കാൻ അഭ്യർത്ഥിക്കുക</string>
<!-- Buttons -->
<string name="feature_apply_savings_button_continue">തുടരുക</string>
<string name="feature_apply_savings_button_ok">ശരി</string>
<string name="feature_apply_savings_button_cancel">റദ്ദാക്കുക</string>
<string name="feature_apply_savings_button_apply">സേവിംഗ്സിന് അപേക്ഷിക്കുക</string>
<string name="feature_button_next">അടുത്തത്</string>
<!-- Principal Amount Validation -->
<string name="feature_apply_savings_error_amount_empty">പ്രിൻസിപ്പൽ തുക ആവശ്യമാണ്</string>
<string name="feature_apply_savings_error_amount_invalid_format">ദയവായി ശരിയായ തുക ഫോർമാറ്റ് നൽകുക</string>
<string name="feature_apply_savings_error_amount_too_small">പ്രിൻസിപ്പൽ തുക വളരെ കുറവാണ്</string>
<string name="feature_apply_savings_error_amount_too_large">പ്രിൻസിപ്പൽ തുക പരമാവധി പരിധിയേക്കാൾ കൂടുതലാണ്</string>
<string name="feature_apply_savings_error_amount_invalid_decimal">തിരഞ്ഞെടുത്ത കറൻസിക്ക് തുകയിൽ ധാരാളം ദശാംശസ്ഥാനങ്ങളുണ്ട്</string>
<!-- Savings Product Validation -->
<string name="feature_apply_savings_error_product_empty">സേവിംഗ്സ് ഉൽപ്പന്നം ആവശ്യമാണ്</string>
<!-- Error Dialogs -->
<string name="feature_apply_savings_error_server">സെർവർ തകരാർ കാരണം മുന്നോട്ട് പോകാനാവില്ല, കുറച്ചു കഴിഞ്ഞ് വീണ്ടും ശ്രമിക്കുക</string>
<string name="feature_apply_savings_error_too_many_attempts">ഒരുപാട് പരാജയപ്പെട്ട ശ്രമങ്ങൾ. ദയവായി പിന്നീട് വീണ്ടും ശ്രമിക്കുക.</string>
<string name="feature_apply_savings_error_submit_failed">സേവിംഗ്സ് അപേക്ഷ സമർപ്പിക്കുന്നതിൽ പരാജയപ്പെട്ടു. ദയവായി വീണ്ടും ശ്രമിക്കുക.</string>
<!-- Success Messages -->
<string name="feature_apply_savings_success_submit">സേവിംഗ്സ് അപേക്ഷ വിജയകരമായി സമർപ്പിച്ചു!</string>
<string name="feature_apply_savings_success_draft_saved">അപേക്ഷയുടെ ഡ്രാഫ്റ്റ് വിജയകരമായി സേവ് ചെയ്തു</string>
<!-- Dialog Titles & Messages -->
<string name="feature_apply_savings_unsaved_changes_title">സേവ് ചെയ്യാത്ത മാറ്റങ്ങൾ!</string>
<string name="feature_apply_savings_unsaved_changes_message">നിങ്ങൾക്ക് സേവ് ചെയ്യാത്ത മാറ്റങ്ങളുണ്ട്. നിങ്ങൾക്ക് തിരികെ പോകണമെന്ന് ഉറപ്പാണോ?</string>
<string name="feature_apply_savings_label_next">അടുത്തത്</string>
<string name="feature_apply_savings_error_currency_required">കറൻസി ആവശ്യമാണ്</string>
<string name="feature_apply_savings_error_minimum_opening_balance_required">മിനിമം ഓപ്പണിംഗ് ബാലൻസ് ആവശ്യമാണ്</string>
<string name="feature_apply_savings_error_lock_in_period_required">ലോക്ക്-ഇൻ കാലയളവ് ആവശ്യമാണ്</string>
<string name="feature_apply_savings_error_frequency_required">ആവൃത്തി ആവശ്യമാണ്</string>
<string name="feature_apply_savings_error_frequency_invalid">ദയവായി സാധുവായ ആവൃത്തി നൽകുക</string>
<string name="feature_apply_savings_status_success">വിജയകരമായി അപേക്ഷിച്ചു!</string>
<string name="feature_apply_savings_status_success_tip">നിങ്ങൾ %1$s-ൽ ഒരു സേവിംഗ്സ് അക്കൗണ്ടിനായി വിജയകരമായി അപേക്ഷിച്ചു.</string>
<string name="feature_apply_savings_status_success_action">തിരികെ ഹോമിലേക്ക്</string>
<string name="feature_apply_savings_status_failure">അപേക്ഷ സമർപ്പിക്കുന്നതിൽ പരാജയപ്പെട്ടു</string>
<string name="feature_apply_savings_status_failure_tip">%1$s-ൽ സേവിംഗ്സ് അക്കൗണ്ടിനായി അപേക്ഷിക്കുന്നതിൽ പരാജയപ്പെട്ടു.</string>
<string name="feature_apply_savings_status_failure_action">വീണ്ടും ശ്രമിക്കുക</string>
</resources>

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2026 Mifos Initiative
Copyright 2024 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,
@ -9,19 +9,202 @@
See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md
-->
<resources>
<!-- ... -->
<string name="change_app_theme">തീം മാറ്റുക</string>
<string name="settings">ക്രമീകരണങ്ങൾ</string>
<string name="change_passcode">പാസ്‌കോഡ് മാറ്റുക</string>
<string name="change_app_passcode">ആപ്പ് പാസ്‌കോഡ് മാറ്റുക</string>
<string name="change_password">പാസ്‌വേഡ് മാറ്റുക</string>
<string name="change_account_password">നിങ്ങളുടെ അക്കൗണ്ട് പാസ്‌വേഡ് മാറ്റുക</string>
<string name="language">ഭാഷ</string>
<string name="choose_language">നിങ്ങളുടെ ഭാഷ തിരഞ്ഞെടുക്കുക</string>
<string name="other">മറ്റുള്ളവ</string>
<string name="accounts">അക്കൗണ്ടുകൾ</string>
<string name="theme">തീം</string>
<string name="pref_base_url_title">എൻഡ്‌പോയിന്റ് അപ്‌ഡേറ്റ് ചെയ്യുക</string>
<string name="pref_base_url_desc">നിങ്ങളുടെ എൻഡ്‌പോയിന്റ് ക്രമീകരണങ്ങൾ മാറ്റാൻ ഇവിടെ ക്ലിക്ക് ചെയ്യുക</string>
<string name="enter_base_url">ബേസ് URL നൽകുക</string>
<string name="enter_tenant">ടെനന്റ് നൽകുക</string>
<string name="cancel">റദ്ദാക്കുക</string>
<string name="dialog_action_ok">ശരി</string>
<string name="base_url_tenant_id_required">ബേസ് URL-ഉം ടെനന്റ് ID-യും ആവശ്യമാണ്</string>
<string-array name="feature_settings_faq_answers">
<!-- ... -->
<item>ഏതെങ്കിലും വായ്പാ അക്കൗണ്ടിന് വേണ്ടിയുള്ള QR കോഡ് മറ്റുള്ള ഉപയോക്താക്കളുമായി പങ്കിടാം, അത് അവർക്ക് ഒരു ബെനിഫിഷ്യറിയെ സൃഷ്ടിക്കാൻ അനുവദിക്കും.</item>
<item>ഒരു ബെനിഫിഷ്യറിയെ സൃഷ്ടിക്കാൻ, ഹോം സ്ക്രീനിൽ നിന്ന് ബെനിഫിഷ്യറി ഐച്ഛികം തിരഞ്ഞെടുക്കുക, പിന്നീറ് താഴെ വലതുവശത്തുള്ള വൃത്താകൃതിയിലുള്ള ബട്ടൺ ക്ലിക്ക് ചെയ്യുക, സ്കാൻ ഐച്ഛികം തിരഞ്ഞെടുക്കുക എന്നത് നിങ്ങളുടെ ഉപകരണ ക്യാമറ തുറക്കും, ബെനിഫിഷ്യറിയെ സൃഷ്ടിക്കാൻ ആഗ്രഹിക്കുന്ന മറ്റൊരാളുടെ QR കോഡ് സ്കാൻ ചെയ്യുക, മറ്റുള്ള ആവശ്യമുള്ള വിവരങ്ങൾ പൂരിപ്പിച്ച ശേഷം നിങ്ങൾക്ക് QR കോഡ് ഉപയോഗിച്ച് ഒരു ബെനിഫിഷ്യറിയെ സൃഷ്ടിക്കാൻ കഴിയും.</item>
<item>ഒരു വായ്പാ അക്കൗണ്ടിനായി പേയ്മെന്റ് നടത്താൻ, അക്കൗണ്ട് വിഭാഗങ്ങളിലേക്ക് പോകുക, LOAN തിരഞ്ഞെടുക്കുക, പിന്നീറ് നിങ്ങളുടെ ആവശ്യമുള്ള വായ്പാ അക്കൗണ്ട് തുറക്കുക, പേയ്മെന്റ് നടത്തുക ഐച്ഛികം ക്ലിക്ക് ചെയ്യുക.</item>
<string name="feature_settings_action_profile">പ്രൊഫൈൽ</string>
<string name="feature_settings_action_profile_tip">ഇമെയിൽ, പേര്, ഫോൺ നമ്പർ എന്നിവ മാറ്റുക</string>
<string name="feature_settings_action_password">പാസ്‌വേഡ്</string>
<string name="feature_settings_action_password_tip">നിങ്ങളുടെ പഴയ പാസ്‌വേഡ് മാറ്റുക</string>
<string name="feature_settings_action_auth_passcode">ഓത്ത് പാസ്‌കോഡ്</string>
<string name="feature_settings_action_auth_passcode_tip">നിങ്ങളുടെ ലോഗിൻ ഓതറൈസേഷൻ പാസ്‌കോഡ് മാറ്റുക</string>
<string name="feature_settings_action_language">ഭാഷ</string>
<string name="feature_settings_action_language_tip">നിങ്ങളുടെ ആപ്പ് ഭാഷ തിരഞ്ഞെടുക്കുക</string>
<string name="feature_settings_action_theme">തീം</string>
<string name="feature_settings_action_theme_tip">നിങ്ങളുടെ ആപ്പ് തീം തിരഞ്ഞെടുക്കുക</string>
<string name="feature_settings_action_endpoint">എൻഡ്‌പോയിന്റ്</string>
<string name="feature_settings_action_endpoint_tip">നിങ്ങളുടെ എൻഡ്‌പോയിന്റ് ക്രമീകരണം മാറ്റുക</string>
<string name="feature_settings_action_about_us">ഞങ്ങളെക്കുറിച്ച്</string>
<string name="feature_settings_action_about_us_tip">ഞങ്ങളുടെ സംരംഭത്തെക്കുറിച്ച് കൂടുതൽ അറിയുക</string>
<string name="feature_settings_action_rate_us">ഞങ്ങളെ റേറ്റുചെയ്യുക</string>
<string name="feature_settings_action_rate_us_tip">പ്ലേസ്റ്റോറിൽ ഞങ്ങളുടെ ആപ്പ് റേറ്റുചെയ്യുക</string>
<string name="feature_settings_action_faq">പതിവുചോദ്യങ്ങൾ</string>
<string name="feature_settings_action_faq_tip">ഉപയോക്താക്കൾ ചോദിക്കുന്ന സാധാരണ ചോദ്യങ്ങൾ</string>
<string name="feature_settings_action_help">സഹായം</string>
<string name="feature_settings_action_help_tip">ഞങ്ങളുടെ കസ്റ്റമർ കെയറുമായി ചാറ്റ് ചെയ്യുക</string>
<string name="feature_settings_action_app_info">ആപ്പ് വിവരങ്ങൾ</string>
<string name="feature_settings_action_app_info_tip">ആപ്പ് പതിപ്പ് വിശദാംശങ്ങൾ കണ്ടെത്തുക</string>
<string name="feature_settings_action_logout">ലോഗൗട്ട് ചെയ്യുക</string>
<string name="feature_settings_action_logout_tip">ലോഗൗട്ട് ചെയ്യണമെന്ന് നിങ്ങൾക്ക് ഉറപ്പാണോ?</string>
<string name="feature_settings_logout_description">ലോഗൗട്ട് ചെയ്യുന്നത് സുരക്ഷാ കാരണങ്ങളാൽ നിങ്ങളുടെ നിലവിലെയും എല്ലാ സജീവ സെഷനുകളെയും അവസാനിപ്പിക്കും. നിങ്ങളുടെ അക്കൗണ്ട് ആക്‌സസ് ചെയ്യാൻ വീണ്ടും ലോഗിൻ ചെയ്യേണ്ടി വരും.</string>
<string name="feature_settings_logout_message">എനിക്ക് ലോഗൗട്ട് ചെയ്യേണ്ട?</string>
<string name="feature_settings_logout_action">ഹോമിലേക്ക്</string>
<string name="feature_settings_top_bar_title">ക്രമീകരണങ്ങൾ</string>
<string name="feature_settings_error_fetching_client">ക്ലയന്റ് വിവരങ്ങൾ ലഭ്യമാക്കുന്നതിൽ പരാജയപ്പെട്ടു.</string>
<string name="feature_settings_error_fetching_profile_image">പ്രൊഫൈൽ ചിത്രം ലഭ്യമാക്കുന്നതിൽ പരാജയപ്പെട്ടു.</string>
<string name="feature_settings_internet_not_connected">ഇന്റർനെറ്റ് കണക്ഷൻ ഇല്ല.</string>
<string name="feature_settings_error_invalid_profile_image">അസാധുവായ പ്രൊഫൈൽ ചിത്ര ഫോർമാറ്റ്.</string>
<string name="feature_settings_customer_account_no">ഉപഭോക്തൃ അക്കൗണ്ട്: %1$s</string>
<!-- About Screen -->
<string name="feature_settings_about_topbar_title">ഞങ്ങളെക്കുറിച്ച്</string>
<string name="feature_settings_about_mifos">മിഫോസ്</string>
<string name="feature_settings_about_logo_content_description">മിഫോസ് ചിത്രം</string>
<string name="feature_settings_about_who_are_we">ആരാണ് ഞങ്ങൾ?</string>
<string name="feature_settings_about_what_does_mifos_do">മിഫോസ് എന്താണ് ചെയ്യുന്നത്?</string>
<string name="feature_settings_about_who_are_we_desc">അടിസ്ഥാന സാമ്പത്തിക സേവനങ്ങൾ ആളുകൾക്ക് ലഭ്യമാക്കാൻ ശ്രമിക്കുന്ന ഒരു ലാഭരഹിത സംഘടനയാണ് മിഫോസ്. ഒരു ഓപ്പൺ സോഴ്‌സ് പ്ലാറ്റ്‌ഫോം വഴിയാണ് ഇത് ചെയ്യുന്നത്.</string>
<string name="feature_settings_about_point_1">ആധുനിക സാമ്പത്തിക സേവനങ്ങൾ നൽകാൻ ധനകാര്യ സ്ഥാപനങ്ങളെ ഇത് സഹായിക്കുന്നു</string>
<string name="feature_settings_about_point_2">വായ്പകൾ ലഭിക്കാനും, പണം ലാഭിക്കാനും, മറ്റും ആളുകളെ ഇത് പ്രാപ്തരാക്കുന്നു</string>
<string name="feature_settings_about_point_3">ലോകമെമ്പാടുമുള്ള ദശലക്ഷക്കണക്കിന് ആളുകളെ സേവിക്കുന്ന ധനകാര്യ സ്ഥാപനങ്ങളെ ഇത് പിന്തുണയ്ക്കുന്നു</string>
<string name="feature_settings_doubt">പതിവുചോദ്യങ്ങളിൽ നിരവധി സംശയങ്ങൾ പരിഹരിക്കപ്പെടുന്നു!</string>
<string name="feature_settings_doubt_message">ഇല്ല, ഞാൻ അവ പരിശോധിച്ചിട്ടില്ല, എന്നെ അവിടെ കൊണ്ടുപോകൂ!</string>
<string name="feature_settings_still_have_doubt">ഇപ്പോഴും സംശയങ്ങളുണ്ടോ?</string>
<string name="feature_settings_still_have_doubt_message">പ്രശ്നം നേരിടുന്നുണ്ടോ? വിഷമിക്കേണ്ട!\nഞങ്ങളുടെ കസ്റ്റമർ കെയറിൽ വിളിക്കുക.\nനിങ്ങളെ സഹായിക്കാൻ രാപ്പകൽ ഞങ്ങൾ ഇവിടെയുണ്ട്,\nഎല്ലാ ശരിയായി പ്രവർത്തിക്കുന്നുണ്ടെന്ന് ഉറപ്പാക്കാൻ!</string>
<string name="feature_settings_still_have_doubt_action">ഞങ്ങളെ വിളിക്കുക</string>
<string name="feature_settings_still_have_issue">പ്രശ്നങ്ങൾ മെയിൽ ചെയ്യണോ?</string>
<string name="feature_settings_still_have_issue_message">പിന്തുണ വേണോ, പക്ഷെ എഴുതാനാണോ താൽപ്പര്യം?\nഞങ്ങൾക്ക് ഇമെയിൽ അയക്കൂ, രാവെന്നോ പകലെന്നോ ഇല്ലാതെ.\nകരുതലോടെയു വേഗത്തിലും ഞങ്ങളുടെ ടീം മറുപടി നൽകും,\nനിങ്ങൾക്ക് ആവശ്യമായ സഹായം ലഭിക്കുന്നുണ്ടെന്ന് ഉറപ്പാക്കും!</string>
<string name="feature_settings_still_have_issue_action">ഞങ്ങൾക്ക് മെയിൽ ചെയ്യുക</string>
<!--App Info -->
<string name="feature_settings_appinfo_topbar_title">ആപ്പ് വിവരങ്ങൾ</string>
<string name="feature_settings_appinfo_mobile">മൊബൈൽ</string>
<string name="feature_settings_appinfo_logo_content_description">മിഫോസ് ചിത്രം</string>
<string name="feature_settings_appinfo_app_name">മിഫോസ് മൊബൈൽ</string>
<string name="feature_settings_appinfo_mifos_electonic_banking">മിഫോസ് ഇലക്ട്രോണിക് ബാങ്കിംഗ്</string>
<string name="feature_settings_appinfo_all_rights_reserved">എല്ലാ അവകാശങ്ങളും നിക്ഷിപ്തം</string>
<string name="feature_settings_appinfo_version">പതിപ്പ്</string>
<string name="feature_settings_appinfo_privacy_policy">സ്വകാര്യതാ നയം</string>
<string name="feature_settings_appinfo_terms_conditions">നിബന്ധനകളും വ്യവസ്ഥകളും</string>
<!-- //passcode screen-->
<string name="feature_settings_update_passcode">പാസ്‌കോഡ് അപ്‌ഡേറ്റ് ചെയ്യുക</string>
<string name="feature_settings_old_passcode">പഴയ പാസ്‌കോഡ്</string>
<string name="feature_settings_new_passcode">പുതിയ പാസ്‌കോഡ്</string>
<string name="feature_settings_confirm_new_passcode">പുതിയ പാസ്‌കോഡ് സ്ഥിരീകരിക്കുക</string>
<string name="feature_settings_authorization_passcode">ഓതറൈസേഷൻ പാസ്‌കോഡ്</string>
<string name="feature_settings_passcode_length_error">പാസ്‌കോഡിൽ 4 അക്കങ്ങൾ ഉണ്ടായിരിക്കണം.</string>
<string name="feature_settings_passcode_empty_error">പാസ്‌കോഡ് ശൂന്യമായിരിക്കരുത്.</string>
<string name="feature_settings_passcode_invalid_error">പാസ്‌കോഡിൽ അക്ഷരങ്ങൾ അടങ്ങിയിരിക്കരുത്.</string>
<string name="feature_settings_passcode_confirm_error">പുതിയതും സ്ഥിരീകരിച്ചതുമായ പാസ്‌കോഡ് ഒന്നായിരിക്കണം.</string>
<string name="feature_settings_passcode_old_passcode_error">പഴയ പാസ്‌കോഡ് സാധുവായതായിരിക്കണം.</string>
<string name="feature_settings_passcode_updated_successfully">പാസ്‌കോഡ് വിജയകരമായി അപ്‌ഡേറ്റ് ചെയ്തു.</string>
<string name="feature_settings_passcode_updated_message">ആപ്പ് സേവനങ്ങൾ ഉപയോഗിക്കുന്നതിന് നിങ്ങൾ പുതിയ പാസ്‌കോഡ് നൽകേണ്ടതുണ്ട്.</string>
<string name="feature_settings_next">അടുത്തത്</string>
<string name="feature_settings_update_password">പാസ്‌വേഡ് അപ്‌ഡേറ്റ് ചെയ്യുക</string>
<string name="feature_settings_old_password">പഴയ പാസ്‌വേഡ്</string>
<string name="feature_settings_new_password">പുതിയ പാസ്‌വേഡ്</string>
<string name="feature_settings_confirm_new_password">പുതിയ പാസ്‌വേഡ് സ്ഥിരീകരിക്കുക</string>
<!-- //password screen-->
<string name="password_empty_error">പാസ്‌വേഡ് ശൂന്യമായിരിക്കരുത്</string>
<string name="password_empty_error_repeat">തുടർച്ചയായി ആവർത്തിക്കുന്ന അക്ഷരങ്ങൾ അനുവദനീയമല്ല</string>
<string name="password_length_error">പാസ്‌വേഡിന് കുറഞ്ഞത് 12 അക്ഷരങ്ങളെങ്കിലും ഉണ്ടായിരിക്കണം</string>
<string name="password_current_incorrect_error">നിലവിലെ പാസ്‌വേഡ് തെറ്റാണ്</string>
<string name="password_validation_error">പാസ്‌വേഡ് സുരക്ഷാ ആവശ്യകതകൾ പാലിക്കുന്നില്ല</string>
<string name="password_same_as_current_error">പുതിയ പാസ്‌വേഡ് നിലവിലെ പാസ്‌വേഡിൽ നിന്ന് വ്യത്യസ്തമായിരിക്കണം</string>
<string name="password_personal_info_error">പാസ്‌വേഡിൽ വ്യക്തിഗത വിവരങ്ങൾ അടങ്ങിയിരിക്കരുത്</string>
<string name="password_confirm_mismatch_error">പാസ്‌വേഡുകൾ പൊരുത്തപ്പെടുന്നില്ല</string>
<string name="feature_settings_password">പാസ്‌വേഡ്</string>
<string name="password_too_many_attempts">വളരെയധികം പരാജയപ്പെട്ട ശ്രമങ്ങൾ. വീണ്ടും ശ്രമിക്കുന്നതിന് മുമ്പ് കാത്തിരിക്കുക.</string>
<string name="password_update_success">പാസ്‌വേഡ് വിജയകരമായി അപ്‌ഡേറ്റ് ചെയ്തു</string>
<string name="password_update_success_message">ആപ്പ് സേവനങ്ങൾ ഉപയോഗിക്കുന്നതിന് നിങ്ങൾ വീണ്ടും ലോഗിൻ ചെയ്യേണ്ടതുണ്ട്.</string>
<string name="password_update_failed">പാസ്‌വേഡ് അപ്‌ഡേറ്റ് ചെയ്യുന്നതിൽ പരാജയപ്പെട്ടു. വീണ്ടും ശ്രമിക്കുക</string>
<string name="password_update_dialog_button">ഇപ്പോൾ ലോഗിൻ ചെയ്യുക</string>
<!-- Faq -->
<string name="no_questions_found">ചോദ്യങ്ങളൊന്നും കണ്ടെത്തിയില്ല</string>
<string-array name="faq_qs">
<item>പുതിയ ലോൺ അക്കൗണ്ടിനായി എങ്ങനെ അപേക്ഷിക്കാം?</item>
<item>എന്റെ പ്രൊഫൈൽ വിവരങ്ങൾ എവിടെ കാണാൻ കഴിയും?</item>
<item>എന്റെ സേവിംഗ്സ് അക്കൗണ്ട് ഇടപാടുകൾ എവിടെ കാണാൻ കഴിയും?</item>
<item>QR കോഡ് കൊണ്ടുള്ള ഉപയോഗം എന്താണ്?</item>
<item>QR കോഡ് ഉപയോഗിച്ച് എങ്ങനെ ഒരു ഗുണഭോക്താവിനെ (beneficiary) സൃഷ്ടിക്കാം?</item>
<item>ഒരു ലോൺ അക്കൗണ്ടിലേക്ക് എങ്ങനെ പണമടയ്ക്കാം?</item>
</string-array>
<string-array name="faq_ans">
<item>വായ്പാ അക്കൗണ്ടിനായി അപേക്ഷിക്കാൻ, ഹോം സ്‌ക്രീനിൽ നൽകിയിരിക്കുന്ന "വായ്‌പയ്‌ക്ക് അപേക്ഷിക്കുക" ക്ലിക്ക് ചെയ്യുക.</item>
<item>ഹോം സ്‌ക്രീനിലുള്ള യൂസർ ഇമേജിൽ ക്ലിക്ക് ചെയ്‌ത് നിങ്ങൾക്ക് പ്രൊഫൈൽ വിവരങ്ങൾ കാണാനാകും.</item>
<item>സേവിംഗ്‌സ് അക്കൗണ്ട് ഇടപാടുകൾ കാണുന്നതിന്, അക്കൗണ്ട്‌സ് വിഭാഗത്തിലേക്ക് പോയി, ആവശ്യമുള്ള സേവിംഗ്‌സ് അക്കൗണ്ടിൽ ക്ലിക്ക് ചെയ്യുക, മുകളിൽ വലതുവശത്തുള്ള മൂന്ന് ഡോട്ടുകളിൽ ക്ലിക്ക് ചെയ്‌ത് ഇടപാടുകൾ (Transactions) ഓപ്‌ഷൻ തിരഞ്ഞെടുക്കുക.</item>
<item>ഏതൊരു വായ്പ അല്ലെങ്കിൽ സേവിംഗ്‌സ് അക്കൗണ്ടിനുമുള്ള QR കോഡ് മറ്റ് ഉപയോക്താക്കളുമായി പങ്കിടാം, ഇത് ഒരു ഗുണഭോക്താവിനെ (beneficiary) സൃഷ്ടിക്കാൻ അവരെ അനുവദിക്കും.</item>
<item>ഒരു ഗുണഭോക്താവിനെ സൃഷ്ടിക്കാൻ, ഹോം സ്‌ക്രീനിൽ നിന്ന് ബെനിഫിഷ്യറി ഓപ്ഷനിലേക്ക് പോകുക, താഴെ വലതുവശത്തുള്ള വട്ടത്തിലുള്ള ബട്ടൺ ക്ലിക്ക് ചെയ്യുക, സ്കാൻ ചെയ്യാനുള്ള ഓപ്ഷൻ തിരഞ്ഞെടുക്കുക (ഇത് ക്യാമറ തുറക്കും), ഗുണഭോക്താവിനെ ചേർക്കേണ്ട വ്യക്തിയുടെ QR കോഡ് സ്കാൻ ചെയ്യുക. ആവശ്യമായ മറ്റ് വിവരങ്ങൾ നൽകിയ ശേഷം QR കോഡ് ഉപയോഗിച്ച് നിങ്ങൾക്ക് ഗുണഭോക്താവിനെ സൃഷ്ടിക്കാൻ കഴിയും.</item>
<item>വായ്പാ അക്കൗണ്ടിലേക്ക് പണമടയ്ക്കാൻ, അക്കൗണ്ട്‌സ് വിഭാഗത്തിലേക്ക് പോയി, LOAN തിരഞ്ഞെടുക്കുക, ആവശ്യമുള്ള വായ്പാ അക്കൗണ്ട് തുറന്ന് 'Make Payment' ഓപ്ഷൻ ക്ലിക്ക് ചെയ്യുക.</item>
</string-array>
<string name="feature_settings_faq_doubt">ഇപ്പോഴും സംശയമുണ്ടോ?</string>
<string name="feature_settings_faq_contact_us"> ഞങ്ങളെ ബന്ധപ്പെടുക</string>
<!-- Change Language -->
<!-- Missing strings added from values-kn/values -->
<string name="password_key" translatable="false">Password</string>
<string name="core_common_default_system_language" translatable="false">default_system_language</string>
<string name="core_common_language_type" translatable="false">language_type</string>
<string-array name="languages" translatable="false">
<item>System Language</item>
<item>English</item>
<item>हिंदी</item>
<item>عربى</item>
<item>اُردُو</item>
<item>বাঙালি</item>
<item>Español</item>
<item>français</item>
<item>bahasa Indonesia</item>
<item>ភាសាខ្មែរ</item>
<item>ಕನ್ನಡ</item>
<item>తెలుగు</item>
<item>မြန်မာ</item>
<item>Polski</item>
<item>Português</item>
<item>русский</item>
<item>Kiswahili</item>
<item>فارسی</item>
<item>മലയാളം</item>
</string-array>
<string name="feature_settings_language">ഭാഷ</string>
<string name="feature_settings_change_language">ഭാഷ മാറ്റുക</string>
<!-- Theme Strings -->
<string name="feature_settings_theme_light">ലൈറ്റ് തീം</string>
<string name="feature_settings_theme_dark">ഡാർക്ക് തീം</string>
<string name="feature_settings_theme_system">സിസ്റ്റം തീം</string>
<string name="feature_settings_apply_theme">തീം പ്രയോഗിക്കുക</string>
<string name="feature_settings_theme_based_on_time">സമയത്തെ അടിസ്ഥാനമാക്കി</string>
<string name="feature_settings_theme_choose_dark_mode_time">ഡാർക്ക് മോഡ് സമയം തിരഞ്ഞെടുക്കുക</string>
<string name="feature_settings_theme_choose_dark_mode_starts_at">ഡാർക്ക് മോഡ് തുടങ്ങുന്ന സമയം</string>
<string name="feature_settings_theme_choose_dark_mode_ends_at">ഡാർക്ക് മോഡ് അവസാനിക്കുന്ന സമയം</string>
<string name="feature_settings_theme_apply">പ്രയോഗിക്കുക</string>
</resources>

View File

@ -50,6 +50,7 @@
<item>русский</item>
<item>Kiswahili</item>
<item>فارسی</item>
<item>മലയാളം</item>
</string-array>

View File

@ -0,0 +1,52 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2026 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 https://mozilla.org/MPL/2.0/.
See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md
-->
<resources>
<string name="feature_share_account_active">സജീവം</string>
<string name="feature_share_account_approved">അംഗീകരിച്ചു</string>
<string name="feature_share_account_approval_pending">അംഗീകാരം കാത്തിരിക്കുന്നു</string>
<string name="feature_share_account_closed">അടച്ചവ</string>
<string name="feature_share_account_rejected">നിരസിച്ചു</string>
<string name="feature_share_account_empty_share_accounts">നിങ്ങളുമായി ബന്ധപ്പെട്ട ഓഹരി അക്കൗണ്ടുകളൊന്നുമില്ല</string>
<string name="feature_share_account_dashboard">ഷെയർ അക്കൗണ്ട് ഡാഷ്ബോർഡ്</string>
<string name="feature_share_account">ഓഹരി അക്കൗണ്ട്</string>
<string name="feature_share_account_items">%1$d ഇനങ്ങൾ</string>
<string name="feature_share_account_generic_error_server">സെർവർ തകരാർ കാരണം മുന്നോട്ട് പോകാനാവില്ല, കുറച്ചു കഴിഞ്ഞ് വീണ്ടും ശ്രമിക്കുക</string>
<string name="feature_share_account_number">അക്കൗണ്ട് നമ്പർ</string>
<string name="feature_share_account_product_name">ഉൽപ്പന്നത്തിന്റെ പേര്</string>
<string name="feature_share_account_currency">കറൻസി</string>
<string name="feature_share_account_status">സ്റ്റാറ്റസ്</string>
<string name="feature_share_account_approved_shares">അംഗീകരിച്ച ഓഹരികൾ</string>
<string name="feature_share_account_pending_shares">അംഗീകാരം കാത്തിരിക്കുന്ന ഓഹരികൾ</string>
<string name="feature_share_account_market_price">വിപണി വില</string>
<string name="feature_share_account_application_date">അപേക്ഷ തീയതി</string>
<string name="feature_share_account_activation_date">ആക്ടിവേഷൻ തീയതി</string>
<string name="feature_share_account_details_top_bar_title">ഓഹരി അക്കൗണ്ട് വിവരങ്ങൾ</string>
<string name="feature_share_account_details_action">പ്രവർത്തനങ്ങൾ</string>
<string name="feature_share_account_action_charges">ചാർജുകൾ</string>
<string name="feature_share_account_action_charges_subtitle">അക്കൗണ്ട് ചാർജുകൾ കാണുക</string>
<string name="feature_share_account_action_transactions">ഇടപാടുകൾ</string>
<string name="feature_share_account_action_transactions_subtitle">വാങ്ങിയ ചരിത്രം കാണുക</string>
<string name="feature_share_account_action_qr_code">QR കോഡ്</string>
<string name="feature_share_account_action_qr_code_subtitle">അക്കൗണ്ട് വിവരങ്ങൾ പങ്കിടുക</string>
<string name="feature_share_account_purchased_shares">വാങ്ങിയ ഓഹരികൾ</string>
<string name="feature_share_account_purchased_date">വാങ്ങിയ തീയതി</string>
</resources>

View File

@ -26,7 +26,6 @@ import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import mifos_mobile.feature.share_account.generated.resources.Res
import mifos_mobile.feature.share_account.generated.resources.feature_share_account_details_action
@ -40,6 +39,7 @@ import org.mifos.mobile.core.designsystem.component.MifosElevatedScaffold
import org.mifos.mobile.core.designsystem.theme.AppColors
import org.mifos.mobile.core.designsystem.theme.DesignToken
import org.mifos.mobile.core.designsystem.theme.MifosTypography
import org.mifos.mobile.core.model.LoanStatus
import org.mifos.mobile.core.model.enums.ChargeType
import org.mifos.mobile.core.ui.component.MifosActionCard
import org.mifos.mobile.core.ui.component.MifosErrorComponent
@ -49,6 +49,7 @@ import org.mifos.mobile.core.ui.component.MifosProgressIndicator
import org.mifos.mobile.core.ui.utils.EventsEffect
import org.mifos.mobile.core.ui.utils.ScreenUiState
import org.mifos.mobile.feature.shareaccount.component.ShareActionItems
import template.core.base.designsystem.theme.KptTheme
@Composable
internal fun ShareAccountDetailsScreen(
@ -130,7 +131,6 @@ internal fun ShareAccountDetailsContent(
) {
AccountDetailsGrid(
details = state.displayItems,
isActive = state.isActive,
)
ShareAccountActions(
@ -148,7 +148,6 @@ internal fun ShareAccountDetailsContent(
internal fun AccountDetailsGrid(
label: StringResource? = null,
details: List<LabelValueItem>? = emptyList(),
isActive: Boolean = false,
) {
Column(
modifier = Modifier.fillMaxWidth(),
@ -170,13 +169,21 @@ internal fun AccountDetailsGrid(
) {
details.forEach { item ->
MifosLabelValueCard(
modifier = Modifier.height(64.dp).weight(1f),
modifier = Modifier
.height(DesignToken.sizes.cardDp64)
.weight(1f),
label = stringResource(item.label),
value = item.value,
color = if (isActive && item.label == Res.string.feature_share_account_status) {
AppColors.customEnable
color = if (item.label == Res.string.feature_share_account_status) {
when (item.value) {
LoanStatus.ACTIVE.status -> AppColors.customEnable
LoanStatus.SUBMIT_AND_PENDING_APPROVAL.status -> AppColors.customYellow
LoanStatus.WITHDRAWN.status, LoanStatus.MATURED.status ->
KptTheme.colorScheme.error
else -> KptTheme.colorScheme.secondary
}
} else {
MaterialTheme.colorScheme.onBackground
KptTheme.colorScheme.secondary
},
)
}

View File

@ -0,0 +1,66 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2026 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 https://mozilla.org/MPL/2.0/.
See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md
-->
<resources>
<!-- Top Bar -->
<string name="feature_share_title">ഓഹരി അപേക്ഷ വിവരങ്ങൾ</string>
<string name="feature_share_navigation_back">തിരികെ</string>
<!-- Form Labels -->
<string name="feature_share_label_applicant_name">അപേക്ഷകന്റെ പേര്</string>
<string name="feature_share_label_submission_date">സമർപ്പിച്ച തീയതി</string>
<string name="feature_share_label_product_name">ഉൽപ്പന്നത്തിന്റെ പേര്</string>
<!-- Buttons -->
<string name="feature_share_button_next">അടുത്തത്</string>
<string name="feature_apply_share_error_server">സെർവർ തകരാർ കാരണം മുന്നോട്ട് പോകാനാവില്ല, കുറച്ചു കഴിഞ്ഞ് വീണ്ടും ശ്രമിക്കുക</string>
<string name="feature_apply_share_error_too_many_attempts">ഒരുപാട് പരാജയപ്പെട്ട ശ്രമങ്ങൾ. ദയവായി പിന്നീട് വീണ്ടും ശ്രമിക്കുക.</string>
<string name="feature_apply_share_error_submit_failed">ഓഹരി അപേക്ഷ സമർപ്പിക്കുന്നതിൽ പരാജയപ്പെട്ടു. ദയവായി വീണ്ടും ശ്രമിക്കുക.</string>
<string name="feature_apply_share_unsaved_changes_title">സേവ് ചെയ്യാത്ത മാറ്റങ്ങൾ!</string>
<string name="feature_apply_share_unsaved_changes_message">നിങ്ങൾക്ക് സേവ് ചെയ്യാത്ത മാറ്റങ്ങളുണ്ട്. നിങ്ങൾക്ക് തിരികെ പോകണമെന്ന് ഉറപ്പാണോ?</string>
<string name="feature_share_no_products_available">ഓഹരി അക്കൗണ്ടിന് അപേക്ഷിക്കാൻ ഓഹരി ഉൽപ്പന്നങ്ങൾ ലഭ്യമല്ല</string>
<string name="feature_apply_share_label_terms">നിബന്ധനകൾ</string>
<string name="feature_apply_share_label_currency">കറൻസി</string>
<string name="feature_apply_share_label_current_price">നിലവിലെ വില</string>
<string name="feature_apply_share_label_total_number_of_shares">ആകെ ഓഹരികളുടെ എണ്ണം</string>
<string name="feature_apply_share_label_default_savings_account">ഡിഫോൾട്ട് സേവിംഗ്സ് അക്കൗണ്ട്</string>
<string name="feature_apply_share_label_minimum_active_period">കുറഞ്ഞ സജീവ കാലയളവ്</string>
<string name="feature_apply_share_section_minimum_active_period">കുറഞ്ഞ സജീവ കാലയളവ്</string>
<string name="feature_apply_share_label_minimum_frequency">ആവൃത്തി</string>
<string name="feature_apply_share_label_minimum_frequency_type">ആവൃത്തി തരം</string>
<string name="feature_apply_share_label_lockin_period">ലോക്ക്-ഇൻ കാലയളവ്</string>
<string name="feature_apply_share_section_lockin_period">ലോക്ക്-ഇൻ കാലയളവ്</string>
<string name="feature_apply_share_label_lockin_frequency">ആവൃത്തി</string>
<string name="feature_apply_share_label_lockin_frequency_type">ആവൃത്തി തരം</string>
<string name="feature_apply_share_error_frequency_required">ആവൃത്തി ആവശ്യമാണ്</string>
<string name="feature_apply_share_frequency_invalid">ദയവായി സാധുവായ ആവൃത്തി നൽകുക</string>
<string name="feature_apply_share_error_shares_required">ഓഹരികൾ ആവശ്യമാണ്</string>
<string name="feature_apply_share_shares_invalid">ദയവായി സാധുവായ ഓഹരികൾ നൽകുക</string>
<string name="feature_apply_share_error_price_required">വില ആവശ്യമാണ്</string>
<string name="feature_apply_share_price_invalid">ദയവായി സാധുവായ വില നൽകുക</string>
<string name="feature_apply_share_status_failure">അപേക്ഷ സമർപ്പിക്കുന്നതിൽ പരാജയപ്പെട്ടു</string>
<string name="feature_apply_share_status_failure_tip">%1$s-ൽ ഓഹരി അക്കൗണ്ടിനായി അപേക്ഷിക്കുന്നതിൽ പരാജയപ്പെട്ടു</string>
<string name="feature_apply_share_status_failure_action">വീണ്ടും ശ്രമിക്കുക</string>
<string name="feature_apply_share_status_success">വിജയകരമായി അപേക്ഷിച്ചു!</string>
<string name="feature_apply_share_status_success_tip">നിങ്ങൾ %1$s-ൽ ഒരു ഓഹരി അക്കൗണ്ടിനായി വിജയകരമായി അപേക്ഷിച്ചു</string>
<string name="feature_apply_share_status_success_action">തിരികെ ഹോമിലേക്ക്</string>
</resources>

View File

@ -0,0 +1,31 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2026 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 https://mozilla.org/MPL/2.0/.
See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md
-->
<resources>
<!-- Error messages -->
<string name="feature_tpt_error_amount_required">തുക ആവശ്യമാണ്</string>
<string name="feature_tpt_error_amount_invalid">ദയവായി ശരിയായ തുക നൽകുക</string>
<string name="feature_tpt_error_remarks_empty">റിമാർക്സ് ശൂന്യമായി ഇടരുത്</string>
<string name="feature_tpt_error_remarks_invalid">നൽകിയ റിമാർക്സ് അസാധുവാണ്</string>
<string name="feature_tpt_error_server">സെർവർ തകരാർ കാരണം മുന്നോട്ട് പോകാനാവില്ല, കുറച്ചു കഴിഞ്ഞ് വീണ്ടും ശ്രമിക്കുക</string>
<string name="feature_tpt_error_amount_exceeds_balance">തുക ലഭ്യമായ ബാലൻസിനേക്കാൾ കൂടുതലാണ്</string>
<!-- Labels -->
<string name="feature_tpt_label_origin_account">ഉറവിട അക്കൗണ്ട്</string>
<string name="feature_tpt_label_origin_account_hint">മറ്റൊരു പേയ്‌മെന്റ് അക്കൗണ്ട് തിരഞ്ഞെടുക്കുക</string>
<string name="feature_tpt_label_destination">ലക്ഷ്യ അക്കൗണ്ട്</string>
<string name="feature_tpt_label_amount">തുക</string>
<string name="feature_tpt_label_remarks">റിമാർക്സ്</string>
<string name="feature_tpt_tip">ലക്ഷ്യ അക്കൗണ്ട് കണ്ടെത്തുന്നില്ലേ?</string>
<string name="feature_tpt_tip_action">ഗുണഭോക്താവിനെ ചേർക്കുക!</string>
<!-- Button texts -->
<string name="feature_tpt_transfer_button">തുക കൈമാറൂ</string>
</resources>

View File

@ -15,6 +15,7 @@
<string name="feature_tpt_error_remarks_empty">Remarks cannot be empty</string>
<string name="feature_tpt_error_remarks_invalid">Invalid remarks entered</string>
<string name="feature_tpt_error_server">Server issue from our side cannot proceed further, Try again after a moment</string>
<string name="feature_tpt_error_amount_exceeds_balance">Amount exceeds available balance </string>
<!-- Labels -->
<string name="feature_tpt_label_origin_account">Origin Account</string>
@ -24,7 +25,6 @@
<string name="feature_tpt_label_remarks">Remarks</string>
<string name="feature_tpt_tip">Not finding destination account?</string>
<string name="feature_tpt_tip_action">Add Beneficiary!</string>
<!-- Button texts -->
<string name="feature_tpt_transfer_button">Transfer Amount</string>

View File

@ -42,6 +42,7 @@ import mifos_mobile.feature.third_party_transfer.generated.resources.feature_tpt
import mifos_mobile.feature.third_party_transfer.generated.resources.feature_tpt_transfer_button
import org.jetbrains.compose.resources.stringResource
import org.koin.compose.viewmodel.koinViewModel
import org.mifos.mobile.core.common.formatAmount
import org.mifos.mobile.core.designsystem.component.BasicDialogState
import org.mifos.mobile.core.designsystem.component.MifosBasicDialog
import org.mifos.mobile.core.designsystem.component.MifosButton
@ -50,7 +51,6 @@ import org.mifos.mobile.core.designsystem.component.MifosOutlinedTextField
import org.mifos.mobile.core.designsystem.component.MifosTextFieldConfig
import org.mifos.mobile.core.designsystem.icon.MifosIcons
import org.mifos.mobile.core.designsystem.theme.DesignToken
import org.mifos.mobile.core.designsystem.theme.MifosTypography
import org.mifos.mobile.core.ui.component.MifosDropDownDoubleTextField
import org.mifos.mobile.core.ui.component.MifosErrorComponent
import org.mifos.mobile.core.ui.component.MifosPayFromDropdownUI
@ -214,17 +214,41 @@ internal fun TptForm(
modifier = modifier
.padding(KptTheme.spacing.md)
.verticalScroll(rememberScrollState()),
verticalArrangement = Arrangement.spacedBy(DesignToken.padding.largeIncreased),
verticalArrangement = Arrangement.spacedBy(KptTheme.spacing.md),
) {
MifosPayFromDropdownUI(
accounts = state.fromAccountOptions.map
{ Pair(it.accountNo ?: "", it.clientName ?: "") },
onAccountSelected = { account, balance ->
onAction(TptAction.OnFromAccountSelected(account))
onAccountSelected = { accountNo, _ ->
val selectedAccount = state.fromAccountOptions
.firstOrNull { it.accountNo == accountNo }
if (selectedAccount == null) {
return@MifosPayFromDropdownUI
}
val accountId = selectedAccount.accountId
if (accountId == null) {
return@MifosPayFromDropdownUI
}
onAction(
TptAction.OnFromAccountSelected(
accountId = accountId.toLong(),
accountNo = accountNo,
),
)
},
label = stringResource(Res.string.feature_tpt_label_origin_account),
selectedAccountNo = state.fromAccount?.accountNo ?: "",
selectedAccountName = state.fromAccount?.clientName ?: "",
showExtendedDetails = true,
productName = state.fromAccountDetails?.savingsProductName,
availableBalance = state.fromAccountBalance?.let { formatAmount(it) },
isBalanceLoading = state.isBalanceLoading,
balanceError = state.balanceError,
)
MifosDropDownDoubleTextField(
@ -249,7 +273,7 @@ internal fun TptForm(
) {
Text(
text = stringResource(Res.string.feature_tpt_tip),
style = MifosTypography.labelMedium,
style = KptTheme.typography.labelMedium,
color = KptTheme.colorScheme.secondary,
)
@ -259,7 +283,7 @@ internal fun TptForm(
onAction(TptAction.OnAddBeneficiaryClicked)
},
text = stringResource(Res.string.feature_tpt_tip_action),
style = MifosTypography.labelMedium,
style = KptTheme.typography.labelMedium,
color = KptTheme.colorScheme.primary,
)
}
@ -269,7 +293,7 @@ internal fun TptForm(
onValueChange = { onAction(TptAction.OnAmountChanged(it)) },
label = stringResource(Res.string.feature_tpt_label_amount),
shape = KptTheme.shapes.medium,
textStyle = MifosTypography.bodyLarge,
textStyle = KptTheme.typography.bodyLarge,
config = MifosTextFieldConfig(
isError = state.amountError != null,
errorText = state.amountError?.let {
@ -297,7 +321,7 @@ internal fun TptForm(
onValueChange = { onAction(TptAction.OnRemarksChanged(it)) },
label = stringResource(Res.string.feature_tpt_label_remarks),
shape = KptTheme.shapes.medium,
textStyle = MifosTypography.bodyLarge,
textStyle = KptTheme.typography.bodyLarge,
config = MifosTextFieldConfig(
isError = state.remarkError != null,
errorText = state.remarkError?.let {
@ -329,7 +353,7 @@ internal fun TptForm(
) {
Text(
text = stringResource(Res.string.feature_tpt_transfer_button),
style = MifosTypography.titleMedium,
style = KptTheme.typography.titleMedium,
)
}
}

View File

@ -16,21 +16,26 @@ import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
import mifos_mobile.feature.third_party_transfer.generated.resources.Res
import mifos_mobile.feature.third_party_transfer.generated.resources.feature_tpt_error_amount_exceeds_balance
import mifos_mobile.feature.third_party_transfer.generated.resources.feature_tpt_error_amount_invalid
import mifos_mobile.feature.third_party_transfer.generated.resources.feature_tpt_error_amount_required
import mifos_mobile.feature.third_party_transfer.generated.resources.feature_tpt_error_remarks_empty
import mifos_mobile.feature.third_party_transfer.generated.resources.feature_tpt_error_remarks_invalid
import mifos_mobile.feature.third_party_transfer.generated.resources.feature_tpt_error_server
import org.jetbrains.compose.resources.StringResource
import org.mifos.mobile.core.common.DataState
import org.mifos.mobile.core.data.repository.SavingsAccountRepository
import org.mifos.mobile.core.data.repository.ThirdPartyTransferRepository
import org.mifos.mobile.core.data.util.NetworkMonitor
import org.mifos.mobile.core.datastore.UserPreferencesRepository
import org.mifos.mobile.core.model.entity.accounts.savings.SavingsWithAssociations
import org.mifos.mobile.core.model.entity.payload.ReviewTransferPayload
import org.mifos.mobile.core.model.entity.templates.account.AccountOption
import org.mifos.mobile.core.model.entity.templates.account.AccountOptionsTemplate
import org.mifos.mobile.core.model.enums.AccountType
import org.mifos.mobile.core.ui.utils.BaseViewModel
import org.mifos.mobile.core.ui.utils.ScreenUiState
import org.mifos.mobile.core.ui.utils.ValidationHelper
/**
* ViewModel for the Make Transfer screen.
@ -42,7 +47,9 @@ import org.mifos.mobile.core.ui.utils.ScreenUiState
* @param networkMonitor A utility to monitor network connectivity.
* @param userPreferencesRepositoryImpl The repository for accessing user preferences, like client ID.
*/
@Suppress("TooManyFunctions")
internal class TptViewModel(
private val savingsAccountRepositoryImpl: SavingsAccountRepository,
private val thirdPartyTransferRepositoryImpl: ThirdPartyTransferRepository,
private val networkMonitor: NetworkMonitor,
private val userPreferencesRepositoryImpl: UserPreferencesRepository,
@ -108,7 +115,10 @@ internal class TptViewModel(
is TptAction.OnToAccountSelected -> handleToAccountChange(action.accountNo)
is TptAction.OnFromAccountSelected -> handleFromAccountChange(action.accountNo)
is TptAction.OnFromAccountSelected -> handleFromAccountChange(
accountId = action.accountId,
accountNo = action.accountNo,
)
is TptAction.OnAmountChanged -> handleAmountChange(action.amount)
@ -132,6 +142,10 @@ internal class TptViewModel(
handleTransferTemplateResult(action.dataState)
TptAction.OnRetry -> retry()
is TptAction.Internal.FetchSavingsBalance -> fetchSavingsBalance(action.accountId)
is TptAction.Internal.ReceiveSavingsBalance -> handleSavingsBalanceResult(action.dataState)
}
}
@ -157,22 +171,109 @@ internal class TptViewModel(
* 1. Finding the selected account from the full list of 'from' accounts.
* 2. Filtering the list of 'to' (destination) accounts to exclude the selected 'from' account.
*
* @param fromAccount The account number of the selected 'from' account.
* @param accountId The unique identifier of the selected origin savings account.
* @param accountNo The account number of the selected origin savings account.
*/
private fun handleFromAccountChange(fromAccount: String) {
val fromAccountSelected = state.accountOptionsTemplate.fromAccountOptions
private fun handleFromAccountChange(
accountId: Long,
accountNo: String,
) {
val fromAccountSelected =
state.accountOptionsTemplate.fromAccountOptions
.filterSavingsAccounts()
.find { it.accountNo == fromAccount }
.find { it.accountNo == accountNo }
val toAccounts = state.accountOptionsTemplate.toAccountOptions
.filter { it.accountNo != fromAccount }
val toAccounts =
state.accountOptionsTemplate.toAccountOptions
.filter { it.accountNo != accountNo }
updateState {
it.copy(
fromAccount = fromAccountSelected,
fromAccountBalance = null,
fromAccountDetails = null,
isBalanceLoading = true,
balanceError = false,
toAccountOptions = toAccounts,
)
}
viewModelScope.launch {
sendAction(
TptAction.Internal.FetchSavingsBalance(accountId),
)
}
}
/**
* Fetches detailed savings account information for the selected origin account.
*
* This function triggers an asynchronous request to retrieve account details,
* including the available balance, which is required for validating transfer
* amounts and displaying origin account information in the UI.
*
* @param accountId The unique identifier of the selected savings account.
*/
private fun fetchSavingsBalance(accountId: Long) {
viewModelScope.launch {
savingsAccountRepositoryImpl
.getSavingsWithAssociations(
accountId = accountId,
associationType = null,
)
.collect { result ->
sendAction(
TptAction.Internal.ReceiveSavingsBalance(result),
)
}
}
}
/**
* Handles the result of fetching savings account details.
*
* This function updates the UI state based on the loading, error, or success
* outcome of the savings account details request. On success, it stores the
* account details and available balance, and re-validates the transfer amount
* against the fetched balance.
*
* @param dataState The result of the savings account details fetch operation.
*/
private fun handleSavingsBalanceResult(
dataState: DataState<SavingsWithAssociations>,
) {
when (dataState) {
is DataState.Loading -> updateState {
it.copy(isBalanceLoading = true)
}
is DataState.Error -> updateState {
it.copy(
isBalanceLoading = false,
balanceError = true,
)
}
is DataState.Success -> {
val savings = dataState.data
val balance = savings.summary?.accountBalance
val amountResult = validateAmount(state.amount)
updateState {
it.copy(
isBalanceLoading = false,
fromAccountDetails = savings,
fromAccountBalance = balance,
amountError = if (amountResult is ValidationResult.Error) {
amountResult.message
} else {
null
},
)
}
}
}
}
/**
@ -312,10 +413,27 @@ internal class TptViewModel(
* @param amount The string amount to validate.
* @return A [ValidationResult] indicating success or an error.
*/
private fun validateAmount(amount: String) = when {
amount.isBlank() -> ValidationResult.Error(Res.string.feature_tpt_error_amount_required)
amount.toDoubleOrNull() == null -> ValidationResult.Error(Res.string.feature_tpt_error_amount_invalid)
else -> ValidationResult.Success
@Suppress("ReturnCount")
private fun validateAmount(amount: String): ValidationResult {
if (amount.isBlank()) {
return ValidationResult.Error(
Res.string.feature_tpt_error_amount_required,
)
}
val value = amount.toDoubleOrNull()
?: return ValidationResult.Error(
Res.string.feature_tpt_error_amount_invalid,
)
val balance = state.fromAccountBalance
if (balance != null && value > balance) {
return ValidationResult.Error(
Res.string.feature_tpt_error_amount_exceeds_balance,
)
}
return ValidationResult.Success
}
/**
@ -329,6 +447,9 @@ internal class TptViewModel(
remark.isEmpty() ->
ValidationResult.Error(Res.string.feature_tpt_error_remarks_empty)
!ValidationHelper.isValidName(remark) ->
ValidationResult.Error(Res.string.feature_tpt_error_remarks_invalid)
else -> ValidationResult.Success
}
@ -479,6 +600,10 @@ internal data class TptState(
var toAccountOptions: List<AccountOption> = emptyList(),
val fromAccount: AccountOption? = null,
val toAccount: AccountOption? = null,
val fromAccountBalance: Double? = null,
val isBalanceLoading: Boolean = false,
val balanceError: Boolean = false,
val fromAccountDetails: SavingsWithAssociations? = null,
val dialogState: DialogState? = null,
val networkStatus: Boolean = false,
@ -500,12 +625,14 @@ internal data class TptState(
* It requires a valid 'from' account, a valid 'to' account, a non-blank amount and remark,
* and no validation errors.
*/
val isEnabled: Boolean = fromAccount != null &&
val isEnabled: Boolean =
fromAccount != null &&
toAccount != null &&
amount.isNotBlank() &&
remark.isNotBlank() &&
amountError == null &&
remarkError == null
remarkError == null &&
fromAccountBalance != null
}
/**
@ -517,7 +644,10 @@ internal sealed interface TptAction {
data class OnToAccountSelected(val accountNo: String) : TptAction
/** Action triggered when a 'from' account is selected. @property accountNo The account number selected. */
data class OnFromAccountSelected(val accountNo: String) : TptAction
data class OnFromAccountSelected(
val accountId: Long,
val accountNo: String,
) : TptAction
/** Action triggered when the transfer amount is changed. @property amount The new amount string. */
data class OnAmountChanged(val amount: String) : TptAction
@ -554,8 +684,12 @@ internal sealed interface TptAction {
* Internal action representing the result of fetching account options.
* @property dataState The result of the fetch operation.
*/
data class ReceiveTransferTemplateResult(val dataState: DataState<AccountOptionsTemplate>) :
Internal
data class ReceiveTransferTemplateResult(val dataState: DataState<AccountOptionsTemplate>) : Internal
data class FetchSavingsBalance(val accountId: Long) : Internal
data class ReceiveSavingsBalance(
val dataState: DataState<SavingsWithAssociations>,
) : Internal
}
}

View File

@ -0,0 +1,42 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2026 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 https://mozilla.org/MPL/2.0/.
See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md
-->
<resources>
<string name="transfer">കൈമാറുക</string>
<string name="transferred_successfully">വിജയകരമായി കൈമാറി</string>
<string name="amount">തുക</string>
<string name="transfer_from_savings">സേവിംഗ്സിൽ നിന്ന് കൈമാറുക</string>
<string name="pay_from">ഇതിൽ നിന്ന് പണമടയ്ക്കുക</string>
<string name="date">തീയതി</string>
<string name="cancel">റദ്ദാക്കുക</string>
<string name="remark">റിമാർക്സ്</string>
<string name="make_transfer">കൈമാറ്റം നടത്തുക</string>
<string name="pay_to">ഇതിലേക്ക് പണമടയ്ക്കുക</string>
<string name="remarks">റിമാർക്സ്</string>
<string name="error_icon_description">പിശക്</string>
<string name="error_description">തുകയിൽ അസാധുവായ അക്ഷരങ്ങൾ അടങ്ങരുത്</string>
<string name="transfer_failed">കൈമാറ്റം പരാജയപ്പെട്ടു</string>
<string name="transfer_successful">കൈമാറ്റം വിജയിച്ചു</string>
<string name="back_to_accounts">ഹോം സ്‌ക്രീനിലേക്ക് മടങ്ങുക</string>
<string name="transfer_id_prefix">ട്രാൻസ്ഫർ ഐഡി:</string>
<string name="feature_make_transfer_error_amount_required">തുക ആവശ്യമാണ്</string>
<string name="feature_make_transfer_error_amount_invalid">ദയവായി ശരിയായ തുക നൽകുക</string>
<string name="feature_make_transfer_error_remarks_empty">റിമാർക്സ് ശൂന്യമായി ഇടരുത്</string>
<string name="feature_make_transfer_error_remarks_invalid">നൽകിയ റിമാർക്സ് അസാധുവാണ്</string>
<string name="feature_make_transfer_error_server">സെർവർ തകരാർ കാരണം മുന്നോട്ട് പോകാനാവില്ല, കുറച്ചു കഴിഞ്ഞ് വീണ്ടും ശ്രമിക്കുക</string>
<string name="feature_make_transfer_account_number">അക്കൗണ്ട് നമ്പർ</string>
<string name="feature_make_transfer_customer_name">ഉപഭോക്താവിന്റെ പേര്</string>
<string name="feature_make_transfer_beneficiary_name">ഗുണഭോക്താവിന്റെ പേര്</string>
<string name="feature_make_transfer_details">കൈമാറ്റ വിവരങ്ങൾ</string>
</resources>