Compare commits

..

2 Commits

Author SHA1 Message Date
Nabin Hait
03ecd2fd3a test: reuse BootStrapTestData master data to reduce runtime
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-26 13:36:39 +05:30
Nabin Hait
55c6d16d69 test: add coverage for Profitability Analysis report
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-26 09:49:40 +05:30
42 changed files with 252 additions and 126124 deletions

View File

@@ -73,7 +73,7 @@ class ExchangeRateRevaluation(Document):
def validate_mandatory(self):
if not (self.company and self.posting_date):
frappe.throw(_("Please select Company and Posting Date to get entries"))
frappe.throw(_("Please select Company and Posting Date to getting entries"))
def before_submit(self):
self.remove_accounts_without_gain_loss()

View File

@@ -0,0 +1,105 @@
# Copyright (c) 2026, Frappe Technologies Pvt. Ltd. and Contributors
# See license.txt
import frappe
from erpnext.accounts.doctype.cost_center.test_cost_center import create_cost_center
from erpnext.accounts.doctype.journal_entry.test_journal_entry import make_journal_entry
from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice
from erpnext.accounts.report.profitability_analysis.profitability_analysis import execute
from erpnext.tests.utils import ERPNextTestSuite
INCOME = "Sales - _TC"
EXPENSE = "_Test Account Cost for Goods Sold - _TC"
BANK = "_Test Bank - _TC"
class TestProfitabilityAnalysis(ERPNextTestSuite):
def run_report(self, fiscal_year="_Test Fiscal Year 2026", **extra):
filters = frappe._dict(
{
"company": "_Test Company",
"based_on": "Cost Center",
"fiscal_year": fiscal_year,
"from_date": "2026-01-01",
"to_date": "2026-12-31",
**extra,
}
)
return execute(filters)[1]
def make_cc(self, name, **args):
create_cost_center(cost_center_name=name, **args)
return name + " - _TC"
def row(self, data, account):
return next(r for r in data if r.get("account") == account)
def book_income(self, cost_center, amount, posting_date="2026-06-01"):
create_sales_invoice(
cost_center=cost_center, income_account=INCOME, rate=amount, qty=1, posting_date=posting_date
)
def book_expense(self, cost_center, amount, posting_date="2026-06-01"):
make_journal_entry(
EXPENSE, BANK, amount, cost_center=cost_center, posting_date=posting_date, submit=True
)
def test_income_expense_and_gross_profit(self):
# bootstrap leaf cost center; clean of committed GL so exact assertions hold
cc = "_Test Cost Center - _TC"
self.book_income(cc, 10000)
self.book_expense(cc, 4000)
row = self.row(self.run_report(), cc)
self.assertEqual(row["income"], 10000)
self.assertEqual(row["expense"], 4000)
self.assertEqual(row["gross_profit_loss"], 6000)
def test_parent_cost_center_accumulates_children(self):
parent = self.make_cc("_Test PA Parent", is_group=1)
child_1 = self.make_cc("_Test PA Child 1", parent_cost_center=parent)
child_2 = self.make_cc("_Test PA Child 2", parent_cost_center=parent)
self.book_income(child_1, 10000)
self.book_expense(child_2, 3000)
data = self.run_report()
self.assertEqual(self.row(data, child_1)["income"], 10000)
self.assertEqual(self.row(data, child_2)["expense"], 3000)
parent_row = self.row(data, parent)
self.assertEqual(parent_row["income"], 10000)
self.assertEqual(parent_row["expense"], 3000)
self.assertEqual(parent_row["gross_profit_loss"], 7000)
def test_date_range_excludes_out_of_period_entries(self):
cc = "_Test Cost Center 2 - _TC"
self.book_income(cc, 10000, posting_date="2025-06-01")
# the 2025 income must not appear in a 2026 report (zero-value rows are dropped)
accounts_2026 = {r.get("account") for r in self.run_report()}
self.assertNotIn(cc, accounts_2026)
row_2025 = self.row(
self.run_report(
fiscal_year="_Test Fiscal Year 2025", from_date="2025-01-01", to_date="2025-12-31"
),
cc,
)
self.assertEqual(row_2025["income"], 10000)
def test_total_row_sums_income_and_expense(self):
cc = "_Test Cost Center - _TC"
self.book_income(cc, 10000)
self.book_expense(cc, 4000)
data = self.run_report()
# the report appends a blank separator row and a totals row at the end
total_row = data[-1]
self.assertEqual(total_row["account"], "'Total'")
# total is built from direct (non-accumulated) values, so it stays internally consistent
self.assertEqual(total_row["gross_profit_loss"], total_row["income"] - total_row["expense"])
# and it includes this test's bookings
self.assertGreaterEqual(total_row["income"], 10000)
self.assertGreaterEqual(total_row["expense"], 4000)

View File

