diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs
index 1cc91fb5c9adff0eb2a6350fedb3b4fdea4a737c..ec683df69ba10a621322aff504d8310e4974c206 100644
--- a/.git-blame-ignore-revs
+++ b/.git-blame-ignore-revs
@@ -8,5 +8,27 @@
#
# $ git config blame.ignoreRevsFile .git-blame-ignore-revs
-# Reformat all files with Black and flake8
-fbfe3de6a2a90654aa1fdc9f4832b297363dc4bb
+# Replace use of Class.extend with native JS class
+1fe891b287a1b3f225d29ee3d07e7b1824aba9e7
+
+# This commit just changes spaces to tabs for indentation in some files
+5f473611bd6ed57703716244a054d3fb5ba9cd23
+
+# Whitespace fix throughout codebase
+4551d7d6029b6f587f6c99d4f8df5519241c6a86
+b147b85e6ac19a9220cd1e2958a6ebd99373283a
+
+# sort and cleanup imports
+915b34391c2066dfc83e60a5813c5a877cebe7ac
+
+# removing six compatibility layer
+8fe5feb6a4372bf5f2dfaf65fca41bbcc25c8ce7
+
+# bulk format python code with black
+494bd9ef78313436f0424b918f200dab8fc7c20b
+
+# bulk format python code with black
+baec607ff5905b1c67531096a9cf50ec7ff00a5d
+
+# bulk refactor with sourcery
+21a5111114e9d0f676bca4ff092c9b3456d5bf96
diff --git a/erpnext/__init__.py b/erpnext/__init__.py
index 10da6b023312395aec6f9b9e308270dd43de5959..786162c0cac9c9a791ec4d7aa645789ef85116db 100644
--- a/erpnext/__init__.py
+++ b/erpnext/__init__.py
@@ -47,7 +47,7 @@ def get_company_currency(company):
"""Returns the default company currency"""
if not frappe.flags.company_currency:
frappe.flags.company_currency = {}
- if not company in frappe.flags.company_currency:
+ if company not in frappe.flags.company_currency:
frappe.flags.company_currency[company] = frappe.db.get_value(
"Company", company, "default_currency", cache=True
)
@@ -81,7 +81,7 @@ def is_perpetual_inventory_enabled(company):
if not hasattr(frappe.local, "enable_perpetual_inventory"):
frappe.local.enable_perpetual_inventory = {}
- if not company in frappe.local.enable_perpetual_inventory:
+ if company not in frappe.local.enable_perpetual_inventory:
frappe.local.enable_perpetual_inventory[company] = (
frappe.get_cached_value("Company", company, "enable_perpetual_inventory") or 0
)
@@ -96,7 +96,7 @@ def get_default_finance_book(company=None):
if not hasattr(frappe.local, "default_finance_book"):
frappe.local.default_finance_book = {}
- if not company in frappe.local.default_finance_book:
+ if company not in frappe.local.default_finance_book:
frappe.local.default_finance_book[company] = frappe.get_cached_value(
"Company", company, "default_finance_book"
)
@@ -108,7 +108,7 @@ def get_party_account_type(party_type):
if not hasattr(frappe.local, "party_account_types"):
frappe.local.party_account_types = {}
- if not party_type in frappe.local.party_account_types:
+ if party_type not in frappe.local.party_account_types:
frappe.local.party_account_types[party_type] = (
frappe.db.get_value("Party Type", party_type, "account_type") or ""
)
diff --git a/erpnext/accounts/deferred_revenue.py b/erpnext/accounts/deferred_revenue.py
index bef18ee1db484396a5af2289efda3cc22b5e23e0..487ab9662bac9179c064b31ddf08247d7b6f2da8 100644
--- a/erpnext/accounts/deferred_revenue.py
+++ b/erpnext/accounts/deferred_revenue.py
@@ -232,7 +232,7 @@ def calculate_monthly_amount(
if amount + already_booked_amount_in_account_currency > item.net_amount:
amount = item.net_amount - already_booked_amount_in_account_currency
- if not (get_first_day(start_date) == start_date and get_last_day(end_date) == end_date):
+ if get_first_day(start_date) != start_date or get_last_day(end_date) != end_date:
partial_month = flt(date_diff(end_date, start_date)) / flt(
date_diff(get_last_day(end_date), get_first_day(start_date))
)
diff --git a/erpnext/accounts/doctype/account/account.json b/erpnext/accounts/doctype/account/account.json
index 47b67400f348aaa2cd8939e8dccfdbd75c2750ba..417c248e5321ed10bab9d278872a242604837978 100644
--- a/erpnext/accounts/doctype/account/account.json
+++ b/erpnext/accounts/doctype/account/account.json
@@ -201,7 +201,7 @@
"index_web_pages_for_search": 1,
"is_tree": 1,
"links": [],
- "modified": "2023-07-20 18:18:44.405723",
+ "modified": "2023-12-08 16:03:01.935070",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Account",
@@ -264,7 +264,7 @@
"search_fields": "account_number",
"show_name_in_global_search": 1,
"sort_field": "modified",
- "sort_order": "ASC",
+ "sort_order": "DESC",
"title_field": "title",
"states": [],
"track_changes": 1
diff --git a/erpnext/accounts/doctype/accounts_settings/accounts_settings.json b/erpnext/accounts/doctype/accounts_settings/accounts_settings.json
index c911a05cc32eeb447d5296013853765ba21816da..3fa149ce7ca1bbc3fd441f9e4f4e6d7b2fc0418e 100644
--- a/erpnext/accounts/doctype/accounts_settings/accounts_settings.json
+++ b/erpnext/accounts/doctype/accounts_settings/accounts_settings.json
@@ -67,6 +67,9 @@
"frozen_accounts_modifier",
"tab_break_dpet",
"show_balance_in_coa",
+ "banking_tab",
+ "enable_party_matching",
+ "enable_fuzzy_matching",
"reports_tab",
"remarks_section",
"general_ledger_remarks_length",
@@ -411,17 +414,30 @@
"fieldtype": "Check",
"label": "Show Taxes as Table in Print"
},
+ {
+ "fieldname": "banking_tab",
+ "fieldtype": "Tab Break",
+ "label": "Banking"
+ },
{
"default": "0",
- "description": "Financial reports will be generated using GL Entry doctypes (should be enabled if Period Closing Voucher is not posted for all years sequentially or missing) ",
- "fieldname": "ignore_account_closing_balance",
+ "description": "Auto match and set the Party in Bank Transactions",
+ "fieldname": "enable_party_matching",
"fieldtype": "Check",
- "label": "Ignore Account Closing Balance"
+ "label": "Enable Automatic Party Matching"
},
{
"default": "0",
- "description": "Tax Amount will be rounded on a row(items) level",
- "fieldname": "round_row_wise_tax",
+ "depends_on": "enable_party_matching",
+ "description": "Approximately match the description/party name against parties",
+ "fieldname": "enable_fuzzy_matching",
+ "fieldtype": "Check",
+ "label": "Enable Fuzzy Matching"
+ },
+ {
+ "default": "0",
+ "description": "Financial reports will be generated using GL Entry doctypes (should be enabled if Period Closing Voucher is not posted for all years sequentially or missing) ",
+ "fieldname": "ignore_account_closing_balance",
"fieldtype": "Check",
"label": "Ignore Account Closing Balance"
},
@@ -430,7 +446,7 @@
"description": "Tax Amount will be rounded on a row(items) level",
"fieldname": "round_row_wise_tax",
"fieldtype": "Check",
- "label": "Round Tax Amount Row-wise"
+ "label": "Ignore Account Closing Balance"
},
{
"fieldname": "reports_tab",
@@ -466,7 +482,7 @@
"index_web_pages_for_search": 1,
"issingle": 1,
"links": [],
- "modified": "2023-11-20 09:37:47.650347",
+ "modified": "2023-12-11 10:22:18.348446",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Accounts Settings",
@@ -492,7 +508,7 @@
],
"quick_entry": 1,
"sort_field": "modified",
- "sort_order": "ASC",
+ "sort_order": "DESC",
"states": [],
"track_changes": 1
}
diff --git a/erpnext/accounts/doctype/accounts_settings/accounts_settings.py b/erpnext/accounts/doctype/accounts_settings/accounts_settings.py
index ac3d44bb5e706dffb1b2ef7f7cad593aaa88c654..4048be10f61c802bd5bd4e0f4c87fddfd6839aa0 100644
--- a/erpnext/accounts/doctype/accounts_settings/accounts_settings.py
+++ b/erpnext/accounts/doctype/accounts_settings/accounts_settings.py
@@ -14,6 +14,54 @@ from erpnext.stock.utils import check_pending_reposting
class AccountsSettings(Document):
+ # begin: auto-generated types
+ # This code is auto-generated. Do not modify anything in this block.
+
+ from typing import TYPE_CHECKING
+
+ if TYPE_CHECKING:
+ from frappe.types import DF
+
+ acc_frozen_upto: DF.Date | None
+ add_taxes_from_item_tax_template: DF.Check
+ allow_multi_currency_invoices_against_single_party_account: DF.Check
+ allow_stale: DF.Check
+ auto_reconcile_payments: DF.Check
+ automatically_fetch_payment_terms: DF.Check
+ automatically_process_deferred_accounting_entry: DF.Check
+ book_asset_depreciation_entry_automatically: DF.Check
+ book_deferred_entries_based_on: DF.Literal["Days", "Months"]
+ book_deferred_entries_via_journal_entry: DF.Check
+ book_tax_discount_loss: DF.Check
+ check_supplier_invoice_uniqueness: DF.Check
+ credit_controller: DF.Link | None
+ default_payment_days: DF.Int
+ determine_address_tax_category_from: DF.Literal["Billing Address", "Shipping Address"]
+ enable_common_party_accounting: DF.Check
+ enable_fuzzy_matching: DF.Check
+ enable_party_matching: DF.Check
+ frozen_accounts_modifier: DF.Link | None
+ general_ledger_remarks_length: DF.Int
+ ignore_account_closing_balance: DF.Check
+ make_payment_via_journal_entry: DF.Check
+ mandatory_accounting_journal: DF.Check
+ merge_similar_account_heads: DF.Check
+ over_billing_allowance: DF.Currency
+ post_change_gl_entries: DF.Check
+ receivable_payable_remarks_length: DF.Int
+ role_allowed_to_over_bill: DF.Link | None
+ round_row_wise_tax: DF.Check
+ show_balance_in_coa: DF.Check
+ show_inclusive_tax_in_print: DF.Check
+ show_payment_schedule_in_print: DF.Check
+ show_taxes_as_table_in_print: DF.Check
+ stale_days: DF.Int
+ submit_journal_entries: DF.Check
+ unlink_advance_payment_on_cancelation_of_order: DF.Check
+ unlink_payment_on_cancellation_of_invoice: DF.Check
+ validate_posting_date_chronology_in_sales_invoices: DF.Check
+ # end: auto-generated types
+
def validate(self):
old_doc = self.get_doc_before_save()
clear_cache = False
diff --git a/erpnext/accounts/doctype/adjustment_entry/adjustment_entry.js b/erpnext/accounts/doctype/adjustment_entry/adjustment_entry.js
index 77db12c074f6c30ca76a2136cf2da039575bcbf8..38493d5e5d67536ab75d108f0e2f80a99bb7b89f 100644
--- a/erpnext/accounts/doctype/adjustment_entry/adjustment_entry.js
+++ b/erpnext/accounts/doctype/adjustment_entry/adjustment_entry.js
@@ -15,6 +15,10 @@ frappe.ui.form.on('Adjustment Entry', {
frappe.set_route("query-report", "General Ledger");
}, "fas fa-table");
}
+
+ if (frm.doc.error) {
+ frm.dashboard.set_headline(frm.doc.error, "red")
+ }
},
get_documents(frm) {
frappe.call({
diff --git a/erpnext/accounts/doctype/adjustment_entry/adjustment_entry.json b/erpnext/accounts/doctype/adjustment_entry/adjustment_entry.json
index e1d0755eb5a73f73e29a0c888995603786aa409d..40ccae532d07234d20e180ff49fdbe3484a4e157 100644
--- a/erpnext/accounts/doctype/adjustment_entry/adjustment_entry.json
+++ b/erpnext/accounts/doctype/adjustment_entry/adjustment_entry.json
@@ -12,6 +12,7 @@
"naming_series",
"entry_type",
"status",
+ "error",
"column_break_4",
"posting_date",
"company",
@@ -111,6 +112,7 @@
"label": "Additional Information"
},
{
+ "depends_on": "eval:doc.docstatus==0",
"fieldname": "get_documents",
"fieldtype": "Button",
"label": "Get documents"
@@ -167,17 +169,24 @@
"fieldname": "status",
"fieldtype": "Select",
"label": "Status",
- "options": "Draft\nSubmitted\nReversed\nCancelled",
+ "options": "Draft\nSubmitted\nReversed\nCancelled\nError",
"read_only": 1
+ },
+ {
+ "fieldname": "error",
+ "fieldtype": "Small Text",
+ "hidden": 1,
+ "label": "Error"
}
],
"index_web_pages_for_search": 1,
"is_submittable": 1,
"links": [],
- "modified": "2022-03-15 09:39:41.487617",
+ "modified": "2023-12-15 13:51:26.563844",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Adjustment Entry",
+ "naming_rule": "By \"Naming Series\" field",
"owner": "Administrator",
"permissions": [
{
@@ -217,6 +226,7 @@
],
"sort_field": "modified",
"sort_order": "DESC",
+ "states": [],
"title_field": "title",
"track_changes": 1
-}
\ No newline at end of file
+}
diff --git a/erpnext/accounts/doctype/adjustment_entry/adjustment_entry.py b/erpnext/accounts/doctype/adjustment_entry/adjustment_entry.py
index 9c0cd00489347a11c4f213140ed1e5d490222dca..1559725fe4e81f1ef3ba316777c4aa28f3bb32c8 100644
--- a/erpnext/accounts/doctype/adjustment_entry/adjustment_entry.py
+++ b/erpnext/accounts/doctype/adjustment_entry/adjustment_entry.py
@@ -12,6 +12,7 @@ from frappe.utils import add_days, date_diff, flt, format_date, getdate, month_d
from erpnext.accounts.general_ledger import (
check_freezing_date,
get_accounting_journal,
+ get_accounting_number,
make_entry,
make_reverse_gl_entries,
validate_accounting_period,
@@ -24,6 +25,36 @@ ACCOUNTTYPE = {"Purchase Invoice": "expense_account", "Sales Invoice": "income_a
class AdjustmentEntry(Document):
+ # begin: auto-generated types
+ # This code is auto-generated. Do not modify anything in this block.
+
+ from typing import TYPE_CHECKING
+
+ if TYPE_CHECKING:
+ from frappe.types import DF
+
+ from erpnext.accounts.doctype.adjustment_entry_detail.adjustment_entry_detail import (
+ AdjustmentEntryDetail,
+ )
+
+ accounting_journal: DF.Link | None
+ adjustment_account: DF.Link
+ amended_from: DF.Link | None
+ auto_repeat: DF.Link | None
+ company: DF.Link
+ details: DF.Table[AdjustmentEntryDetail]
+ entry_type: DF.Literal["Deferred charges", "Deferred income"]
+ error: DF.SmallText | None
+ naming_series: DF.Literal["ACC-ADJ-.YYYY.-"]
+ posting_date: DF.Date
+ reversal_date: DF.Date
+ status: DF.Literal["Draft", "Submitted", "Reversed", "Cancelled", "Error"]
+ title: DF.Data | None
+ total_credit: DF.Currency
+ total_debit: DF.Currency
+ total_posting_amount: DF.Currency
+ # end: auto-generated types
+
def on_submit(self):
self._make_gl_entries()
self.set_status()
@@ -54,6 +85,17 @@ class AdjustmentEntry(Document):
if gl_entries:
validate_accounting_period(gl_entries)
check_freezing_date(gl_entries[0]["posting_date"], False)
+ new_fiscal_year = get_fiscal_years(date, company=self.company)
+
+ if not new_fiscal_year:
+ self.db_set("status", "Error")
+ error_msg = _("No fiscal year could be found to reverse this entry")
+ self.db_set("error", error_msg)
+ frappe.throw(error_msg)
+
+ self.db_set("error", "")
+ fiscal_year = new_fiscal_year[0][0]
+ accounting_number = get_accounting_number(gl_entries[0])
for entry in gl_entries:
name = entry["name"]
@@ -71,6 +113,8 @@ class AdjustmentEntry(Document):
entry["debit_in_account_currency"] = credit_in_account_currency
entry["credit_in_account_currency"] = debit_in_account_currency
entry["against"] = name
+ entry["accounting_entry_number"] = accounting_number
+ entry["fiscal_year"] = fiscal_year
if not entry.get("accounting_journal"):
get_accounting_journal(entry)
diff --git a/erpnext/accounts/doctype/bank_account/bank_account.js b/erpnext/accounts/doctype/bank_account/bank_account.js
index af68d0ffd86793e0cfeea05188e4d0696833061f..d698bc28d54458ee569e0658acf627cb75ab5c09 100644
--- a/erpnext/accounts/doctype/bank_account/bank_account.js
+++ b/erpnext/accounts/doctype/bank_account/bank_account.js
@@ -12,11 +12,21 @@ frappe.ui.form.on('Bank Account', {
}
};
});
+
frm.set_query("party_type", function() {
return {
query: "erpnext.setup.doctype.party_type.party_type.get_party_type",
};
});
+
+ frm.set_query("linked_account", function() {
+ return {
+ filters: {
+ 'bank': frm.doc.bank,
+ 'disabled': 0,
+ }
+ };
+ });
},
refresh: function(frm) {
frappe.dynamic_link = { doc: frm.doc, fieldname: 'name', doctype: 'Bank Account' }
diff --git a/erpnext/accounts/doctype/bank_account/bank_account.json b/erpnext/accounts/doctype/bank_account/bank_account.json
index 8121d4fb0e9bc890f4d9a1b9e51ddfb84d98700a..6a47dc02bd2ef8ff2630d405d329d13a54ada29c 100644
--- a/erpnext/accounts/doctype/bank_account/bank_account.json
+++ b/erpnext/accounts/doctype/bank_account/bank_account.json
@@ -17,6 +17,8 @@
"is_default",
"is_company_account",
"company",
+ "is_card",
+ "linked_account",
"section_break_11",
"party_type",
"column_break_14",
@@ -218,6 +220,21 @@
"fieldname": "disabled",
"fieldtype": "Check",
"label": "Disabled"
+ },
+ {
+ "default": "0",
+ "fieldname": "is_card",
+ "fieldtype": "Check",
+ "label": "Is a debit/credit card"
+ },
+ {
+ "depends_on": "eval:doc.is_card",
+ "fieldname": "linked_account",
+ "fieldtype": "Link",
+ "ignore_user_permissions": 1,
+ "label": "Linked Account",
+ "mandatory_depends_on": "eval:doc.is_card",
+ "options": "Bank Account"
}
],
"links": [
@@ -227,7 +244,7 @@
"link_fieldname": "bank_account"
}
],
- "modified": "2023-09-22 21:31:34.763977",
+ "modified": "2023-12-13 18:10:11.200837",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Bank Account",
@@ -264,5 +281,6 @@
"search_fields": "bank,account",
"sort_field": "modified",
"sort_order": "DESC",
+ "states": [],
"track_changes": 1
}
diff --git a/erpnext/accounts/doctype/bank_account/bank_account.py b/erpnext/accounts/doctype/bank_account/bank_account.py
index 6017a6235b81f36948f97e52c0eb5964bddb1925..5bd2c1ccaabf807bf3b4b3f06c1503a934a49340 100644
--- a/erpnext/accounts/doctype/bank_account/bank_account.py
+++ b/erpnext/accounts/doctype/bank_account/bank_account.py
@@ -13,6 +13,37 @@ from schwifty import IBAN
class BankAccount(Document):
+ # begin: auto-generated types
+ # This code is auto-generated. Do not modify anything in this block.
+
+ from typing import TYPE_CHECKING
+
+ if TYPE_CHECKING:
+ from frappe.types import DF
+
+ account: DF.Link | None
+ account_name: DF.Data
+ account_subtype: DF.Link | None
+ account_type: DF.Link | None
+ bank: DF.Link
+ bank_account_no: DF.Data | None
+ branch_code: DF.Data | None
+ company: DF.Link | None
+ disabled: DF.Check
+ iban: DF.Data | None
+ integration_id: DF.Data | None
+ is_card: DF.Check
+ is_company_account: DF.Check
+ is_default: DF.Check
+ last_integration_date: DF.Date | None
+ linked_account: DF.Link | None
+ mask: DF.Data | None
+ party: DF.DynamicLink | None
+ party_type: DF.Link | None
+ swift_number: DF.Data | None
+ website: DF.Data | None
+ # end: auto-generated types
+
def onload(self):
"""Load address and contacts in `__onload`"""
load_address_and_contact(self)
diff --git a/erpnext/accounts/doctype/bank_transaction/auto_match_party.py b/erpnext/accounts/doctype/bank_transaction/auto_match_party.py
new file mode 100644
index 0000000000000000000000000000000000000000..04dab4c28a05f040ae02266b9f95cc76b9fce66d
--- /dev/null
+++ b/erpnext/accounts/doctype/bank_transaction/auto_match_party.py
@@ -0,0 +1,183 @@
+from typing import Tuple, Union
+
+import frappe
+from frappe.utils import flt
+from rapidfuzz import fuzz, process
+
+
+class AutoMatchParty:
+ """
+ Matches by Account/IBAN and then by Party Name/Description sequentially.
+ Returns when a result is obtained.
+
+ Result (if present) is of the form: (Party Type, Party,)
+ """
+
+ def __init__(self, **kwargs) -> None:
+ self.__dict__.update(kwargs)
+
+ def get(self, key):
+ return self.__dict__.get(key, None)
+
+ def match(self) -> Union[Tuple, None]:
+ result = None
+ result = AutoMatchbyAccountIBAN(
+ bank_party_account_number=self.bank_party_account_number,
+ bank_party_iban=self.bank_party_iban,
+ deposit=self.deposit,
+ ).match()
+
+ fuzzy_matching_enabled = frappe.db.get_single_value("Accounts Settings", "enable_fuzzy_matching")
+ if not result and fuzzy_matching_enabled:
+ result = AutoMatchbyPartyNameDescription(
+ bank_party_name=self.bank_party_name, description=self.description, deposit=self.deposit
+ ).match()
+
+ return result
+
+
+class AutoMatchbyAccountIBAN:
+ def __init__(self, **kwargs) -> None:
+ self.__dict__.update(kwargs)
+
+ def get(self, key):
+ return self.__dict__.get(key, None)
+
+ def match(self):
+ if not (self.bank_party_account_number or self.bank_party_iban):
+ return None
+
+ result = self.match_account_in_party()
+ return result
+
+ def match_account_in_party(self) -> Union[Tuple, None]:
+ """Check if there is a IBAN/Account No. match in Customer/Supplier/Employee"""
+ result = None
+ parties = get_parties_in_order(self.deposit)
+ or_filters = self.get_or_filters()
+
+ for party in parties:
+ party_result = frappe.db.get_all(
+ "Bank Account", or_filters=or_filters, pluck="party", limit_page_length=1
+ )
+
+ if party == "Employee" and not party_result:
+ # Search in Bank Accounts first for Employee, and then Employee record
+ if "bank_account_no" in or_filters:
+ or_filters["bank_ac_no"] = or_filters.pop("bank_account_no")
+
+ party_result = frappe.db.get_all(
+ party, or_filters=or_filters, pluck="name", limit_page_length=1
+ )
+
+ if party_result:
+ result = (
+ party,
+ party_result[0],
+ )
+ break
+
+ return result
+
+ def get_or_filters(self) -> dict:
+ or_filters = {}
+ if self.bank_party_account_number:
+ or_filters["bank_account_no"] = self.bank_party_account_number
+
+ if self.bank_party_iban:
+ or_filters["iban"] = self.bank_party_iban
+
+ return or_filters
+
+
+class AutoMatchbyPartyNameDescription:
+ def __init__(self, **kwargs) -> None:
+ self.__dict__.update(kwargs)
+
+ def get(self, key):
+ return self.__dict__.get(key, None)
+
+ def match(self) -> Union[Tuple, None]:
+ # fuzzy search by customer/supplier & employee
+ if not (self.bank_party_name or self.description):
+ return None
+
+ result = self.match_party_name_desc_in_party()
+ return result
+
+ def match_party_name_desc_in_party(self) -> Union[Tuple, None]:
+ """Fuzzy search party name and/or description against parties in the system"""
+ result = None
+ parties = get_parties_in_order(self.deposit)
+
+ for party in parties:
+ filters = {"status": "Active"} if party == "Employee" else {"disabled": 0}
+ field = party.lower() + "_name"
+ names = frappe.get_all(party, filters=filters, fields=[f"{field} as party_name", "name"])
+
+ for field in ["bank_party_name", "description"]:
+ if not self.get(field):
+ continue
+
+ result, skip = self.fuzzy_search_and_return_result(party, names, field)
+ if result or skip:
+ break
+
+ if result or skip:
+ # Skip If: It was hard to distinguish between close matches and so match is None
+ # OR if the right match was found
+ break
+
+ return result
+
+ def fuzzy_search_and_return_result(self, party, names, field) -> Union[Tuple, None]:
+ skip = False
+ result = process.extract(
+ query=self.get(field),
+ choices={row.get("name"): row.get("party_name") for row in names},
+ scorer=fuzz.token_set_ratio,
+ )
+ party_name, skip = self.process_fuzzy_result(result)
+
+ if not party_name:
+ return None, skip
+
+ return (
+ party,
+ party_name,
+ ), skip
+
+ def process_fuzzy_result(self, result: Union[list, None]):
+ """
+ If there are multiple valid close matches return None as result may be faulty.
+ Return the result only if one accurate match stands out.
+
+ Returns: Result, Skip (whether or not to discontinue matching)
+ """
+ SCORE, PARTY_ID, CUTOFF = 1, 2, 80
+
+ if not result or not len(result):
+ return None, False
+
+ first_result = result[0]
+ if len(result) == 1:
+ return (first_result[PARTY_ID] if first_result[SCORE] > CUTOFF else None), True
+
+ second_result = result[1]
+ if first_result[SCORE] > CUTOFF:
+ # If multiple matches with the same score, return None but discontinue matching
+ # Matches were found but were too close to distinguish between
+ if first_result[SCORE] == second_result[SCORE]:
+ return None, True
+
+ return first_result[PARTY_ID], True
+ else:
+ return None, False
+
+
+def get_parties_in_order(deposit: float) -> list:
+ parties = ["Supplier", "Employee", "Customer"] # most -> least likely to receive
+ if flt(deposit) > 0:
+ parties = ["Customer", "Supplier", "Employee"] # most -> least likely to pay
+
+ return parties
diff --git a/erpnext/accounts/doctype/bank_transaction/bank_transaction.js b/erpnext/accounts/doctype/bank_transaction/bank_transaction.js
index 6e504668d8a06cf06add80ca03bb913723aaa074..4c1052a69ab26e51e7af1a28c64e0500d1aeb48c 100644
--- a/erpnext/accounts/doctype/bank_transaction/bank_transaction.js
+++ b/erpnext/accounts/doctype/bank_transaction/bank_transaction.js
@@ -42,6 +42,12 @@ frappe.ui.form.on('Bank Transaction', {
}
}
});
+
+ frm.set_query('party_type', function() {
+ return {
+ query: "erpnext.setup.doctype.party_type.party_type.get_party_type"
+ };
+ });
},
refresh(frm) {
frm.page.clear_actions_menu();
@@ -54,12 +60,19 @@ frappe.ui.form.on('Bank Transaction', {
if (frm.doc.status === "Unreconciled" && frm.doc.docstatus === 1) {
frm.add_custom_button(__('Set status as Closed'), function () {
frm.trigger("close_bank_transaction");
- });
+ }, __("Actions"));
}
- frm.add_custom_button(__('Bank reconciliation dashboard'), function () {
- frappe.set_route("bank-reconciliation");
- });
+ if (frm.doc.docstatus == 1) {
+ frm.add_custom_button(__('Bank reconciliation'), function () {
+ frappe.set_route("bank-reconciliation");
+ });
+
+ frm.add_custom_button(__('Unreconcile Transaction'), () => {
+ frm.call('remove_payment_entries')
+ .then( () => frm.refresh() );
+ }, __("Actions"));
+ }
},
close_bank_transaction(frm) {
return frappe.call({
diff --git a/erpnext/accounts/doctype/bank_transaction/bank_transaction.json b/erpnext/accounts/doctype/bank_transaction/bank_transaction.json
index 1561e3f7b0b719f17f54435855cd37ac7859a790..119dab4ceac16e952d1c62c15a1d59927cafcb65 100644
--- a/erpnext/accounts/doctype/bank_transaction/bank_transaction.json
+++ b/erpnext/accounts/doctype/bank_transaction/bank_transaction.json
@@ -21,8 +21,10 @@
"currency",
"section_break_4",
"debit",
+ "deposit",
"column_break_7",
"credit",
+ "withdrawal",
"section_break_10",
"description",
"section_break_14",
@@ -35,7 +37,14 @@
"allocated_amount",
"amended_from",
"column_break_17",
- "unallocated_amount"
+ "unallocated_amount",
+ "party_section",
+ "party_type",
+ "party",
+ "column_break_3czf",
+ "bank_party_name",
+ "bank_party_account_number",
+ "bank_party_iban"
],
"fields": [
{
@@ -62,6 +71,7 @@
"fieldtype": "Column Break"
},
{
+ "allow_on_submit": 1,
"default": "Unreconciled",
"fieldname": "status",
"fieldtype": "Select",
@@ -97,13 +107,13 @@
"fieldname": "debit",
"fieldtype": "Currency",
"in_list_view": 1,
- "label": "Debit"
+ "label": "Deposit"
},
{
"fieldname": "credit",
"fieldtype": "Currency",
"in_list_view": 1,
- "label": "Credit"
+ "label": "Withdrawal"
},
{
"fieldname": "column_break_7",
@@ -187,7 +197,7 @@
"allow_on_submit": 1,
"fieldname": "total_debit",
"fieldtype": "Currency",
- "label": "Total Debit",
+ "label": "Total Allocated Debit",
"read_only": 1
},
{
@@ -198,7 +208,7 @@
"allow_on_submit": 1,
"fieldname": "total_credit",
"fieldtype": "Currency",
- "label": "Total Credit",
+ "label": "Total Allocated Credit",
"read_only": 1
},
{
@@ -231,11 +241,65 @@
"hidden": 1,
"label": "Bank",
"options": "Bank"
+ },
+ {
+ "fieldname": "party_section",
+ "fieldtype": "Section Break",
+ "label": "Payment From / To"
+ },
+ {
+ "allow_on_submit": 1,
+ "fieldname": "party_type",
+ "fieldtype": "Link",
+ "label": "Party Type",
+ "options": "DocType"
+ },
+ {
+ "allow_on_submit": 1,
+ "fieldname": "party",
+ "fieldtype": "Dynamic Link",
+ "label": "Party",
+ "options": "party_type"
+ },
+ {
+ "fieldname": "column_break_3czf",
+ "fieldtype": "Column Break"
+ },
+ {
+ "fieldname": "bank_party_name",
+ "fieldtype": "Data",
+ "label": "Party Name/Account Holder (Bank Statement)"
+ },
+ {
+ "fieldname": "bank_party_iban",
+ "fieldtype": "Data",
+ "label": "Party IBAN (Bank Statement)"
+ },
+ {
+ "fieldname": "bank_party_account_number",
+ "fieldtype": "Data",
+ "label": "Party Account No. (Bank Statement)"
+ },
+ {
+ "fieldname": "deposit",
+ "fieldtype": "Currency",
+ "hidden": 1,
+ "label": "Deposit",
+ "oldfieldname": "debit",
+ "options": "currency"
+ },
+ {
+ "fieldname": "withdrawal",
+ "fieldtype": "Currency",
+ "hidden": 1,
+ "label": "Withdrawal",
+ "oldfieldname": "credit",
+ "options": "currency"
}
],
"is_submittable": 1,
"links": [],
- "modified": "2023-10-16 11:44:31.419057",
+ "modified": "2023-12-11 10:20:42.555879",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Bank Transaction",
diff --git a/erpnext/accounts/doctype/bank_transaction/bank_transaction.py b/erpnext/accounts/doctype/bank_transaction/bank_transaction.py
index 5ed85904557ae94193ee4774ab3326d5a77d728f..c9376e242a6423ac4b99ecd8460826b5b5c3f022 100644
--- a/erpnext/accounts/doctype/bank_transaction/bank_transaction.py
+++ b/erpnext/accounts/doctype/bank_transaction/bank_transaction.py
@@ -28,14 +28,20 @@ class BankTransaction(StatusUpdater):
bank: DF.Link | None
bank_account: DF.Link
bank_account_head: DF.Link | None
+ bank_party_account_number: DF.Data | None
+ bank_party_iban: DF.Data | None
+ bank_party_name: DF.Data | None
category: DF.Link | None
company: DF.Link
credit: DF.Currency
currency: DF.Link
date: DF.Date
debit: DF.Currency
+ deposit: DF.Currency
description: DF.SmallText | None
naming_series: DF.Literal["ACC-BTN-.YYYY.-"]
+ party: DF.DynamicLink | None
+ party_type: DF.Link | None
payment_entries: DF.Table[BankTransactionPayments]
reference_number: DF.Data | None
status: DF.Literal["", "Pending", "Settled", "Unreconciled", "Reconciled", "Cancelled", "Closed"]
@@ -43,25 +49,58 @@ class BankTransaction(StatusUpdater):
total_debit: DF.Currency
transaction_type: DF.Data | None
unallocated_amount: DF.Currency
+ withdrawal: DF.Currency
# end: auto-generated types
- def after_insert(self):
- self.unallocated_amount = flt(self.credit) - flt(self.debit)
+ def before_validate(self):
+ self.set_allocation_in_bank_transaction()
def before_insert(self):
self.check_similar_entries()
self.check_transaction_references()
+ def validate(self):
+ # Keep for backward compatibility
+ if not (self.debit or self.credit) and (self.deposit or self.withdrawal):
+ self.credit = self.deposit
+ self.debit = self.withdrawal
+ else:
+ self.deposit = self.credit
+ self.withdrawal = self.debit
+
+ self.validate_duplicate_references()
+
+ def validate_duplicate_references(self):
+ """Make sure the same voucher is not allocated twice within the same Bank Transaction"""
+ if not self.payment_entries:
+ return
+
+ pe = []
+ for row in self.payment_entries:
+ reference = (row.payment_document, row.payment_entry)
+ if reference in pe:
+ frappe.throw(
+ _("{0} {1} is allocated twice in this Bank Transaction").format(
+ _(row.payment_document), row.payment_entry
+ )
+ )
+ pe.append(reference)
+
def before_save(self):
self.check_bank_account_head()
self.check_payment_types()
self.calculate_totals()
self.check_reconciliation_amounts()
- def on_submit(self):
- self.check_reconciliation_amounts()
+ def before_submit(self):
self.set_allocation_in_linked_docs()
+ self.check_reconciliation_amounts()
self.set_allocation_in_bank_transaction()
+
+ if frappe.db.get_single_value("Accounts Settings", "enable_party_matching"):
+ self.auto_set_party()
+
+ def on_submit(self):
self.set_payment_entries_clearance_date()
self.set_status()
@@ -70,10 +109,11 @@ class BankTransaction(StatusUpdater):
self.check_payment_types()
self.calculate_totals()
- def on_update_after_submit(self):
- self.check_reconciliation_amounts()
self.set_allocation_in_linked_docs()
+ self.check_reconciliation_amounts()
self.set_allocation_in_bank_transaction()
+
+ def on_update_after_submit(self):
self.set_payment_entries_clearance_date()
self.set_status(update=True)
@@ -83,6 +123,7 @@ class BankTransaction(StatusUpdater):
self.payment_entries = []
def on_cancel(self):
+ self.remove_payment_entries(cancel=True)
self.set_status(update=True)
def check_similar_entries(self):
@@ -220,16 +261,13 @@ class BankTransaction(StatusUpdater):
transaction_amount = flt(self.credit) - flt(self.debit)
- self.db_set("allocated_amount", flt(allocated_amount) if allocated_amount else 0)
- self.db_set(
- "unallocated_amount",
- (transaction_amount - flt(allocated_amount)) if allocated_amount else transaction_amount,
+ self.allocated_amount = flt(allocated_amount) if allocated_amount else 0
+ self.unallocated_amount = (
+ (transaction_amount - flt(allocated_amount)) if allocated_amount else transaction_amount
)
if transaction_amount == self.allocated_amount:
- self.db_set("status", "Reconciled")
-
- self.reload()
+ self.status = "Reconciled"
def check_reconciliation_amounts(self):
for payment_entry in self.payment_entries:
@@ -330,6 +368,36 @@ class BankTransaction(StatusUpdater):
self.date = auto_repeat_doc.next_schedule_date
self.reference_number = f"""{formatdate(self.date, "YYYYMMDD")}-{frappe.generate_hash("", 10)}"""
+ @frappe.whitelist()
+ def remove_payment_entries(self, cancel=False):
+ for payment_entry in self.payment_entries:
+ self.remove(payment_entry)
+
+ if cancel:
+ self.run_method("before_update_after_submit")
+ self.run_method("on_update_after_submit")
+ else:
+ self.save()
+
+ def auto_set_party(self):
+ from erpnext.accounts.doctype.bank_transaction.auto_match_party import AutoMatchParty
+
+ if self.party_type and self.party:
+ return
+
+ result = AutoMatchParty(
+ bank_party_account_number=self.bank_party_account_number,
+ bank_party_iban=self.bank_party_iban,
+ bank_party_name=self.bank_party_name,
+ description=self.description,
+ deposit=self.deposit,
+ ).match()
+
+ if not result:
+ return
+
+ self.party_type, self.party = result
+
def get_unreconciled_amount(payment_entry):
return frappe.db.get_value(
diff --git a/erpnext/accounts/doctype/bank_transaction/bank_transaction_import/BankAccountPreview.vue b/erpnext/accounts/doctype/bank_transaction/bank_transaction_import/BankAccountPreview.vue
index c9cd0174292d1409a76198fe2d818c1eb73767c7..e8df911a5283d4ca3b457fab776e8f49ad84de4f 100644
--- a/erpnext/accounts/doctype/bank_transaction/bank_transaction_import/BankAccountPreview.vue
+++ b/erpnext/accounts/doctype/bank_transaction/bank_transaction_import/BankAccountPreview.vue
@@ -1,6 +1,6 @@
-
-
+
+
-
-
{{ account.account_name }}
-
{{ account.bank }}
-
{{ account.company }}
-
+
+
{{ account.account_name }}
+
{{ account.bank }}
+
{{ account.company }}
+
-
+
-
\ No newline at end of file
diff --git a/erpnext/accounts/doctype/bank_transaction/bank_transaction_import/BankTransactionImporter.vue b/erpnext/accounts/doctype/bank_transaction/bank_transaction_import/BankTransactionImporter.vue
index 992424e516bf5bc67a6f41accbb8848339217689..f62e5b30e7ee1d85ee36699a7c3459c93c47bcef 100644
--- a/erpnext/accounts/doctype/bank_transaction/bank_transaction_import/BankTransactionImporter.vue
+++ b/erpnext/accounts/doctype/bank_transaction/bank_transaction_import/BankTransactionImporter.vue
@@ -1,173 +1,160 @@
-
+
-
+
{{ __("Please add at least one company bank account. 'Is company account' must be checked.") }}
diff --git a/erpnext/translations/de.csv b/erpnext/translations/de.csv
index 6bfeb5e3039b93bb063b1d1ed409158d1efb07ce..ac9528b0e0fc4033757f2f249703d63a1109499d 100644
--- a/erpnext/translations/de.csv
+++ b/erpnext/translations/de.csv
@@ -8967,3 +8967,7 @@ Book Tax Loss on Early Payment Discount,Umsatzsteueranteil bei Skonto berücksic
Split Early Payment Discount Loss into Income and Tax Loss,"Skontobetrag in Aufwand und Umsatzsteuerkorrektur aufteilen",
Approve,Genehmigen,
Reject,Ablehnen,
+Lost Quotations,Verlorene Angebote,
+Lost Quotations %,Verlorene Angebote %,
+Lost Value,Verlorener Wert,
+Lost Value %,Verlorener Wert %,
diff --git a/erpnext/translations/fr.csv b/erpnext/translations/fr.csv
index 09835ddef3f2d8c0f8969018cf6dd8d8e40cc227..5199c1489e1ab6e2bb1d66e67e83a93438b4ca0b 100644
--- a/erpnext/translations/fr.csv
+++ b/erpnext/translations/fr.csv
@@ -820,6 +820,7 @@ Accounting Journal adjustment in progress,Ajustement de journal comptable en cou
Accounting Journal in Dokos,Journaux comptables dans Dokos,
Accounting Journal in FEC,Journaux comptables dans le FEC,
Accounting Journal,Journal comptable,
+Accounting Ledger Preview,Aperçu du grand livre,
Accounting Ledger,Grand livre,
Accounting Masters,Données de base,
Accounting Period overlaps with {0},La période comptable chevauche {0},
@@ -846,6 +847,7 @@ Accounts Receivable Credit Account,Compte débiteur à créditer,
Accounts Receivable Discounted Account,Compte débiteur d'affacturage,
Accounts Receivable Summary,Récapitulatif des comptes clients,
Accounts Receivable Unpaid Account,Compte débiteur d'impayés,
+Accounts Receivable/Payable,Comptes clients/fournisseurs,
Accounts Receivable,Comptes clients,
Accounts Settings,Paramètres de comptabilité,
Accounts User,Comptable,
@@ -1049,11 +1051,13 @@ Additional Salary Component Exists.,Une composante de paie additionnelle existe,
Additional Salary ,Salaire additionnel,
Additional Salary for referral bonus can only be created against Employee Referral with status {0},Les salaires additionnels pour les bonus de recommandation ne peuvent être créé qu'en contrepartie d'une recommandation au statut {0},
Additional Salary,Salaire supplémentaire,
+Additional Settings,Paramètres additionnels,
Additional contact information,Informations de contact supplémentaires,
Additional information regarding the customer.,Informations supplémentaires concernant le client.,
Address & Contact,Adresse & Contact,
Address & Contacts,Adresse & Contacts,
Address Desc,Adresse Desc,
+Address Display,Affichage de l'adresse,
Address Form,Formulaire d'adresse,
Address HTML,Adresse HTML,
Address Line 1,Adresse,
@@ -1376,6 +1380,7 @@ An error has been appeared while reposting item valuation via {0},Une erreur est
An error has occurred during {0}. Check {1} for more details,Une erreur est survenue durant {0}. Veuillez vérifier les {0} pour plus de détails,Error Log
An error occured during the payment flow. Please create the payment and the invoice manually.,Une erreur a eu lieu pendant le flux de paiement. Veuillez créer le paiement et la facture manuellement,
An error occured for certain Items while creating Material Requests based on Re-order level. Please rectify these issues :,Une erreur s'est produite pour certains articles lors de la création de demandes de matériel basées sur le niveau de réapprovisionnement. Veuillez rectifier ces problèmes :,
+An error occured while importing your FEC.,Une erreur s'est produite lors de l'import de votre FEC.,
An error occured while trying to fetch your payment plan on Stripe. Please check your error logs.,Une erreur a empếché la récupération de votre plan de paiement sur Stripe. Veuillez regarder dans vos logs d'erreur.,
An error occured,Erreur lors de l'initialisation du paiement,
An error occurred during the update process,Une erreur s'est produite lors du processus de mise à jour,
@@ -1484,6 +1489,7 @@ Approving Role (above authorized value),Rôle Approbateur (valeurs autorisées c
Approving Role cannot be same as role the rule is Applicable To,Le Rôle Approbateur ne peut pas être identique au rôle dont la règle est Applicable,
Approving User (above authorized value),Utilisateur Approbateur (valeurs autorisées ci-dessus),
Approving User cannot be same as user the rule is Applicable To,L'Utilisateur Approbateur ne peut pas être identique à l'utilisateur dont la règle est Applicable,
+Approximately match the description/party name against parties,Cherche une correspondance approximative entre la description/nom du tiers et les tiers disponibles,
"Apps using current key won't be able to access, are you sure?","Les applications utilisant la clé actuelle ne pourront plus y accéder, êtes-vous sûr?",
April,Avril,
Arabic name missing for {} in the company document,Nom arabe manquant pour {} dans le document de l'entreprise,
@@ -1636,6 +1642,8 @@ Associated Document,Document associé,
At least one mode of payment is required for POS invoice.,Au moins un mode de paiement est nécessaire pour une facture de point de vente,
At least one of the Applicable Modules should be selected,Sélectionnez au moins un module,
At row #{0}: the sequence id {1} cannot be less than previous row sequence id {2},A la ligne #{0}: le numéro de séquence {1} ne peut pas être inférieur au numéro de séquence de la ligne précédente {2},
+At row {0}: Batch No is mandatory for Item {1},A la ligne {0}: Le numéro de lot est obligatoire pour l'article {1},
+At row {0}: Serial No is mandatory for Item {1},A la ligne {0}: Le numéro de série est obligatoire pour l'article {1},
Atleast one asset has to be selected.,Au moins un actif doit être sélectionné,
Atleast one interview has to be selected.,Au moins un entretien doit être sélectionné.,
Atleast one invoice has to be selected.,Au moins une facture doit être sélectionnée,
@@ -1677,7 +1685,9 @@ Authorized Signatory,Signataire Autorisé,
Authorized Value,Valeur Autorisée,
Auto Create Assets on Purchase,Créer automatiquement des actifs à l'achat,
Auto Create Exchange Rate Revaluation,Créer une réévaluation automatique du taux de change,
+Auto Create Purchase Receipt,Création automatique des reçus d'achat,
Auto Create Serial and Batch Bundle For Outward,Créer des ensembles de numéro de série et lot automatiquement pour les sorties de stock,
+Auto Create Subcontracting Order,Création automatique des commandes de sous-traitances,
Auto Created Serial and Batch Bundle,Créer des ensembles de numéro de série et lot automatiquement,
Auto Created,Créé automatiquement,
Auto Creation of Contact,Création automatique d'un contact,
@@ -1702,6 +1712,7 @@ Auto close Opportunity Replied after the no. of days mentioned above,Fermeture a
Auto close Opportunity after 15 days,Fermer automatiquement les opportunités après 15 jours,
Auto close Opportunity after the no. of days mentioned above,Fermer l'opportunité automatiquement après le nombre de jours indiqués ci-dessus,
Auto insert Price List rate if missing,Insérer automatiquemenet le prix dans la liste de prix s'il n'existe pas,
+Auto match and set the Party in Bank Transactions,Cherche automatiquement une correspondance entre une transaction bancaire et un tiers,
Auto re-order,Réapprovisionnement automatique,
Auto reconcile open entries,Réconcilier les écritures non réconciliées,
Auto repeat document updated,Document de répétition automatique mis à jour,
@@ -1925,6 +1936,7 @@ Bank account,Compte bancaire,
Bank accounts added,Comptes bancaires ajoutés,
Bank and Payments,Banque et Paiements,
Bank reconciliation dashboard,Tableau de bord de rapprochement bancaire,
+Bank reconciliation,Réconciliation bancaire,
Bank statement balance,Solde du relevé bancaire,
Bank transaction creation error,Erreur de création d'une transaction bancaire,
Bank transactions creation in progress. Please wait...,Création des transactions bancaire en cours. Veuillez patienter...,
@@ -1982,6 +1994,7 @@ Batch ID is mandatory,Le N° du lot est obligatoire,
Batch ID,ID du Lot,
Batch Identification,Identification par lots,
Batch Item Expiry Status,Statut d'expiration des articles en lots,
+Batch No is mandatory,Le numéro de lot est obligatoire,
Batch No.,N° de lot,
Batch No,N° du lot,
Batch Nos are created successfully,Les n° de lot ont été créé avec succès,
@@ -2645,6 +2658,7 @@ Column Labels : ,Libellés des colonnes,
Column filters ignored,Filtres de colonne ignorés,
Column in Bank File,Colonne dans le fichier de la banque,
Combined invoice portion must equal 100%,La portion combinée de la facture doit être égale à 100%,
+Comma,Virgule,
Comments,Commentaires,
Commercial,Commercial,
Commission Rate %,Pourcentage de commission (%),
@@ -2674,6 +2688,7 @@ Company Address is mandatory to fetch company GSTIN details.,L'adresse de la soc
Company Address,Adresse de la Société,
Company Bank Account,Compte bancaire de la société,
Company Billing Address,Adresse de facturation de la société,
+Company Creation,Création de la société,
Company Description for website homepage,Description de la Société pour la page d'accueil du site web,
Company Description,Description de l'entreprise,
Company Details,Détails de la société,
@@ -2686,6 +2701,7 @@ Company Name as per Imported Tally Data,Nom de la société dans les données im
Company Name cannot be Company,Nom de la Société ne peut pas être Company,
Company Name,Nom de la société,
Company Not Linked,La société n'est pas référencée,
+Company Search,Recherche de sociétés,
Company Settings,des paramètres de l'entreprise,
Company Shipping Address,Adresse d'expédition,
Company Tagline for website homepage,Slogan de la Société pour la page d'accueil du site web,
@@ -2919,6 +2935,7 @@ Cost Centers for Budgeting and Analysis,Centres de coûts pour la budgétisation
Cost Centers,Centres de Coûts,
Cost Configuration,Configuration des coûts,
Cost Per Unit,Coût par unité,
+Cost Price,Coût de revient,
Cost Updated,Coût Mise à Jour,
Cost as on,Coût à partir de,
Cost center is mandatory for loans having rate of interest greater than 0,Le centre de coût est obligatoire pour les prêts dont le taux d'intérêt est supérieur à 0.,
@@ -3677,6 +3694,7 @@ Dependent Task {0} is not a Template Task,La tâche dépendant {0} n'est pas un
Dependent Task,Tâche Dépendante,
Dependent Tasks,Tâche dépendante,
Depends on Tasks,Dépend des Tâches,
+Deposit,Dépôt,
Deprecated field. Will be removed in a future version.,Champ déprécié. Sera supprimé dans une future version.,
Deprecated: Kept for compatibility only but will be removed in the future,"Obsolète: Gardé uniquement pour compatibilité, mais sera supprimé à l'avenir",
Depreciated Amount,Montant amorti,
@@ -3732,6 +3750,7 @@ Difference Account,Compte d'écart,
Difference Amount (Company Currency),Écart de montant (Devise de la Société),
Difference Amount must be zero,L'Écart de montant doit être égal à zéro,
Difference Amount,Écart de montant,
+Difference In,Différence en,
Difference Posting Date,Date de comptabilisation de la différence,
Difference Qty,Qté de différence,
Difference Value,Différence de valeur,
@@ -3930,6 +3949,7 @@ Driver,Chauffeur,
Driving License Categories,Catégories de permis de conduire,
Driving License Category,Catégorie de permis de conduire,
Drop Ship,Expédition Directe,
+Drop a file,Déposez un fichier,
Drop files here,Déposez des fichiers ici,
Drug,Médicament,
Due / Reference Date cannot be after {0},Date d'échéance / de référence ne peut pas être après le {0},
@@ -4116,6 +4136,7 @@ Enable Appointment Scheduling,Autoriser la prise de rendez-vous,
Enable Attribute Filters,Autoriser les filtres d'attributs,
Enable Auto Email,Autoriser les emails automatiques,
Enable Auto Re-Order,Autoriser le réapprovisonnement automatique,
+Enable Automatic Party Matching,Autoriser la correspondance automatique de tiers,
Enable Capital Work in Progress Accounting,Autoriser la comptabilisation des immobilisations en cours,
Enable Checkout,Activer Caisse,
Enable Common Party Accounting,Activer la comptabilité des tiers communs,
@@ -4128,6 +4149,7 @@ Enable Distributed Cost Center,Activer la distribution du centre de coût,
Enable European Access,Autoriser l'accès aux pays européens,
Enable Field Filters (Categories),Activer les filtres de champ (Catégories),
Enable Field Filters,Autoriser les filtres de champ,
+Enable Fuzzy Matching,Autoriser la recherche approximative,
Enable Item Booking,Autoriser la réservation d'articles,
Enable Perpetual Inventory For Non Stock Items,Autoriser l'inventaire permanent pour les articles non stockés,
Enable Perpetual Inventory,Autoriser l'inventaire permanent,
@@ -4487,6 +4509,7 @@ Fetched only {0} available serial numbers.,Seulement {0} numéros de série disp
Fetching exchange rates ...,Récupération des taux de change...,
Fetching...,Récupération...,
Fichier des Ecritures Comptables,Fichier des Ecritures Comptables,
+Field Delimiter,Délimiteur de champs,
Field Name,Nom du champ,
Field in Bank Transaction,Champ dans la transaction bancaire,
Field,Champs,
@@ -4745,8 +4768,11 @@ From and To dates are required,Les dates de début et de fin sont requises,
From and To dates required,Les date Du et Au sont requises,
From date can not be greater than than To date,La date de début ne peut pas être supérieure à la date de fin,
From date cannot be greater than To date,La date de début ne peut pas être après la date de fin,
+From date must be before To date,La date de début doit être avant la date de fin,
+From date must be within fiscal year {0},La date de début doit être dans l'exercice fiscal {0},
From duration (Mins),Durée minimum (Mins),
From employee is required while receiving Asset {0} to a target location,L'employé source est nécessaire pour recevoir l'actif {0} dans le lieu cible,
+From payment order,Depuis l'ordre de paiement,
From value must be less than to value in row {0},De la Valeur doit être inférieure à la valeur de la ligne {0},
From {0} | {1} {2},Du {0} | {1} {2},
From(Year),Du (Année),
@@ -5012,7 +5038,11 @@ Gross Pay (Company Currency),Paie brute (Devise société),
Gross Pay - Total Deduction - Loan Repayment,Salaire Brut - Déductions Totales - Remboursement de Prêt,
Gross Profit %,Bénéfice Brut %,
Gross Profit / Loss,Bénéfice/Perte Brut,
+Gross Profit Based On,Marge brute basée sur,
+Gross Profit Calculation in Quotations and Sales Orders Based On,Calcul de la marge brute dans les devis et les commandes basée sur,
Gross Profit Percent,Pourcentage de bénéfice brut,
+Gross Profit Percentage,Pourcentage de marge brute,
+Gross Profit,Marge brute,Quotation Item
Gross Profit,Bénéfice Brut,
Gross Purchase Amount is mandatory,Montant d'Achat Brut est obligatoire,
Gross Purchase Amount should be equal to purchase amount of one single Asset.,Le montant d'achat brut doit être égal au montant d'achat d'un seul actif.,
@@ -5089,6 +5119,7 @@ Has Variants,A des variantes,
Hashed Data,Hash des données,
Have Default Naming Series for Batch ID?,Vous avez une série de noms par défaut pour l'ID du lot ?,
Head of Marketing and Sales,Responsable du Marketing et des Ventes,
+Headcount,Nombre d'employés,
Header Image,Image d'en-tête,
Heads (or groups) against which Accounting Entries are made and balances are maintained.,Titres (ou groupes) sur lequel les entrées comptables sont faites et les soldes sont maintenus.,
Health Care,Soins de Santé,
@@ -5168,6 +5199,7 @@ How Pricing Rule is applied?,Comment est appliquée la règle de prix ?,
How frequently?,A quelle fréquence ?,
How often should Project and Company be updated based on Sales Transactions ?,A quelle fréquence le projet et la société doivent-ils être mis à jour sur la base des transactions de vente ?,
How often should Project and Company be updated based on Sales Transactions?,À quelle fréquence le projet et la société doivent-ils être mis à jour en fonction des transactions de vente ?,
+How often should Project be updated of Total Purchase Cost ?,A quelle fréquence doit-on mettre à jour le coût total des achats d'un projet ?,
How often should project and company be updated based on Sales Transactions.,Fréquence de mise à jour des montants de transaction de vente dans les projets et la société.,
How to Navigate in ERPNext,Comment naviguer dans Dokos,
Hrs,Hrs,
@@ -5291,6 +5323,7 @@ If this is undesirable please cancel the corresponding Payment Entry.,"Si ce n'e
","Si vous {0} {1} d'article {2}, le schéma {3}
sera appliqué sur l'article.",
"If you {0} {1} worth item {2}, the scheme {3} will be applied on the item.","Si vous {0} {1} de l'article {2}, la règle {3} sera appliquée sur l'article",
+"If your SEPA file is not generated from a payment order, From Date and To Date are mandatory","Si votre fichier SEPA n'est pas généré via un ordre de paiement, les dates de début et de fin sont obligatoies.",
Ignore Account Closing Balance,Ignorer le solde comptable de clôture,
Ignore Available Stock,Ignorer le stock disponible,
Ignore Closing Balance,Ignore le solde de clôture,
@@ -5385,6 +5418,7 @@ Include Ageing Summary,Inclure un récapitulatif agé,
Include Default Book Assets,Include les actifs du livre comptable par défaut,
Include Default Book Entries,Inclure les écritures du livre comptable par défaut,
Include Descendants,Inclure les descendants,
+Include Disabled,Inclure les désactivés,
Include Expired,Inclure les devis expirés,
Include Exploded Items,Inclure les articles éclatés,
Include Item In Manufacturing,Inclure l'article dans la production,
@@ -5584,6 +5618,7 @@ Invalid GSTIN! The input you've entered doesn't match the GSTIN format for UIN H
Invalid GSTIN! The input you've entered doesn't match the format of GSTIN.,GSTIN invalide! Le numéro fourni ne correspond pas au format d'un n° GSTIN,
Invalid GSTIN,GSTIN invalide,
Invalid Gross Purchase Amount,Montant d'achat brut invalide,
+Invalid Group By,Fonction de groupement invalide,
Invalid Invoice,Facture non valide,
Invalid Item Defaults,Défauts d'éléments non valides,
Invalid Item,Article invalide,
@@ -5601,6 +5636,7 @@ Invalid Process Loss Configuration,Configuration des pertes du processus invalid
Invalid Purchase Invoice,Facture d'achat invalide,
Invalid Purchase Receipt,Reçu d'achat invalide,
Invalid Qty,Qté non valide,
+Invalid Quantity,Quantité invalide,
Invalid Schedule,Programme non valide,
Invalid Scheduled Time,Heure planifiée invalide,
Invalid Selling Price,Prix de vente invalide,
@@ -6034,6 +6070,7 @@ Journal Entry {0} does not have account {1} or already matched against other vou
Journal Entry,Écriture de journal,
Journal Name,Nom du journal,
Journal code,Code journal,
+Journal entries for one supplier,Ecritures de journal pour un fournisseur,
Journal name,Nom du journal,
Journal type,Type de journal,
JournalCode,JournalCode,
@@ -6096,6 +6133,7 @@ Last Purchase Rate,Dernier Prix d'Achat,
Last Stock Transaction for item {0} under warehouse {1} was on {2}.,"La dernière transaction de stock pour l'article {0}, dans l'entrepôt {1}, a eu lieu le {2}",
Last Stock Transaction for item {0} was on {1}.,La dernière transation de stock pour l'article {0} était le {1},
Last Sync Datetime,Dernière date de synchronisation,
+Last Update via Pappers,Dernière mise à jour via Pappers,
Last Woocommerce Sync,Dernière synchronisation WooCommerce,
Last carbon check date cannot be a future date,La date de dernière vérification carbone ne peut être dans le futur,
Last day of the month,Dernier jour du mois,
@@ -6149,6 +6187,7 @@ Leave Encashed?,Congés encaissés ?,
"Leave blank for home. This is relative to site URL, for example ""about"" will redirect to ""https://yoursitename.com/about""","Laisser vide pour ""home"". Il s'agit d'une URL relative, par exemple ""about"" sera redirigé ver ""https://votresite.com/about""",
Leave blank if the Supplier is blocked indefinitely,Laisser vide si le fournisseur est bloqué indéfiniment,
Leave blank to use the standard Delivery Note format,Laissez vide pour utiliser le format de bon de livraison standard,
+"Leave empty for default format. For available formats please read the Python documentation","Laissez vide pour le format par défaut. Pour connaître les formats disponibles veuillez lire la documentation Python",
Leave empty if credits have a no validity end date,Laisser vide si les crédits n'ont pas de date de fin de validité,
Leave empty if no expiration,Laisser vide si aucune durée d'expiration,
Leave the field empty to make purchase orders for all suppliers,Laissez le champ vide pour passer des commandes pour tous les fournisseurs,
@@ -6160,6 +6199,7 @@ Left Index,Index gauche,
Left,A quitté l'entreprise,Employee
Legal Entity / Subsidiary with a separate Chart of Accounts belonging to the Organization.,Entité Juridique / Filiale avec un Plan de Comptes différent appartenant à l'Organisation.,
Legal Expenses,Frais Juridiques,
+Legal Form,Forme juridique,
Legal,Juridique,
Legend,Légende,
Length (cm),Longueur (cm),
@@ -6358,10 +6398,14 @@ Loss Value,Valeur de la perte,
Lost Opportunities,Opportunités perdues,
Lost Opportunity,Opportunités perdues,
Lost Quotation,Devis Perdu,
+Lost Quotations %,% de devis perdus,
+Lost Quotations,Devis perdus,
Lost Reason Detail,Détail de la raison de la perte,
Lost Reason,Raison de la Perte,
Lost Reasons are required in case opportunity is Lost.,Les raisons de la perte sont requises en cas de perte d'opportunité.,
Lost Reasons,Raisons pour avoir perdu le devis,
+Lost Value %,% de valeur perdue,
+Lost Value,Valeur perdue,
Lost,Perdu,
Low,Bas,
Lower Deduction Certificate,Certificat de déduction minorée,
@@ -6535,6 +6579,7 @@ Manufacturing module is set up !,Le module de production est configuré,
Manufacturing,Production,
Map Custom Field to DocType,Mapper le champ personnalisé au type de document,
Map Shopify Taxes / Shipping Charges to Dokos Account,Correspondance entre les taxes / frais de livraison de Shopify et les comptes dans Dokos,
+Mapping Purchase Receipt ...,Création des reçus d'achat ...,
Mapping Subcontracting Order ...,Mapping de la commande de sous-traitance ...,
Mapping {0} ...,Création d'une correspondance avec {0}...,
Mapping,Mapping,
@@ -7600,6 +7645,7 @@ Parent Detail docname,Nom de document du détail parent,
Parent Document,Document parent,
Parent Item Booking,Réservation d'article parente,
Parent Item Group,Groupe d'articles parent,
+Parent Item {0} must not be a Fixed Asset,L'article parent {0} ne doit pas être un actif immobilisé,
Parent Item {0} must not be a Stock Item,L'article parent {0} ne doit pas être un article stocké,
Parent Item,Article Parent,
Parent Location,Localisation parente,
@@ -7639,13 +7685,16 @@ Partner Type,Type de Partenaire,
Partner website,Site Partenaire,
Partnership,Partenariat,
Party Account Currency,Devise du Compte de Tiers,
+Party Account No. (Bank Statement),Compte bancaire du tiers (Relevé bancaire),
Party Account {0} currency ({1}) and document currency ({2}) should be same,La devise ({1}) du compte de tiers {0} et la devise du document ({2}) doivent être identiques,
Party Account,Compte de Tiers,
Party Balance,Solde du Tiers,
Party Bank Account,Compte bancaire du tiers,
Party Details,Détails du tiers,
+Party IBAN (Bank Statement),IBAN du tiers (Relevé bancaire),
Party Information,Informations additionnelles,
Party Link,Lien avec la partie,
+Party Name/Account Holder (Bank Statement),Nom du tiers/Titulaire du compte (Relevé bancaire),
Party Name,Nom du tiers,
Party Specific Item,Articles liés au tiers,
Party Type and Party is mandatory for {0} account,Le type de tiers et le tiers sont obligatoires pour le compte {0},
@@ -7775,6 +7824,7 @@ Payment Unlink Error,Erreur de déliaison de paiement,
Payment against {0} {1} cannot be greater than Outstanding Amount {2},Paiement pour {0} {1} ne peut pas être supérieur à Encours {2},
Payment amount cannot be less than or equal to 0,Le montant du paiement ne peut pas être inférieur ou égal à 0,
Payment cannot be processed immediately for this payment request.,Le paiement ne peut pas être récolté automatiquement pour cette demande de paiement.,
+Payment entries in batch,Ecritures de paiement en lot,
Payment entry cannot be created from payment request for doctype {0},Une écriture de paiement ne peut pas être créée depuis une demande de paiement pour le type de document {0},
Payment entry created,Ecriture de paiement créée,
Payment entry with reference {0} not found,Ecriture de paiement avec la référence {0} introuvable,
@@ -7798,6 +7848,7 @@ Payment succeeded. Refresh the page to pay again.,Paiement réussi. Veuillez raf
Payment successfully initialized,Paiement initialisé avec succès,
Payment term {0} not used in {1},Les conditions de paiement {0} ne sont pas utilisées dans {1}.,
Payment,Paiement,
+Payments created,Paiements créés,
Payments,Paiements,
Payroll Cost Centers,Centres de coûts de la paie,
Payroll Entry,Ecriture de paie,
@@ -7978,8 +8029,10 @@ Please add Root Account for - {0},Veuillez ajouter le compte racine pour - {0},
Please add a Swift Number in bank account {0} for customer {1},Veuillez ajouter un BIC dans le compte bancaire {0} pour le client {1},
Please add a Temporary Opening account in Chart of Accounts,Veuillez ajouter un compte d'ouverture temporaire dans le plan comptable,
Please add a bank account in mandate {0} for customer {1},Veuillez ajouter un compte bancaire dans le mandat {0} pour le client {1},
+Please add a bank account to supplier {0},Veuillez ajouter un compte bancaire au fournisseur {0},
Please add a price for the following billing intervals:,Veuillez ajouter un prix pour les intervalles de facturation suivants:,
Please add an IBAN in bank account {0} for customer {1},Veuillez ajouter un IBAN dans le compte bancaire {0} pour le client {1},
+Please add an IBAN to bank account {0},Veuillez associer un IBAN au compte bancaire {0},
Please add at least one company bank account. 'Is company account' must be checked.,Veuillez ajouter au moins un compte bancaire. 'Est le compte de la société' doit être coché.,
Please add at least one payment gateway,Veuillez ajouter au moins une passerelle de paiement,
Please add atleast one Serial No / Batch No,Veuillez ajouter au moins un numéro de série / lot,
@@ -8031,6 +8084,7 @@ Please create Landed Cost Vouchers against Invoices that have 'Update Stock' ena
Please create a new Accounting Dimension if required.,Veuillez créer une nouvelle dimension comptable si nécessaire.,
Please create a new invoice for this event with external reference {0},Veuillez créer une nouvelle facture pour cet événement avec la référence externe {0},
Please create a payment gateway account for currency {0},Veuillez créer un compte de passerelle de paiement pour la devise {0},
+Please create a {0} document to configure the generation of your XML file,Veuillez créer un document {0} pour configurer la génération de votre fichier XML,
Please create adjustment Journal Entry for amount {0} ,Veuillez créer une écriture de journal pour le montant {0},
Please create an adjustment Journal Entry for amount {0} on {1},Veuillez créer une écriture de journal d'ajustement pour le montant {0} à la date du {1},
Please create at least one mode of payment for this bank account first,Veuillez créer au moins un mode de paiement pour ce compte bancaire,
@@ -8710,6 +8764,7 @@ Publish in Website,Publier sur le site Web,
Publish on website,Publier sur le site web,
Publishable Key,Clé publiable,
Published Date,Date de publication,
+Published In Website,Publié sur le site web,
Published in Website,Publié sur le site Web,
Publishing Item ...,Élément de publication ...,
Publishing,Édition,
@@ -8770,6 +8825,7 @@ Purchase Receipt Required for item {},Reçu d'achat requis pour l'article {},
Purchase Receipt Required,Reçu d'achat requis,
Purchase Receipt Trends,Evolution des reçus d'achat,
Purchase Receipt doesn't have any Item for which Retain Sample is enabled.,Le reçu d'achat n'a aucun article pour lequel 'Garder un échantillon' est activé.,
+Purchase Receipt {0} created.,Reçu d'achats créé,
Purchase Receipt {0} is not submitted,Le Reçu d'Achat {0} n'est pas soumis,
Purchase Receipt,Reçu d'Achat,
Purchase Receipts,Reçus d'Achats,
@@ -8944,6 +9000,7 @@ Quote Status,Statut du Devis,
Quoted Amount,Montant du devis,
Quoted Item Comparison,Comparaison de articles des devis fournisseurs,
Quotes to Leads or Customers.,Devis de Prospects ou Clients.,
+RCS Information,Informations du RCS,
RFQs are not allowed for {0} due to a scorecard standing of {1},Les Appels d'Offres ne sont pas autorisés pour {0} en raison d'une note de {1} sur la fiche d'évaluation,
RRULE,RRULE,
RTT,RTT,
@@ -9220,6 +9277,7 @@ Relieving Date must be greater than or equal to Date of Joining,La date de dépa
Relieving Date,Date de départ,
Remaining Balance,Solde restant,
Remark,Remarque,
+Remarks Column Length,Longueur de la colonne Remarques,
Remarks,Remarques,
Remember to set {field_label}. It is required by {regulation}.,N'oubliez pas de définir {field_label}. C'est obligatoire d'après {regulation},
Reminder to update GSTIN Sent,Rappel pour mettre à jour GSTIN envoyé,
@@ -10295,6 +10353,7 @@ Selling ,Vente,
"Selling must be checked, if Applicable For is selected as {0}","Vente doit être vérifiée, si ""Applicable pour"" est sélectionné comme {0}",
Selling rate for item {0} is lower than its {1}. Selling rate should be atleast {2},Le prix de vente pour l'élément {0} est inférieur à son {1}. Le prix de vente devrait être au moins {2},
Selling,Vente,
+Semicolon,Point Virgule,
Send After (days),Envoyer après (jours),
Send Attached Files,Envoyer les pièces jointes,
Send Document Print,Envoyer une impression de document,
@@ -10332,6 +10391,7 @@ Sepa Direct Debit Settings,Paramètres de prélèvement Sepa,
Sepa Direct Debit,Prélèvement Sepa,
Sepa Mandate,Mandat Sepa,
Sepa Mandates,Mandats SEPA,
+Sepa Payments,Paiement SEPA,
Sepa mandate retrieval error,Erreur de récupération d'un mandat Sepa,
Sepa mandate status update error,Erreur de mise à jour du statut d'un mandat Sepa,
Sepa mandate validation failed for {0},La validation du mandat Sepa échoué pour {0},
@@ -11262,6 +11322,7 @@ Supplier Address,Adresse du Fournisseur,
Supplier Addresses And Contacts,Adresses et contacts des fournisseurs,
Supplier Analytics,Analyse des fournisseurs,
Supplier Contact,Contact du fournisseur,
+Supplier Cost Price,Prix du fournisseur,
Supplier Delivery Note,Bon de livraison du Fournisseur,
Supplier Detail,Détails du Fournisseur,
Supplier Details,Détails du Fournisseur,
@@ -11286,6 +11347,7 @@ Supplier Naming By,Nommage du fournisseur selon,
Supplier Part No,N° de Pièce du Fournisseur,
Supplier Part Number,Numéro de Pièce du Fournisseur,
Supplier Portal Users,Utilisateurs du portail fournisseur,
+Supplier Price,Prix du fournisseur,
Supplier Primary Address,Adresse principale du fournisseur,
Supplier Primary Contact,Contact principal du fournisseur,
Supplier Quotation Comparison,Comparaison de devis fournisseur,
@@ -11305,6 +11367,7 @@ Supplier Scorecard Variable,Variable de la Fiche d'Évaluation Fournisseur,
Supplier Scorecard,Fiche d'évaluation des fournisseurs,
Supplier Scorecards,Evaluation des fournisseurs,
Supplier Type,Type de Fournisseur,
+Supplier Unit Price,Prix unitaire du fournisseur,
Supplier Warehouse mandatory for sub-contracted Purchase Receipt,Entrepôt Fournisseur obligatoire pour les Reçus d'Achat sous-traités,
Supplier Warehouse mandatory for sub-contracted {0},Entrepôt fournisseur obligatoire pour le·la {0} sous-traité,
Supplier Warehouse,Entrepôt Fournisseur,
@@ -11384,6 +11447,7 @@ TLB-,TLB-,
TS-.YYYY.-,TS-.YYYY.-,
TS-,TS-,
TVA-.YYYY.-.MM.-,TVA-.YYYY.-.MM.-,
+Tab,Tabulation,
Table for Item that will be shown in Web Site,Table pour l'Article qui sera affiché sur le site Web,
Tabs,Séparateur d'onglet,
Tag Line,Slogan,
@@ -11858,7 +11922,7 @@ This operation will not erase your existing accounting journals.,Cette opératio
This operation will not erase your existing accounts. Dokos will try to append them to their corresponding parents in the tree.,Cette opération n'écrasera pas vos comptes existants. Dokos essaiera de les associer avec les groupes correspondant dans l'arbre.,
This option can be checked to edit the 'Posting Date' and 'Posting Time' fields.,Cette option peut être cochée pour modifier les champs 'Date de comptabilisation' et 'Heure de comptabilisation'.,
This order contains some recurring items and is linked to subscription {0},Cette commande contient des articles récurrents et est liée à l'abonnement {0},
-This order contains some recurring items. A subscription will be automatically generated on submission.,Cette commande contient des articles récurrents. Un abonnement sera automatiquement généré à la validation.,
+This order contains some recurring items. A subscription will be automatically generated on submission if a recurring period is set.,Cette commande contient des articles récurrents. Un abonnement sera automatiquement généré à la validation si une période de récurrence est définie.,
This payment has already been done. Please contact us if you have any question.,Ce paiement a déjà été fait. Veuillez nous contacter si vous avez des questions.,
This payment has not been paid out yet,Ce paiement n'a pas été encore été versé,
"This payment request is linked to subscription {0}","Cette demande de paiement est liée à l'abonnement {0}",
@@ -12068,6 +12132,8 @@ Total Additional Costs,Total des coûts additionnels,
Total Advance,Acompte/avance total,
Total Allocated Amount (Company Currency),Montant total alloué (Devise société),
Total Allocated Amount,Montant total alloué,
+Total Allocated Credit,Crédit alloué total,
+Total Allocated Debit,Débit alloué total,
Total Allocations,Allocations totales,
Total Amount Credited,Montant total crédité,
Total Amount Currency,Montant total en devise,
@@ -12186,6 +12252,7 @@ Total Projected Qty,Qté Totale Prévue,
Total Projected Quantity in Stock,Quantité projetée totale en stock,
Total Purchase Amount,Montant total des achats,
Total Purchase Cost (via Purchase Invoice),Coût d'Achat Total (via les factures d'achat),
+Total Purchase Cost has been updated,Le coût d'achats total a été mis à jour,
Total Purchases Last Month,Total Achats du mois dernier,
Total Purchases This Month,Total Achats du mois en cours,
Total Purchases This Year,Total Achats cette année,
@@ -12417,6 +12484,7 @@ Under Review,En cours de révision,
Under Warranty,Sous Garantie,
Undue Booked Interest,Intérêt comptabilisé non dû,
Unfulfilled,Non-rempli,
+Unit Cost Price,Coût de revient unitaire,
Unit Of Measure,Unité de mesure,
Unit of Measure (UOM),Unité de mesure,
Unit of Measure Field,Champ Unité de mesure,
@@ -12454,7 +12522,9 @@ Unrealized Profit / Loss Account,Compte de bénéfice/perte non réalisée,
Unrealized Profit / Loss account for intra-company transfers,Bénéfice/perte non réalisé pour les transferts intra-société,
Unrealized Profit/Loss account for intra-company transfers,Compte de bénéfice/perte non réalisé pour les transferts intra-société,
Unreconcile Payment Entries,Dé-réconcilier les écritures de paiement,
+Unreconcile Payment,Dé-réconcilier le paiement,
Unreconcile Payments,Dé-réconcilier les paiements,
+Unreconcile Transaction,Dé-réconcilier la transaction,
Unreconciled Amount,Montant non rapproché,
Unreconciled Entries,Entrées non réconciliées,
Unreconciled Payment Details,Détails des paiements non rapprochés,
@@ -12516,9 +12586,11 @@ Update Series,Mettre à Jour les Séries,
Update Stock Opening Balance,Mise à jour du solde d'ouverture des stocks,
Update Stock,Mettre à jour le stock,
Update Taxes for Items,Mettre à jour les taxes pour les articles,
+Update Total Purchase Cost,Mettre à jour le coût total des achats,
Update Woocommerce products from Dokos items,Mettre à jour les produits WooCommerce à partir des articles Dokos,
Update bank payment dates with journals.,Mettre à jour les dates de paiement bancaires avec les journaux.,
Update data every (Days),Mettre à jour tous les (Jours),
+Update frequency of Project,Mettre à jour la fréquence du projet,
Update in progress. It might take a while.,Mise à jour en cours. Ça peut prendre un moment.,
Update latest price in all BOMs,Mettre à jour le prix le plus récent dans toutes les nomenclatures,
Update rate as per last purchase,Mettre à jour les prix selon le dernier prix achat,
@@ -12726,6 +12798,7 @@ View General Ledger,Afficher le grand livre,
View Journals,Voir les journaux,
View Leads,Voir Prospects,
View Ledger,Grand livre,
+View Ledgers,Voir les livres comptables,
View More,Voir plus,
View Now,Voir Maintenant,
View Orders,Afficher les commandes,
@@ -12912,6 +12985,7 @@ Wishlist is empty!,La liste de préférences est vide !,
Wishlist,Liste de préférences,
With Items,Avec Articles,
With Operations,Avec des Opérations,
+Withdrawal,Retrait,
Without category,Sans catégorie,
Won Opportunities,Opportunités gagnées,
Won Opportunity (Last 1 Month),Opportunités gagnées (30 jours glissants),
@@ -13115,6 +13189,7 @@ You need to enable Shopping Cart,Vous devez activer le Panier,
YouTube Interactions,Interactions Youtube,
Your Company set in Dokos,Votre société dans Dokos,
Your FEC is being prepared,Votre FEC est en cours de préparation,
+Your FEC is ready - {0},Votre FEC est prêt - {0},
Your Interview session is rescheduled from {0} {1} - {2} to {3} {4} - {5},Votre session d'entretien a été reprogrammée de {0} {1} - {2} à {3} {4} - {5},
Your Name (required),Votre nom *,
Your Organization,L'activité de la société,
@@ -13289,6 +13364,7 @@ out of 5,sur 5,
overwrite,écraser,
pages,pages,
paid_amount,paid_amount,
+pain.001.001.03,pain.001.001.03,
pain.008.001.02,pain.008.001.02,
pain.008.002.02,pain.008.002.02,
pain.008.003.02,pain.008.003.02,
@@ -13505,6 +13581,7 @@ you must select Capital Work in Progress Account in accounts table,Vous devez s
{0} {1} has already been partly paid. Please use the 'Get Outstanding Invoice' or the 'Get Outstanding Orders' button to get the latest outstanding amounts.,{0} {1} a déjà été partiellement payé·e. Veuillez utiliser le bouton 'Obtenir les factures en attente' ou 'Obtenir les commandes en attente' pour récupérer les derniers montants restant dûs.,
{0} {1} has been modified. Please refresh.,{0} {1} a été modifié. Veuillez actualiser.,
{0} {1} has not been submitted so the action cannot be completed,"{0} {1} n'a pas été soumis, donc l'action ne peut pas être complétée",
+{0} {1} is allocated twice in this Bank Transaction,{0} {0} est alloué deux fois dans cette transaction bancaire,
"{0} {1} is associated with {2}, but Party Account is {3}","{0} {1} est associé à {2}, mais le compte tiers est {3}",
{0} {1} is cancelled or closed,{0} {1} est annulé ou fermé,
{0} {1} is cancelled or stopped,{0} {1} est annulé ou arrêté,
@@ -13593,6 +13670,7 @@ you must select Capital Work in Progress Account in accounts table,Vous devez s
{},{},}
{},{},
← Back to upload files,← Retour au téléchargement de fichiers,
+🏃 Your Shortcuts,🏃 Vos Raccourcis,
🏃Your Shortcuts,🏃Vos raccourcis,
📊 Reports ,📊 Rapports,
📖 General Ledger,📖 Grand livre,
@@ -13600,3 +13678,4 @@ you must select Capital Work in Progress Account in accounts table,Vous devez s
🗃️ CRM Data & Transactions,🗃️ Données CRM & Transactions,
🗃️ Manufacturing Data & Transactions,🗃️ Données de production & Transactions,
🗃️ Projects Data,🗃️ Données des projets,
+🗃️ Reports & Masters,🗃️ Rapports & Données de base,
diff --git a/erpnext/utilities/doctype/sms_log/README.md b/erpnext/utilities/doctype/sms_log/README.md
deleted file mode 100644
index 9ee2b79ef07e653f17a69cbe0fa60616707ee26b..0000000000000000000000000000000000000000
--- a/erpnext/utilities/doctype/sms_log/README.md
+++ /dev/null
@@ -1 +0,0 @@
-Log of SMS sent via SMS Center.
\ No newline at end of file
diff --git a/erpnext/utilities/doctype/sms_log/__init__.py b/erpnext/utilities/doctype/sms_log/__init__.py
deleted file mode 100644
index 8b137891791fe96927ad78e64b0aad7bded08bdc..0000000000000000000000000000000000000000
--- a/erpnext/utilities/doctype/sms_log/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/erpnext/utilities/doctype/sms_log/sms_log.js b/erpnext/utilities/doctype/sms_log/sms_log.js
deleted file mode 100644
index f5358e84093cc7bff55fd38427fed151b4941fed..0000000000000000000000000000000000000000
--- a/erpnext/utilities/doctype/sms_log/sms_log.js
+++ /dev/null
@@ -1,8 +0,0 @@
-// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors
-// For license information, please see license.txt
-
-frappe.ui.form.on('SMS Log', {
- refresh: function(frm) {
-
- }
-});
diff --git a/erpnext/utilities/doctype/sms_log/sms_log.json b/erpnext/utilities/doctype/sms_log/sms_log.json
deleted file mode 100644
index 09ab4d1de8a718b34328952e58495edee7f84d15..0000000000000000000000000000000000000000
--- a/erpnext/utilities/doctype/sms_log/sms_log.json
+++ /dev/null
@@ -1,99 +0,0 @@
-{
- "actions": [],
- "autoname": "SYS-SMS-.#####",
- "creation": "2012-03-27 14:36:47",
- "doctype": "DocType",
- "engine": "InnoDB",
- "field_order": [
- "sender_name",
- "sent_on",
- "column_break0",
- "message",
- "sec_break1",
- "no_of_requested_sms",
- "requested_numbers",
- "column_break1",
- "no_of_sent_sms",
- "sent_to"
- ],
- "fields": [
- {
- "fieldname": "sender_name",
- "fieldtype": "Data",
- "label": "Sender Name",
- "read_only": 1
- },
- {
- "fieldname": "sent_on",
- "fieldtype": "Date",
- "label": "Sent On",
- "read_only": 1
- },
- {
- "fieldname": "column_break0",
- "fieldtype": "Column Break",
- "width": "50%"
- },
- {
- "fieldname": "message",
- "fieldtype": "Small Text",
- "label": "Message",
- "read_only": 1
- },
- {
- "fieldname": "sec_break1",
- "fieldtype": "Section Break",
- "options": "Simple"
- },
- {
- "fieldname": "no_of_requested_sms",
- "fieldtype": "Int",
- "label": "No of Requested SMS",
- "read_only": 1
- },
- {
- "fieldname": "requested_numbers",
- "fieldtype": "Code",
- "label": "Requested Numbers",
- "read_only": 1
- },
- {
- "fieldname": "column_break1",
- "fieldtype": "Column Break",
- "width": "50%"
- },
- {
- "fieldname": "no_of_sent_sms",
- "fieldtype": "Int",
- "label": "No of Sent SMS",
- "read_only": 1
- },
- {
- "fieldname": "sent_to",
- "fieldtype": "Code",
- "label": "Sent To",
- "read_only": 1
- }
- ],
- "icon": "uil uil-comments-alt",
- "idx": 1,
- "links": [],
- "modified": "2023-02-20 16:33:50.446725",
- "modified_by": "Administrator",
- "module": "Utilities",
- "name": "SMS Log",
- "owner": "Administrator",
- "permissions": [
- {
- "email": 1,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "System Manager"
- }
- ],
- "sort_field": "modified",
- "sort_order": "DESC",
- "states": [],
- "track_changes": 1
-}
\ No newline at end of file
diff --git a/erpnext/utilities/doctype/sms_log/sms_log.py b/erpnext/utilities/doctype/sms_log/sms_log.py
deleted file mode 100644
index ff220d8bcb9c3814f8bb4c84616f1124652c9a26..0000000000000000000000000000000000000000
--- a/erpnext/utilities/doctype/sms_log/sms_log.py
+++ /dev/null
@@ -1,10 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
-# License: GNU General Public License v3. See license.txt
-
-
-import frappe
-from frappe.model.document import Document
-
-
-class SMSLog(Document):
- pass
diff --git a/erpnext/utilities/doctype/sms_log/test_sms_log.py b/erpnext/utilities/doctype/sms_log/test_sms_log.py
deleted file mode 100644
index 8590d81616f7b5a5732c419c3c26ee1cb7903515..0000000000000000000000000000000000000000
--- a/erpnext/utilities/doctype/sms_log/test_sms_log.py
+++ /dev/null
@@ -1,13 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
-# See license.txt
-
-
-import unittest
-
-import frappe
-
-# test_records = frappe.get_test_records('SMS Log')
-
-
-class TestSMSLog(unittest.TestCase):
- pass
diff --git a/erpnext/venue/custom/event.json b/erpnext/venue/custom/event.json
index 1e093f1f4e389518d89df78e9e24554cce7dba2d..d136d2ec506fb1eaabfb16cfcfe33e5979deeeca 100644
--- a/erpnext/venue/custom/event.json
+++ b/erpnext/venue/custom/event.json
@@ -1,132 +1,144 @@
{
- "custom_fields": [
- {
- "description": "Leave this field empty or write 0 to not set a limit.",
- "dt": "Event",
- "fieldname": "max_number_of_registrations",
- "fieldtype": "Int",
- "insert_after": "status",
- "is_system_generated": 1,
- "label": "Maximum number of registrations",
- "non_negative": 1
- },
- {
- "depends_on": "eval:doc.published",
- "dt": "Event",
- "fieldname": "registrations_section",
- "fieldtype": "Section Break",
- "insert_after": "role",
- "is_system_generated": 1,
- "label": "Registrations",
- "module": "Venue",
- "name": "Event-registrations_section"
- },
- {
- "default": "0",
- "dt": "Event",
- "fieldname": "allow_registrations",
- "fieldtype": "Check",
- "insert_after": "registrations_section",
- "is_system_generated": 1,
- "label": "Allow registrations",
- "module": "Venue",
- "name": "Event-allow_registrations"
- },
- {
- "default": "0",
- "depends_on": "eval:doc.allow_registrations",
- "description": "Allows for the registration of multiple people (e.g. family) using a single user account/email address.",
- "dt": "Event",
- "fieldname": "allow_multiple_registrations",
- "fieldtype": "Check",
- "hidden": 1,
- "insert_after": "allow_registrations",
- "is_system_generated": 1,
- "label": "Allow users to register multiple times",
- "module": "Venue",
- "name": "Event-allow_multiple_registrations"
- },
- {
- "default": "0",
- "depends_on": "eval:doc.allow_registrations",
- "dt": "Event",
- "fieldname": "allow_cancellations",
- "fieldtype": "Check",
- "insert_after": "allow_multiple_registrations",
- "is_system_generated": 1,
- "label": "Allow cancellations",
- "module": "Venue",
- "name": "Event-allow_cancellations"
- },
- {
- "depends_on": "eval:doc.allow_registrations",
- "dt": "Event",
- "fieldname": "registration_form",
- "fieldtype": "Link",
- "insert_after": "allow_cancellations",
- "is_system_generated": 1,
- "label": "Registration Form",
- "module": "Venue",
- "name": "Event-registration_form",
- "options": "Web Form"
- },
- {
- "default": "0",
- "depends_on": "eval:doc.registration_form&&doc.allow_registrations",
- "dt": "Event",
- "fieldname": "registration_amount",
- "fieldtype": "Currency",
- "insert_after": "registration_form",
- "is_system_generated": 1,
- "label": "Registration amount",
- "non_negative": 1
- },
- {
- "dt": "Event",
- "fieldname": "column_break_38",
- "fieldtype": "Column Break",
- "insert_after": "amount",
- "is_system_generated": 1,
- "name": "Event-column_break_38"
- },
- {
- "default": null,
- "depends_on": "eval:!doc.registration_form",
- "dt": "Event",
- "fieldname": "success_message",
- "fieldtype": "HTML",
- "insert_after": "column_break_38",
- "is_system_generated": 1,
- "label": "Registration success message"
- }
- ],
- "custom_perms": [],
- "doctype": "Event",
- "links": [
- {
- "group": "Registrations",
- "is_child_table": 0,
- "link_doctype": "Event Registration",
- "link_fieldname": "event",
- "name": "6b3d53940f",
- "parent": "Event",
- "parent_doctype": null,
- "parentfield": "links",
- "parenttype": "DocType",
- "table_fieldname": null
- }
- ],
- "property_setters": [
- {
- "doc_type": "Event",
- "doctype_or_field": "DocType",
- "module": "Venue",
- "name": "Event-main-links_order",
- "property": "links_order",
- "property_type": "Small Text",
- "value": "[\"6b3d53940f\"]",
- "is_system_generated": 1
- }
- ],
- "sync_on_migrate": 1
-}
\ No newline at end of file
+ "custom_fields": [
+ {
+ "description": "Leave this field empty or write 0 to not set a limit.",
+ "dt": "Event",
+ "fieldname": "max_number_of_registrations",
+ "fieldtype": "Int",
+ "insert_after": "status",
+ "is_system_generated": 1,
+ "label": "Maximum number of registrations",
+ "non_negative": 1
+ },
+ {
+ "depends_on": "eval:doc.published",
+ "dt": "Event",
+ "fieldname": "published_address",
+ "fieldtype": "Link",
+ "insert_after": "role",
+ "is_system_generated": 1,
+ "label": "Address",
+ "options": "Address",
+ "module": "Venue",
+ "name": "Event-published_address"
+ },
+ {
+ "depends_on": "eval:doc.published",
+ "dt": "Event",
+ "fieldname": "registrations_section",
+ "fieldtype": "Section Break",
+ "insert_after": "published_address",
+ "is_system_generated": 1,
+ "label": "Registrations",
+ "module": "Venue",
+ "name": "Event-registrations_section"
+ },
+ {
+ "default": "0",
+ "dt": "Event",
+ "fieldname": "allow_registrations",
+ "fieldtype": "Check",
+ "insert_after": "registrations_section",
+ "is_system_generated": 1,
+ "label": "Allow registrations",
+ "module": "Venue",
+ "name": "Event-allow_registrations"
+ },
+ {
+ "default": "0",
+ "depends_on": "eval:doc.allow_registrations",
+ "description": "Allows for the registration of multiple people (e.g. family) using a single user account/email address.",
+ "dt": "Event",
+ "fieldname": "allow_multiple_registrations",
+ "fieldtype": "Check",
+ "hidden": 1,
+ "insert_after": "allow_registrations",
+ "is_system_generated": 1,
+ "label": "Allow users to register multiple times",
+ "module": "Venue",
+ "name": "Event-allow_multiple_registrations"
+ },
+ {
+ "default": "0",
+ "depends_on": "eval:doc.allow_registrations",
+ "dt": "Event",
+ "fieldname": "allow_cancellations",
+ "fieldtype": "Check",
+ "insert_after": "allow_multiple_registrations",
+ "is_system_generated": 1,
+ "label": "Allow cancellations",
+ "module": "Venue",
+ "name": "Event-allow_cancellations"
+ },
+ {
+ "depends_on": "eval:doc.allow_registrations",
+ "dt": "Event",
+ "fieldname": "registration_form",
+ "fieldtype": "Link",
+ "insert_after": "allow_cancellations",
+ "is_system_generated": 1,
+ "label": "Registration Form",
+ "module": "Venue",
+ "name": "Event-registration_form",
+ "options": "Web Form"
+ },
+ {
+ "default": "0",
+ "depends_on": "eval:doc.registration_form&&doc.allow_registrations",
+ "dt": "Event",
+ "fieldname": "registration_amount",
+ "fieldtype": "Currency",
+ "insert_after": "registration_form",
+ "is_system_generated": 1,
+ "label": "Registration amount",
+ "non_negative": 1
+ },
+ {
+ "dt": "Event",
+ "fieldname": "column_break_38",
+ "fieldtype": "Column Break",
+ "insert_after": "amount",
+ "is_system_generated": 1,
+ "name": "Event-column_break_38"
+ },
+ {
+ "default": null,
+ "depends_on": "eval:!doc.registration_form",
+ "dt": "Event",
+ "fieldname": "success_message",
+ "fieldtype": "HTML",
+ "insert_after": "column_break_38",
+ "is_system_generated": 1,
+ "label": "Registration success message"
+ }
+ ],
+ "custom_perms": [],
+ "doctype": "Event",
+ "links": [
+ {
+ "group": "Registrations",
+ "is_child_table": 0,
+ "link_doctype": "Event Registration",
+ "link_fieldname": "event",
+ "name": "6b3d53940f",
+ "parent": "Event",
+ "parent_doctype": null,
+ "parentfield": "links",
+ "parenttype": "DocType",
+ "table_fieldname": null
+ }
+ ],
+ "property_setters": [
+ {
+ "doc_type": "Event",
+ "doctype_or_field": "DocType",
+ "module": "Venue",
+ "name": "Event-main-links_order",
+ "property": "links_order",
+ "property_type": "Small Text",
+ "value": "[\"6b3d53940f\"]",
+ "is_system_generated": 1
+ }
+ ],
+ "sync_on_migrate": 1
+}
diff --git a/erpnext/venue/web_template/__init__.py b/erpnext/venue/web_template/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/erpnext/venue/web_template/event_card/__init__.py b/erpnext/venue/web_template/event_card/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/erpnext/venue/web_template/event_card/event_card.html b/erpnext/venue/web_template/event_card/event_card.html
new file mode 100644
index 0000000000000000000000000000000000000000..4c719bdc0411f8cb347eecc895e6a12e5a7364c9
--- /dev/null
+++ b/erpnext/venue/web_template/event_card/event_card.html
@@ -0,0 +1,155 @@
+{%- macro event_card(event, is_full_width=False, align="Left") -%}
+ {# {%- set align_events_class = resolve_class({
+ 'align-events-end': align == 'Right',
+ 'align-events-center': align == 'Center',
+ 'align-events-start': align == 'Left',
+ }) -%} #}
+ {# {%- set col_size = 3 if is_full_width else 4 -%} #}
+ {%- set title = event.subject -%}
+ {%- set title = title[:50] + "..." if title|len > 50 else title -%}
+ {%- set image = event.image -%}
+ {%- set description = event.short_description-%}
+
+
+ {% if image %}
+