@@ -3,26 +3,11 @@
import frappe
from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice
from erpnext.assets.doctype.asset.depreciation import post_depreciation_entries
from erpnext.assets.doctype.asset.test_asset import AssetSetup, create_asset
from erpnext.assets.doctype.asset_capitalization.test_asset_capitalization import (
create_asset_capitalization,
)
from erpnext.assets.doctype.asset_value_adjustment.test_asset_value_adjustment import (
make_asset_value_adjustment,
)
from erpnext.assets.report.fixed_asset_register.fixed_asset_register import execute
class TestFixedAssetRegister(AssetSetup):
def run_report(self, **extra):
filters = frappe._dict(company="_Test Company", **extra)
return execute(filters)[1]
def report_row(self, asset_name, **extra):
return next(row for row in self.run_report(**extra) if row["asset_id"] == asset_name)
def test_report_lists_submitted_asset(self):
"""Exercises the report's converted queries -- including the depreciation aggregate that groups
by asset.name (must be valid on Postgres) -- by asserting a submitted asset is listed."""
@@ -33,170 +18,16 @@ class TestFixedAssetRegister(AssetSetup):
location="Test Location",
submit=1,
)
ids = {
row["asset_id"]
for row in self.run_report(
status="In Location",
filter_based_on="Date Range",
from_date="2020-01-01",
to_date="2030-12-31",
date_based_on="Purchase Date",
)
}
self.assertIn(asset.name, ids)
def test_asset_appears_with_purchase_value(self):
asset = create_asset(
item_code="Macbook Pro", net_purchase_amount=100000, purchase_amount=100000, submit=True
filters = frappe._dict(
{
"company": "_Test Company",
"status": "In Location",
"filter_based_on": "Date Range",
"from_date": "2020-01-01",
"to_date": "2030-12-31",
"date_based_on": "Purchase Date",
}
)
row = self.report_row(asset.name)
self.assertEqual(row["net_purchase_amount"], 100000)
self.assertEqual(row["asset_value"], 100000) # no depreciation yet
self.assertEqual(row["asset_category"], "Computers")
def test_asset_value_reduced_by_opening_depreciation(self):
asset = create_asset(
item_code="Macbook Pro",
net_purchase_amount=100000,
purchase_amount=100000,
opening_accumulated_depreciation=20000,
opening_number_of_booked_depreciations=2,
submit=True,
)
row = self.report_row(asset.name)
self.assertEqual(row["opening_accumulated_depreciation"], 20000)
self.assertEqual(row["asset_value"], 80000) # 100000 - 20000
def test_status_in_location_filter_shows_active_asset(self):
asset = create_asset(
item_code="Macbook Pro", net_purchase_amount=100000, purchase_amount=100000, submit=True
)
ids = {row["asset_id"] for row in self.run_report(status="In Location")}
self.assertIn(asset.name, ids)
def test_asset_category_filter(self):
asset = create_asset(
item_code="Macbook Pro", net_purchase_amount=100000, purchase_amount=100000, submit=True
)
ids = {row["asset_id"] for row in self.run_report(asset_category="Computers")}
self.assertIn(asset.name, ids)
def test_group_by_asset_category_sums_values(self):
before_net, before_value = self.computers_group_totals()
create_asset(item_code="Macbook Pro", net_purchase_amount=100000, purchase_amount=100000, submit=True)
create_asset(
item_code="Macbook Pro",
asset_name="Macbook Pro 2",
net_purchase_amount=50000,
purchase_amount=50000,
submit=True,
)
after_net, after_value = self.computers_group_totals()
# assert on the delta so pre-existing Computers assets don't skew the totals
self.assertEqual(after_net - before_net, 150000)
self.assertEqual(after_value - before_value, 150000)
def computers_group_totals(self):
row = next(
(r for r in self.run_report(group_by="Asset Category") if r["asset_category"] == "Computers"),
None,
)
return (row["net_purchase_amount"], row["asset_value"]) if row else (0, 0)
def test_booked_depreciation_reduces_asset_value(self):
asset = create_asset(
item_code="Macbook Pro",
calculate_depreciation=1,
available_for_use_date="2019-12-31",
depreciation_start_date="2020-12-31",
frequency_of_depreciation=12,
total_number_of_depreciations=3,
expected_value_after_useful_life=10000,
net_purchase_amount=100000,
purchase_amount=100000,
submit=True,
)
# books one depreciation entry of (100000 - 10000) / 3 = 30000
post_depreciation_entries(date="2021-01-01")
row = self.report_row(asset.name)
self.assertEqual(row["depreciated_amount"], 30000)
self.assertEqual(row["asset_value"], 70000) # 100000 - 30000
def test_revaluation_adjusts_asset_value(self):
asset = create_asset(
item_code="Macbook Pro", net_purchase_amount=100000, purchase_amount=100000, submit=True
)
# revalue the asset upwards by 20000
make_asset_value_adjustment(
asset=asset.name, current_asset_value=100000, new_asset_value=120000
).submit()
row = self.report_row(asset.name)
self.assertEqual(row["asset_value"], 120000) # 100000 + 20000 revaluation
def test_depreciation_and_revaluation_together(self):
asset = create_asset(
item_code="Macbook Pro",
calculate_depreciation=1,
available_for_use_date="2019-12-31",
depreciation_start_date="2020-12-31",
frequency_of_depreciation=12,
total_number_of_depreciations=3,
expected_value_after_useful_life=10000,
net_purchase_amount=100000,
purchase_amount=100000,
submit=True,
)
# books one depreciation entry of (100000 - 10000) / 3 = 30000, leaving 70000
post_depreciation_entries(date="2021-01-01")
# revalue the depreciated asset down from 70000 to 60000
make_asset_value_adjustment(
asset=asset.name, current_asset_value=70000, new_asset_value=60000
).submit()
row = self.report_row(asset.name)
self.assertEqual(row["depreciated_amount"], 30000)
self.assertEqual(row["asset_value"], 60000) # 100000 - 30000 depreciation - 10000 revaluation
def test_sold_asset_hidden_from_in_location_and_shown_in_disposed(self):
asset = create_asset(
item_code="Macbook Pro", net_purchase_amount=100000, purchase_amount=100000, submit=True
)
create_sales_invoice(item_code="Macbook Pro", asset=asset.name, qty=1, rate=80000)
self.assertEqual(frappe.db.get_value("Asset", asset.name, "status"), "Sold")
self.assertNotIn(asset.name, {row["asset_id"] for row in self.run_report(status="In Location")})
self.assertIn(asset.name, {row["asset_id"] for row in self.run_report(status="Disposed")})
def test_capitalized_asset_hidden_from_in_location_and_shown_in_disposed(self):
consumed_asset = create_asset(
asset_name="Consumed Asset",
net_purchase_amount=100000,
purchase_amount=100000,
submit=True,
)
composite_asset = create_asset(
asset_name="Composite Asset", asset_type="Composite Asset", submit=False
)
create_asset_capitalization(
target_asset=composite_asset.name, consumed_asset=consumed_asset.name, submit=1
)
self.assertEqual(frappe.db.get_value("Asset", consumed_asset.name, "status"), "Capitalized")
self.assertNotIn(
consumed_asset.name, {row["asset_id"] for row in self.run_report(status="In Location")}
)
self.assertIn(consumed_asset.name, {row["asset_id"] for row in self.run_report(status="Disposed")})
data = execute(filters)[1]
asset_ids = {row.get("asset_id") for row in data}
self.assertIn(asset.name, asset_ids)

View File

@@ -274,7 +274,7 @@ class AccountsController(TransactionBase):
if invalid_advances := [x for x in self.advances if not x.reference_type or not x.reference_name]:
frappe.throw(
_(
"Rows: {0} in {1} section are invalid. Reference Name should point to a valid Payment Entry or Journal Entry."
"Rows: {0} in {1} section are Invalid. Reference Name should point to a valid Payment Entry or Journal Entry."
).format(
frappe.bold(comma_and([x.idx for x in invalid_advances])),
frappe.bold(_("Advance Payments")),
@@ -1233,7 +1233,7 @@ class AccountsController(TransactionBase):
{"sales_order": None, "sales_order_item": None},
)
frappe.msgprint(_("Purchase Orders {0} are unlinked").format("\n".join(linked_po)))
frappe.msgprint(_("Purchase Orders {0} are un-linked").format("\n".join(linked_po)))
def get_company_default(self, fieldname, ignore_validation=False):
from erpnext.accounts.utils import get_company_default

View File

@@ -129,7 +129,7 @@ class BuyingController(SubcontractingController):
msg += f"<li>{po} ({date})</li>"
msg += "</ul>"
frappe.throw(msg)
frappe.throw(_(msg))
def create_package_for_transfer(self) -> None:
"""Create serial and batch package for Sourece Warehouse in case of inter transfer."""
@@ -287,7 +287,7 @@ class BuyingController(SubcontractingController):
if self.is_return and len(not_cancelled_asset):
frappe.throw(
_(
"{0} has submitted assets linked to it. You need to cancel the assets to create purchase return."
"{} has submitted assets linked to it. You need to cancel the assets to create purchase return."
).format(self.return_against),
title=_("Not Allowed"),
)
@@ -738,7 +738,7 @@ class BuyingController(SubcontractingController):
frappe.throw(
_("Row #{idx}: {field_label} can not be negative for item {item_code}.").format(
idx=item_row["idx"],
field_label=_(frappe.get_meta(item_row.doctype).get_label(fieldname)),
field_label=frappe.get_meta(item_row.doctype).get_label(fieldname),
item_code=frappe.bold(item_row["item_code"]),
)
)

View File

@@ -77,7 +77,7 @@ def validate_return_against(doc):
# validate update stock
if doc.doctype == "Sales Invoice" and doc.update_stock and not ref_doc.update_stock:
frappe.throw(
_("'Update Stock' cannot be checked because items are not delivered via {0}").format(
_("'Update Stock' can not be checked because items are not delivered via {0}").format(
doc.return_against
)
)

View File

@@ -297,7 +297,7 @@ class SellingController(StockController):
throw(
_(
"""Row #{0}: Selling rate for item {1} is lower than its {2}.
Selling {3} should be at least {4}.<br><br>Alternatively,
Selling {3} should be atleast {4}.<br><br>Alternatively,
you can disable '{5}' in {6} to bypass
this validation."""
).format(
@@ -869,7 +869,7 @@ class SellingController(StockController):
duplicate_items_msg = _("Item {0} entered multiple times.").format(frappe.bold(d.item_code))
duplicate_items_msg += "<br><br>"
duplicate_items_msg += _("Please enable {0} in {1} to allow same item in multiple rows").format(
duplicate_items_msg += _("Please enable {} in {} to allow same item in multiple rows").format(
frappe.bold(_("Allow Item to Be Added Multiple Times in a Transaction")),
get_link_to_form("Selling Settings", "Selling Settings"),
)
@@ -898,7 +898,7 @@ class SellingController(StockController):
if not self.get("is_internal_customer") and any(d.get("target_warehouse") for d in items):
msg = _("Target Warehouse is set for some items but the customer is not an internal customer.")
msg += " " + _("This {0} will be treated as material transfer.").format(_(self.doctype))
msg += " " + _("This {} will be treated as material transfer.").format(_(self.doctype))
frappe.msgprint(msg, title="Internal Transfer", alert=True)
def validate_items(self):

View File

@@ -286,10 +286,10 @@ class StatusUpdater(Document):
# get unique transactions to update
for d in self.get_all_children():
if hasattr(d, "qty") and flt(d.qty) < 0 and not self.get("is_return"):
frappe.throw(_("For an item {0}, quantity must be a positive number").format(d.item_code))
frappe.throw(_("For an item {0}, quantity must be positive number").format(d.item_code))
if hasattr(d, "qty") and flt(d.qty) > 0 and self.get("is_return"):
frappe.throw(_("For an item {0}, quantity must be a negative number").format(d.item_code))
frappe.throw(_("For an item {0}, quantity must be negative number").format(d.item_code))
if (
not selling_negative_rate_allowed and self.doctype in ["Sales Invoice", "Delivery Note"]
@@ -300,7 +300,7 @@ class StatusUpdater(Document):
if hasattr(d, "item_code") and hasattr(d, "rate") and flt(d.rate) < 0:
frappe.throw(
_(
"For item {0}, rate must be a positive number. To allow negative rates, enable {1} in {2}"
"For item {0}, rate must be a positive number. To Allow negative rates, enable {1} in {2}"
).format(
frappe.bold(d.item_code),
frappe.bold(_("`Allow Negative rates for Items`")),

View File

@@ -211,7 +211,7 @@ class SubcontractingController(StockController):
)
if bom_item != item.item_code:
frappe.throw(
_("Row {0}: Please select a valid BOM for Item {1}.").format(
_("Row {0}: Please select an valid BOM for Item {1}.").format(
item.idx, item.item_name
)
)
@@ -1053,10 +1053,8 @@ class SubcontractingController(StockController):
link = get_link_to_form(
self.subcontract_data.order_doctype, row.get(self.subcontract_data.order_field)
)
msg = _("The Batch No {0} has not been supplied against the {1} {2}").format(
frappe.bold(row.get("batch_no")), self.subcontract_data.order_doctype, link
)
frappe.throw(msg, title=_("Incorrect Batch Consumed"))
msg = f'The Batch No {frappe.bold(row.get("batch_no"))} has not supplied against the {self.subcontract_data.order_doctype} {link}'
frappe.throw(_(msg), title=_("Incorrect Batch Consumed"))
def __validate_serial_no(self, row, key):
if row.get("serial_and_batch_bundle") and self.__transferred_items.get(key).get("serial_no"):
@@ -1068,10 +1066,8 @@ class SubcontractingController(StockController):
link = get_link_to_form(
self.subcontract_data.order_doctype, row.get(self.subcontract_data.order_field)
)
msg = _("The Serial Nos {0} have not been supplied against the {1} {2}").format(
incorrect_sn, self.subcontract_data.order_doctype, link
)
frappe.throw(msg, title=_("Incorrect Serial Number Consumed"))
msg = f"The Serial Nos {incorrect_sn} has not supplied against the {self.subcontract_data.order_doctype} {link}"
frappe.throw(_(msg), title=_("Incorrect Serial Number Consumed"))
def __validate_supplied_or_received_items(self):
if self.doctype not in ["Purchase Invoice", "Purchase Receipt", "Subcontracting Receipt"]:

View File

@@ -78,7 +78,7 @@ class SubcontractingInwardController:
):
frappe.throw(
_(
"Row #{0}: Item {1} mismatch. Changing the item code is not permitted, add another row instead."
"Row #{0}: Item {1} mismatch. Changing of item code is not permitted, add another row instead."
).format(item.idx, get_link_to_form("Item", item.item_code))
)
@@ -126,7 +126,7 @@ class SubcontractingInwardController:
or frappe.get_cached_value("Subcontracting Inward Order Item", item.scio_detail, "item_code")
):
frappe.throw(
_("Row #{0}: Item {1} mismatch. Changing the item code is not permitted.").format(
_("Row #{0}: Item {1} mismatch. Changing of item code is not permitted.").format(
item.idx, get_link_to_form("Item", item.item_code)
)
)
@@ -441,7 +441,7 @@ class SubcontractingInwardController:
):
frappe.throw(
_(
"Row #{0}: Batch No(s) {1} are not a part of the linked Subcontracting Inward Order. Please select valid Batch No(s)."
"Row #{0}: Batch No(s) {1} is not a part of the linked Subcontracting Inward Order. Please select valid Batch No(s)."
).format(
item.idx,
", ".join([get_link_to_form("Batch No", bn) for bn in incorrect_batch_nos]),

View File

@@ -131,9 +131,9 @@ class calculate_taxes_and_totals:
if item.item_tax_template not in taxes:
item.item_tax_template = taxes[0]
frappe.msgprint(
_(
"Row {0}: Item Tax template for {1} updated as per validity and rate applied"
).format(item.idx, frappe.bold(item.item_code))
_("Row {0}: Item Tax template updated as per validity and rate applied").format(
item.idx, frappe.bold(item.item_code)
)
)
# For correct tax_amount calculation re-computation is required
@@ -564,7 +564,7 @@ class calculate_taxes_and_totals:
+ "<br>".join(invalid_rows)
)
frappe.throw(message)
frappe.throw(_(message))
def get_tax_amount_if_for_valuation_or_deduction(self, tax_amount, tax):
# if just for valuation, do not add the tax amount in total

View File

@@ -56,10 +56,10 @@ def validate_filters(filters):
frappe.throw(_("{0} is mandatory").format(_(f)))
if not frappe.db.exists("Fiscal Year", filters.get("fiscal_year")):
frappe.throw(_("Fiscal Year {0} does not exist").format(filters.get("fiscal_year")))
frappe.throw(_("Fiscal Year {0} Does Not Exist").format(filters.get("fiscal_year")))
if filters.get("based_on") == filters.get("group_by"):
frappe.throw(_("'Based On' and 'Group By' can not be the same"))
frappe.throw(_("'Based On' and 'Group By' can not be same"))
if filters.get("period_based_on") and filters.period_based_on not in ["bill_date", "posting_date"]:
frappe.throw(

View File

@@ -308,4 +308,4 @@ def add_role_for_portal_user(portal_user, role):
return
user_doc.add_roles(role)
frappe.msgprint(_("Added {1} role to user {0}.").format(frappe.bold(user_doc.name), role), alert=True)
frappe.msgprint(_("Added {1} Role to User {0}.").format(frappe.bold(user_doc.name), role), alert=True)

View File

@@ -59,7 +59,7 @@ class AppointmentBookingSettings(Document):
err_msg = _("<b>From Time</b> cannot be later than <b>To Time</b> for {0}").format(
record.day_of_week
)
frappe.throw(err_msg)
frappe.throw(_(err_msg))
def duration_is_divisible(self, from_time, to_time):
timedelta = to_time - from_time

View File

@@ -49,7 +49,7 @@ class CRMSettings(Document):
if self.enable_frappe_crm_data_synchronization and not self.allowed_users:
frappe.throw(
_(
"Please add at least one user on Allowed Users to allow Data Synchronization from Frappe CRM site."
"Please add atleast one user on Allowed Users to allow Data Synchronization from Frappe CRM site."
)
)

View File

@@ -171,7 +171,7 @@ def add_bank_accounts(response: str | dict, bank: str | dict, company: str):
except Exception:
frappe.log_error("Plaid Link Error")
frappe.throw(
_("There was an error updating Bank Account {0} while linking with Plaid.").format(
_("There was an error updating Bank Account {} while linking with Plaid.").format(
existing_bank_account
),
title=_("Plaid Link Failed"),

View File

@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: frappe\n"
"Report-Msgid-Bugs-To: hello@frappe.io\n"
"POT-Creation-Date: 2026-06-21 10:42+0000\n"
"PO-Revision-Date: 2026-06-23 19:26\n"
"PO-Revision-Date: 2026-06-21 19:01\n"
"Last-Translator: hello@frappe.io\n"
"Language-Team: Arabic\n"
"MIME-Version: 1.0\n"
@@ -21009,7 +21009,7 @@ msgstr "للتشغيل"
#: banking/src/pages/BankStatementImporter.tsx:172
msgid "For PDF statements, we auto-detect the tables on each page. You can then confirm each detected table, map its columns, and exclude anything that is not transactions (e.g. ads or summaries). Password-protected PDFs are supported - the password is saved on the bank account and reused."
msgstr "بالنسبة لبيانات PDF، نقوم بالكشف التلقائي عن الجداول في كل صفحة. يمكنك بعد ذلك تأكيد كل جدول تم اكتشافه، وتعيين أعمدته، واستبعاد أي شيء لا يمثل معاملات (مثل الإعلانات أو الملخصات). يتم دعم ملفات PDF المحمية بكلمة مرور - يتم حفظ كلمة المرور في الحساب البنكي وإعادة استخدامها."
msgstr ""
#. Label of the for_price_list (Link) field in DocType 'Pricing Rule'
#. Label of the for_price_list (Link) field in DocType 'Promotional Scheme

File diff suppressed because it is too large Load Diff

View File

@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: frappe\n"
"Report-Msgid-Bugs-To: hello@frappe.io\n"
"POT-Creation-Date: 2026-06-21 10:42+0000\n"
"PO-Revision-Date: 2026-06-24 19:23\n"
"PO-Revision-Date: 2026-06-21 19:03\n"
"Last-Translator: hello@frappe.io\n"
"Language-Team: Bosnian\n"
"MIME-Version: 1.0\n"
@@ -27,8 +27,8 @@ msgid "\n"
"\t\t\tSo please ensure the stock levels are adjusted as soon as possible to maintain the correct valuation rate."
msgstr "\n"
"\t\t\tŠarža {0} artikla {1} ima negativne zalihe u skladištu {2}{3}.\n"
"\t\t\tDodaj količinu zaliha od {4} da biste nastavili s ovim unosom.\n"
"\t\t\tAko nije moguće izvršiti unos prilagođavanja, omogućite 'Dozvoli Negativne Zalihe za Šaržu' za Šaržu {0} ili u Postavkama Zaliha da biste nastavili.\n"
"\t\t\tMolimo dodajte količinu zaliha od {4} da biste nastavili s ovim unosom.\n"
"\t\t\tAko nije moguće izvršiti unos prilagođavanja, omogućite 'Dozvoli Negativne Zalihe za Šaržu' ya Šaržu {0} ili u Postavkama Zaliha da biste nastavili.\n"
"\t\t\tMeđutim, omogućavanje ove postavke može dovesti do negativnih zaliha u sistemu.\n"
"\t\t\tStoga, molimo vas da osigurate da se nivoi zaliha što prije prilagode kako bi se održala ispravna stopa vrednovanja."
@@ -12197,7 +12197,7 @@ msgstr "Konsolidirana Prodajna Faktura"
#. Name of a report
#: erpnext/accounts/report/consolidated_trial_balance/consolidated_trial_balance.json
msgid "Consolidated Trial Balance"
msgstr "Konsolidovani Probni Bilans"
msgstr "Konsolidovani Bruto Bilans"
#: erpnext/accounts/report/consolidated_trial_balance/consolidated_trial_balance.py:71
msgid "Consolidated Trial Balance can be generated for Companies having same root Company."
@@ -12205,7 +12205,7 @@ msgstr "Konsolidovani Bruto Bilans može se generirati za poduzeća koje imaju i
#: erpnext/accounts/report/consolidated_trial_balance/consolidated_trial_balance.py:167
msgid "Consolidated Trial balance could not be generated as Exchange Rate from {0} to {1} is not available for {2}."
msgstr "Konsolidovani Probni Bilans nije mogao biti generisan jer kurs valute od {0} do {1} nije dostupan za {2}."
msgstr "Konsolidovani Bruto Bilans nije mogao biti generisan jer kurs od {0} do {1} nije dostupan za {2}."
#. Option for the 'Lead Type' (Select) field in DocType 'Lead'
#: erpnext/crm/doctype/lead/lead.json
@@ -58110,7 +58110,7 @@ msgstr "Stablo Procedura"
#: erpnext/workspace_sidebar/invoicing.json
#: erpnext/workspace_sidebar/payments.json
msgid "Trial Balance"
msgstr "Probni Bilans"
msgstr "Bruto Stanje"
#. Name of a report
#: erpnext/accounts/report/trial_balance_simple/trial_balance_simple.json
@@ -58124,7 +58124,7 @@ msgstr "Bruto Stanje (Jednostavno)"
#: erpnext/accounts/workspace/financial_reports/financial_reports.json
#: erpnext/workspace_sidebar/financial_reports.json
msgid "Trial Balance for Party"
msgstr "Probni Bilans Stranke"
msgstr "Bruto Stanje Stranke"
#. Label of the trial_period_end (Date) field in DocType 'Subscription'
#: erpnext/accounts/doctype/subscription/subscription.json

View File

@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: frappe\n"
"Report-Msgid-Bugs-To: hello@frappe.io\n"
"POT-Creation-Date: 2026-06-21 10:42+0000\n"
"PO-Revision-Date: 2026-06-23 19:26\n"
"PO-Revision-Date: 2026-06-21 19:02\n"
"Last-Translator: hello@frappe.io\n"
"Language-Team: German\n"
"MIME-Version: 1.0\n"
@@ -4293,7 +4293,7 @@ msgstr "Verkauf erlauben"
#. in DocType 'Selling Settings'
#: erpnext/selling/doctype/selling_settings/selling_settings.json
msgid "Allow Sales Order creation for expired Quotation"
msgstr "Auftragserstellung für abgelaufene Angebote zulassen"
msgstr ""
#. Label of the allow_zero_qty_in_sales_order (Check) field in DocType 'Selling
#. Settings'
@@ -4409,7 +4409,7 @@ msgstr "Rechnungswährung darf sich von Kontowährung unterscheiden"
#. 'Selling Settings'
#: erpnext/selling/doctype/selling_settings/selling_settings.json
msgid "Allow multiple Sales Orders against a customer's Purchase Order"
msgstr "Mehrere Aufträge (je Kunde) mit derselben Bestellnummer erlauben"
msgstr ""
#. Label of the allow_negative_rates_for_items (Check) field in DocType 'Buying
#. Settings'
@@ -48219,7 +48219,7 @@ msgstr "Einsparungen"
#. Name of a UOM
#: erpnext/setup/setup_wizard/data/uom_data.json
msgid "Sazhen"
msgstr "Saschen"
msgstr ""
#. Label of the scan_barcode (Data) field in DocType 'POS Invoice'
#. Label of the scan_barcode (Data) field in DocType 'Purchase Invoice'
@@ -51463,7 +51463,7 @@ msgstr "Quadratmeile"
#. Name of a UOM
#: erpnext/setup/setup_wizard/data/uom_data.json
msgid "Square Yard"
msgstr "Quadratyard"
msgstr ""
#. Label of the stage_name (Data) field in DocType 'Sales Stage'
#: erpnext/crm/doctype/sales_stage/sales_stage.json
@@ -52544,7 +52544,7 @@ msgstr "Lagerbestände/Konten können nicht eingefroren werden, da die Verarbeit
#. Name of a UOM
#: erpnext/setup/setup_wizard/data/uom_data.json
msgid "Stone"
msgstr "Stone"
msgstr ""
#. Label of the stop_reason (Select) field in DocType 'Downtime Entry'
#: erpnext/manufacturing/doctype/downtime_entry/downtime_entry.json
@@ -59818,7 +59818,7 @@ msgstr "Wert oder Menge"
#. Name of a UOM
#: erpnext/setup/setup_wizard/data/uom_data.json
msgid "Vara"
msgstr "Vara"
msgstr ""
#. Label of the variable (Data) field in DocType 'Bank Statement Import Log
#. Column Map'
@@ -61136,7 +61136,7 @@ msgstr "Einbehalt-Dokumenttyp"
#: banking/src/components/features/Settings/Preferences.tsx:70
msgid "Within 1 day"
msgstr "Innerhalb eines Tages"
msgstr ""
#: banking/src/components/features/Settings/Preferences.tsx:71
msgid "Within 2 days"
@@ -62090,7 +62090,7 @@ msgstr ""
#. Exchange Settings'
#: erpnext/accounts/doctype/currency_exchange_settings/currency_exchange_settings.json
msgid "frankfurter.dev"
msgstr "frankfurter.dev"
msgstr ""
#. Option for the 'Service Provider' (Select) field in DocType 'Currency
#. Exchange Settings'

View File

@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: frappe\n"
"Report-Msgid-Bugs-To: hello@frappe.io\n"
"POT-Creation-Date: 2026-06-21 10:42+0000\n"
"PO-Revision-Date: 2026-06-23 19:26\n"
"PO-Revision-Date: 2026-06-21 19:03\n"
"Last-Translator: hello@frappe.io\n"
"Language-Team: Persian\n"
"MIME-Version: 1.0\n"
@@ -61985,7 +61985,7 @@ msgstr "frankfurter.dev"
#. Exchange Settings'
#: erpnext/accounts/doctype/currency_exchange_settings/currency_exchange_settings.json
msgid "frankfurter.dev - v2"
msgstr "frankfurter.dev - v2"
msgstr ""
#: erpnext/templates/form_grid/item_grid.html:66
#: erpnext/templates/form_grid/item_grid.html:80

View File

@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: frappe\n"
"Report-Msgid-Bugs-To: hello@frappe.io\n"
"POT-Creation-Date: 2026-06-21 10:42+0000\n"
"PO-Revision-Date: 2026-06-24 19:23\n"
"PO-Revision-Date: 2026-06-21 19:03\n"
"Last-Translator: hello@frappe.io\n"
"Language-Team: Croatian\n"
"MIME-Version: 1.0\n"
@@ -25,12 +25,7 @@ msgid "\n"
"\t\t\tIf it is not possible to make an adjustment entry, please enable 'Allow Negative Stock for Batch' in the batch {0} or in the Stock Settings to proceed.\n"
"\t\t\tHowever, enabling this setting may lead to negative stock in the system.\n"
"\t\t\tSo please ensure the stock levels are adjusted as soon as possible to maintain the correct valuation rate."
msgstr "\n"
"\t\t\tŠarža {0} artikla {1} ima negativne zalihe u skladištu {2}{3}.\n"
"\t\t\tDodaj količinu zaliha od {4} da biste nastavili s ovim unosom.\n"
"\t\t\tAko nije moguće izvršiti unos prilagođavanja, omogućite 'Dozvoli Negativne Zalihe za Šaržu' za Šaržu {0} ili u Postavkama Zaliha da biste nastavili.\n"
"\t\t\tMeđutim, omogućavanje ove postavke može dovesti do negativnih zaliha u ssustavu.\n"
"\t\t\tStoga, molimo vas da osigurate da se razina zaliha što prije prilagode kako bi se održala ispravna stopa vrednovanja."
msgstr ""
#. Label of the column_break_32 (Column Break) field in DocType 'Email Digest'
#: erpnext/setup/doctype/email_digest/email_digest.json
@@ -1072,7 +1067,7 @@ msgstr "Otpremnica se može kreirati samo za nacrt Dostavnice."
#: erpnext/accounts/services/gl_validator.py:123
msgid "A Period Closing Voucher is already submitted and an Opening Entry can no longer be created. {0} to learn more."
msgstr "Verifikat Zatvaranje Razdoblja je već podnesen i početni unos se više ne može kreirati. {0} za više informacija."
msgstr ""
#. Description of a DocType
#: erpnext/stock/doctype/price_list/price_list.json
@@ -2737,7 +2732,7 @@ msgstr "Dodaj više zadataka"
#: erpnext/stock/doctype/item/item.js:974
msgid "Add Opening Stock"
msgstr "Dodaj Početne Zalihe"
msgstr ""
#. Label of the add_deduct_tax (Select) field in DocType 'Advance Taxes and
#. Charges'
@@ -4029,7 +4024,7 @@ msgstr "Automatski Dodjeli Predujam (FIFO)"
#. 'Purchase Taxes and Charges'
#: erpnext/accounts/doctype/purchase_taxes_and_charges/purchase_taxes_and_charges.json
msgid "Allocate Full Amount to Stock Items"
msgstr "Dodijeli Puni Iznos Artiklima Zaliha"
msgstr ""
#: erpnext/accounts/doctype/payment_entry/payment_entry.js:919
msgid "Allocate Payment Amount"
@@ -4608,7 +4603,7 @@ msgstr "Također se ne možete vratiti na FIFO nakon što ste za ovu stavku post
#: erpnext/stock/report/stock_balance/stock_balance.py:644
msgid "Alt UOM"
msgstr "Alternativna Jedinica"
msgstr ""
#: erpnext/manufacturing/doctype/bom/bom.js:291
#: erpnext/manufacturing/doctype/work_order/work_order.js:158
@@ -7300,7 +7295,7 @@ msgstr "Količinsko Stanje"
#: erpnext/stock/report/stock_balance/stock_balance.py:635
msgid "Balance Qty (Alt UOM)"
msgstr "Količinsko Stanja (Alternativna Jedinica)"
msgstr ""
#: erpnext/stock/page/warehouse_capacity_summary/warehouse_capacity_summary.js:71
msgid "Balance Qty (Stock)"
@@ -12197,15 +12192,15 @@ msgstr "Konsolidirana Prodajna Faktura"
#. Name of a report
#: erpnext/accounts/report/consolidated_trial_balance/consolidated_trial_balance.json
msgid "Consolidated Trial Balance"
msgstr "Konsolidirana Probna Bilanca"
msgstr "Konsolidirana Bruto Bilanca"
#: erpnext/accounts/report/consolidated_trial_balance/consolidated_trial_balance.py:71
msgid "Consolidated Trial Balance can be generated for Companies having same root Company."
msgstr "Konsolidirana Probna Bilanca može se generirati za tvrtke koje imaju istu matičnu tvrtku."
msgstr "Konsolidirana Bruto Bilanca može se generirati za tvrtke koje imaju istu matičnu tvrtku."
#: erpnext/accounts/report/consolidated_trial_balance/consolidated_trial_balance.py:167
msgid "Consolidated Trial balance could not be generated as Exchange Rate from {0} to {1} is not available for {2}."
msgstr "Konsolidirana Probna Bilanca nije mongla biti generirana jer devizni tečaj od {0} do {1} nije dostupan za {2}."
msgstr "Konsolidirana Bruto Bilanca nije mogla biti generirana jer tečaj od {0} do {1} nije dostupan za {2}."
#. Option for the 'Lead Type' (Select) field in DocType 'Lead'
#: erpnext/crm/doctype/lead/lead.json
@@ -13777,7 +13772,7 @@ msgstr "Kreiranje Naloga Knjiženja u toku..."
#: erpnext/stock/doctype/item/item.js:988
msgid "Creating Opening Stock Entry..."
msgstr "Kreiranje Početnog Unosa Zaliha..."
msgstr ""
#: erpnext/stock/doctype/packing_slip/packing_slip.js:42
msgid "Creating Packing Slip ..."
@@ -16104,7 +16099,7 @@ msgstr "Standard Predlošci PDV-a za prodaju, nabavu i artikle su kreirani."
#: erpnext/stock/doctype/item/item.js:942
#: erpnext/stock/doctype/item/item.js:954
msgid "Default warehouse from Item Defaults."
msgstr "Standard Skladište iz Standard Postavki Artikala."
msgstr ""
#. Description of the 'Time Between Operations (Mins)' (Int) field in DocType
#. 'Manufacturing Settings'
@@ -16290,7 +16285,7 @@ msgstr "Izbriši Transakcije"
#: erpnext/setup/doctype/company/company.js:254
msgid "Delete all the Transactions for {0}"
msgstr "Izbriši sve transakcije za {0}"
msgstr ""
#. Label of a Link in the ERPNext Settings Workspace
#: erpnext/setup/workspace/erpnext_settings/erpnext_settings.json
@@ -19574,7 +19569,7 @@ msgstr "Prekomjerna Demontaža"
#: erpnext/stock/doctype/stock_entry/services/material_transfer.py:243
msgid "Excess Material Transfer"
msgstr "Prijenos Dodatnog Materijala"
msgstr ""
#: erpnext/manufacturing/report/work_order_consumed_materials/work_order_consumed_materials.js:55
msgid "Excess Materials Consumed"
@@ -23445,7 +23440,7 @@ msgstr "Ako je označeno, odabrana količina neće biti automatski ispunjena pri
#. DocType 'Purchase Taxes and Charges'
#: erpnext/accounts/doctype/purchase_taxes_and_charges/purchase_taxes_and_charges.json
msgid "If checked, the entire amount (e.g. Freight) is allocated to the valuation of stock & asset items only. If unchecked, the amount is distributed across all items and the portion belonging to non-stock items is not added to valuation."
msgstr "Ako je odabrano, cijeli iznos (npr. Vozarina) se dodjeljuje samo za stopu vrijednovanja zaliha i imovine. Ako nije odabrano, iznos se raspoređuje na sve artikle, a dio koji pripada artiklima koje nisu na zalihama se ne dodaje stopi vrijednovanja."
msgstr ""
#. Description of the 'Considered In Paid Amount' (Check) field in DocType
#. 'Purchase Taxes and Charges'
@@ -23620,7 +23615,7 @@ msgstr "Ako je omogućeno, sustav će dopustiti negativne unose zaliha za šarž
#. 'Batch'
#: erpnext/stock/doctype/batch/batch.json
msgid "If enabled, the system will allow negative stock entries for this batch, overriding the 'Allow negative stock for Batch' setting in Stock Settings. This may lead to incorrect valuation rates, so it is recommended to avoid using this option."
msgstr "Ako je omogućeno, sustav će dopustiti unos negativnih zaliha za ovu šaržu, poništavajući postavku 'Dopusti negativne zalihe za Šaržu' u Postavkama Zaliha. To može dovesti do netočnih stopa vrednovanja, stoga se preporučuje izbjegavanje korištenja ove opcije."
msgstr ""
#. Description of the 'Allow UOM with conversion rate defined in Item' (Check)
#. field in DocType 'Stock Settings'
@@ -25521,7 +25516,7 @@ msgstr "Nevažeći upit pretraživanja"
#: erpnext/stock/doctype/stock_entry/stock_entry.py:1649
msgid "Invalid subcontract order field: {0}"
msgstr "Nevažeći nalog podizvođača: {0}"
msgstr ""
#: erpnext/accounts/report/inactive_sales_items/inactive_sales_items.py:99
msgid "Invalid value {0} for 'Based On'"
@@ -28871,7 +28866,7 @@ msgstr "Odsustvo Isplaćeno?"
#: erpnext/stock/doctype/item/item.js:969
msgid "Leave as 0 to allow zero valuation rate."
msgstr "Ostavite kao 0 kako biste omogućili nultu stopu vrednovanja."
msgstr ""
#. Description of the 'Success Redirect URL' (Data) field in DocType
#. 'Appointment Booking Settings'
@@ -32348,7 +32343,7 @@ msgstr "Bez Odgovora"
#: erpnext/stock/doctype/item/item.js:913
msgid "No Company Found"
msgstr "Nije pronađenaTvrtka"
msgstr ""
#: erpnext/accounts/doctype/sales_invoice/mapper.py:115
msgid "No Customer found for Inter Company Transactions which represents company {0}"
@@ -32539,7 +32534,7 @@ msgstr "Nema podataka. Čini se da ste otpremili praznu datoteku"
#: erpnext/stock/doctype/item/item.js:943
msgid "No default warehouse set for this company. Entry will use Stock Settings default."
msgstr "Za ovu tvrtku nije postavljeno standard skladište. Unos će koristiti standard postavke zaliha."
msgstr ""
#: erpnext/templates/generators/bom.html:85
msgid "No description given"
@@ -32825,7 +32820,7 @@ msgstr "Nisu pronađeni vaučeri za ovu transakciju"
#: erpnext/stock/doctype/item/item.py:1734
msgid "No warehouse found for company {0}. Please set a Default Warehouse in Item Defaults or Stock Settings."
msgstr "Nije pronađeno skladište za {0}. Postavi Standard Skladište u Postavkama Artikala ili Postavkama Zaliha."
msgstr ""
#: erpnext/accounts/doctype/sales_invoice/mapper.py:163
msgid "No {0} found for Inter Company Transactions."
@@ -33569,7 +33564,7 @@ msgstr "Dozvoljene su samo vrijednosti između [0,1). Kao {0,00, 0,04, 0,09, ...
#. 'Repost Item Valuation'
#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.json
msgid "Only works for Purchase Receipt, Purchase Invoice and Stock Entry"
msgstr "Radi samo za Račun Nabave, Fakturu Nabave i Unos Zaliha"
msgstr ""
#: erpnext/accounts/doctype/unreconcile_payment/unreconcile_payment.py:43
msgid "Only {0} are supported"
@@ -33862,24 +33857,24 @@ msgstr "Početna Zaliha"
#: erpnext/stock/doctype/item/item.py:1588
msgid "Opening Stock can only be set for stock items."
msgstr "Početne zalihe mogu se postaviti samo za artikle na zalihi."
msgstr ""
#: erpnext/stock/doctype/item/item.py:1595
msgid "Opening Stock cannot be created as stock transactions already exist for item {0}."
msgstr "Početne zalihe se ne mogu kreirati jer već postoje transakcije zaliha za artikal {0}."
msgstr ""
#: erpnext/stock/doctype/item/item.py:1591
msgid "Opening Stock for serialised or batch items must be set via the Stock Reconciliation form."
msgstr "Početne zalihe za serijske ili šaržne artikle mora se postaviti putem Usklađivanje Zaliha."
msgstr ""
#: erpnext/stock/doctype/item/item.py:356
msgid "Opening Stock reconciliation created with zero valuation rate: {0}"
msgstr "Početno Usklađivanje Zaliha kreirano sa nultom stopom vrednovanja: {0}"
msgstr ""
#: erpnext/stock/doctype/item/item.py:364
#: erpnext/stock/doctype/item/item.py:1637
msgid "Opening Stock reconciliation created: {0}"
msgstr "Početno Usklađivanje Zaliha kreirano: {0}"
msgstr ""
#. Label of the opening_time (Time) field in DocType 'Issue'
#: erpnext/support/doctype/issue/issue.json
@@ -33897,7 +33892,7 @@ msgstr "Otvaranje & Zatvaranje"
#: erpnext/stock/doctype/item/item.py:199
msgid "Opening stock creation has been queued and will be created in the background. Please check the Stock Reconciliation after some time."
msgstr "Kreiranje početnih zaliha je stavljeno u red čekanja i bit će kreirano u pozadini. Molimo provjerite usklađivanje zaliha nakon nekog vremena."
msgstr ""
#. Label of the operating_component (Link) field in DocType 'Workstation Cost'
#. Label of the operating_component (Data) field in DocType 'Landed Cost Taxes
@@ -35651,7 +35646,7 @@ msgstr "Djelomično Rezervisano"
#. Option for the 'Status' (Select) field in DocType 'Job Card'
#: erpnext/manufacturing/doctype/job_card/job_card.json
msgid "Partially Transferred"
msgstr "Djelomično Preneseno"
msgstr ""
#. Option for the 'Status' (Select) field in DocType 'Stock Reservation Entry'
#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.json
@@ -37727,7 +37722,7 @@ msgstr "Dodaj barem jednu seriju imenovanja."
#: erpnext/stock/doctype/item/item.js:914
msgid "Please add at least one row in Item Defaults with a Company before setting opening stock."
msgstr "Dodaj barem jedan red u Postavke Artikala sa tvrtkom prije postavljanja početnih zaliha."
msgstr ""
#: erpnext/public/js/utils/serial_no_batch_selector.js:663
msgid "Please add atleast one Serial No / Batch No"
@@ -38133,7 +38128,7 @@ msgstr "Potvrdi da datoteka koju koristite ima kolonu 'Nadređeni Račun' u zagl
#: erpnext/setup/doctype/company/company.js:234
msgid "Please make sure you really want to delete all the transactions for {0}. Your master data will remain as it is. This action cannot be undone."
msgstr "Da li zaista želiš izbrisati sve transakcije za {0}. Vaši glavni podaci će ostati onakvi kakvi jesu. Ova radnja se ne može poništiti."
msgstr ""
#: erpnext/stock/doctype/item/item.js:1025
msgid "Please mention 'Weight UOM' along with Weight."
@@ -38653,7 +38648,7 @@ msgstr "Postavi Centar Troškova za Imovinu ili postavite Centar Troškova Amort
#: erpnext/stock/doctype/item/item.py:339
#: erpnext/stock/doctype/item/item.py:1621
msgid "Please set a Temporary Opening account for company {0} to create an Opening Stock reconciliation."
msgstr "Postavi Privremeni Početni Račun za {0} kako biste kreirali početno usklađivanje zaliha."
msgstr ""
#: erpnext/projects/doctype/project/project.py:806
msgid "Please set a default Holiday List for Company {0}"
@@ -43162,7 +43157,7 @@ msgstr "Dostignut je Najviši Nivo"
#: erpnext/accounts/services/gl_validator.py:127
msgid "Read the docs"
msgstr "Pročitaj dokumentaciju"
msgstr ""
#. Label of the reading_1 (Data) field in DocType 'Quality Inspection Reading'
#: erpnext/stock/doctype/quality_inspection_reading/quality_inspection_reading.json
@@ -43275,7 +43270,7 @@ msgstr "Preračunaj Nabavnu/Prodajnu Cijenu"
#. Item Valuation'
#: erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.json
msgid "Recalculate Valuation Rate"
msgstr "Ponovo izračunaj Stopu Vrednovanja"
msgstr ""
#. Option for the 'Status' (Select) field in DocType 'Asset'
#. Option for the 'Purpose' (Select) field in DocType 'Asset Movement'
@@ -46056,7 +46051,7 @@ msgstr "Red #{0}: Ne može se prenijeti više od potrebne količine {1} za artik
#: erpnext/stock/doctype/stock_entry/services/material_transfer.py:233
msgid "Row #{0}: Cannot transfer {1} {2} of Item {3}. Maximum transferable quantity is {4} {2}."
msgstr "Red #{0}: Ne može se prenijeti {1} {2} artikal {3}. Najveća prenosiva količina je {4} {2}."
msgstr ""
#: erpnext/selling/doctype/product_bundle/product_bundle.py:138
msgid "Row #{0}: Child Item should not be a Product Bundle. Please remove Item {1} and Save"
@@ -47747,7 +47742,7 @@ msgstr "Prodajni Nalog {0} već postoji naspram Nabavnog Naloga Klijenta {1}. Da
#: erpnext/projects/doctype/project/project.py:256
msgid "Sales Order {0} is already linked to Project {1}, skipping the link."
msgstr "Prodajni Nalog {0} je već povezan s projektom {1}, preskoči poveznicu."
msgstr ""
#: erpnext/selling/doctype/sales_order/mapper.py:883
#: erpnext/selling/doctype/sales_order/mapper.py:896
@@ -50043,7 +50038,7 @@ msgstr "Postavi Novi Datum Izdavanja"
#: erpnext/stock/doctype/item/item.js:203
msgid "Set Opening Stock"
msgstr "Postavi Početne Zalihe"
msgstr ""
#. Label of the set_op_cost_and_secondary_items_from_sub_assemblies (Check)
#. field in DocType 'Manufacturing Settings'
@@ -50737,7 +50732,7 @@ msgstr "Prikažite ukupnu vrijednost iz Podružnica"
#: erpnext/stock/report/stock_balance/stock_balance.js:115
msgid "Show Alternate UOM Balance"
msgstr "Prikaži Saldo Alternativne Jedinice"
msgstr ""
#: erpnext/accounts/report/general_ledger/general_ledger.js:199
msgid "Show Cancelled Entries"
@@ -58110,12 +58105,12 @@ msgstr "Stablo Procedura"
#: erpnext/workspace_sidebar/invoicing.json
#: erpnext/workspace_sidebar/payments.json
msgid "Trial Balance"
msgstr "Probna Bilanca"
msgstr "Bruto Stanje"
#. Name of a report
#: erpnext/accounts/report/trial_balance_simple/trial_balance_simple.json
msgid "Trial Balance (Simple)"
msgstr "Probna Bilanca (Jednostavno)"
msgstr "Bruto Stanje (Jednostavno)"
#. Name of a report
#. Label of a Link in the Financial Reports Workspace
@@ -58124,7 +58119,7 @@ msgstr "Probna Bilanca (Jednostavno)"
#: erpnext/accounts/workspace/financial_reports/financial_reports.json
#: erpnext/workspace_sidebar/financial_reports.json
msgid "Trial Balance for Party"
msgstr "Probna Bilanca Stranke"
msgstr "Bruto Stanje Stranke"
#. Label of the trial_period_end (Date) field in DocType 'Subscription'
#: erpnext/accounts/doctype/subscription/subscription.json
@@ -59690,7 +59685,7 @@ msgstr "Nedostaje Stopa Vrednovanja"
#: erpnext/stock/doctype/item/item.py:1604
msgid "Valuation Rate cannot be negative."
msgstr "Stopa Vrednovanja ne može biti negativna."
msgstr ""
#: erpnext/stock/stock_ledger.py:2037
msgid "Valuation Rate for the Item {0}, is required to do accounting entries for {1} {2}."
@@ -62099,7 +62094,7 @@ msgstr "frankfurter.dev"
#. Exchange Settings'
#: erpnext/accounts/doctype/currency_exchange_settings/currency_exchange_settings.json
msgid "frankfurter.dev - v2"
msgstr "frankfurter.dev - v2"
msgstr ""
#: erpnext/templates/form_grid/item_grid.html:66
#: erpnext/templates/form_grid/item_grid.html:80

View File

@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: frappe\n"
"Report-Msgid-Bugs-To: hello@frappe.io\n"
"POT-Creation-Date: 2026-06-21 10:42+0000\n"
"PO-Revision-Date: 2026-06-24 19:22\n"
"PO-Revision-Date: 2026-06-21 19:02\n"
"Last-Translator: hello@frappe.io\n"
"Language-Team: Hungarian\n"
"MIME-Version: 1.0\n"
@@ -11865,7 +11865,7 @@ msgstr ""
#. Label of the items (Table) field in DocType 'BOM'
#: erpnext/manufacturing/doctype/bom/bom.json
msgid "Components"
msgstr "Komponensek"
msgstr ""
#. Option for the 'Asset Type' (Select) field in DocType 'Asset'
#: erpnext/assets/doctype/asset/asset.json
@@ -36116,7 +36116,7 @@ msgstr ""
#: banking/src/components/features/ActionLog/ActionLogDialogBody.tsx:408
msgid "Payment Details"
msgstr "Fizetési részletek"
msgstr ""
#. Label of the payment_document (Link) field in DocType 'Bank Clearance
#. Detail'
@@ -59394,7 +59394,7 @@ msgstr ""
#: erpnext/stock/doctype/item/item_prices.html:86
msgid "Valid Upto"
msgstr "Valid Upto"
msgstr ""
#. Label of the countries (Table) field in DocType 'Shipping Rule'
#: erpnext/accounts/doctype/shipping_rule/shipping_rule.json

View File

@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: frappe\n"
"Report-Msgid-Bugs-To: hello@frappe.io\n"
"POT-Creation-Date: 2026-06-21 10:42+0000\n"
"PO-Revision-Date: 2026-06-24 19:23\n"
"PO-Revision-Date: 2026-06-21 19:02\n"
"Last-Translator: hello@frappe.io\n"
"Language-Team: Slovenian\n"
"MIME-Version: 1.0\n"
@@ -12751,13 +12751,13 @@ msgstr ""
#. Label of the cost_allocation (Currency) field in DocType 'BOM'
#: erpnext/manufacturing/doctype/bom/bom.json
msgid "Cost Allocation"
msgstr "porazdelitve stroškov"
msgstr ""
#. Label of the cost_allocation_per (Percent) field in DocType 'BOM Secondary
#. Item'
#: erpnext/manufacturing/doctype/bom_secondary_item/bom_secondary_item.json
msgid "Cost Allocation %"
msgstr "porazdelitve stroškov %"
msgstr ""
#. Label of the cost_allocation__process_loss_section (Section Break) field in
#. DocType 'BOM'

View File

@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: frappe\n"
"Report-Msgid-Bugs-To: hello@frappe.io\n"
"POT-Creation-Date: 2026-06-21 10:42+0000\n"
"PO-Revision-Date: 2026-06-24 19:23\n"
"PO-Revision-Date: 2026-06-21 19:02\n"
"Last-Translator: hello@frappe.io\n"
"Language-Team: Swedish\n"
"MIME-Version: 1.0\n"
@@ -12204,15 +12204,15 @@ msgstr "Konsoliderad Försäljning Faktura"
#. Name of a report
#: erpnext/accounts/report/consolidated_trial_balance/consolidated_trial_balance.json
msgid "Consolidated Trial Balance"
msgstr "Konsoliderad Prov Saldo"
msgstr "Konsoliderat Brutto Saldo"
#: erpnext/accounts/report/consolidated_trial_balance/consolidated_trial_balance.py:71
msgid "Consolidated Trial Balance can be generated for Companies having same root Company."
msgstr "Konsoliderad Prov Saldo kan skapas för bolag som har samma moderbolag."
msgstr "Konsoliderad Brutto Saldo kan skapas för bolag som har samma moderbolag."
#: erpnext/accounts/report/consolidated_trial_balance/consolidated_trial_balance.py:167
msgid "Consolidated Trial balance could not be generated as Exchange Rate from {0} to {1} is not available for {2}."
msgstr "Konsoliderad Prov Saldo kunde inte skapas eftersom växelkurs från {0} till {1} inte är tillgänglig för {2}."
msgstr "Konsoliderad Brutto Saldo kunde inte skapas eftersom växelkurs från {0} till {1} inte är tillgänglig för {2}."
#. Option for the 'Lead Type' (Select) field in DocType 'Lead'
#: erpnext/crm/doctype/lead/lead.json
@@ -58117,12 +58117,12 @@ msgstr "Kvalitet Procedur Träd"
#: erpnext/workspace_sidebar/invoicing.json
#: erpnext/workspace_sidebar/payments.json
msgid "Trial Balance"
msgstr "Prov Saldo"
msgstr "Brutto Saldo"
#. Name of a report
#: erpnext/accounts/report/trial_balance_simple/trial_balance_simple.json
msgid "Trial Balance (Simple)"
msgstr "Prov Saldo (Enkel)"
msgstr "Brutto Saldo (Enkel)"
#. Name of a report
#. Label of a Link in the Financial Reports Workspace
@@ -58131,7 +58131,7 @@ msgstr "Prov Saldo (Enkel)"
#: erpnext/accounts/workspace/financial_reports/financial_reports.json
#: erpnext/workspace_sidebar/financial_reports.json
msgid "Trial Balance for Party"
msgstr "Prov Saldo för Parti"
msgstr "Brutto Saldo för Parti"
#. Label of the trial_period_end (Date) field in DocType 'Subscription'
#: erpnext/accounts/doctype/subscription/subscription.json

File diff suppressed because it is too large Load Diff

View File

@@ -144,7 +144,7 @@ class Task(NestedSet):
if frappe.db.get_value("Task", d.task, "status") not in ("Completed", "Cancelled"):
frappe.throw(
_(
"Cannot complete task {0} as its dependent task {1} is not completed / cancelled."
"Cannot complete task {0} as its dependant task {1} are not completed / cancelled."
).format(frappe.bold(self.name), frappe.bold(d.task))
)
@@ -316,7 +316,7 @@ class Task(NestedSet):
def on_trash(self):
if check_if_child_exists(self.name):
throw(_("Child Task exists for this Task. You cannot delete this Task."))
throw(_("Child Task exists for this Task. You can not delete this Task."))
self.update_nsm_model()

View File

@@ -105,7 +105,7 @@ class TimesheetDetail(Document):
def validate_dates(self):
"""Validate that to_time is not before from_time."""
if self.from_time and self.to_time and time_diff_in_hours(self.to_time, self.from_time) < 0:
frappe.throw(_("To Time cannot be before From Time"))
frappe.throw(_("To Time cannot be before from date"))
def validate_parent_project(self, parent_project: str):
"""Validate that project is same as Timesheet's parent project."""

View File

@@ -158,7 +158,7 @@ class Customer(TransactionBase):
new_customer_name = f"{self.customer_name} - {cstr(count)}"
msgprint(
_("Changed customer name to '{0}' as '{1}' already exists.").format(
_("Changed customer name to '{}' as '{}' already exists.").format(
new_customer_name, self.customer_name
),
title=_("Note"),
@@ -356,7 +356,7 @@ class Customer(TransactionBase):
if frappe.db.exists("Customer Group", self.name):
frappe.throw(
_(
"A Customer Group exists with the same name. Please change the Customer name or rename the Customer Group"
"A Customer Group exists with same name please change the Customer name or rename the Customer Group"
),
frappe.NameError,
)
@@ -406,7 +406,7 @@ class Customer(TransactionBase):
if flt(limit.credit_limit) < outstanding_amt:
frappe.throw(
_(
"""New credit limit is less than current outstanding amount for the customer. Credit limit has to be at least {0}"""
"""New credit limit is less than current outstanding amount for the customer. Credit limit has to be atleast {0}"""
).format(outstanding_amt)
)
@@ -440,7 +440,7 @@ class Customer(TransactionBase):
self.loyalty_program = loyalty_program[0]
else:
frappe.msgprint(
_("Multiple Loyalty Programs found for Customer {0}. Please select manually.").format(
_("Multiple Loyalty Programs found for Customer {}. Please select manually.").format(
frappe.bold(self.customer_name)
)
)

View File

@@ -172,7 +172,7 @@ def make_address(args, is_primary_address=1, is_shipping_address=1):
if reqd_fields:
msg = _("Following fields are mandatory to create address:")
frappe.throw(
msg + " <br><br> <ul>{}</ul>".format("\n".join(reqd_fields)),
"{} <br><br> <ul>{}</ul>".format(msg, "\n".join(reqd_fields)),
title=_("Missing Values Required"),
)

View File

@@ -32,6 +32,4 @@ class PartySpecificItem(Document):
},
)
if exists:
frappe.throw(
_("This item filter has already been applied for the {0}").format(_(self.party_type))
)
frappe.throw(_("This item filter has already been applied for the {0}").format(self.party_type))

View File

@@ -118,9 +118,9 @@ class ProductBundle(Document):
if len(invoice_links):
frappe.throw(
_(
"This Product Bundle is linked with {0}. You will have to cancel these documents in order to delete this Product Bundle"
).format(", ".join(invoice_links)),
"This Product Bundle is linked with {}. You will have to cancel these documents in order to delete this Product Bundle".format(
", ".join(invoice_links)
),
title=_("Not Allowed"),
)

View File

@@ -16,7 +16,7 @@ def validate_filters(from_date, to_date, company):
frappe.throw(_("To Date must be greater than From Date"))
if not company:
frappe.throw(_("Please select a Company"))
frappe.throw(_("Please Select a Company"))
@frappe.whitelist()

View File

@@ -47,7 +47,7 @@ class SalesPartnerSummaryReport:
frappe.throw(_("Please select the document type first."))
if self.filters.get("doctype") not in SALES_TRANSACTION_DOCTYPES:
frappe.throw(_("DocType can be one of {0}").format(comma_or(SALES_TRANSACTION_DOCTYPES)))
frappe.throw(_("DocType can be one of them {0}").format(comma_or(SALES_TRANSACTION_DOCTYPES)))
if not self.filters.get("company"):
frappe.throw(_("Please select a company."))

View File

@@ -19,7 +19,7 @@ class SalesPartnerSummaryReportTestMixin(ERPNextTestSuite):
with self.assertRaisesRegex(
frappe.ValidationError,
_("DocType can be one of {0}").format(comma_or(SALES_TRANSACTION_DOCTYPES)),
_("DocType can be one of them {0}").format(comma_or(SALES_TRANSACTION_DOCTYPES)),
):
run(self.report_name, self.filters)

View File

@@ -606,16 +606,10 @@ def get_serial_nos_from_bundle(serial_and_batch_bundle, serial_nos=None):
def get_serial_or_batch_nos(bundle):
# For print format
if not bundle:
return ""
bundle_data = frappe.get_cached_value(
"Serial and Batch Bundle", bundle, ["has_serial_no", "has_batch_no"], as_dict=True
)
if not bundle_data:
return bundle
fields = []
if bundle_data.has_serial_no:
fields.append("serial_no")

View File

@@ -224,7 +224,7 @@ class SubcontractingInwardOrder(SubcontractingController):
if not any([rm.is_customer_provided_item for rm in raw_materials]):
frappe.throw(
_(
"At least one raw material for Finished Good Item {0} should be customer provided."
"Atleast one raw material for Finished Good Item {0} should be customer provided."
).format(frappe.bold(item.item_code))
)

View File

@@ -139,14 +139,12 @@ class SubcontractingOrder(SubcontractingController):
frappe.throw(_("Please select a valid Purchase Order that is configured for Subcontracting."))
if po.docstatus != 1:
frappe.throw(_("Please submit Purchase Order {0} before proceeding.").format(po.name))
msg = f"Please submit Purchase Order {po.name} before proceeding."
frappe.throw(_(msg))
if po.per_received == 100:
frappe.throw(
_("Cannot create more Subcontracting Orders against the Purchase Order {0}.").format(
po.name
)
)
msg = f"Cannot create more Subcontracting Orders against the Purchase Order {po.name}."
frappe.throw(_(msg))
else:
self.service_items = self.items = self.supplied_items = None
frappe.throw(_("Please select a Subcontracting Purchase Order."))
@@ -174,11 +172,8 @@ class SubcontractingOrder(SubcontractingController):
if self.supplier_warehouse:
for item in self.supplied_items:
if self.supplier_warehouse == item.reserve_warehouse:
frappe.throw(
_(
"Reserve Warehouse must be different from Supplier Warehouse for Supplied Item {0}."
).format(item.main_item_code)
)
msg = f"Reserve Warehouse must be different from Supplier Warehouse for Supplied Item {item.main_item_code}."
frappe.throw(_(msg))
def set_missing_values(self):
self.calculate_additional_costs()

View File

@@ -143,7 +143,7 @@ class SubcontractingReceipt(SubcontractingController):
self.validate_inspection()
if getdate(self.posting_date) > getdate(nowdate()):
frappe.throw(_("Posting Date cannot be a future date"))
frappe.throw(_("Posting Date cannot be future date"))
super().validate()

View File

@@ -48,7 +48,7 @@ def get_site_info(site_info):
def payment_app_import_guard():
marketplace_link = '<a href="https://frappecloud.com/marketplace/apps/payments">Marketplace</a>'
github_link = '<a href="https://github.com/frappe/payments/">GitHub</a>'
msg = _("payments app is not installed. Please install it from {0} or {1}").format(
msg = _("payments app is not installed. Please install it from {} or {}").format(
marketplace_link, github_link
)
try:

View File

@@ -30,7 +30,7 @@ def transaction_processing(
skipped_msg += (
"<br><br><ul>"
+ "".join(_("<li>{0}</li>").format(frappe.bold(row.get("name"))) for row in skipped_records)
+ "".join(_("<li>{}</li>").format(frappe.bold(row.get("name"))) for row in skipped_records)
+ "</ul>"
)

View File

@@ -30,8 +30,6 @@ class VideoSettings(Document):
try:
build("youtube", "v3", developerKey=self.api_key)
except Exception:
title = _("Failed to Authenticate the API key.")
self.log_error("Failed to authenticate API key")
frappe.throw(
_("Failed to authenticate the API key. Please check the error logs."),
title=_("Invalid Credentials"),
)
frappe.throw(title + " Please check the error logs.", title=_("Invalid Credentials"))