Merge branch 'develop' into get_incoming_rate_v14_fix

This commit is contained in:
rohitwaghchaure 2023-05-18 06:13:52 +05:30 committed by GitHub
commit ffb353032d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
94 changed files with 33125 additions and 32335 deletions

View File

@ -204,8 +204,11 @@ class Account(NestedSet):
) )
def validate_account_currency(self): def validate_account_currency(self):
self.currency_explicitly_specified = True
if not self.account_currency: if not self.account_currency:
self.account_currency = frappe.get_cached_value("Company", self.company, "default_currency") self.account_currency = frappe.get_cached_value("Company", self.company, "default_currency")
self.currency_explicitly_specified = False
gl_currency = frappe.db.get_value("GL Entry", {"account": self.name}, "account_currency") gl_currency = frappe.db.get_value("GL Entry", {"account": self.name}, "account_currency")
@ -251,8 +254,10 @@ class Account(NestedSet):
{ {
"company": company, "company": company,
# parent account's currency should be passed down to child account's curreny # parent account's currency should be passed down to child account's curreny
# if it is None, it picks it up from default company currency, which might be unintended # if currency explicitly specified by user, child will inherit. else, default currency will be used.
"account_currency": erpnext.get_company_currency(company), "account_currency": self.account_currency
if self.currency_explicitly_specified
else erpnext.get_company_currency(company),
"parent_account": parent_acc_name_map[company], "parent_account": parent_acc_name_map[company],
} }
) )

View File

@ -5,10 +5,13 @@
import unittest import unittest
import frappe import frappe
from frappe.test_runner import make_test_records
from erpnext.accounts.doctype.account.account import merge_account, update_account_number from erpnext.accounts.doctype.account.account import merge_account, update_account_number
from erpnext.stock import get_company_default_inventory_account, get_warehouse_account from erpnext.stock import get_company_default_inventory_account, get_warehouse_account
test_dependencies = ["Company"]
class TestAccount(unittest.TestCase): class TestAccount(unittest.TestCase):
def test_rename_account(self): def test_rename_account(self):
@ -188,6 +191,58 @@ class TestAccount(unittest.TestCase):
frappe.delete_doc("Account", "1234 - Test Rename Sync Account - _TC4") frappe.delete_doc("Account", "1234 - Test Rename Sync Account - _TC4")
frappe.delete_doc("Account", "1234 - Test Rename Sync Account - _TC5") frappe.delete_doc("Account", "1234 - Test Rename Sync Account - _TC5")
def test_account_currency_sync(self):
"""
In a parent->child company setup, child should inherit parent account currency if explicitly specified.
"""
make_test_records("Company")
frappe.local.flags.pop("ignore_root_company_validation", None)
def create_bank_account():
acc = frappe.new_doc("Account")
acc.account_name = "_Test Bank JPY"
acc.parent_account = "Temporary Accounts - _TC6"
acc.company = "_Test Company 6"
return acc
acc = create_bank_account()
# Explicitly set currency
acc.account_currency = "JPY"
acc.insert()
self.assertTrue(
frappe.db.exists(
{
"doctype": "Account",
"account_name": "_Test Bank JPY",
"account_currency": "JPY",
"company": "_Test Company 7",
}
)
)
frappe.delete_doc("Account", "_Test Bank JPY - _TC6")
frappe.delete_doc("Account", "_Test Bank JPY - _TC7")
acc = create_bank_account()
# default currency is used
acc.insert()
self.assertTrue(
frappe.db.exists(
{
"doctype": "Account",
"account_name": "_Test Bank JPY",
"account_currency": "USD",
"company": "_Test Company 7",
}
)
)
frappe.delete_doc("Account", "_Test Bank JPY - _TC6")
frappe.delete_doc("Account", "_Test Bank JPY - _TC7")
def test_child_company_account_rename_sync(self): def test_child_company_account_rename_sync(self):
frappe.local.flags.pop("ignore_root_company_validation", None) frappe.local.flags.pop("ignore_root_company_validation", None)

View File

@ -53,19 +53,20 @@ class BankStatementImport(DataImport):
if "Bank Account" not in json.dumps(preview["columns"]): if "Bank Account" not in json.dumps(preview["columns"]):
frappe.throw(_("Please add the Bank Account column")) frappe.throw(_("Please add the Bank Account column"))
from frappe.utils.background_jobs import is_job_queued from frappe.utils.background_jobs import is_job_enqueued
from frappe.utils.scheduler import is_scheduler_inactive from frappe.utils.scheduler import is_scheduler_inactive
if is_scheduler_inactive() and not frappe.flags.in_test: if is_scheduler_inactive() and not frappe.flags.in_test:
frappe.throw(_("Scheduler is inactive. Cannot import data."), title=_("Scheduler Inactive")) frappe.throw(_("Scheduler is inactive. Cannot import data."), title=_("Scheduler Inactive"))
if not is_job_queued(self.name): job_id = f"bank_statement_import::{self.name}"
if not is_job_enqueued(job_id):
enqueue( enqueue(
start_import, start_import,
queue="default", queue="default",
timeout=6000, timeout=6000,
event="data_import", event="data_import",
job_name=self.name, job_id=job_id,
data_import=self.name, data_import=self.name,
bank_account=self.bank_account, bank_account=self.bank_account,
import_file_path=self.import_file, import_file_path=self.import_file,

View File

@ -4,7 +4,7 @@
import frappe import frappe
from frappe import _ from frappe import _
from frappe.model.document import Document from frappe.model.document import Document
from frappe.utils.background_jobs import is_job_queued from frappe.utils.background_jobs import is_job_enqueued
from erpnext.accounts.doctype.account.account import merge_account from erpnext.accounts.doctype.account.account import merge_account
@ -17,13 +17,14 @@ class LedgerMerge(Document):
if is_scheduler_inactive() and not frappe.flags.in_test: if is_scheduler_inactive() and not frappe.flags.in_test:
frappe.throw(_("Scheduler is inactive. Cannot merge accounts."), title=_("Scheduler Inactive")) frappe.throw(_("Scheduler is inactive. Cannot merge accounts."), title=_("Scheduler Inactive"))
if not is_job_queued(self.name): job_id = f"ledger_merge::{self.name}"
if not is_job_enqueued(job_id):
enqueue( enqueue(
start_merge, start_merge,
queue="default", queue="default",
timeout=6000, timeout=6000,
event="ledger_merge", event="ledger_merge",
job_name=self.name, job_id=job_id,
docname=self.name, docname=self.name,
now=frappe.conf.developer_mode or frappe.flags.in_test, now=frappe.conf.developer_mode or frappe.flags.in_test,
) )

View File

@ -6,7 +6,7 @@ import frappe
from frappe import _, scrub from frappe import _, scrub
from frappe.model.document import Document from frappe.model.document import Document
from frappe.utils import flt, nowdate from frappe.utils import flt, nowdate
from frappe.utils.background_jobs import enqueue, is_job_queued from frappe.utils.background_jobs import enqueue, is_job_enqueued
from erpnext.accounts.doctype.accounting_dimension.accounting_dimension import ( from erpnext.accounts.doctype.accounting_dimension.accounting_dimension import (
get_accounting_dimensions, get_accounting_dimensions,
@ -212,13 +212,15 @@ class OpeningInvoiceCreationTool(Document):
if is_scheduler_inactive() and not frappe.flags.in_test: if is_scheduler_inactive() and not frappe.flags.in_test:
frappe.throw(_("Scheduler is inactive. Cannot import data."), title=_("Scheduler Inactive")) frappe.throw(_("Scheduler is inactive. Cannot import data."), title=_("Scheduler Inactive"))
if not is_job_queued(self.name): job_id = f"opening_invoice::{self.name}"
if not is_job_enqueued(job_id):
enqueue( enqueue(
start_import, start_import,
queue="default", queue="default",
timeout=6000, timeout=6000,
event="opening_invoice_creation", event="opening_invoice_creation",
job_name=self.name, job_id=job_id,
invoices=invoices, invoices=invoices,
now=frappe.conf.developer_mode or frappe.flags.in_test, now=frappe.conf.developer_mode or frappe.flags.in_test,
) )

View File

@ -904,7 +904,7 @@ frappe.ui.form.on('Payment Entry', {
function(d) { return flt(d.amount) })); function(d) { return flt(d.amount) }));
frm.set_value("difference_amount", difference_amount - total_deductions + frm.set_value("difference_amount", difference_amount - total_deductions +
frm.doc.base_total_taxes_and_charges); flt(frm.doc.base_total_taxes_and_charges));
frm.events.hide_unhide_fields(frm); frm.events.hide_unhide_fields(frm);
}, },

View File

@ -9,7 +9,7 @@ from frappe import _
from frappe.model.document import Document from frappe.model.document import Document
from frappe.model.mapper import map_child_doc, map_doc from frappe.model.mapper import map_child_doc, map_doc
from frappe.utils import cint, flt, get_time, getdate, nowdate, nowtime from frappe.utils import cint, flt, get_time, getdate, nowdate, nowtime
from frappe.utils.background_jobs import enqueue, is_job_queued from frappe.utils.background_jobs import enqueue, is_job_enqueued
from frappe.utils.scheduler import is_scheduler_inactive from frappe.utils.scheduler import is_scheduler_inactive
@ -483,15 +483,15 @@ def enqueue_job(job, **kwargs):
closing_entry = kwargs.get("closing_entry") or {} closing_entry = kwargs.get("closing_entry") or {}
job_name = closing_entry.get("name") job_id = "pos_invoice_merge::" + str(closing_entry.get("name"))
if not is_job_queued(job_name): if not is_job_enqueued(job_id):
enqueue( enqueue(
job, job,
**kwargs, **kwargs,
queue="long", queue="long",
timeout=10000, timeout=10000,
event="processing_merge_logs", event="processing_merge_logs",
job_name=job_name, job_id=job_id,
now=frappe.conf.developer_mode or frappe.flags.in_test now=frappe.conf.developer_mode or frappe.flags.in_test
) )

View File

@ -164,7 +164,7 @@ def trigger_reconciliation_for_queued_docs():
Fetch queued docs and start reconciliation process for each one Fetch queued docs and start reconciliation process for each one
""" """
if not frappe.db.get_single_value("Accounts Settings", "auto_reconcile_payments"): if not frappe.db.get_single_value("Accounts Settings", "auto_reconcile_payments"):
frappe.throw( frappe.msgprint(
_("Auto Reconciliation of Payments has been disabled. Enable it through {0}").format( _("Auto Reconciliation of Payments has been disabled. Enable it through {0}").format(
get_link_to_form("Accounts Settings", "Accounts Settings") get_link_to_form("Accounts Settings", "Accounts Settings")
) )

View File

@ -303,7 +303,7 @@ erpnext.accounts.PurchaseInvoice = class PurchaseInvoice extends erpnext.buying.
apply_tds(frm) { apply_tds(frm) {
var me = this; var me = this;
me.frm.set_value("tax_withheld_vouchers", []);
if (!me.frm.doc.apply_tds) { if (!me.frm.doc.apply_tds) {
me.frm.set_value("tax_withholding_category", ''); me.frm.set_value("tax_withholding_category", '');
me.frm.set_df_property("tax_withholding_category", "hidden", 1); me.frm.set_df_property("tax_withholding_category", "hidden", 1);

View File

@ -1369,6 +1369,7 @@
"options": "Warehouse", "options": "Warehouse",
"print_hide": 1, "print_hide": 1,
"print_width": "50px", "print_width": "50px",
"ignore_user_permissions": 1,
"width": "50px" "width": "50px"
}, },
{ {
@ -1572,7 +1573,7 @@
"idx": 204, "idx": 204,
"is_submittable": 1, "is_submittable": 1,
"links": [], "links": [],
"modified": "2023-04-28 12:57:50.832598", "modified": "2023-04-29 12:57:50.832598",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Accounts", "module": "Accounts",
"name": "Purchase Invoice", "name": "Purchase Invoice",

View File

@ -124,6 +124,7 @@
"fieldname": "rate", "fieldname": "rate",
"fieldtype": "Currency", "fieldtype": "Currency",
"label": "Rate", "label": "Rate",
"options": "Company:company:default_currency",
"reqd": 1 "reqd": 1
}, },
{ {
@ -147,6 +148,7 @@
"fieldname": "amount", "fieldname": "amount",
"fieldtype": "Currency", "fieldtype": "Currency",
"label": "Amount", "label": "Amount",
"options": "Company:company:default_currency",
"read_only": 1 "read_only": 1
}, },
{ {

View File

@ -546,12 +546,13 @@ def apply_additional_conditions(doctype, query, from_date, ignore_closing_entrie
) )
query = query.where( query = query.where(
(gl_entry.finance_book.isin([cstr(filters.finance_book), cstr(company_fb)])) (gl_entry.finance_book.isin([cstr(filters.finance_book), cstr(company_fb), ""]))
| (gl_entry.finance_book.isnull()) | (gl_entry.finance_book.isnull())
) )
else: else:
query = query.where( query = query.where(
(gl_entry.finance_book.isin([cstr(filters.finance_book)])) | (gl_entry.finance_book.isnull()) (gl_entry.finance_book.isin([cstr(filters.finance_book), ""]))
| (gl_entry.finance_book.isnull())
) )
if accounting_dimensions: if accounting_dimensions:

View File

@ -253,14 +253,14 @@ def get_conditions(filters):
_("To use a different finance book, please uncheck 'Include Default Book Entries'") _("To use a different finance book, please uncheck 'Include Default Book Entries'")
) )
else: else:
conditions.append("(finance_book in (%(finance_book)s) OR finance_book IS NULL)") conditions.append("(finance_book in (%(finance_book)s, '') OR finance_book IS NULL)")
else: else:
conditions.append("(finance_book in (%(company_fb)s) OR finance_book IS NULL)") conditions.append("(finance_book in (%(company_fb)s, '') OR finance_book IS NULL)")
else: else:
if filters.get("finance_book"): if filters.get("finance_book"):
conditions.append("(finance_book in (%(finance_book)s) OR finance_book IS NULL)") conditions.append("(finance_book in (%(finance_book)s, '') OR finance_book IS NULL)")
else: else:
conditions.append("(finance_book IS NULL)") conditions.append("(finance_book in ('') OR finance_book IS NULL)")
if not filters.get("show_cancelled_entries"): if not filters.get("show_cancelled_entries"):
conditions.append("is_cancelled = 0") conditions.append("is_cancelled = 0")

View File

@ -19,14 +19,19 @@ def execute(filters=None):
return _execute(filters) return _execute(filters)
def _execute(filters=None, additional_table_columns=None, additional_query_columns=None): def _execute(
filters=None,
additional_table_columns=None,
additional_query_columns=None,
additional_conditions=None,
):
if not filters: if not filters:
filters = {} filters = {}
columns = get_columns(additional_table_columns, filters) columns = get_columns(additional_table_columns, filters)
company_currency = frappe.get_cached_value("Company", filters.get("company"), "default_currency") company_currency = frappe.get_cached_value("Company", filters.get("company"), "default_currency")
item_list = get_items(filters, additional_query_columns) item_list = get_items(filters, additional_query_columns, additional_conditions)
if item_list: if item_list:
itemised_tax, tax_columns = get_tax_accounts(item_list, columns, company_currency) itemised_tax, tax_columns = get_tax_accounts(item_list, columns, company_currency)
@ -328,7 +333,7 @@ def get_columns(additional_table_columns, filters):
return columns return columns
def get_conditions(filters): def get_conditions(filters, additional_conditions=None):
conditions = "" conditions = ""
for opts in ( for opts in (
@ -341,6 +346,9 @@ def get_conditions(filters):
if filters.get(opts[0]): if filters.get(opts[0]):
conditions += opts[1] conditions += opts[1]
if additional_conditions:
conditions += additional_conditions
if filters.get("mode_of_payment"): if filters.get("mode_of_payment"):
conditions += """ and exists(select name from `tabSales Invoice Payment` conditions += """ and exists(select name from `tabSales Invoice Payment`
where parent=`tabSales Invoice`.name where parent=`tabSales Invoice`.name
@ -376,8 +384,8 @@ def get_group_by_conditions(filters, doctype):
return "ORDER BY `tab{0}`.{1}".format(doctype, frappe.scrub(filters.get("group_by"))) return "ORDER BY `tab{0}`.{1}".format(doctype, frappe.scrub(filters.get("group_by")))
def get_items(filters, additional_query_columns): def get_items(filters, additional_query_columns, additional_conditions=None):
conditions = get_conditions(filters) conditions = get_conditions(filters, additional_conditions)
if additional_query_columns: if additional_query_columns:
additional_query_columns = ", " + ", ".join(additional_query_columns) additional_query_columns = ", " + ", ".join(additional_query_columns)

View File

@ -256,12 +256,12 @@ def get_opening_balance(
) )
opening_balance = opening_balance.where( opening_balance = opening_balance.where(
(closing_balance.finance_book.isin([cstr(filters.finance_book), cstr(company_fb)])) (closing_balance.finance_book.isin([cstr(filters.finance_book), cstr(company_fb), ""]))
| (closing_balance.finance_book.isnull()) | (closing_balance.finance_book.isnull())
) )
else: else:
opening_balance = opening_balance.where( opening_balance = opening_balance.where(
(closing_balance.finance_book.isin([cstr(filters.finance_book)])) (closing_balance.finance_book.isin([cstr(filters.finance_book), ""]))
| (closing_balance.finance_book.isnull()) | (closing_balance.finance_book.isnull())
) )

View File

@ -691,7 +691,7 @@ class TestDepreciationMethods(AssetSetup):
) )
self.assertEqual(asset.status, "Draft") self.assertEqual(asset.status, "Draft")
expected_schedules = [["2032-12-31", 30000.0, 77095.89], ["2033-06-06", 12904.11, 90000.0]] expected_schedules = [["2032-12-31", 42904.11, 90000.0]]
schedules = [ schedules = [
[cstr(d.schedule_date), flt(d.depreciation_amount, 2), d.accumulated_depreciation_amount] [cstr(d.schedule_date), flt(d.depreciation_amount, 2), d.accumulated_depreciation_amount]
for d in get_depr_schedule(asset.name, "Draft") for d in get_depr_schedule(asset.name, "Draft")

View File

@ -337,7 +337,7 @@ class AssetDepreciationSchedule(Document):
depreciation_amount += value_after_depreciation - row.expected_value_after_useful_life depreciation_amount += value_after_depreciation - row.expected_value_after_useful_life
skip_row = True skip_row = True
if depreciation_amount > 0: if flt(depreciation_amount, asset_doc.precision("gross_purchase_amount")) > 0:
self.add_depr_schedule_row( self.add_depr_schedule_row(
schedule_date, schedule_date,
depreciation_amount, depreciation_amount,
@ -521,9 +521,11 @@ def get_straight_line_or_manual_depr_amount(asset, row):
) )
# if the Depreciation Schedule is being prepared for the first time # if the Depreciation Schedule is being prepared for the first time
else: else:
return (flt(asset.gross_purchase_amount) - flt(row.expected_value_after_useful_life)) / flt( return (
row.total_number_of_depreciations flt(asset.gross_purchase_amount)
) - flt(asset.opening_accumulated_depreciation)
- flt(row.expected_value_after_useful_life)
) / flt(row.total_number_of_depreciations - asset.number_of_depreciations_booked)
def get_wdv_or_dd_depr_amount( def get_wdv_or_dd_depr_amount(

View File

@ -1171,6 +1171,7 @@
"depends_on": "is_internal_supplier", "depends_on": "is_internal_supplier",
"fieldname": "set_from_warehouse", "fieldname": "set_from_warehouse",
"fieldtype": "Link", "fieldtype": "Link",
"ignore_user_permissions": 1,
"label": "Set From Warehouse", "label": "Set From Warehouse",
"options": "Warehouse" "options": "Warehouse"
}, },
@ -1271,7 +1272,7 @@
"idx": 105, "idx": 105,
"is_submittable": 1, "is_submittable": 1,
"links": [], "links": [],
"modified": "2023-04-14 16:42:29.448464", "modified": "2023-05-07 20:18:09.196799",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Buying", "module": "Buying",
"name": "Purchase Order", "name": "Purchase Order",

View File

@ -392,6 +392,9 @@ class AccountsController(TransactionBase):
) )
def validate_inter_company_reference(self): def validate_inter_company_reference(self):
if self.get("is_return"):
return
if self.doctype not in ("Purchase Invoice", "Purchase Receipt"): if self.doctype not in ("Purchase Invoice", "Purchase Receipt"):
return return
@ -1679,6 +1682,9 @@ class AccountsController(TransactionBase):
d.base_payment_amount = flt( d.base_payment_amount = flt(
d.payment_amount * self.get("conversion_rate"), d.precision("base_payment_amount") d.payment_amount * self.get("conversion_rate"), d.precision("base_payment_amount")
) )
else:
self.fetch_payment_terms_from_order(po_or_so, doctype)
self.ignore_default_payment_terms_template = 1
def get_order_details(self): def get_order_details(self):
if self.doctype == "Sales Invoice": if self.doctype == "Sales Invoice":

View File

@ -53,13 +53,17 @@ def lead_query(doctype, txt, searchfield, start, page_len, filters):
doctype = "Lead" doctype = "Lead"
fields = get_fields(doctype, ["name", "lead_name", "company_name"]) fields = get_fields(doctype, ["name", "lead_name", "company_name"])
searchfields = frappe.get_meta(doctype).get_search_fields()
searchfields = " or ".join(field + " like %(txt)s" for field in searchfields)
return frappe.db.sql( return frappe.db.sql(
"""select {fields} from `tabLead` """select {fields} from `tabLead`
where docstatus < 2 where docstatus < 2
and ifnull(status, '') != 'Converted' and ifnull(status, '') != 'Converted'
and ({key} like %(txt)s and ({key} like %(txt)s
or lead_name like %(txt)s or lead_name like %(txt)s
or company_name like %(txt)s) or company_name like %(txt)s
or {scond})
{mcond} {mcond}
order by order by
(case when locate(%(_txt)s, name) > 0 then locate(%(_txt)s, name) else 99999 end), (case when locate(%(_txt)s, name) > 0 then locate(%(_txt)s, name) else 99999 end),
@ -68,7 +72,12 @@ def lead_query(doctype, txt, searchfield, start, page_len, filters):
idx desc, idx desc,
name, lead_name name, lead_name
limit %(page_len)s offset %(start)s""".format( limit %(page_len)s offset %(start)s""".format(
**{"fields": ", ".join(fields), "key": searchfield, "mcond": get_match_cond(doctype)} **{
"fields": ", ".join(fields),
"key": searchfield,
"scond": searchfields,
"mcond": get_match_cond(doctype),
}
), ),
{"txt": "%%%s%%" % txt, "_txt": txt.replace("%", ""), "start": start, "page_len": page_len}, {"txt": "%%%s%%" % txt, "_txt": txt.replace("%", ""), "start": start, "page_len": page_len},
) )

View File

@ -168,7 +168,7 @@ class SellingController(StockController):
self.round_floats_in(sales_person) self.round_floats_in(sales_person)
sales_person.allocated_amount = flt( sales_person.allocated_amount = flt(
self.amount_eligible_for_commission * sales_person.allocated_percentage / 100.0, flt(self.amount_eligible_for_commission) * sales_person.allocated_percentage / 100.0,
self.precision("allocated_amount", sales_person), self.precision("allocated_amount", sales_person),
) )

View File

@ -442,7 +442,43 @@ class StockController(AccountsController):
if not dimension: if not dimension:
continue continue
if row.get(dimension.source_fieldname): if self.doctype in [
"Purchase Invoice",
"Purchase Receipt",
"Sales Invoice",
"Delivery Note",
"Stock Entry",
]:
if (
(
sl_dict.actual_qty > 0
and not self.get("is_return")
or sl_dict.actual_qty < 0
and self.get("is_return")
)
and self.doctype in ["Purchase Invoice", "Purchase Receipt"]
) or (
(
sl_dict.actual_qty < 0
and not self.get("is_return")
or sl_dict.actual_qty > 0
and self.get("is_return")
)
and self.doctype in ["Sales Invoice", "Delivery Note", "Stock Entry"]
):
sl_dict[dimension.target_fieldname] = row.get(dimension.source_fieldname)
else:
fieldname_start_with = "to"
if self.doctype in ["Purchase Invoice", "Purchase Receipt"]:
fieldname_start_with = "from"
fieldname = f"{fieldname_start_with}_{dimension.source_fieldname}"
sl_dict[dimension.target_fieldname] = row.get(fieldname)
if not sl_dict.get(dimension.target_fieldname):
sl_dict[dimension.target_fieldname] = row.get(dimension.source_fieldname)
elif row.get(dimension.source_fieldname):
sl_dict[dimension.target_fieldname] = row.get(dimension.source_fieldname) sl_dict[dimension.target_fieldname] = row.get(dimension.source_fieldname)
if not sl_dict.get(dimension.target_fieldname) and dimension.fetch_from_parent: if not sl_dict.get(dimension.target_fieldname) and dimension.fetch_from_parent:
@ -734,6 +770,9 @@ class StockController(AccountsController):
} }
) )
if self.docstatus == 2:
force = True
if force or future_sle_exists(args) or repost_required_for_queue(self): if force or future_sle_exists(args) or repost_required_for_queue(self):
item_based_reposting = cint( item_based_reposting = cint(
frappe.db.get_single_value("Stock Reposting Settings", "item_based_reposting") frappe.db.get_single_value("Stock Reposting Settings", "item_based_reposting")

View File

@ -741,7 +741,7 @@ class SubcontractingController(StockController):
sco_doc = frappe.get_doc("Subcontracting Order", sco) sco_doc = frappe.get_doc("Subcontracting Order", sco)
sco_doc.update_status() sco_doc.update_status()
def set_missing_values_in_additional_costs(self): def calculate_additional_costs(self):
self.total_additional_costs = sum(flt(item.amount) for item in self.get("additional_costs")) self.total_additional_costs = sum(flt(item.amount) for item in self.get("additional_costs"))
if self.total_additional_costs: if self.total_additional_costs:

View File

@ -36,7 +36,7 @@ class TestSubcontractingController(FrappeTestCase):
sco.remove_empty_rows() sco.remove_empty_rows()
self.assertEqual((len_before - 1), len(sco.service_items)) self.assertEqual((len_before - 1), len(sco.service_items))
def test_set_missing_values_in_additional_costs(self): def test_calculate_additional_costs(self):
sco = get_subcontracting_order(do_not_submit=1) sco = get_subcontracting_order(do_not_submit=1)
rate_without_additional_cost = sco.items[0].rate rate_without_additional_cost = sco.items[0].rate

View File

@ -165,6 +165,7 @@
"fieldname": "slide_3_content_align", "fieldname": "slide_3_content_align",
"fieldtype": "Select", "fieldtype": "Select",
"label": "Content Align", "label": "Content Align",
"options": "Left\nCentre\nRight",
"reqd": 0 "reqd": 0
}, },
{ {
@ -214,6 +215,7 @@
"fieldname": "slide_4_content_align", "fieldname": "slide_4_content_align",
"fieldtype": "Select", "fieldtype": "Select",
"label": "Content Align", "label": "Content Align",
"options": "Left\nCentre\nRight",
"reqd": 0 "reqd": 0
}, },
{ {
@ -263,6 +265,7 @@
"fieldname": "slide_5_content_align", "fieldname": "slide_5_content_align",
"fieldtype": "Select", "fieldtype": "Select",
"label": "Content Align", "label": "Content Align",
"options": "Left\nCentre\nRight",
"reqd": 0 "reqd": 0
}, },
{ {
@ -274,7 +277,7 @@
} }
], ],
"idx": 2, "idx": 2,
"modified": "2021-02-24 15:57:05.889709", "modified": "2023-05-12 15:03:57.604060",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "E-commerce", "module": "E-commerce",
"name": "Hero Slider", "name": "Hero Slider",

View File

@ -48,7 +48,8 @@ frappe.ui.form.on("BOM", {
return { return {
query: "erpnext.manufacturing.doctype.bom.bom.item_query", query: "erpnext.manufacturing.doctype.bom.bom.item_query",
filters: { filters: {
"item_code": doc.item "include_item_in_manufacturing": 1,
"is_fixed_asset": 0
} }
}; };
}); });

View File

@ -1339,8 +1339,9 @@ def item_query(doctype, txt, searchfield, start, page_len, filters):
if not has_variants: if not has_variants:
query_filters["has_variants"] = 0 query_filters["has_variants"] = 0
if filters and filters.get("is_stock_item"): if filters:
query_filters["is_stock_item"] = 1 for fieldname, value in filters.items():
query_filters[fieldname] = value
return frappe.get_list( return frappe.get_list(
"Item", "Item",

View File

@ -698,6 +698,45 @@ class TestBOM(FrappeTestCase):
bom.update_cost() bom.update_cost()
self.assertFalse(bom.flags.cost_updated) self.assertFalse(bom.flags.cost_updated)
def test_do_not_include_manufacturing_and_fixed_items(self):
from erpnext.manufacturing.doctype.bom.bom import item_query
if not frappe.db.exists("Asset Category", "Computers-Test"):
doc = frappe.get_doc({"doctype": "Asset Category", "asset_category_name": "Computers-Test"})
doc.flags.ignore_mandatory = True
doc.insert()
for item_code, properties in {
"_Test RM Item 1 Do Not Include In Manufacture": {
"is_stock_item": 1,
"include_item_in_manufacturing": 0,
},
"_Test RM Item 2 Fixed Asset Item": {
"is_fixed_asset": 1,
"is_stock_item": 0,
"asset_category": "Computers-Test",
},
"_Test RM Item 3 Manufacture Item": {"is_stock_item": 1, "include_item_in_manufacturing": 1},
}.items():
make_item(item_code, properties)
data = item_query(
"Item",
txt="_Test RM Item",
searchfield="name",
start=0,
page_len=20000,
filters={"include_item_in_manufacturing": 1, "is_fixed_asset": 0},
)
items = []
for row in data:
items.append(row[0])
self.assertTrue("_Test RM Item 1 Do Not Include In Manufacture" not in items)
self.assertTrue("_Test RM Item 2 Fixed Asset Item" not in items)
self.assertTrue("_Test RM Item 3 Manufacture Item" in items)
def get_default_bom(item_code="_Test FG Item 2"): def get_default_bom(item_code="_Test FG Item 2"):
return frappe.db.get_value("BOM", {"item": item_code, "is_active": 1, "is_default": 1}) return frappe.db.get_value("BOM", {"item": item_code, "is_active": 1, "is_default": 1})

View File

@ -562,6 +562,7 @@ class JobCard(Document):
) )
def update_work_order_data(self, for_quantity, time_in_mins, wo): def update_work_order_data(self, for_quantity, time_in_mins, wo):
workstation_hour_rate = frappe.get_value("Workstation", self.workstation, "hour_rate")
jc = frappe.qb.DocType("Job Card") jc = frappe.qb.DocType("Job Card")
jctl = frappe.qb.DocType("Job Card Time Log") jctl = frappe.qb.DocType("Job Card Time Log")
@ -587,6 +588,7 @@ class JobCard(Document):
if data.get("workstation") != self.workstation: if data.get("workstation") != self.workstation:
# workstations can change in a job card # workstations can change in a job card
data.workstation = self.workstation data.workstation = self.workstation
data.hour_rate = flt(workstation_hour_rate)
wo.flags.ignore_validate_update_after_submit = True wo.flags.ignore_validate_update_after_submit = True
wo.update_operation_status() wo.update_operation_status()

View File

@ -587,6 +587,7 @@ class ProductionPlan(Document):
"production_plan_sub_assembly_item": row.name, "production_plan_sub_assembly_item": row.name,
"bom": row.bom_no, "bom": row.bom_no,
"production_plan": self.name, "production_plan": self.name,
"fg_item_qty": row.qty,
} }
for field in [ for field in [

View File

@ -307,6 +307,43 @@ class TestProductionPlan(FrappeTestCase):
self.assertEqual(plan.sub_assembly_items[0].supplier, "_Test Supplier") self.assertEqual(plan.sub_assembly_items[0].supplier, "_Test Supplier")
def test_production_plan_for_subcontracting_po(self):
from erpnext.manufacturing.doctype.bom.test_bom import create_nested_bom
bom_tree_1 = {"Test Laptop 1": {"Test Motherboard 1": {"Test Motherboard Wires 1": {}}}}
create_nested_bom(bom_tree_1, prefix="")
item_doc = frappe.get_doc("Item", "Test Motherboard 1")
company = "_Test Company"
item_doc.is_sub_contracted_item = 1
for row in item_doc.item_defaults:
if row.company == company and not row.default_supplier:
row.default_supplier = "_Test Supplier"
if not item_doc.item_defaults:
item_doc.append("item_defaults", {"company": company, "default_supplier": "_Test Supplier"})
item_doc.save()
plan = create_production_plan(
item_code="Test Laptop 1", planned_qty=10, use_multi_level_bom=1, do_not_submit=True
)
plan.get_sub_assembly_items()
plan.set_default_supplier_for_subcontracting_order()
plan.submit()
self.assertEqual(plan.sub_assembly_items[0].supplier, "_Test Supplier")
plan.make_work_order()
po = frappe.db.get_value("Purchase Order Item", {"production_plan": plan.name}, "parent")
po_doc = frappe.get_doc("Purchase Order", po)
self.assertEqual(po_doc.supplier, "_Test Supplier")
self.assertEqual(po_doc.items[0].qty, 10.0)
self.assertEqual(po_doc.items[0].fg_item_qty, 10.0)
self.assertEqual(po_doc.items[0].fg_item_qty, 10.0)
self.assertEqual(po_doc.items[0].fg_item, "Test Motherboard 1")
def test_production_plan_combine_subassembly(self): def test_production_plan_combine_subassembly(self):
""" """
Test combining Sub assembly items belonging to the same BOM in Prod Plan. Test combining Sub assembly items belonging to the same BOM in Prod Plan.

View File

@ -326,7 +326,7 @@ erpnext.patches.v13_0.update_docs_link
erpnext.patches.v15_0.update_asset_value_for_manual_depr_entries erpnext.patches.v15_0.update_asset_value_for_manual_depr_entries
erpnext.patches.v15_0.update_gpa_and_ndb_for_assdeprsch erpnext.patches.v15_0.update_gpa_and_ndb_for_assdeprsch
erpnext.patches.v14_0.create_accounting_dimensions_for_closing_balance erpnext.patches.v14_0.create_accounting_dimensions_for_closing_balance
erpnext.patches.v14_0.update_closing_balances erpnext.patches.v14_0.update_closing_balances #10-05-2023
execute:frappe.db.set_single_value("Accounts Settings", "merge_similar_account_heads", 0) execute:frappe.db.set_single_value("Accounts Settings", "merge_similar_account_heads", 0)
# below migration patches should always run last # below migration patches should always run last
erpnext.patches.v14_0.migrate_gl_to_payment_ledger erpnext.patches.v14_0.migrate_gl_to_payment_ledger

View File

@ -7,4 +7,6 @@ def execute():
frappe.reload_doc("manufacturing", "doctype", "work_order") frappe.reload_doc("manufacturing", "doctype", "work_order")
frappe.reload_doc("manufacturing", "doctype", "work_order_item") frappe.reload_doc("manufacturing", "doctype", "work_order_item")
frappe.db.sql("""UPDATE `tabWork Order Item` SET amount = rate * required_qty""") frappe.db.sql(
"""UPDATE `tabWork Order Item` SET amount = ifnull(rate, 0.0) * ifnull(required_qty, 0.0)"""
)

View File

@ -11,6 +11,8 @@ from erpnext.accounts.utils import get_fiscal_year
def execute(): def execute():
frappe.db.truncate("Account Closing Balance")
company_wise_order = {} company_wise_order = {}
get_opening_entries = True get_opening_entries = True
for pcv in frappe.db.get_all( for pcv in frappe.db.get_all(
@ -35,7 +37,20 @@ def execute():
entry["closing_date"] = pcv_doc.posting_date entry["closing_date"] = pcv_doc.posting_date
entry["period_closing_voucher"] = pcv_doc.name entry["period_closing_voucher"] = pcv_doc.name
closing_entries = pcv_doc.get_grouped_gl_entries(get_opening_entries=get_opening_entries) closing_entries = frappe.db.get_all(
"GL Entry",
filters={
"is_cancelled": 0,
"voucher_no": ["!=", pcv.name],
"posting_date": ["<=", pcv.posting_date],
},
fields=["*"],
)
for entry in closing_entries:
entry["closing_date"] = pcv_doc.posting_date
entry["period_closing_voucher"] = pcv_doc.name
make_closing_entries(gl_entries + closing_entries, voucher_name=pcv.name) make_closing_entries(gl_entries + closing_entries, voucher_name=pcv.name)
company_wise_order[pcv.company].append(pcv.posting_date) company_wise_order[pcv.company].append(pcv.posting_date)
get_opening_entries = False get_opening_entries = False

View File

@ -374,6 +374,7 @@ def make_sales_invoice(source_name, item_code=None, customer=None, currency=None
billing_rate = billing_amount / hours billing_rate = billing_amount / hours
target.company = timesheet.company target.company = timesheet.company
target.project = timesheet.parent_project
if customer: if customer:
target.customer = customer target.customer = customer

View File

@ -91,6 +91,12 @@ frappe.ui.form.on("Sales Invoice", {
}); });
frappe.ui.form.on('Purchase Invoice', { frappe.ui.form.on('Purchase Invoice', {
setup: (frm) => {
frm.make_methods = {
'Landed Cost Voucher': function () { frm.trigger('create_landedcost_voucher') },
}
},
mode_of_payment: function(frm) { mode_of_payment: function(frm) {
get_payment_mode_account(frm, frm.doc.mode_of_payment, function(account){ get_payment_mode_account(frm, frm.doc.mode_of_payment, function(account){
frm.set_value('cash_bank_account', account); frm.set_value('cash_bank_account', account);
@ -99,6 +105,20 @@ frappe.ui.form.on('Purchase Invoice', {
payment_terms_template: function() { payment_terms_template: function() {
cur_frm.trigger("disable_due_date"); cur_frm.trigger("disable_due_date");
},
create_landedcost_voucher: function (frm) {
let lcv = frappe.model.get_new_doc('Landed Cost Voucher');
lcv.company = frm.doc.company;
let lcv_receipt = frappe.model.get_new_doc('Landed Cost Purchase Invoice');
lcv_receipt.receipt_document_type = 'Purchase Invoice';
lcv_receipt.receipt_document = frm.doc.name;
lcv_receipt.supplier = frm.doc.supplier;
lcv_receipt.grand_total = frm.doc.grand_total;
lcv.purchase_receipts = [lcv_receipt];
frappe.set_route("Form", lcv.doctype, lcv.name);
} }
}); });

View File

@ -92,7 +92,7 @@ erpnext.taxes_and_totals = class TaxesAndTotals extends erpnext.payments {
_calculate_taxes_and_totals() { _calculate_taxes_and_totals() {
const is_quotation = this.frm.doc.doctype == "Quotation"; const is_quotation = this.frm.doc.doctype == "Quotation";
this.frm.doc._items = is_quotation ? this.filtered_items() : this.frm.doc.items; this.frm._items = is_quotation ? this.filtered_items() : this.frm.doc.items;
this.validate_conversion_rate(); this.validate_conversion_rate();
this.calculate_item_values(); this.calculate_item_values();
@ -125,7 +125,7 @@ erpnext.taxes_and_totals = class TaxesAndTotals extends erpnext.payments {
calculate_item_values() { calculate_item_values() {
var me = this; var me = this;
if (!this.discount_amount_applied) { if (!this.discount_amount_applied) {
for (const item of this.frm.doc._items || []) { for (const item of this.frm._items || []) {
frappe.model.round_floats_in(item); frappe.model.round_floats_in(item);
item.net_rate = item.rate; item.net_rate = item.rate;
item.qty = item.qty === undefined ? (me.frm.doc.is_return ? -1 : 1) : item.qty; item.qty = item.qty === undefined ? (me.frm.doc.is_return ? -1 : 1) : item.qty;
@ -209,7 +209,7 @@ erpnext.taxes_and_totals = class TaxesAndTotals extends erpnext.payments {
}); });
if(has_inclusive_tax==false) return; if(has_inclusive_tax==false) return;
$.each(me.frm.doc._items || [], function(n, item) { $.each(me.frm._items || [], function(n, item) {
var item_tax_map = me._load_item_tax_rate(item.item_tax_rate); var item_tax_map = me._load_item_tax_rate(item.item_tax_rate);
var cumulated_tax_fraction = 0.0; var cumulated_tax_fraction = 0.0;
var total_inclusive_tax_amount_per_qty = 0; var total_inclusive_tax_amount_per_qty = 0;
@ -280,13 +280,13 @@ erpnext.taxes_and_totals = class TaxesAndTotals extends erpnext.payments {
var me = this; var me = this;
this.frm.doc.total_qty = this.frm.doc.total = this.frm.doc.base_total = this.frm.doc.net_total = this.frm.doc.base_net_total = 0.0; this.frm.doc.total_qty = this.frm.doc.total = this.frm.doc.base_total = this.frm.doc.net_total = this.frm.doc.base_net_total = 0.0;
$.each(this.frm.doc._items || [], function(i, item) { $.each(this.frm._items || [], function(i, item) {
me.frm.doc.total += item.amount; me.frm.doc.total += item.amount;
me.frm.doc.total_qty += item.qty; me.frm.doc.total_qty += item.qty;
me.frm.doc.base_total += item.base_amount; me.frm.doc.base_total += item.base_amount;
me.frm.doc.net_total += item.net_amount; me.frm.doc.net_total += item.net_amount;
me.frm.doc.base_net_total += item.base_net_amount; me.frm.doc.base_net_total += item.base_net_amount;
}); });
} }
calculate_shipping_charges() { calculate_shipping_charges() {
@ -333,7 +333,7 @@ erpnext.taxes_and_totals = class TaxesAndTotals extends erpnext.payments {
} }
}); });
$.each(this.frm.doc._items || [], function(n, item) { $.each(this.frm._items || [], function(n, item) {
var item_tax_map = me._load_item_tax_rate(item.item_tax_rate); var item_tax_map = me._load_item_tax_rate(item.item_tax_rate);
$.each(me.frm.doc["taxes"] || [], function(i, tax) { $.each(me.frm.doc["taxes"] || [], function(i, tax) {
// tax_amount represents the amount of tax for the current step // tax_amount represents the amount of tax for the current step
@ -342,7 +342,7 @@ erpnext.taxes_and_totals = class TaxesAndTotals extends erpnext.payments {
// Adjust divisional loss to the last item // Adjust divisional loss to the last item
if (tax.charge_type == "Actual") { if (tax.charge_type == "Actual") {
actual_tax_dict[tax.idx] -= current_tax_amount; actual_tax_dict[tax.idx] -= current_tax_amount;
if (n == me.frm.doc._items.length - 1) { if (n == me.frm._items.length - 1) {
current_tax_amount += actual_tax_dict[tax.idx]; current_tax_amount += actual_tax_dict[tax.idx];
} }
} }
@ -379,7 +379,7 @@ erpnext.taxes_and_totals = class TaxesAndTotals extends erpnext.payments {
} }
// set precision in the last item iteration // set precision in the last item iteration
if (n == me.frm.doc._items.length - 1) { if (n == me.frm._items.length - 1) {
me.round_off_totals(tax); me.round_off_totals(tax);
me.set_in_company_currency(tax, me.set_in_company_currency(tax,
["tax_amount", "tax_amount_after_discount_amount"]); ["tax_amount", "tax_amount_after_discount_amount"]);
@ -602,7 +602,7 @@ erpnext.taxes_and_totals = class TaxesAndTotals extends erpnext.payments {
_cleanup() { _cleanup() {
this.frm.doc.base_in_words = this.frm.doc.in_words = ""; this.frm.doc.base_in_words = this.frm.doc.in_words = "";
let items = this.frm.doc._items; let items = this.frm._items;
if(items && items.length) { if(items && items.length) {
if(!frappe.meta.get_docfield(items[0].doctype, "item_tax_amount", this.frm.doctype)) { if(!frappe.meta.get_docfield(items[0].doctype, "item_tax_amount", this.frm.doctype)) {
@ -659,7 +659,7 @@ erpnext.taxes_and_totals = class TaxesAndTotals extends erpnext.payments {
var net_total = 0; var net_total = 0;
// calculate item amount after Discount Amount // calculate item amount after Discount Amount
if (total_for_discount_amount) { if (total_for_discount_amount) {
$.each(this.frm.doc._items || [], function(i, item) { $.each(this.frm._items || [], function(i, item) {
distributed_amount = flt(me.frm.doc.discount_amount) * item.net_amount / total_for_discount_amount; distributed_amount = flt(me.frm.doc.discount_amount) * item.net_amount / total_for_discount_amount;
item.net_amount = flt(item.net_amount - distributed_amount, item.net_amount = flt(item.net_amount - distributed_amount,
precision("base_amount", item)); precision("base_amount", item));
@ -667,7 +667,7 @@ erpnext.taxes_and_totals = class TaxesAndTotals extends erpnext.payments {
// discount amount rounding loss adjustment if no taxes // discount amount rounding loss adjustment if no taxes
if ((!(me.frm.doc.taxes || []).length || total_for_discount_amount==me.frm.doc.net_total || (me.frm.doc.apply_discount_on == "Net Total")) if ((!(me.frm.doc.taxes || []).length || total_for_discount_amount==me.frm.doc.net_total || (me.frm.doc.apply_discount_on == "Net Total"))
&& i == (me.frm.doc._items || []).length - 1) { && i == (me.frm._items || []).length - 1) {
var discount_amount_loss = flt(me.frm.doc.net_total - net_total var discount_amount_loss = flt(me.frm.doc.net_total - net_total
- me.frm.doc.discount_amount, precision("net_total")); - me.frm.doc.discount_amount, precision("net_total"));
item.net_amount = flt(item.net_amount + discount_amount_loss, item.net_amount = flt(item.net_amount + discount_amount_loss,

View File

@ -617,11 +617,15 @@ def get_credit_limit(customer, company):
if not credit_limit: if not credit_limit:
customer_group = frappe.get_cached_value("Customer", customer, "customer_group") customer_group = frappe.get_cached_value("Customer", customer, "customer_group")
credit_limit = frappe.db.get_value(
result = frappe.db.get_values(
"Customer Credit Limit", "Customer Credit Limit",
{"parent": customer_group, "parenttype": "Customer Group", "company": company}, {"parent": customer_group, "parenttype": "Customer Group", "company": company},
"credit_limit", fieldname=["credit_limit", "bypass_credit_limit_check"],
as_dict=True,
) )
if result and not result[0].bypass_credit_limit_check:
credit_limit = result[0].credit_limit
if not credit_limit: if not credit_limit:
credit_limit = frappe.get_cached_value("Company", company, "credit_limit") credit_limit = frappe.get_cached_value("Company", company, "credit_limit")

View File

@ -286,6 +286,18 @@ def _make_sales_order(source_name, target_doc=None, ignore_permissions=False):
target.commission_rate = frappe.get_value( target.commission_rate = frappe.get_value(
"Sales Partner", source.referral_sales_partner, "commission_rate" "Sales Partner", source.referral_sales_partner, "commission_rate"
) )
# sales team
for d in customer.get("sales_team"):
target.append(
"sales_team",
{
"sales_person": d.sales_person,
"allocated_percentage": d.allocated_percentage or None,
"commission_rate": d.commission_rate,
},
)
target.flags.ignore_permissions = ignore_permissions target.flags.ignore_permissions = ignore_permissions
target.run_method("set_missing_values") target.run_method("set_missing_values")
target.run_method("calculate_taxes_and_totals") target.run_method("calculate_taxes_and_totals")

View File

@ -264,7 +264,7 @@ erpnext.selling.SalesOrderController = class SalesOrderController extends erpnex
} }
} }
// payment request // payment request
if(flt(doc.per_billed)<100) { if(flt(doc.per_billed, precision('per_billed', doc)) < 100 + frappe.boot.sysdefaults.over_billing_allowance) {
this.frm.add_custom_button(__('Payment Request'), () => this.make_payment_request(), __('Create')); this.frm.add_custom_button(__('Payment Request'), () => this.make_payment_request(), __('Create'));
this.frm.add_custom_button(__('Payment'), () => this.make_payment_entry(), __('Create')); this.frm.add_custom_button(__('Payment'), () => this.make_payment_entry(), __('Create'));
} }

View File

@ -620,6 +620,8 @@ def make_project(source_name, target_doc=None):
@frappe.whitelist() @frappe.whitelist()
def make_delivery_note(source_name, target_doc=None, skip_item_mapping=False): def make_delivery_note(source_name, target_doc=None, skip_item_mapping=False):
from erpnext.stock.doctype.packed_item.packed_item import make_packing_list
def set_missing_values(source, target): def set_missing_values(source, target):
target.run_method("set_missing_values") target.run_method("set_missing_values")
target.run_method("set_po_nos") target.run_method("set_po_nos")
@ -634,6 +636,8 @@ def make_delivery_note(source_name, target_doc=None, skip_item_mapping=False):
if target.company_address: if target.company_address:
target.update(get_fetch_values("Delivery Note", "company_address", target.company_address)) target.update(get_fetch_values("Delivery Note", "company_address", target.company_address))
make_packing_list(target)
def update_item(source, target, source_parent): def update_item(source, target, source_parent):
target.base_amount = (flt(source.qty) - flt(source.delivered_qty)) * flt(source.base_rate) target.base_amount = (flt(source.qty) - flt(source.delivered_qty)) * flt(source.base_rate)
target.amount = (flt(source.qty) - flt(source.delivered_qty)) * flt(source.rate) target.amount = (flt(source.qty) - flt(source.delivered_qty)) * flt(source.rate)

View File

@ -1909,6 +1909,75 @@ class TestSalesOrder(FrappeTestCase):
self.assertEqual(mr.items[0].qty, 6) self.assertEqual(mr.items[0].qty, 6)
def test_packed_items_for_partial_sales_order(self):
# test Update Items with product bundle
for product_bundle in [
"_Test Product Bundle Item Partial 1",
"_Test Product Bundle Item Partial 2",
]:
if not frappe.db.exists("Item", product_bundle):
bundle_item = make_item(product_bundle, {"is_stock_item": 0})
bundle_item.append(
"item_defaults", {"company": "_Test Company", "default_warehouse": "_Test Warehouse - _TC"}
)
bundle_item.save(ignore_permissions=True)
for product_bundle in ["_Packed Item Partial 1", "_Packed Item Partial 2"]:
if not frappe.db.exists("Item", product_bundle):
make_item(product_bundle, {"is_stock_item": 1, "stock_uom": "Nos"})
make_stock_entry(item=product_bundle, target="_Test Warehouse - _TC", qty=2, rate=10)
make_product_bundle("_Test Product Bundle Item Partial 1", ["_Packed Item Partial 1"], 1)
make_product_bundle("_Test Product Bundle Item Partial 2", ["_Packed Item Partial 2"], 1)
so = make_sales_order(
item_code="_Test Product Bundle Item Partial 1",
warehouse="_Test Warehouse - _TC",
qty=1,
uom="Nos",
stock_uom="Nos",
conversion_factor=1,
transaction_date=nowdate(),
delivery_note=nowdate(),
do_not_submit=1,
)
so.append(
"items",
{
"item_code": "_Test Product Bundle Item Partial 2",
"warehouse": "_Test Warehouse - _TC",
"qty": 1,
"uom": "Nos",
"stock_uom": "Nos",
"conversion_factor": 1,
"delivery_note": nowdate(),
},
)
so.save()
so.submit()
dn = make_delivery_note(so.name)
dn.remove(dn.items[1])
dn.save()
dn.submit()
self.assertEqual(len(dn.items), 1)
self.assertEqual(len(dn.packed_items), 1)
self.assertEqual(dn.items[0].item_code, "_Test Product Bundle Item Partial 1")
so.load_from_db()
dn = make_delivery_note(so.name)
dn.save()
self.assertEqual(len(dn.items), 1)
self.assertEqual(len(dn.packed_items), 1)
self.assertEqual(dn.items[0].item_code, "_Test Product Bundle Item Partial 2")
def automatically_fetch_payment_terms(enable=1): def automatically_fetch_payment_terms(enable=1):
accounts_settings = frappe.get_doc("Accounts Settings") accounts_settings = frappe.get_doc("Accounts Settings")

View File

@ -299,7 +299,8 @@ erpnext.selling.SellingController = class SellingController extends erpnext.Tran
} }
batch_no(doc, cdt, cdn) { batch_no(doc, cdt, cdn) {
var me = this; super.batch_no(doc, cdt, cdn);
var item = frappe.get_doc(cdt, cdn); var item = frappe.get_doc(cdt, cdn);
if (item.serial_no) { if (item.serial_no) {
@ -378,10 +379,6 @@ erpnext.selling.SellingController = class SellingController extends erpnext.Tran
} }
} }
batch_no(doc, cdt, cdn) {
super.batch_no(doc, cdt, cdn);
}
qty(doc, cdt, cdn) { qty(doc, cdt, cdn) {
super.qty(doc, cdt, cdn); super.qty(doc, cdt, cdn);

View File

@ -80,5 +80,30 @@
"chart_of_accounts": "Standard", "chart_of_accounts": "Standard",
"enable_perpetual_inventory": 1, "enable_perpetual_inventory": 1,
"default_holiday_list": "_Test Holiday List" "default_holiday_list": "_Test Holiday List"
},
{
"abbr": "_TC6",
"company_name": "_Test Company 6",
"is_group": 1,
"country": "India",
"default_currency": "INR",
"doctype": "Company",
"domain": "Manufacturing",
"chart_of_accounts": "Standard",
"default_holiday_list": "_Test Holiday List",
"enable_perpetual_inventory": 0
},
{
"abbr": "_TC7",
"company_name": "_Test Company 7",
"parent_company": "_Test Company 6",
"is_group": 1,
"country": "United States",
"default_currency": "USD",
"doctype": "Company",
"domain": "Manufacturing",
"chart_of_accounts": "Standard",
"default_holiday_list": "_Test Holiday List",
"enable_perpetual_inventory": 0
} }
] ]

View File

@ -257,7 +257,9 @@ def get_employee_email(employee_doc):
def get_holiday_list_for_employee(employee, raise_exception=True): def get_holiday_list_for_employee(employee, raise_exception=True):
if employee: if employee:
holiday_list, company = frappe.db.get_value("Employee", employee, ["holiday_list", "company"]) holiday_list, company = frappe.get_cached_value(
"Employee", employee, ["holiday_list", "company"]
)
else: else:
holiday_list = "" holiday_list = ""
company = frappe.db.get_single_value("Global Defaults", "default_company") company = frappe.db.get_single_value("Global Defaults", "default_company")

View File

@ -115,6 +115,8 @@ def is_holiday(holiday_list, date=None):
if date is None: if date is None:
date = today() date = today()
if holiday_list: if holiday_list:
return bool(frappe.get_all("Holiday List", dict(name=holiday_list, holiday_date=date))) return bool(
frappe.db.exists("Holiday", {"parent": holiday_list, "holiday_date": date}, cache=True)
)
else: else:
return False return False

View File

@ -22,24 +22,18 @@
"creation": "2021-11-22 12:19:15.888642", "creation": "2021-11-22 12:19:15.888642",
"docstatus": 0, "docstatus": 0,
"doctype": "Module Onboarding", "doctype": "Module Onboarding",
"documentation_url": "https://docs.erpnext.com/docs/v13/user/manual/en/setting-up/company-setup", "documentation_url": "https://docs.erpnext.com/docs/v14/user/manual/en/setting-up/company-setup",
"idx": 0, "idx": 0,
"is_complete": 0, "is_complete": 0,
"modified": "2022-06-07 14:31:00.575193", "modified": "2023-05-16 13:13:24.043792",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Setup", "module": "Setup",
"name": "Home", "name": "Home",
"owner": "Administrator", "owner": "Administrator",
"steps": [ "steps": [
{
"step": "Company Set Up"
},
{ {
"step": "Navigation Help" "step": "Navigation Help"
}, },
{
"step": "Data import"
},
{ {
"step": "Create an Item" "step": "Create an Item"
}, },
@ -51,12 +45,9 @@
}, },
{ {
"step": "Create a Quotation" "step": "Create a Quotation"
},
{
"step": "Letterhead"
} }
], ],
"subtitle": "Company, Item, Customer, Supplier, Navigation Help, Data Import, Letter Head, Quotation", "subtitle": "Item, Customer, Supplier, Navigation Help and Quotation",
"success_message": "Masters are all set up!", "success_message": "You're ready to start your journey with ERPNext",
"title": "Let's Set Up Some Masters" "title": "Let's begin your journey with ERPNext"
} }

View File

@ -5,11 +5,11 @@
"description": "# Set Up a Company\n\nA company is a legal entity for which you will set up your books of account and create accounting transactions. In ERPNext, you can create multiple companies, and establish relationships (group/subsidiary) among them.\n\nWithin the company master, you can capture various default accounts for that Company and set crucial settings related to the accounting methodology followed for a company.\n", "description": "# Set Up a Company\n\nA company is a legal entity for which you will set up your books of account and create accounting transactions. In ERPNext, you can create multiple companies, and establish relationships (group/subsidiary) among them.\n\nWithin the company master, you can capture various default accounts for that Company and set crucial settings related to the accounting methodology followed for a company.\n",
"docstatus": 0, "docstatus": 0,
"doctype": "Onboarding Step", "doctype": "Onboarding Step",
"idx": 0, "idx": 1,
"is_complete": 0, "is_complete": 0,
"is_single": 0, "is_single": 0,
"is_skipped": 0, "is_skipped": 0,
"modified": "2021-12-15 14:22:18.317423", "modified": "2023-05-15 09:18:42.895537",
"modified_by": "Administrator", "modified_by": "Administrator",
"name": "Company Set Up", "name": "Company Set Up",
"owner": "Administrator", "owner": "Administrator",

View File

@ -5,17 +5,17 @@
"description": "# Create a Customer\n\nThe Customer master is at the heart of your sales transactions. Customers are linked in Quotations, Sales Orders, Invoices, and Payments. Customers can be either numbered or identified by name (you would typically do this based on the number of customers you have).\n\nThrough Customer\u2019s master, you can effectively track essentials like:\n - Customer\u2019s multiple address and contacts\n - Account Receivables\n - Credit Limit and Credit Period\n", "description": "# Create a Customer\n\nThe Customer master is at the heart of your sales transactions. Customers are linked in Quotations, Sales Orders, Invoices, and Payments. Customers can be either numbered or identified by name (you would typically do this based on the number of customers you have).\n\nThrough Customer\u2019s master, you can effectively track essentials like:\n - Customer\u2019s multiple address and contacts\n - Account Receivables\n - Credit Limit and Credit Period\n",
"docstatus": 0, "docstatus": 0,
"doctype": "Onboarding Step", "doctype": "Onboarding Step",
"idx": 0, "idx": 1,
"is_complete": 0, "is_complete": 0,
"is_single": 0, "is_single": 0,
"is_skipped": 0, "is_skipped": 0,
"modified": "2021-12-15 14:20:31.197564", "modified": "2023-05-16 12:54:54.112364",
"modified_by": "Administrator", "modified_by": "Administrator",
"name": "Create a Customer", "name": "Create a Customer",
"owner": "Administrator", "owner": "Administrator",
"reference_document": "Customer", "reference_document": "Customer",
"show_form_tour": 0, "show_form_tour": 0,
"show_full_form": 0, "show_full_form": 0,
"title": "Manage Customers", "title": "Create a Customer",
"validate_action": 1 "validate_action": 1
} }

View File

@ -5,11 +5,11 @@
"description": "# Create a Quotation\n\nLet\u2019s get started with business transactions by creating your first Quotation. You can create a Quotation for an existing customer or a prospect. It will be an approved document, with items you sell and the proposed price + taxes applied. After completing the instructions, you will get a Quotation in a ready to share print format.", "description": "# Create a Quotation\n\nLet\u2019s get started with business transactions by creating your first Quotation. You can create a Quotation for an existing customer or a prospect. It will be an approved document, with items you sell and the proposed price + taxes applied. After completing the instructions, you will get a Quotation in a ready to share print format.",
"docstatus": 0, "docstatus": 0,
"doctype": "Onboarding Step", "doctype": "Onboarding Step",
"idx": 0, "idx": 1,
"is_complete": 0, "is_complete": 0,
"is_single": 0, "is_single": 0,
"is_skipped": 0, "is_skipped": 0,
"modified": "2021-12-15 14:21:31.675330", "modified": "2023-05-15 09:18:42.984170",
"modified_by": "Administrator", "modified_by": "Administrator",
"name": "Create a Quotation", "name": "Create a Quotation",
"owner": "Administrator", "owner": "Administrator",

View File

@ -5,17 +5,17 @@
"description": "# Create a Supplier\n\nAlso known as Vendor, is a master at the center of your purchase transactions. Suppliers are linked in Request for Quotation, Purchase Orders, Receipts, and Payments. Suppliers can be either numbered or identified by name.\n\nThrough Supplier\u2019s master, you can effectively track essentials like:\n - Supplier\u2019s multiple address and contacts\n - Account Receivables\n - Credit Limit and Credit Period\n", "description": "# Create a Supplier\n\nAlso known as Vendor, is a master at the center of your purchase transactions. Suppliers are linked in Request for Quotation, Purchase Orders, Receipts, and Payments. Suppliers can be either numbered or identified by name.\n\nThrough Supplier\u2019s master, you can effectively track essentials like:\n - Supplier\u2019s multiple address and contacts\n - Account Receivables\n - Credit Limit and Credit Period\n",
"docstatus": 0, "docstatus": 0,
"doctype": "Onboarding Step", "doctype": "Onboarding Step",
"idx": 0, "idx": 1,
"is_complete": 0, "is_complete": 0,
"is_single": 0, "is_single": 0,
"is_skipped": 0, "is_skipped": 0,
"modified": "2021-12-15 14:21:23.518301", "modified": "2023-05-16 12:55:08.610113",
"modified_by": "Administrator", "modified_by": "Administrator",
"name": "Create a Supplier", "name": "Create a Supplier",
"owner": "Administrator", "owner": "Administrator",
"reference_document": "Supplier", "reference_document": "Supplier",
"show_form_tour": 0, "show_form_tour": 0,
"show_full_form": 0, "show_full_form": 0,
"title": "Manage Suppliers", "title": "Create a Supplier",
"validate_action": 1 "validate_action": 1
} }

View File

@ -6,18 +6,18 @@
"docstatus": 0, "docstatus": 0,
"doctype": "Onboarding Step", "doctype": "Onboarding Step",
"form_tour": "Item General", "form_tour": "Item General",
"idx": 0, "idx": 1,
"intro_video_url": "", "intro_video_url": "",
"is_complete": 0, "is_complete": 0,
"is_single": 0, "is_single": 0,
"is_skipped": 0, "is_skipped": 0,
"modified": "2021-12-15 14:19:56.297772", "modified": "2023-05-16 12:56:40.355878",
"modified_by": "Administrator", "modified_by": "Administrator",
"name": "Create an Item", "name": "Create an Item",
"owner": "Administrator", "owner": "Administrator",
"reference_document": "Item", "reference_document": "Item",
"show_form_tour": 1, "show_form_tour": 1,
"show_full_form": 1, "show_full_form": 0,
"title": "Manage Items", "title": "Create an Item",
"validate_action": 1 "validate_action": 1
} }

View File

@ -5,11 +5,11 @@
"description": "# Import Data from Spreadsheet\n\nIn ERPNext, you can easily migrate your historical data using spreadsheets. You can use it for migrating not just masters (like Customer, Supplier, Items), but also for transactions like (outstanding invoices, opening stock and accounting entries, etc).", "description": "# Import Data from Spreadsheet\n\nIn ERPNext, you can easily migrate your historical data using spreadsheets. You can use it for migrating not just masters (like Customer, Supplier, Items), but also for transactions like (outstanding invoices, opening stock and accounting entries, etc).",
"docstatus": 0, "docstatus": 0,
"doctype": "Onboarding Step", "doctype": "Onboarding Step",
"idx": 0, "idx": 1,
"is_complete": 0, "is_complete": 0,
"is_single": 0, "is_single": 0,
"is_skipped": 0, "is_skipped": 0,
"modified": "2022-06-07 14:28:51.390813", "modified": "2023-05-15 09:18:42.962231",
"modified_by": "Administrator", "modified_by": "Administrator",
"name": "Data import", "name": "Data import",
"owner": "Administrator", "owner": "Administrator",

View File

@ -5,11 +5,11 @@
"description": "# Create a Letter Head\n\nA Letter Head contains your organization's name, logo, address, etc which appears at the header and footer portion in documents. You can learn more about Setting up Letter Head in ERPNext here.\n", "description": "# Create a Letter Head\n\nA Letter Head contains your organization's name, logo, address, etc which appears at the header and footer portion in documents. You can learn more about Setting up Letter Head in ERPNext here.\n",
"docstatus": 0, "docstatus": 0,
"doctype": "Onboarding Step", "doctype": "Onboarding Step",
"idx": 0, "idx": 1,
"is_complete": 0, "is_complete": 0,
"is_single": 0, "is_single": 0,
"is_skipped": 0, "is_skipped": 0,
"modified": "2021-12-15 14:21:39.037742", "modified": "2023-05-15 09:18:42.995184",
"modified_by": "Administrator", "modified_by": "Administrator",
"name": "Letterhead", "name": "Letterhead",
"owner": "Administrator", "owner": "Administrator",

View File

@ -2,14 +2,14 @@
"action": "Watch Video", "action": "Watch Video",
"action_label": "Learn about Navigation options", "action_label": "Learn about Navigation options",
"creation": "2021-11-22 12:09:52.233872", "creation": "2021-11-22 12:09:52.233872",
"description": "# Navigation in ERPNext\n\nEase of navigating and browsing around the ERPNext is one of our core strengths. In the following video, you will learn how to reach a specific feature in ERPNext via module page or awesome bar\u2019s shortcut.\n", "description": "# Navigation in ERPNext\n\nEase of navigating and browsing around the ERPNext is one of our core strengths. In the following video, you will learn how to reach a specific feature in ERPNext via module page or AwesomeBar.",
"docstatus": 0, "docstatus": 0,
"doctype": "Onboarding Step", "doctype": "Onboarding Step",
"idx": 0, "idx": 1,
"is_complete": 0, "is_complete": 0,
"is_single": 0, "is_single": 0,
"is_skipped": 0, "is_skipped": 0,
"modified": "2022-06-07 14:28:00.901082", "modified": "2023-05-16 12:53:25.939908",
"modified_by": "Administrator", "modified_by": "Administrator",
"name": "Navigation Help", "name": "Navigation Help",
"owner": "Administrator", "owner": "Administrator",

View File

@ -21,6 +21,10 @@ def boot_session(bootinfo):
bootinfo.sysdefaults.allow_stale = cint( bootinfo.sysdefaults.allow_stale = cint(
frappe.db.get_single_value("Accounts Settings", "allow_stale") frappe.db.get_single_value("Accounts Settings", "allow_stale")
) )
bootinfo.sysdefaults.over_billing_allowance = frappe.db.get_single_value(
"Accounts Settings", "over_billing_allowance"
)
bootinfo.sysdefaults.quotation_valid_till = cint( bootinfo.sysdefaults.quotation_valid_till = cint(
frappe.db.get_single_value("CRM Settings", "default_valid_till") frappe.db.get_single_value("CRM Settings", "default_valid_till")
) )

View File

@ -75,7 +75,16 @@ class InventoryDimension(Document):
self.delete_custom_fields() self.delete_custom_fields()
def delete_custom_fields(self): def delete_custom_fields(self):
filters = {"fieldname": self.source_fieldname} filters = {
"fieldname": (
"in",
[
self.source_fieldname,
f"to_{self.source_fieldname}",
f"from_{self.source_fieldname}",
],
)
}
if self.document_type: if self.document_type:
filters["dt"] = self.document_type filters["dt"] = self.document_type
@ -88,6 +97,8 @@ class InventoryDimension(Document):
def reset_value(self): def reset_value(self):
if self.apply_to_all_doctypes: if self.apply_to_all_doctypes:
self.type_of_transaction = ""
self.istable = 0 self.istable = 0
for field in ["document_type", "condition"]: for field in ["document_type", "condition"]:
self.set(field, None) self.set(field, None)
@ -111,12 +122,35 @@ class InventoryDimension(Document):
def on_update(self): def on_update(self):
self.add_custom_fields() self.add_custom_fields()
def add_custom_fields(self): @staticmethod
dimension_fields = [ def get_insert_after_fieldname(doctype):
return frappe.get_all(
"DocField",
fields=["fieldname"],
filters={"parent": doctype},
order_by="idx desc",
limit=1,
)[0].fieldname
def get_dimension_fields(self, doctype=None):
if not doctype:
doctype = self.document_type
label_start_with = ""
if doctype in ["Purchase Invoice Item", "Purchase Receipt Item"]:
label_start_with = "Target"
elif doctype in ["Sales Invoice Item", "Delivery Note Item", "Stock Entry Detail"]:
label_start_with = "Source"
label = self.dimension_name
if label_start_with:
label = f"{label_start_with} {self.dimension_name}"
return [
dict( dict(
fieldname="inventory_dimension", fieldname="inventory_dimension",
fieldtype="Section Break", fieldtype="Section Break",
insert_after="warehouse", insert_after=self.get_insert_after_fieldname(doctype),
label="Inventory Dimension", label="Inventory Dimension",
collapsible=1, collapsible=1,
), ),
@ -125,24 +159,37 @@ class InventoryDimension(Document):
fieldtype="Link", fieldtype="Link",
insert_after="inventory_dimension", insert_after="inventory_dimension",
options=self.reference_document, options=self.reference_document,
label=self.dimension_name, label=label,
reqd=self.reqd, reqd=self.reqd,
mandatory_depends_on=self.mandatory_depends_on, mandatory_depends_on=self.mandatory_depends_on,
), ),
] ]
def add_custom_fields(self):
custom_fields = {} custom_fields = {}
dimension_fields = []
if self.apply_to_all_doctypes: if self.apply_to_all_doctypes:
for doctype in get_inventory_documents(): for doctype in get_inventory_documents():
if not field_exists(doctype[0], self.source_fieldname): if field_exists(doctype[0], self.source_fieldname):
custom_fields.setdefault(doctype[0], dimension_fields) continue
dimension_fields = self.get_dimension_fields(doctype[0])
self.add_transfer_field(doctype[0], dimension_fields)
custom_fields.setdefault(doctype[0], dimension_fields)
elif not field_exists(self.document_type, self.source_fieldname): elif not field_exists(self.document_type, self.source_fieldname):
dimension_fields = self.get_dimension_fields()
self.add_transfer_field(self.document_type, dimension_fields)
custom_fields.setdefault(self.document_type, dimension_fields) custom_fields.setdefault(self.document_type, dimension_fields)
if not frappe.db.get_value( if (
"Custom Field", {"dt": "Stock Ledger Entry", "fieldname": self.target_fieldname} dimension_fields
) and not field_exists("Stock Ledger Entry", self.target_fieldname): and not frappe.db.get_value(
"Custom Field", {"dt": "Stock Ledger Entry", "fieldname": self.target_fieldname}
)
and not field_exists("Stock Ledger Entry", self.target_fieldname)
):
dimension_field = dimension_fields[1] dimension_field = dimension_fields[1]
dimension_field["mandatory_depends_on"] = "" dimension_field["mandatory_depends_on"] = ""
dimension_field["reqd"] = 0 dimension_field["reqd"] = 0
@ -152,6 +199,53 @@ class InventoryDimension(Document):
if custom_fields: if custom_fields:
create_custom_fields(custom_fields) create_custom_fields(custom_fields)
def add_transfer_field(self, doctype, dimension_fields):
if doctype not in [
"Stock Entry Detail",
"Sales Invoice Item",
"Delivery Note Item",
"Purchase Invoice Item",
"Purchase Receipt Item",
]:
return
fieldname_start_with = "to"
label_start_with = "Target"
display_depends_on = ""
if doctype in ["Purchase Invoice Item", "Purchase Receipt Item"]:
fieldname_start_with = "from"
label_start_with = "Source"
display_depends_on = "eval:parent.is_internal_supplier == 1"
elif doctype != "Stock Entry Detail":
display_depends_on = "eval:parent.is_internal_customer == 1"
elif doctype == "Stock Entry Detail":
display_depends_on = "eval:parent.purpose != 'Material Issue'"
fieldname = f"{fieldname_start_with}_{self.source_fieldname}"
label = f"{label_start_with} {self.dimension_name}"
if field_exists(doctype, fieldname):
return
dimension_fields.extend(
[
dict(
fieldname="inventory_dimension_col_break",
fieldtype="Column Break",
insert_after=self.source_fieldname,
),
dict(
fieldname=fieldname,
fieldtype="Link",
insert_after="inventory_dimension_col_break",
options=self.reference_document,
label=label,
depends_on=display_depends_on,
),
]
)
def field_exists(doctype, fieldname) -> str or None: def field_exists(doctype, fieldname) -> str or None:
return frappe.db.get_value("DocField", {"parent": doctype, "fieldname": fieldname}, "name") return frappe.db.get_value("DocField", {"parent": doctype, "fieldname": fieldname}, "name")
@ -185,18 +279,19 @@ def get_evaluated_inventory_dimension(doc, sl_dict, parent_doc=None):
dimensions = get_document_wise_inventory_dimensions(doc.doctype) dimensions = get_document_wise_inventory_dimensions(doc.doctype)
filter_dimensions = [] filter_dimensions = []
for row in dimensions: for row in dimensions:
if ( if row.type_of_transaction:
row.type_of_transaction == "Inward" if (
if doc.docstatus == 1 row.type_of_transaction == "Inward"
else row.type_of_transaction != "Inward" if doc.docstatus == 1
) and sl_dict.actual_qty < 0: else row.type_of_transaction != "Inward"
continue ) and sl_dict.actual_qty < 0:
elif ( continue
row.type_of_transaction == "Outward" elif (
if doc.docstatus == 1 row.type_of_transaction == "Outward"
else row.type_of_transaction != "Outward" if doc.docstatus == 1
) and sl_dict.actual_qty > 0: else row.type_of_transaction != "Outward"
continue ) and sl_dict.actual_qty > 0:
continue
evals = {"doc": doc} evals = {"doc": doc}
if parent_doc: if parent_doc:

View File

@ -4,6 +4,7 @@
import frappe import frappe
from frappe.custom.doctype.custom_field.custom_field import create_custom_field from frappe.custom.doctype.custom_field.custom_field import create_custom_field
from frappe.tests.utils import FrappeTestCase from frappe.tests.utils import FrappeTestCase
from frappe.utils import nowdate, nowtime
from erpnext.stock.doctype.delivery_note.test_delivery_note import create_delivery_note from erpnext.stock.doctype.delivery_note.test_delivery_note import create_delivery_note
from erpnext.stock.doctype.inventory_dimension.inventory_dimension import ( from erpnext.stock.doctype.inventory_dimension.inventory_dimension import (
@ -12,6 +13,7 @@ from erpnext.stock.doctype.inventory_dimension.inventory_dimension import (
DoNotChangeError, DoNotChangeError,
delete_dimension, delete_dimension,
) )
from erpnext.stock.doctype.item.test_item import create_item
from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import make_purchase_receipt from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import make_purchase_receipt
from erpnext.stock.doctype.stock_entry.stock_entry_utils import make_stock_entry from erpnext.stock.doctype.stock_entry.stock_entry_utils import make_stock_entry
from erpnext.stock.doctype.warehouse.test_warehouse import create_warehouse from erpnext.stock.doctype.warehouse.test_warehouse import create_warehouse
@ -20,6 +22,7 @@ from erpnext.stock.doctype.warehouse.test_warehouse import create_warehouse
class TestInventoryDimension(FrappeTestCase): class TestInventoryDimension(FrappeTestCase):
def setUp(self): def setUp(self):
prepare_test_data() prepare_test_data()
create_store_dimension()
def test_validate_inventory_dimension(self): def test_validate_inventory_dimension(self):
# Can not be child doc # Can not be child doc
@ -73,6 +76,8 @@ class TestInventoryDimension(FrappeTestCase):
self.assertFalse(custom_field) self.assertFalse(custom_field)
def test_inventory_dimension(self): def test_inventory_dimension(self):
frappe.local.document_wise_inventory_dimensions = {}
warehouse = "Shelf Warehouse - _TC" warehouse = "Shelf Warehouse - _TC"
item_code = "_Test Item" item_code = "_Test Item"
@ -143,6 +148,8 @@ class TestInventoryDimension(FrappeTestCase):
self.assertRaises(DoNotChangeError, inv_dim1.save) self.assertRaises(DoNotChangeError, inv_dim1.save)
def test_inventory_dimension_for_purchase_receipt_and_delivery_note(self): def test_inventory_dimension_for_purchase_receipt_and_delivery_note(self):
frappe.local.document_wise_inventory_dimensions = {}
inv_dimension = create_inventory_dimension( inv_dimension = create_inventory_dimension(
reference_document="Rack", dimension_name="Rack", apply_to_all_doctypes=1 reference_document="Rack", dimension_name="Rack", apply_to_all_doctypes=1
) )
@ -250,6 +257,191 @@ class TestInventoryDimension(FrappeTestCase):
) )
) )
def test_for_purchase_sales_and_stock_transaction(self):
from erpnext.controllers.sales_and_purchase_return import make_return_doc
create_inventory_dimension(
reference_document="Store",
type_of_transaction="Outward",
dimension_name="Store",
apply_to_all_doctypes=1,
)
item_code = "Test Inventory Dimension Item"
create_item(item_code)
warehouse = create_warehouse("Store Warehouse")
# Purchase Receipt -> Inward in Store 1
pr_doc = make_purchase_receipt(
item_code=item_code, warehouse=warehouse, qty=10, rate=100, do_not_submit=True
)
pr_doc.items[0].store = "Store 1"
pr_doc.save()
pr_doc.submit()
entries = get_voucher_sl_entries(pr_doc.name, ["warehouse", "store", "incoming_rate"])
self.assertEqual(entries[0].warehouse, warehouse)
self.assertEqual(entries[0].store, "Store 1")
# Stock Entry -> Transfer from Store 1 to Store 2
se_doc = make_stock_entry(
item_code=item_code, qty=10, from_warehouse=warehouse, to_warehouse=warehouse, do_not_save=True
)
se_doc.items[0].store = "Store 1"
se_doc.items[0].to_store = "Store 2"
se_doc.save()
se_doc.submit()
entries = get_voucher_sl_entries(
se_doc.name, ["warehouse", "store", "incoming_rate", "actual_qty"]
)
for entry in entries:
self.assertEqual(entry.warehouse, warehouse)
if entry.actual_qty > 0:
self.assertEqual(entry.store, "Store 2")
self.assertEqual(entry.incoming_rate, 100.0)
else:
self.assertEqual(entry.store, "Store 1")
# Delivery Note -> Outward from Store 2
dn_doc = create_delivery_note(item_code=item_code, qty=10, warehouse=warehouse, do_not_save=True)
dn_doc.items[0].store = "Store 2"
dn_doc.save()
dn_doc.submit()
entries = get_voucher_sl_entries(dn_doc.name, ["warehouse", "store", "actual_qty"])
self.assertEqual(entries[0].warehouse, warehouse)
self.assertEqual(entries[0].store, "Store 2")
self.assertEqual(entries[0].actual_qty, -10.0)
return_dn = make_return_doc("Delivery Note", dn_doc.name)
return_dn.submit()
entries = get_voucher_sl_entries(return_dn.name, ["warehouse", "store", "actual_qty"])
self.assertEqual(entries[0].warehouse, warehouse)
self.assertEqual(entries[0].store, "Store 2")
self.assertEqual(entries[0].actual_qty, 10.0)
se_doc = make_stock_entry(
item_code=item_code, qty=10, from_warehouse=warehouse, to_warehouse=warehouse, do_not_save=True
)
se_doc.items[0].store = "Store 2"
se_doc.items[0].to_store = "Store 1"
se_doc.save()
se_doc.submit()
return_pr = make_return_doc("Purchase Receipt", pr_doc.name)
return_pr.submit()
entries = get_voucher_sl_entries(return_pr.name, ["warehouse", "store", "actual_qty"])
self.assertEqual(entries[0].warehouse, warehouse)
self.assertEqual(entries[0].store, "Store 1")
self.assertEqual(entries[0].actual_qty, -10.0)
def test_inter_transfer_return_against_inventory_dimension(self):
from erpnext.controllers.sales_and_purchase_return import make_return_doc
from erpnext.stock.doctype.delivery_note.delivery_note import make_inter_company_purchase_receipt
data = prepare_data_for_internal_transfer()
dn_doc = create_delivery_note(
customer=data.customer,
company=data.company,
warehouse=data.from_warehouse,
target_warehouse=data.to_warehouse,
qty=5,
cost_center=data.cost_center,
expense_account=data.expense_account,
do_not_submit=True,
)
dn_doc.items[0].store = "Inter Transfer Store 1"
dn_doc.items[0].to_store = "Inter Transfer Store 2"
dn_doc.save()
dn_doc.submit()
for d in get_voucher_sl_entries(dn_doc.name, ["store", "actual_qty"]):
if d.actual_qty > 0:
self.assertEqual(d.store, "Inter Transfer Store 2")
else:
self.assertEqual(d.store, "Inter Transfer Store 1")
pr_doc = make_inter_company_purchase_receipt(dn_doc.name)
pr_doc.items[0].warehouse = data.store_warehouse
pr_doc.items[0].from_store = "Inter Transfer Store 2"
pr_doc.items[0].store = "Inter Transfer Store 3"
pr_doc.save()
pr_doc.submit()
for d in get_voucher_sl_entries(pr_doc.name, ["store", "actual_qty"]):
if d.actual_qty > 0:
self.assertEqual(d.store, "Inter Transfer Store 3")
else:
self.assertEqual(d.store, "Inter Transfer Store 2")
return_doc = make_return_doc("Purchase Receipt", pr_doc.name)
return_doc.submit()
for d in get_voucher_sl_entries(return_doc.name, ["store", "actual_qty"]):
if d.actual_qty > 0:
self.assertEqual(d.store, "Inter Transfer Store 2")
else:
self.assertEqual(d.store, "Inter Transfer Store 3")
dn_doc.load_from_db()
return_doc1 = make_return_doc("Delivery Note", dn_doc.name)
return_doc1.posting_date = nowdate()
return_doc1.posting_time = nowtime()
return_doc1.items[0].target_warehouse = dn_doc.items[0].target_warehouse
return_doc1.items[0].warehouse = dn_doc.items[0].warehouse
return_doc1.save()
return_doc1.submit()
for d in get_voucher_sl_entries(return_doc1.name, ["store", "actual_qty"]):
if d.actual_qty > 0:
self.assertEqual(d.store, "Inter Transfer Store 1")
else:
self.assertEqual(d.store, "Inter Transfer Store 2")
def get_voucher_sl_entries(voucher_no, fields):
return frappe.get_all(
"Stock Ledger Entry", filters={"voucher_no": voucher_no}, fields=fields, order_by="creation"
)
def create_store_dimension():
if not frappe.db.exists("DocType", "Store"):
frappe.get_doc(
{
"doctype": "DocType",
"name": "Store",
"module": "Stock",
"custom": 1,
"naming_rule": "By fieldname",
"autoname": "field:store_name",
"fields": [{"label": "Store Name", "fieldname": "store_name", "fieldtype": "Data"}],
"permissions": [
{"role": "System Manager", "permlevel": 0, "read": 1, "write": 1, "create": 1, "delete": 1}
],
}
).insert(ignore_permissions=True)
for store in ["Store 1", "Store 2"]:
if not frappe.db.exists("Store", store):
frappe.get_doc({"doctype": "Store", "store_name": store}).insert(ignore_permissions=True)
def prepare_test_data(): def prepare_test_data():
if not frappe.db.exists("DocType", "Shelf"): if not frappe.db.exists("DocType", "Shelf"):
@ -326,3 +518,79 @@ def create_inventory_dimension(**args):
doc.insert(ignore_permissions=True) doc.insert(ignore_permissions=True)
return doc return doc
def prepare_data_for_internal_transfer():
from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_internal_supplier
from erpnext.selling.doctype.customer.test_customer import create_internal_customer
from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import make_purchase_receipt
from erpnext.stock.doctype.warehouse.test_warehouse import create_warehouse
company = "_Test Company with perpetual inventory"
customer = create_internal_customer(
"_Test Internal Customer 3",
company,
company,
)
supplier = create_internal_supplier(
"_Test Internal Supplier 3",
company,
company,
)
for store in ["Inter Transfer Store 1", "Inter Transfer Store 2", "Inter Transfer Store 3"]:
if not frappe.db.exists("Store", store):
frappe.get_doc({"doctype": "Store", "store_name": store}).insert(ignore_permissions=True)
warehouse = create_warehouse("_Test Internal Warehouse New A", company=company)
to_warehouse = create_warehouse("_Test Internal Warehouse GIT A", company=company)
pr_doc = make_purchase_receipt(
company=company, warehouse=warehouse, qty=10, rate=100, do_not_submit=True
)
pr_doc.items[0].store = "Inter Transfer Store 1"
pr_doc.submit()
if not frappe.db.get_value("Company", company, "unrealized_profit_loss_account"):
account = "Unrealized Profit and Loss - TCP1"
if not frappe.db.exists("Account", account):
frappe.get_doc(
{
"doctype": "Account",
"account_name": "Unrealized Profit and Loss",
"parent_account": "Direct Income - TCP1",
"company": company,
"is_group": 0,
"account_type": "Income Account",
}
).insert()
frappe.db.set_value("Company", company, "unrealized_profit_loss_account", account)
cost_center = frappe.db.get_value("Company", company, "cost_center") or frappe.db.get_value(
"Cost Center", {"company": company}, "name"
)
expene_account = frappe.db.get_value(
"Company", company, "stock_adjustment_account"
) or frappe.db.get_value(
"Account", {"company": company, "account_type": "Expense Account"}, "name"
)
return frappe._dict(
{
"from_warehouse": warehouse,
"to_warehouse": to_warehouse,
"customer": customer,
"supplier": supplier,
"company": company,
"cost_center": cost_center,
"expene_account": expene_account,
"store_warehouse": frappe.db.get_value(
"Warehouse", {"name": ("like", "Store%"), "company": company}, "name"
),
}
)

View File

@ -1,5 +1,5 @@
frappe.listview_settings['Item'] = { frappe.listview_settings['Item'] = {
add_fields: ["item_name", "stock_uom", "item_group", "image", "variant_of", add_fields: ["item_name", "stock_uom", "item_group", "image",
"has_variants", "end_of_life", "disabled"], "has_variants", "end_of_life", "disabled"],
filters: [["disabled", "=", "0"]], filters: [["disabled", "=", "0"]],

View File

@ -280,6 +280,7 @@
{ {
"fieldname": "set_warehouse", "fieldname": "set_warehouse",
"fieldtype": "Link", "fieldtype": "Link",
"ignore_user_permissions": 1,
"in_list_view": 1, "in_list_view": 1,
"label": "Set Target Warehouse", "label": "Set Target Warehouse",
"options": "Warehouse" "options": "Warehouse"
@ -355,7 +356,7 @@
"idx": 70, "idx": 70,
"is_submittable": 1, "is_submittable": 1,
"links": [], "links": [],
"modified": "2022-09-27 17:58:26.366469", "modified": "2023-05-07 20:17:29.108095",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Stock", "module": "Stock",
"name": "Material Request", "name": "Material Request",

View File

@ -419,6 +419,7 @@
"depends_on": "eval:parent.material_request_type == \"Material Transfer\"", "depends_on": "eval:parent.material_request_type == \"Material Transfer\"",
"fieldname": "from_warehouse", "fieldname": "from_warehouse",
"fieldtype": "Link", "fieldtype": "Link",
"ignore_user_permissions": 1,
"label": "Source Warehouse", "label": "Source Warehouse",
"options": "Warehouse" "options": "Warehouse"
}, },
@ -451,16 +452,16 @@
"fieldname": "job_card_item", "fieldname": "job_card_item",
"fieldtype": "Data", "fieldtype": "Data",
"hidden": 1, "hidden": 1,
"label": "Job Card Item",
"no_copy": 1, "no_copy": 1,
"print_hide": 1, "print_hide": 1
"label": "Job Card Item"
} }
], ],
"idx": 1, "idx": 1,
"index_web_pages_for_search": 1, "index_web_pages_for_search": 1,
"istable": 1, "istable": 1,
"links": [], "links": [],
"modified": "2022-03-10 18:42:42.705190", "modified": "2023-05-07 20:23:31.250252",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Stock", "module": "Stock",
"name": "Material Request Item", "name": "Material Request Item",
@ -469,5 +470,6 @@
"permissions": [], "permissions": [],
"sort_field": "modified", "sort_field": "modified",
"sort_order": "DESC", "sort_order": "DESC",
"states": [],
"track_changes": 1 "track_changes": 1
} }

View File

@ -29,6 +29,7 @@ class PickList(Document):
self.validate_for_qty() self.validate_for_qty()
def before_save(self): def before_save(self):
self.update_status()
self.set_item_locations() self.set_item_locations()
# set percentage picked in SO # set percentage picked in SO
@ -89,20 +90,20 @@ class PickList(Document):
self.update_reference_qty() self.update_reference_qty()
self.update_sales_order_picking_status() self.update_sales_order_picking_status()
def update_status(self, status=None, update_modified=True): def update_status(self, status=None):
if not status: if not status:
if self.docstatus == 0: if self.docstatus == 0:
status = "Draft" status = "Draft"
elif self.docstatus == 1: elif self.docstatus == 1:
if self.status == "Draft": if target_document_exists(self.name, self.purpose):
status = "Open"
elif target_document_exists(self.name, self.purpose):
status = "Completed" status = "Completed"
else:
status = "Open"
elif self.docstatus == 2: elif self.docstatus == 2:
status = "Cancelled" status = "Cancelled"
if status: if status:
frappe.db.set_value("Pick List", self.name, "status", status, update_modified=update_modified) self.db_set("status", status)
def update_reference_qty(self): def update_reference_qty(self):
packed_items = [] packed_items = []

View File

@ -1113,6 +1113,7 @@
"depends_on": "eval: doc.is_internal_supplier", "depends_on": "eval: doc.is_internal_supplier",
"fieldname": "set_from_warehouse", "fieldname": "set_from_warehouse",
"fieldtype": "Link", "fieldtype": "Link",
"ignore_user_permissions": 1,
"label": "Set From Warehouse", "label": "Set From Warehouse",
"options": "Warehouse" "options": "Warehouse"
}, },
@ -1238,7 +1239,7 @@
"idx": 261, "idx": 261,
"is_submittable": 1, "is_submittable": 1,
"links": [], "links": [],
"modified": "2022-12-12 18:40:32.447752", "modified": "2023-05-07 20:18:25.458185",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Stock", "module": "Stock",
"name": "Purchase Receipt", "name": "Purchase Receipt",

View File

@ -353,7 +353,7 @@ def get_repost_item_valuation_entries():
return frappe.db.sql( return frappe.db.sql(
""" SELECT name from `tabRepost Item Valuation` """ SELECT name from `tabRepost Item Valuation`
WHERE status in ('Queued', 'In Progress') and creation <= %s and docstatus = 1 WHERE status in ('Queued', 'In Progress') and creation <= %s and docstatus = 1
ORDER BY timestamp(posting_date, posting_time) asc, creation asc ORDER BY timestamp(posting_date, posting_time) asc, creation asc, status asc
""", """,
now(), now(),
as_dict=1, as_dict=1,

View File

@ -376,3 +376,19 @@ class TestRepostItemValuation(FrappeTestCase, StockTestMixin):
accounts_settings.acc_frozen_upto = "" accounts_settings.acc_frozen_upto = ""
accounts_settings.save() accounts_settings.save()
def test_create_repost_entry_for_cancelled_document(self):
pr = make_purchase_receipt(
company="_Test Company with perpetual inventory",
warehouse="Stores - TCP1",
get_multiple_items=True,
)
self.assertTrue(pr.docstatus == 1)
self.assertFalse(frappe.db.exists("Repost Item Valuation", {"voucher_no": pr.name}))
pr.load_from_db()
pr.cancel()
self.assertTrue(pr.docstatus == 2)
self.assertTrue(frappe.db.exists("Repost Item Valuation", {"voucher_no": pr.name}))

View File

@ -9,7 +9,17 @@ import frappe
from frappe import _ from frappe import _
from frappe.model.mapper import get_mapped_doc from frappe.model.mapper import get_mapped_doc
from frappe.query_builder.functions import Sum from frappe.query_builder.functions import Sum
from frappe.utils import cint, comma_or, cstr, flt, format_time, formatdate, getdate, nowdate from frappe.utils import (
cint,
comma_or,
cstr,
flt,
format_time,
formatdate,
getdate,
month_diff,
nowdate,
)
import erpnext import erpnext
from erpnext.accounts.general_ledger import process_gl_map from erpnext.accounts.general_ledger import process_gl_map
@ -151,6 +161,41 @@ class StockEntry(StockController):
self.reset_default_field_value("from_warehouse", "items", "s_warehouse") self.reset_default_field_value("from_warehouse", "items", "s_warehouse")
self.reset_default_field_value("to_warehouse", "items", "t_warehouse") self.reset_default_field_value("to_warehouse", "items", "t_warehouse")
def submit(self):
if self.is_enqueue_action():
frappe.msgprint(
_(
"The task has been enqueued as a background job. In case there is any issue on processing in background, the system will add a comment about the error on this Stock Reconciliation and revert to the Draft stage"
)
)
self.queue_action("submit", timeout=2000)
else:
self._submit()
def cancel(self):
if self.is_enqueue_action():
frappe.msgprint(
_(
"The task has been enqueued as a background job. In case there is any issue on processing in background, the system will add a comment about the error on this Stock Reconciliation and revert to the Submitted stage"
)
)
self.queue_action("cancel", timeout=2000)
else:
self._cancel()
def is_enqueue_action(self, force=False) -> bool:
if force:
return True
if frappe.flags.in_test:
return False
# If line items are more than 100 or record is older than 6 months
if len(self.items) > 100 or month_diff(nowdate(), self.posting_date) > 6:
return True
return False
def on_submit(self): def on_submit(self):
self.update_stock_ledger() self.update_stock_ledger()

View File

@ -5,7 +5,7 @@
import frappe import frappe
from frappe.permissions import add_user_permission, remove_user_permission from frappe.permissions import add_user_permission, remove_user_permission
from frappe.tests.utils import FrappeTestCase, change_settings from frappe.tests.utils import FrappeTestCase, change_settings
from frappe.utils import add_days, flt, nowdate, nowtime, today from frappe.utils import add_days, add_to_date, flt, nowdate, nowtime, today
from erpnext.accounts.doctype.account.test_account import get_inventory_account from erpnext.accounts.doctype.account.test_account import get_inventory_account
from erpnext.stock.doctype.item.test_item import ( from erpnext.stock.doctype.item.test_item import (
@ -1707,6 +1707,36 @@ class TestStockEntry(FrappeTestCase):
self.assertRaises(frappe.ValidationError, sr_doc.submit) self.assertRaises(frappe.ValidationError, sr_doc.submit)
def test_enqueue_action(self):
frappe.flags.in_test = False
item_code = "Test Enqueue Item - 001"
create_item(item_code=item_code, is_stock_item=1, valuation_rate=10)
doc = make_stock_entry(
item_code=item_code,
posting_date=add_to_date(today(), months=-7),
posting_time="00:00:00",
purpose="Material Receipt",
qty=10,
to_warehouse="_Test Warehouse - _TC",
do_not_submit=True,
)
self.assertTrue(doc.is_enqueue_action())
doc = make_stock_entry(
item_code=item_code,
posting_date=today(),
posting_time="00:00:00",
purpose="Material Receipt",
qty=10,
to_warehouse="_Test Warehouse - _TC",
do_not_submit=True,
)
self.assertFalse(doc.is_enqueue_action())
frappe.flags.in_test = True
def make_serialized_item(**args): def make_serialized_item(**args):
args = frappe._dict(args) args = frappe._dict(args)

View File

@ -395,7 +395,8 @@
"no_copy": 1, "no_copy": 1,
"options": "Material Request", "options": "Material Request",
"print_hide": 1, "print_hide": 1,
"read_only": 1 "read_only": 1,
"search_index": 1
}, },
{ {
"fieldname": "material_request_item", "fieldname": "material_request_item",
@ -571,7 +572,7 @@
"index_web_pages_for_search": 1, "index_web_pages_for_search": 1,
"istable": 1, "istable": 1,
"links": [], "links": [],
"modified": "2023-01-03 14:51:16.575515", "modified": "2023-05-09 12:41:18.210864",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Stock", "module": "Stock",
"name": "Stock Entry Detail", "name": "Stock Entry Detail",

View File

@ -99,7 +99,7 @@
}, },
{ {
"fieldname": "serial_no", "fieldname": "serial_no",
"fieldtype": "Small Text", "fieldtype": "Long Text",
"label": "Serial No" "label": "Serial No"
}, },
{ {
@ -120,7 +120,7 @@
}, },
{ {
"fieldname": "current_serial_no", "fieldname": "current_serial_no",
"fieldtype": "Small Text", "fieldtype": "Long Text",
"label": "Current Serial No", "label": "Current Serial No",
"no_copy": 1, "no_copy": 1,
"print_hide": 1, "print_hide": 1,
@ -189,7 +189,7 @@
], ],
"istable": 1, "istable": 1,
"links": [], "links": [],
"modified": "2022-11-02 13:01:23.580937", "modified": "2023-05-09 18:42:19.224916",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Stock", "module": "Stock",
"name": "Stock Reconciliation Item", "name": "Stock Reconciliation Item",

View File

@ -781,13 +781,21 @@ class update_entries_after(object):
d.db_update() d.db_update()
def update_rate_on_subcontracting_receipt(self, sle, outgoing_rate): def update_rate_on_subcontracting_receipt(self, sle, outgoing_rate):
if frappe.db.exists(sle.voucher_type + " Item", sle.voucher_detail_no): if frappe.db.exists("Subcontracting Receipt Item", sle.voucher_detail_no):
frappe.db.set_value(sle.voucher_type + " Item", sle.voucher_detail_no, "rate", outgoing_rate) frappe.db.set_value("Subcontracting Receipt Item", sle.voucher_detail_no, "rate", outgoing_rate)
else: else:
frappe.db.set_value( frappe.db.set_value(
"Subcontracting Receipt Supplied Item", sle.voucher_detail_no, "rate", outgoing_rate "Subcontracting Receipt Supplied Item",
sle.voucher_detail_no,
{"rate": outgoing_rate, "amount": abs(sle.actual_qty) * outgoing_rate},
) )
scr = frappe.get_doc("Subcontracting Receipt", sle.voucher_no, for_update=True)
scr.calculate_items_qty_and_amount()
scr.db_update()
for d in scr.items:
d.db_update()
def get_serialized_values(self, sle): def get_serialized_values(self, sle):
incoming_rate = flt(sle.incoming_rate) incoming_rate = flt(sle.incoming_rate)
actual_qty = flt(sle.actual_qty) actual_qty = flt(sle.actual_qty)

View File

@ -77,22 +77,22 @@ class SubcontractingOrder(SubcontractingController):
frappe.throw(_(msg)) frappe.throw(_(msg))
def set_missing_values(self): def set_missing_values(self):
self.set_missing_values_in_additional_costs() self.calculate_additional_costs()
self.set_missing_values_in_service_items() self.calculate_service_costs()
self.set_missing_values_in_supplied_items() self.calculate_supplied_items_qty_and_amount()
self.set_missing_values_in_items() self.calculate_items_qty_and_amount()
def set_missing_values_in_service_items(self): def calculate_service_costs(self):
for idx, item in enumerate(self.get("service_items")): for idx, item in enumerate(self.get("service_items")):
self.items[idx].service_cost_per_qty = item.amount / self.items[idx].qty self.items[idx].service_cost_per_qty = item.amount / self.items[idx].qty
def set_missing_values_in_supplied_items(self): def calculate_supplied_items_qty_and_amount(self):
for item in self.get("items"): for item in self.get("items"):
bom = frappe.get_doc("BOM", item.bom) bom = frappe.get_doc("BOM", item.bom)
rm_cost = sum(flt(rm_item.amount) for rm_item in bom.items) rm_cost = sum(flt(rm_item.amount) for rm_item in bom.items)
item.rm_cost_per_qty = rm_cost / flt(bom.quantity) item.rm_cost_per_qty = rm_cost / flt(bom.quantity)
def set_missing_values_in_items(self): def calculate_items_qty_and_amount(self):
total_qty = total = 0 total_qty = total = 0
for item in self.items: for item in self.items:
item.rate = item.rm_cost_per_qty + item.service_cost_per_qty + flt(item.additional_cost_per_qty) item.rate = item.rm_cost_per_qty + item.service_cost_per_qty + flt(item.additional_cost_per_qty)

View File

@ -76,26 +76,14 @@ frappe.ui.form.on('Subcontracting Receipt', {
} }
}); });
let batch_no_field = frm.get_docfield("items", "batch_no"); let batch_no_field = frm.get_docfield('items', 'batch_no');
if (batch_no_field) { if (batch_no_field) {
batch_no_field.get_route_options_for_new_doc = function(row) { batch_no_field.get_route_options_for_new_doc = function(row) {
return { return {
"item": row.doc.item_code 'item': row.doc.item_code
} }
}; };
} }
frappe.db.get_single_value('Buying Settings', 'backflush_raw_materials_of_subcontract_based_on').then(val => {
if (val == 'Material Transferred for Subcontract') {
frm.fields_dict['supplied_items'].grid.grid_rows.forEach((grid_row) => {
grid_row.docfields.forEach((df) => {
if (df.fieldname == 'consumed_qty') {
df.read_only = 0;
}
});
});
}
});
}, },
refresh: (frm) => { refresh: (frm) => {
@ -157,6 +145,8 @@ frappe.ui.form.on('Subcontracting Receipt', {
} }
}); });
}, __('Get Items From')); }, __('Get Items From'));
frm.fields_dict.supplied_items.grid.update_docfield_property('consumed_qty', 'read_only', frm.doc.__onload && frm.doc.__onload.backflush_based_on === 'BOM');
} }
}, },

View File

@ -28,6 +28,14 @@ class SubcontractingReceipt(SubcontractingController):
}, },
] ]
def onload(self):
self.set_onload(
"backflush_based_on",
frappe.db.get_single_value(
"Buying Settings", "backflush_raw_materials_of_subcontract_based_on"
),
)
def update_status_updater_args(self): def update_status_updater_args(self):
if cint(self.is_return): if cint(self.is_return):
self.status_updater.extend( self.status_updater.extend(
@ -113,9 +121,9 @@ class SubcontractingReceipt(SubcontractingController):
@frappe.whitelist() @frappe.whitelist()
def set_missing_values(self): def set_missing_values(self):
self.set_missing_values_in_additional_costs() self.calculate_additional_costs()
self.set_missing_values_in_supplied_items() self.calculate_supplied_items_qty_and_amount()
self.set_missing_values_in_items() self.calculate_items_qty_and_amount()
def set_available_qty_for_consumption(self): def set_available_qty_for_consumption(self):
supplied_items_details = {} supplied_items_details = {}
@ -147,13 +155,13 @@ class SubcontractingReceipt(SubcontractingController):
item.rm_item_code, 0 item.rm_item_code, 0
) )
def set_missing_values_in_supplied_items(self): def calculate_supplied_items_qty_and_amount(self):
for item in self.get("supplied_items") or []: for item in self.get("supplied_items") or []:
item.amount = item.rate * item.consumed_qty item.amount = item.rate * item.consumed_qty
self.set_available_qty_for_consumption() self.set_available_qty_for_consumption()
def set_missing_values_in_items(self): def calculate_items_qty_and_amount(self):
rm_supp_cost = {} rm_supp_cost = {}
for item in self.get("supplied_items") or []: for item in self.get("supplied_items") or []:
if item.reference_name in rm_supp_cost: if item.reference_name in rm_supp_cost:

View File

@ -6,7 +6,7 @@ import copy
import frappe import frappe
from frappe.tests.utils import FrappeTestCase from frappe.tests.utils import FrappeTestCase
from frappe.utils import cint, flt from frappe.utils import add_days, cint, cstr, flt, today
import erpnext import erpnext
from erpnext.accounts.doctype.account.test_account import get_inventory_account from erpnext.accounts.doctype.account.test_account import get_inventory_account
@ -26,6 +26,9 @@ from erpnext.controllers.tests.test_subcontracting_controller import (
from erpnext.stock.doctype.item.test_item import make_item from erpnext.stock.doctype.item.test_item import make_item
from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import get_gl_entries from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import get_gl_entries
from erpnext.stock.doctype.stock_entry.test_stock_entry import make_stock_entry from erpnext.stock.doctype.stock_entry.test_stock_entry import make_stock_entry
from erpnext.stock.doctype.stock_reconciliation.test_stock_reconciliation import (
create_stock_reconciliation,
)
from erpnext.subcontracting.doctype.subcontracting_order.subcontracting_order import ( from erpnext.subcontracting.doctype.subcontracting_order.subcontracting_order import (
make_subcontracting_receipt, make_subcontracting_receipt,
) )
@ -528,6 +531,69 @@ class TestSubcontractingReceipt(FrappeTestCase):
# consumed_qty should be (accepted_qty * qty_consumed_per_unit) = (6 * 1) = 6 # consumed_qty should be (accepted_qty * qty_consumed_per_unit) = (6 * 1) = 6
self.assertEqual(scr.supplied_items[0].consumed_qty, 6) self.assertEqual(scr.supplied_items[0].consumed_qty, 6)
def test_supplied_items_cost_after_reposting(self):
# Set Backflush Based On as "BOM"
set_backflush_based_on("BOM")
# Create Material Receipt for RM's
make_stock_entry(
item_code="_Test Item",
qty=100,
target="_Test Warehouse 1 - _TC",
basic_rate=100,
posting_date=add_days(today(), -2),
)
make_stock_entry(
item_code="_Test Item Home Desktop 100",
qty=100,
target="_Test Warehouse 1 - _TC",
basic_rate=100,
)
service_items = [
{
"warehouse": "_Test Warehouse - _TC",
"item_code": "Subcontracted Service Item 1",
"qty": 10,
"rate": 100,
"fg_item": "_Test FG Item",
"fg_item_qty": 10,
},
]
# Create Subcontracting Order
sco = get_subcontracting_order(service_items=service_items)
# Transfer RM's
rm_items = get_rm_items(sco.supplied_items)
itemwise_details = make_stock_in_entry(rm_items=rm_items)
make_stock_transfer_entry(
sco_no=sco.name,
rm_items=rm_items,
itemwise_details=copy.deepcopy(itemwise_details),
)
# Create Subcontracting Receipt
scr = make_subcontracting_receipt(sco.name)
scr.save()
scr.submit()
# Create Backdated Stock Reconciliation
sr = create_stock_reconciliation(
item_code=rm_items[0].get("item_code"),
warehouse="_Test Warehouse 1 - _TC",
qty=100,
rate=50,
posting_date=add_days(today(), -1),
)
# Cost should be updated in Subcontracting Receipt after reposting
prev_cost = scr.supplied_items[0].rate
scr.load_from_db()
self.assertNotEqual(scr.supplied_items[0].rate, prev_cost)
self.assertEqual(scr.supplied_items[0].rate, sr.items[0].valuation_rate)
def make_return_subcontracting_receipt(**args): def make_return_subcontracting_receipt(**args):
args = frappe._dict(args) args = frappe._dict(args)

File diff suppressed because it is too large Load Diff

View File

@ -1,29 +1,29 @@
apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py +153,'Opening','Åbning' 'Opening','Åbning'
DocType: Lead,Lead,Bly Lead,Bly,
apps/erpnext/erpnext/config/selling.py +153,Default settings for selling transactions.,Standardindstillinger for at sælge transaktioner. Default settings for selling transactions.,Standardindstillinger for at sælge transaktioner.
DocType: Timesheet,% Amount Billed,% Beløb Billed % Amount Billed,% Beløb Billed,
DocType: Purchase Order,% Billed,% Billed % Billed,% Billed,
,Lead Id,Bly Id Lead Id,Bly Id,
apps/erpnext/erpnext/accounts/doctype/payment_order/payment_order.py +87,{0} {1} created,{0} {1} creado {0} {1} created,{0} {1} creado,
apps/erpnext/erpnext/accounts/report/accounts_receivable/accounts_receivable.html +237,'Total','Total' 'Total','Total'
DocType: Selling Settings,Selling Settings,Salg af indstillinger Selling Settings,Salg af indstillinger,
apps/erpnext/erpnext/accounts/report/gross_profit/gross_profit.py +69,Selling Amount,Selling Beløb Selling Amount,Selling Beløb,
apps/erpnext/erpnext/crm/doctype/opportunity/opportunity.py +192,Lead must be set if Opportunity is made from Lead,"Bly skal indstilles, hvis Opportunity er lavet af Lead" Lead must be set if Opportunity is made from Lead,"Bly skal indstilles, hvis Opportunity er lavet af Lead"
DocType: Item Default,Default Selling Cost Center,Standard Selling Cost center Default Selling Cost Center,Standard Selling Cost center,
apps/erpnext/erpnext/accounts/report/payment_period_based_on_invoice_date/payment_period_based_on_invoice_date.py +64,90-Above,90-Above 90-Above,90-Above,
DocType: Pricing Rule,Selling,Selling Selling,Selling,
DocType: Sales Order,% Delivered,% Leveres % Delivered,% Leveres,
DocType: Lead,Lead Owner,Bly Owner Lead Owner,Bly Owner,
apps/erpnext/erpnext/controllers/stock_controller.py +240,{0} {1}: Cost Center is mandatory for Item {2},{0} {1}: Udgiftområde er obligatorisk for varen {2} {0} {1}: Cost Center is mandatory for Item {2},{0} {1}: Udgiftområde er obligatorisk for varen {2}
apps/erpnext/erpnext/config/selling.py +169,Tax template for selling transactions.,Skat skabelon til at sælge transaktioner. Tax template for selling transactions.,Skat skabelon til at sælge transaktioner.
apps/erpnext/erpnext/controllers/accounts_controller.py +377, or ,o or ,o,
DocType: Sales Order,% of materials billed against this Sales Order,% Af materialer faktureret mod denne Sales Order % of materials billed against this Sales Order,% Af materialer faktureret mod denne Sales Order,
DocType: SMS Center,All Lead (Open),Alle Bly (Open) All Lead (Open),Alle Bly (Open)
apps/erpnext/erpnext/templates/includes/footer/footer_extension.html +7,Get Updates,Hent opdateringer Get Updates,Hent opdateringer,
apps/erpnext/erpnext/controllers/sales_and_purchase_return.py +46,'Update Stock' can not be checked because items are not delivered via {0},"'Opdater lager' kan ikke markeres, varerne ikke leveres via {0}" 'Update Stock' can not be checked because items are not delivered via {0},"'Opdater lager' kan ikke markeres, varerne ikke leveres via {0}"
apps/erpnext/erpnext/patches/v4_0/create_price_list_if_missing.py +21,Standard Selling,Standard Selling Standard Selling,Standard Selling,
,Lead Details,Bly Detaljer Lead Details,Bly Detaljer,
DocType: Selling Settings,Settings for Selling Module,Indstillinger for Selling modul Settings for Selling Module,Indstillinger for Selling modul,
,Lead Name,Bly navn Lead Name,Bly navn,
DocType: Vehicle Service,Half Yearly,Halvdelen Årlig Half Yearly,Halvdelen Årlig,
DocType: Rename Tool,"Attach .csv file with two columns, one for the old name and one for the new name","Vedhæfte .csv fil med to kolonner, en for det gamle navn og et til det nye navn" "Attach .csv file with two columns, one for the old name and one for the new name","Vedhæfte .csv fil med to kolonner, en for det gamle navn og et til det nye navn"

Can't render this file because it has a wrong number of fields in line 2.

View File

@ -7638,20 +7638,19 @@ Restaurant Order Entry Item,Restaurantbestellzugangsposten,
Served,Serviert, Served,Serviert,
Restaurant Reservation,Restaurant Reservierung, Restaurant Reservation,Restaurant Reservierung,
Waitlisted,Auf der Warteliste, Waitlisted,Auf der Warteliste,
No Show,Keine Show, No Show,Nicht angetreten,
No of People,Nein von Menschen, No of People,Anzahl von Personen,
Reservation Time,Reservierungszeit, Reservation Time,Reservierungszeit,
Reservation End Time,Reservierungsendzeit, Reservation End Time,Reservierungsendzeit,
No of Seats,Anzahl der Sitze, No of Seats,Anzahl der Sitze,
Minimum Seating,Mindestbestuhlung, Minimum Seating,Mindestbestuhlung,
"Keep Track of Sales Campaigns. Keep track of Leads, Quotations, Sales Order etc from Campaigns to gauge Return on Investment. ","Verkaufskampagne verfolgen: Leads, Angebote, Aufträge usw. von Kampagnen beobachten um die Kapitalverzinsung (RoI) zu messen.", "Keep Track of Sales Campaigns. Keep track of Leads, Quotations, Sales Order etc from Campaigns to gauge Return on Investment. ","Verkaufskampagne verfolgen: Leads, Angebote, Aufträge usw. von Kampagnen beobachten um die Kapitalverzinsung (RoI) zu messen.",
SAL-CAM-.YYYY.-,SAL-CAM-.YYYY.-,
Campaign Schedules,Kampagnenpläne, Campaign Schedules,Kampagnenpläne,
Buyer of Goods and Services.,Käufer von Waren und Dienstleistungen., Buyer of Goods and Services.,Käufer von Waren und Dienstleistungen.,
CUST-.YYYY.-,CUST-.YYYY.-,
Default Company Bank Account,Standard-Bankkonto des Unternehmens, Default Company Bank Account,Standard-Bankkonto des Unternehmens,
From Lead,Aus Lead, From Lead,Aus Lead,
Account Manager,Buchhalter, Account Manager,Kundenberater,
Accounts Manager,Buchhalter,
Allow Sales Invoice Creation Without Sales Order,Ermöglichen Sie die Erstellung von Kundenrechnungen ohne Auftrag, Allow Sales Invoice Creation Without Sales Order,Ermöglichen Sie die Erstellung von Kundenrechnungen ohne Auftrag,
Allow Sales Invoice Creation Without Delivery Note,Ermöglichen Sie die Erstellung einer Ausgangsrechnung ohne Lieferschein, Allow Sales Invoice Creation Without Delivery Note,Ermöglichen Sie die Erstellung einer Ausgangsrechnung ohne Lieferschein,
Default Price List,Standardpreisliste, Default Price List,Standardpreisliste,
@ -7692,7 +7691,6 @@ Quantity of Items,Anzahl der Artikel,
"Aggregate group of **Items** into another **Item**. This is useful if you are bundling a certain **Items** into a package and you maintain stock of the packed **Items** and not the aggregate **Item**. \n\nThe package **Item** will have ""Is Stock Item"" as ""No"" and ""Is Sales Item"" as ""Yes"".\n\nFor Example: If you are selling Laptops and Backpacks separately and have a special price if the customer buys both, then the Laptop + Backpack will be a new Product Bundle Item.\n\nNote: BOM = Bill of Materials","Fassen Sie eine Gruppe von Artikeln zu einem neuen Artikel zusammen. Dies ist nützlich, wenn Sie bestimmte Artikel zu einem Paket bündeln und einen Bestand an Artikel-Bündeln erhalten und nicht einen Bestand der einzelnen Artikel. Das Artikel-Bündel erhält für das Attribut ""Ist Lagerartikel"" den Wert ""Nein"" und für das Attribut ""Ist Verkaufsartikel"" den Wert ""Ja"". Beispiel: Wenn Sie Laptops und Tragetaschen getrennt verkaufen und einen bestimmten Preis anbieten, wenn der Kunde beides zusammen kauft, dann wird der Laptop mit der Tasche zusammen ein neuer Bündel-Artikel. Anmerkung: BOM = Stückliste", "Aggregate group of **Items** into another **Item**. This is useful if you are bundling a certain **Items** into a package and you maintain stock of the packed **Items** and not the aggregate **Item**. \n\nThe package **Item** will have ""Is Stock Item"" as ""No"" and ""Is Sales Item"" as ""Yes"".\n\nFor Example: If you are selling Laptops and Backpacks separately and have a special price if the customer buys both, then the Laptop + Backpack will be a new Product Bundle Item.\n\nNote: BOM = Bill of Materials","Fassen Sie eine Gruppe von Artikeln zu einem neuen Artikel zusammen. Dies ist nützlich, wenn Sie bestimmte Artikel zu einem Paket bündeln und einen Bestand an Artikel-Bündeln erhalten und nicht einen Bestand der einzelnen Artikel. Das Artikel-Bündel erhält für das Attribut ""Ist Lagerartikel"" den Wert ""Nein"" und für das Attribut ""Ist Verkaufsartikel"" den Wert ""Ja"". Beispiel: Wenn Sie Laptops und Tragetaschen getrennt verkaufen und einen bestimmten Preis anbieten, wenn der Kunde beides zusammen kauft, dann wird der Laptop mit der Tasche zusammen ein neuer Bündel-Artikel. Anmerkung: BOM = Stückliste",
Parent Item,Übergeordneter Artikel, Parent Item,Übergeordneter Artikel,
List items that form the package.,"Die Artikel auflisten, die das Paket bilden.", List items that form the package.,"Die Artikel auflisten, die das Paket bilden.",
SAL-QTN-.YYYY.-,SAL-QTN-.YYYY.-,
Quotation To,Angebot für, Quotation To,Angebot für,
Rate at which customer's currency is converted to company's base currency,"Kurs, zu dem die Währung des Kunden in die Basiswährung des Unternehmens umgerechnet wird", Rate at which customer's currency is converted to company's base currency,"Kurs, zu dem die Währung des Kunden in die Basiswährung des Unternehmens umgerechnet wird",
Rate at which Price list currency is converted to company's base currency,"Kurs, zu dem die Währung der Preisliste in die Basiswährung des Unternehmens umgerechnet wird", Rate at which Price list currency is converted to company's base currency,"Kurs, zu dem die Währung der Preisliste in die Basiswährung des Unternehmens umgerechnet wird",
@ -7704,7 +7702,6 @@ Quotation Item,Angebotsposition,
Against Doctype,Zu DocType, Against Doctype,Zu DocType,
Against Docname,Zu Dokumentenname, Against Docname,Zu Dokumentenname,
Additional Notes,Zusätzliche Bemerkungen, Additional Notes,Zusätzliche Bemerkungen,
SAL-ORD-.YYYY.-,SAL-ORD-.YYYY.-,
Skip Delivery Note,Lieferschein überspringen, Skip Delivery Note,Lieferschein überspringen,
In Words will be visible once you save the Sales Order.,"""In Worten"" wird sichtbar, sobald Sie den Auftrag speichern.", In Words will be visible once you save the Sales Order.,"""In Worten"" wird sichtbar, sobald Sie den Auftrag speichern.",
Track this Sales Order against any Project,Diesen Auftrag in jedem Projekt nachverfolgen, Track this Sales Order against any Project,Diesen Auftrag in jedem Projekt nachverfolgen,
@ -7935,7 +7932,7 @@ For reference,Zu Referenzzwecken,
Territory Targets,Ziele für die Region, Territory Targets,Ziele für die Region,
Set Item Group-wise budgets on this Territory. You can also include seasonality by setting the Distribution.,Artikelgruppenbezogene Budgets für diese Region erstellen. Durch Setzen der Auslieferungseinstellungen können auch saisonale Aspekte mit einbezogen werden., Set Item Group-wise budgets on this Territory. You can also include seasonality by setting the Distribution.,Artikelgruppenbezogene Budgets für diese Region erstellen. Durch Setzen der Auslieferungseinstellungen können auch saisonale Aspekte mit einbezogen werden.,
UOM Name,Maßeinheit-Name, UOM Name,Maßeinheit-Name,
Check this to disallow fractions. (for Nos),"Hier aktivieren, um keine Bruchteile zuzulassen (für Nr.)", Check this to disallow fractions. (for Nos),"Hier aktivieren, um keine Bruchteile zuzulassen (für Anzahl)",
Website Item Group,Webseiten-Artikelgruppe, Website Item Group,Webseiten-Artikelgruppe,
Cross Listing of Item in multiple groups,Kreuzweise Auflistung des Artikels in mehreren Gruppen, Cross Listing of Item in multiple groups,Kreuzweise Auflistung des Artikels in mehreren Gruppen,
Default settings for Shopping Cart,Standardeinstellungen für den Warenkorb, Default settings for Shopping Cart,Standardeinstellungen für den Warenkorb,
@ -8016,7 +8013,6 @@ Contact Information,Kontaktinformationen,
Email sent to,E-Mail versandt an, Email sent to,E-Mail versandt an,
Dispatch Information,Versandinformationen, Dispatch Information,Versandinformationen,
Estimated Arrival,Voraussichtliche Ankunft, Estimated Arrival,Voraussichtliche Ankunft,
MAT-DT-.YYYY.-,MAT-DT-.YYYY.-,
Initial Email Notification Sent,Erste E-Mail-Benachrichtigung gesendet, Initial Email Notification Sent,Erste E-Mail-Benachrichtigung gesendet,
Delivery Details,Lieferdetails, Delivery Details,Lieferdetails,
Driver Email,Fahrer-E-Mail, Driver Email,Fahrer-E-Mail,
@ -8176,7 +8172,6 @@ Purchase Receipt Item,Kaufbeleg-Artikel,
Landed Cost Purchase Receipt,Einstandspreis-Kaufbeleg, Landed Cost Purchase Receipt,Einstandspreis-Kaufbeleg,
Landed Cost Taxes and Charges,Einstandspreis Steuern und Gebühren, Landed Cost Taxes and Charges,Einstandspreis Steuern und Gebühren,
Landed Cost Voucher,Beleg über Einstandskosten, Landed Cost Voucher,Beleg über Einstandskosten,
MAT-LCV-.YYYY.-,MAT-LCV-.YYYY.-,
Purchase Receipts,Kaufbelege, Purchase Receipts,Kaufbelege,
Purchase Receipt Items,Kaufbeleg-Artikel, Purchase Receipt Items,Kaufbeleg-Artikel,
Get Items From Purchase Receipts,Artikel vom Kaufbeleg übernehmen, Get Items From Purchase Receipts,Artikel vom Kaufbeleg übernehmen,
@ -8184,7 +8179,6 @@ Distribute Charges Based On,Kosten auf folgender Grundlage verteilen,
Landed Cost Help,Hilfe zum Einstandpreis, Landed Cost Help,Hilfe zum Einstandpreis,
Manufacturers used in Items,Hersteller im Artikel verwendet, Manufacturers used in Items,Hersteller im Artikel verwendet,
Limited to 12 characters,Limitiert auf 12 Zeichen, Limited to 12 characters,Limitiert auf 12 Zeichen,
MAT-MR-.YYYY.-,MAT-MR-.YYYY.-,
Partially Ordered,Teilweise bestellt, Partially Ordered,Teilweise bestellt,
Transferred,Übergeben, Transferred,Übergeben,
% Ordered,% bestellt, % Ordered,% bestellt,
@ -8199,7 +8193,6 @@ Prevdoc DocType,Prevdoc DocType,
Parent Detail docname,Übergeordnetes Detail Dokumentenname, Parent Detail docname,Übergeordnetes Detail Dokumentenname,
"Generate packing slips for packages to be delivered. Used to notify package number, package contents and its weight.","Packzettel für zu liefernde Pakete generieren. Wird verwendet, um Paketnummer, Packungsinhalt und das Gewicht zu dokumentieren.", "Generate packing slips for packages to be delivered. Used to notify package number, package contents and its weight.","Packzettel für zu liefernde Pakete generieren. Wird verwendet, um Paketnummer, Packungsinhalt und das Gewicht zu dokumentieren.",
Indicates that the package is a part of this delivery (Only Draft),"Zeigt an, dass das Paket ein Teil dieser Lieferung ist (nur Entwurf)", Indicates that the package is a part of this delivery (Only Draft),"Zeigt an, dass das Paket ein Teil dieser Lieferung ist (nur Entwurf)",
MAT-PAC-.YYYY.-,MAT-PAC-.YYYY.-,
From Package No.,Von Paket Nr., From Package No.,Von Paket Nr.,
Identification of the package for the delivery (for print),Kennzeichnung des Paketes für die Lieferung (für den Druck), Identification of the package for the delivery (for print),Kennzeichnung des Paketes für die Lieferung (für den Druck),
To Package No.,Bis Paket Nr., To Package No.,Bis Paket Nr.,
@ -8290,7 +8283,6 @@ Under AMC,Innerhalb des jährlichen Wartungsvertrags,
Out of AMC,Außerhalb des jährlichen Wartungsvertrags, Out of AMC,Außerhalb des jährlichen Wartungsvertrags,
Warranty Period (Days),Garantiefrist (Tage), Warranty Period (Days),Garantiefrist (Tage),
Serial No Details,Details zur Seriennummer, Serial No Details,Details zur Seriennummer,
MAT-STE-.YYYY.-,MAT-STE-.JJJJ.-,
Stock Entry Type,Bestandsbuchungsart, Stock Entry Type,Bestandsbuchungsart,
Stock Entry (Outward GIT),Bestandsbuchung (Outward GIT), Stock Entry (Outward GIT),Bestandsbuchung (Outward GIT),
Material Consumption for Manufacture,Materialverbrauch für die Herstellung, Material Consumption for Manufacture,Materialverbrauch für die Herstellung,
@ -8336,7 +8328,6 @@ Stock Queue (FIFO),Lagerverfahren (FIFO),
Is Cancelled,Ist storniert, Is Cancelled,Ist storniert,
Stock Reconciliation,Bestandsabgleich, Stock Reconciliation,Bestandsabgleich,
This tool helps you to update or fix the quantity and valuation of stock in the system. It is typically used to synchronise the system values and what actually exists in your warehouses.,"Dieses Werkzeug hilft Ihnen dabei, die Menge und die Bewertung von Bestand im System zu aktualisieren oder zu ändern. Es wird in der Regel verwendet, um die Systemwerte und den aktuellen Bestand Ihrer Lager zu synchronisieren.", This tool helps you to update or fix the quantity and valuation of stock in the system. It is typically used to synchronise the system values and what actually exists in your warehouses.,"Dieses Werkzeug hilft Ihnen dabei, die Menge und die Bewertung von Bestand im System zu aktualisieren oder zu ändern. Es wird in der Regel verwendet, um die Systemwerte und den aktuellen Bestand Ihrer Lager zu synchronisieren.",
MAT-RECO-.YYYY.-,MAT-RECO-.YYYY.-,
Reconciliation JSON,Abgleich JSON (JavaScript Object Notation), Reconciliation JSON,Abgleich JSON (JavaScript Object Notation),
Stock Reconciliation Item,Bestandsabgleich-Artikel, Stock Reconciliation Item,Bestandsabgleich-Artikel,
Before reconciliation,Vor Ausgleich, Before reconciliation,Vor Ausgleich,
@ -8796,8 +8787,7 @@ Availed ITC State/UT Tax,Verfügbare ITC State / UT Tax,
Availed ITC Cess,ITC Cess verfügbar, Availed ITC Cess,ITC Cess verfügbar,
Is Nil Rated or Exempted,Ist gleich Null oder ausgenommen, Is Nil Rated or Exempted,Ist gleich Null oder ausgenommen,
Is Non GST,Ist nicht GST, Is Non GST,Ist nicht GST,
ACC-SINV-RET-.YYYY.-,ACC-SINV-RET-.YYYY.-, E-Way Bill No.,E-Way Bill Nr.,
E-Way Bill No.,E-Way Bill No.,
Is Consolidated,Ist konsolidiert, Is Consolidated,Ist konsolidiert,
Billing Address GSTIN,Rechnungsadresse GSTIN, Billing Address GSTIN,Rechnungsadresse GSTIN,
Customer GSTIN,Kunde GSTIN, Customer GSTIN,Kunde GSTIN,
@ -9216,7 +9206,7 @@ Id,Ich würde,
Time Required (In Mins),Erforderliche Zeit (in Minuten), Time Required (In Mins),Erforderliche Zeit (in Minuten),
From Posting Date,Ab dem Buchungsdatum, From Posting Date,Ab dem Buchungsdatum,
To Posting Date,Zum Buchungsdatum, To Posting Date,Zum Buchungsdatum,
No records found,Keine Aufzeichnungen gefunden, No records found,Keine Einträge gefunden,
Customer/Lead Name,Name des Kunden / Lead, Customer/Lead Name,Name des Kunden / Lead,
Unmarked Days,Nicht markierte Tage, Unmarked Days,Nicht markierte Tage,
Jan,Jan., Jan,Jan.,
@ -9275,7 +9265,7 @@ Delay (in Days),Verzögerung (in Tagen),
Group by Sales Order,Nach Auftrag gruppieren, Group by Sales Order,Nach Auftrag gruppieren,
Sales Value,Verkaufswert, Sales Value,Verkaufswert,
Stock Qty vs Serial No Count,Lagermenge vs Seriennummer, Stock Qty vs Serial No Count,Lagermenge vs Seriennummer,
Serial No Count,Seriennummer nicht gezählt, Serial No Count,Seriennummern gezählt,
Work Order Summary,Arbeitsauftragsübersicht, Work Order Summary,Arbeitsauftragsübersicht,
Produce Qty,Menge produzieren, Produce Qty,Menge produzieren,
Lead Time (in mins),Vorlaufzeit (in Minuten), Lead Time (in mins),Vorlaufzeit (in Minuten),
@ -9569,7 +9559,7 @@ Row #{}: Selling rate for item {} is lower than its {}. Selling {} should be atl
You can alternatively disable selling price validation in {} to bypass this validation.,"Alternativ können Sie die Validierung des Verkaufspreises in {} deaktivieren, um diese Validierung zu umgehen.", You can alternatively disable selling price validation in {} to bypass this validation.,"Alternativ können Sie die Validierung des Verkaufspreises in {} deaktivieren, um diese Validierung zu umgehen.",
Invalid Selling Price,Ungültiger Verkaufspreis, Invalid Selling Price,Ungültiger Verkaufspreis,
Address needs to be linked to a Company. Please add a row for Company in the Links table.,Die Adresse muss mit einem Unternehmen verknüpft sein. Bitte fügen Sie eine Zeile für Firma in die Tabelle Links ein., Address needs to be linked to a Company. Please add a row for Company in the Links table.,Die Adresse muss mit einem Unternehmen verknüpft sein. Bitte fügen Sie eine Zeile für Firma in die Tabelle Links ein.,
Company Not Linked,Firma nicht verbunden, Company Not Linked,Firma nicht verknüpft,
Import Chart of Accounts from CSV / Excel files,Kontenplan aus CSV / Excel-Dateien importieren, Import Chart of Accounts from CSV / Excel files,Kontenplan aus CSV / Excel-Dateien importieren,
Completed Qty cannot be greater than 'Qty to Manufacture',Die abgeschlossene Menge darf nicht größer sein als die Menge bis zur Herstellung., Completed Qty cannot be greater than 'Qty to Manufacture',Die abgeschlossene Menge darf nicht größer sein als die Menge bis zur Herstellung.,
"Row {0}: For Supplier {1}, Email Address is Required to send an email","Zeile {0}: Für Lieferant {1} ist eine E-Mail-Adresse erforderlich, um eine E-Mail zu senden", "Row {0}: For Supplier {1}, Email Address is Required to send an email","Zeile {0}: Für Lieferant {1} ist eine E-Mail-Adresse erforderlich, um eine E-Mail zu senden",
@ -9656,7 +9646,7 @@ Hide Customer's Tax ID from Sales Transactions,Steuer-ID des Kunden vor Verkaufs
Action If Quality Inspection Is Not Submitted,Maßnahme Wenn keine Qualitätsprüfung eingereicht wird, Action If Quality Inspection Is Not Submitted,Maßnahme Wenn keine Qualitätsprüfung eingereicht wird,
Auto Insert Price List Rate If Missing,"Preisliste automatisch einfügen, falls fehlt", Auto Insert Price List Rate If Missing,"Preisliste automatisch einfügen, falls fehlt",
Automatically Set Serial Nos Based on FIFO,Seriennummern basierend auf FIFO automatisch einstellen, Automatically Set Serial Nos Based on FIFO,Seriennummern basierend auf FIFO automatisch einstellen,
Set Qty in Transactions Based on Serial No Input,Stellen Sie die Menge in Transaktionen basierend auf Seriennummer ohne Eingabe ein, Set Qty in Transactions Based on Serial No Input,Setze die Anzahl in der Transaktion basierend auf den Seriennummern,
Raise Material Request When Stock Reaches Re-order Level,"Erhöhen Sie die Materialanforderung, wenn der Lagerbestand die Nachbestellmenge erreicht", Raise Material Request When Stock Reaches Re-order Level,"Erhöhen Sie die Materialanforderung, wenn der Lagerbestand die Nachbestellmenge erreicht",
Notify by Email on Creation of Automatic Material Request,Benachrichtigen Sie per E-Mail über die Erstellung einer automatischen Materialanforderung, Notify by Email on Creation of Automatic Material Request,Benachrichtigen Sie per E-Mail über die Erstellung einer automatischen Materialanforderung,
Allow Material Transfer from Delivery Note to Sales Invoice,Materialübertragung vom Lieferschein zur Ausgangsrechnung zulassen, Allow Material Transfer from Delivery Note to Sales Invoice,Materialübertragung vom Lieferschein zur Ausgangsrechnung zulassen,
@ -9765,7 +9755,7 @@ Open Form View,Öffnen Sie die Formularansicht,
POS invoice {0} created succesfully,POS-Rechnung {0} erfolgreich erstellt, POS invoice {0} created succesfully,POS-Rechnung {0} erfolgreich erstellt,
Stock quantity not enough for Item Code: {0} under warehouse {1}. Available quantity {2}.,Lagermenge nicht ausreichend für Artikelcode: {0} unter Lager {1}. Verfügbare Menge {2}., Stock quantity not enough for Item Code: {0} under warehouse {1}. Available quantity {2}.,Lagermenge nicht ausreichend für Artikelcode: {0} unter Lager {1}. Verfügbare Menge {2}.,
Serial No: {0} has already been transacted into another POS Invoice.,Seriennummer: {0} wurde bereits in eine andere POS-Rechnung übertragen., Serial No: {0} has already been transacted into another POS Invoice.,Seriennummer: {0} wurde bereits in eine andere POS-Rechnung übertragen.,
Balance Serial No,Balance Seriennr, Balance Serial No,Stand Seriennummern,
Warehouse: {0} does not belong to {1},Lager: {0} gehört nicht zu {1}, Warehouse: {0} does not belong to {1},Lager: {0} gehört nicht zu {1},
Please select batches for batched item {0},Bitte wählen Sie Chargen für Chargenartikel {0} aus, Please select batches for batched item {0},Bitte wählen Sie Chargen für Chargenartikel {0} aus,
Please select quantity on row {0},Bitte wählen Sie die Menge in Zeile {0}, Please select quantity on row {0},Bitte wählen Sie die Menge in Zeile {0},

Can't render this file because it is too large.

View File

@ -1,47 +1,47 @@
apps/erpnext/erpnext/accounts/report/accounts_receivable/accounts_receivable.html +93,Cheques Required,Checks Required Cheques Required,Checks Required,
apps/erpnext/erpnext/accounts/doctype/bank_reconciliation/bank_reconciliation.py +97,Row #{0}: Clearance date {1} cannot be before Cheque Date {2},Row #{0}: Clearance date {1} cannot be before Check Date {2} Row #{0}: Clearance date {1} cannot be before Cheque Date {2},Row #{0}: Clearance date {1} cannot be before Check Date {2}
apps/erpnext/erpnext/utilities/user_progress.py +210,People who teach at your organisation,People who teach at your organization People who teach at your organisation,People who teach at your organization,
apps/erpnext/erpnext/stock/stock_ledger.py +482,"Valuation rate not found for the Item {0}, which is required to do accounting entries for {1} {2}. If the item is transacting as a zero valuation rate item in the {1}, please mention that in the {1} Item table. Otherwise, please create an incoming stock transaction for the item or mention valuation rate in the Item record, and then try submiting/cancelling this entry","Valuation rate not found for the Item {0}, which is required to do accounting entries for {1} {2}. If the item is transacting as a zero valuation rate item in the {1}, please mention that in the {1} Item table. Otherwise, please create an incoming stock transaction for the item or mention valuation rate in the Item record, and then try submitting/canceling this entry" "Valuation rate not found for the Item {0}, which is required to do accounting entries for {1} {2}. If the item is transacting as a zero valuation rate item in the {1}, please mention that in the {1} Item table. Otherwise, please create an incoming stock transaction for the item or mention valuation rate in the Item record, and then try submiting/cancelling this entry","Valuation rate not found for the Item {0}, which is required to do accounting entries for {1} {2}. If the item is transacting as a zero valuation rate item in the {1}, please mention that in the {1} Item table. Otherwise, please create an incoming stock transaction for the item or mention valuation rate in the Item record, and then try submitting/canceling this entry"
apps/erpnext/erpnext/hr/doctype/leave_application/leave_application.py +115,"Leave cannot be applied/cancelled before {0}, as leave balance has already been carry-forwarded in the future leave allocation record {1}","Leave cannot be applied/canceled before {0}, as leave balance has already been carry-forwarded in the future leave allocation record {1}" "Leave cannot be applied/cancelled before {0}, as leave balance has already been carry-forwarded in the future leave allocation record {1}","Leave cannot be applied/canceled before {0}, as leave balance has already been carry-forwarded in the future leave allocation record {1}"
apps/erpnext/erpnext/support/doctype/warranty_claim/warranty_claim.py +33,Cancel Material Visit {0} before cancelling this Warranty Claim,Cancel Material Visit {0} before canceling this Warranty Claim Cancel Material Visit {0} before cancelling this Warranty Claim,Cancel Material Visit {0} before canceling this Warranty Claim,
apps/erpnext/erpnext/healthcare/doctype/patient_appointment/patient_appointment.py +100,"Appointment cancelled, Please review and cancel the invoice {0}","Appointment canceled, Please review and cancel the invoice {0}" "Appointment cancelled, Please review and cancel the invoice {0}","Appointment canceled, Please review and cancel the invoice {0}"
apps/erpnext/erpnext/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.py +37,Outstanding Cheques and Deposits to clear,Outstanding Checks and Deposits to clear Outstanding Cheques and Deposits to clear,Outstanding Checks and Deposits to clear,
apps/erpnext/erpnext/healthcare/doctype/patient_appointment/patient_appointment.py +103,Appointment cancelled,Appointment canceled Appointment cancelled,Appointment canceled,
DocType: Payment Entry,Cheque/Reference Date,Check/Reference Date Cheque/Reference Date,Check/Reference Date,
DocType: Cheque Print Template,Scanned Cheque,Scanned Check Scanned Cheque,Scanned Check,
DocType: Cheque Print Template,Cheque Size,Check Size Cheque Size,Check Size,
apps/erpnext/erpnext/assets/doctype/asset_maintenance_log/asset_maintenance_log.py +25,Maintenance Status has to be Cancelled or Completed to Submit,Maintenance Status has to be Canceled or Completed to Submit Maintenance Status has to be Cancelled or Completed to Submit,Maintenance Status has to be Canceled or Completed to Submit,
apps/erpnext/erpnext/accounts/doctype/journal_entry/journal_entry.py +486,'Entries' cannot be empty,'Entries' can not be empty 'Entries' cannot be empty,'Entries' can not be empty,
apps/erpnext/erpnext/setup/doctype/company/company.py +84,"Cannot change company's default currency, because there are existing transactions. Transactions must be cancelled to change the default currency.","Cannot change company's default currency, because there are existing transactions. Transactions must be canceled to change the default currency." "Cannot change company's default currency, because there are existing transactions. Transactions must be cancelled to change the default currency.","Cannot change company's default currency, because there are existing transactions. Transactions must be canceled to change the default currency."
apps/erpnext/erpnext/selling/doctype/sales_order/sales_order.py +257,Maintenance Visit {0} must be cancelled before cancelling this Sales Order,Maintenance Visit {0} must be canceled before cancelling this Sales Order Maintenance Visit {0} must be cancelled before cancelling this Sales Order,Maintenance Visit {0} must be canceled before cancelling this Sales Order,
apps/erpnext/erpnext/selling/doctype/sales_order/sales_order.py +235,Sales Invoice {0} must be cancelled before cancelling this Sales Order,Sales Invoice {0} must be canceled before cancelling this Sales Order Sales Invoice {0} must be cancelled before cancelling this Sales Order,Sales Invoice {0} must be canceled before cancelling this Sales Order,
DocType: Bank Reconciliation Detail,Cheque Date,Check Date Cheque Date,Check Date,
apps/erpnext/erpnext/manufacturing/doctype/work_order/work_order.py +249,"Stopped Work Order cannot be cancelled, Unstop it first to cancel","Stopped Work Order cannot be canceled, Unstop it first to cancel" "Stopped Work Order cannot be cancelled, Unstop it first to cancel","Stopped Work Order cannot be canceled, Unstop it first to cancel"
apps/erpnext/erpnext/buying/doctype/purchase_order/purchase_order.py +164,Material Request {0} is cancelled or stopped,Material Request {0} is canceled or stopped Material Request {0} is cancelled or stopped,Material Request {0} is canceled or stopped,
apps/erpnext/erpnext/selling/doctype/sales_order/sales_order.py +188,Closed order cannot be cancelled. Unclose to cancel.,Closed order cannot be canceled. Unclose to cancel. Closed order cannot be cancelled. Unclose to cancel.,Closed order cannot be canceled. Unclose to cancel.
apps/erpnext/erpnext/selling/doctype/sales_order/sales_order.py +246,Maintenance Schedule {0} must be cancelled before cancelling this Sales Order,Maintenance Schedule {0} must be canceled before cancelling this Sales Order Maintenance Schedule {0} must be cancelled before cancelling this Sales Order,Maintenance Schedule {0} must be canceled before cancelling this Sales Order,
DocType: Accounts Settings,Unlink Payment on Cancellation of Invoice,Unlink Payment on Cancelation of Invoice Unlink Payment on Cancellation of Invoice,Unlink Payment on Cancelation of Invoice,
apps/erpnext/erpnext/selling/doctype/sales_order/sales_order.py +224,Delivery Notes {0} must be cancelled before cancelling this Sales Order,Delivery Notes {0} must be canceled before cancelling this Sales Order Delivery Notes {0} must be cancelled before cancelling this Sales Order,Delivery Notes {0} must be canceled before cancelling this Sales Order,
apps/erpnext/erpnext/selling/doctype/sales_order/sales_order.py +268,Work Order {0} must be cancelled before cancelling this Sales Order,Work Order {0} must be canceled before cancelling this Sales Order Work Order {0} must be cancelled before cancelling this Sales Order,Work Order {0} must be canceled before cancelling this Sales Order,
apps/erpnext/erpnext/config/accounts.py +240,Setup cheque dimensions for printing,Setup check dimensions for printing Setup cheque dimensions for printing,Setup check dimensions for printing,
apps/erpnext/erpnext/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.py +42,Cheques and Deposits incorrectly cleared,Checks and Deposits incorrectly cleared Cheques and Deposits incorrectly cleared,Checks and Deposits incorrectly cleared,
apps/erpnext/erpnext/stock/doctype/material_request/material_request.py +130,{0} {1} is cancelled so the action cannot be completed,{0} {1} is canceled so the action cannot be completed {0} {1} is cancelled so the action cannot be completed,{0} {1} is canceled so the action cannot be completed,
apps/erpnext/erpnext/stock/doctype/delivery_note/delivery_note.py +300,Packing Slip(s) cancelled,Packing Slip(s) canceled Packing Slip(s) cancelled,Packing Slip(s) canceled,
DocType: Payment Entry,Cheque/Reference No,Check/Reference No Cheque/Reference No,Check/Reference No,
apps/erpnext/erpnext/assets/doctype/asset/asset.py +297,"Asset cannot be cancelled, as it is already {0}","Asset cannot be canceled, as it is already {0}" "Asset cannot be cancelled, as it is already {0}","Asset cannot be canceled, as it is already {0}"
DocType: Bank Reconciliation,Select account head of the bank where cheque was deposited.,Select account head of the bank where check was deposited. Select account head of the bank where cheque was deposited.,Select account head of the bank where check was deposited.
DocType: Cheque Print Template,Cheque Print Template,Check Print Template Cheque Print Template,Check Print Template,
apps/erpnext/erpnext/controllers/buying_controller.py +503,{0} {1} is cancelled or closed,{0} {1} is canceled or closed {0} {1} is cancelled or closed,{0} {1} is canceled or closed,
apps/erpnext/erpnext/selling/doctype/sales_order/sales_order.py +165,Quotation {0} is cancelled,Quotation {0} is canceled Quotation {0} is cancelled,Quotation {0} is canceled,
apps/erpnext/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +367,Timesheet {0} is already completed or cancelled,Timesheet {0} is already completed or canceled Timesheet {0} is already completed or cancelled,Timesheet {0} is already completed or canceled,
apps/erpnext/erpnext/erpnext_integrations/doctype/gocardless_settings/gocardless_settings.py +136,Payment Cancelled. Please check your GoCardless Account for more details,Payment Canceled. Please check your GoCardless Account for more details Payment Cancelled. Please check your GoCardless Account for more details,Payment Canceled. Please check your GoCardless Account for more details,
apps/erpnext/erpnext/stock/doctype/item/item.py +840,Item {0} is cancelled,Item {0} is canceled Item {0} is cancelled,Item {0} is canceled,
DocType: Serial No,Is Cancelled,Is Canceled Is Cancelled,Is Canceled,
apps/erpnext/erpnext/stock/doctype/material_request/material_request.py +227,{0} {1} is cancelled or stopped,{0} {1} is canceled or stopped {0} {1} is cancelled or stopped,{0} {1} is canceled or stopped,
apps/erpnext/erpnext/setup/setup_wizard/operations/install_fixtures.py +155,Colour,Color Colour,Color,
DocType: Bank Reconciliation Detail,Cheque Number,Check Number Cheque Number,Check Number,
apps/erpnext/erpnext/maintenance/doctype/maintenance_visit/maintenance_visit.py +65,Cancel Material Visits {0} before cancelling this Maintenance Visit,Cancel Material Visits {0} before canceling this Maintenance Visit Cancel Material Visits {0} before cancelling this Maintenance Visit,Cancel Material Visits {0} before canceling this Maintenance Visit,
DocType: Employee,Cheque,Check Cheque,Check,
DocType: Cheque Print Template,Cheque Height,Check Height Cheque Height,Check Height,
DocType: Cheque Print Template,Cheque Width,Check Width Cheque Width,Check Width,
apps/erpnext/erpnext/setup/setup_wizard/operations/install_fixtures.py +135,Wire Transfer,Wire Transfer Wire Transfer,Wire Transfer,

Can't render this file because it has a wrong number of fields in line 2.

View File

@ -1,6 +1,6 @@
DocType: Fee Structure,Components,Componentes Components,Componentes,
apps/erpnext/erpnext/hr/doctype/attendance/attendance.py +31,Employee {0} on Half day on {1},"Empleado {0}, media jornada el día {1}" Employee {0} on Half day on {1},"Empleado {0}, media jornada el día {1}"
DocType: Purchase Invoice Item,Item,Producto Item,Producto,
DocType: Payment Entry,Deductions or Loss,Deducciones o Pérdidas Deductions or Loss,Deducciones o Pérdidas,
DocType: Cheque Print Template,Cheque Size,Tamaño de Cheque Cheque Size,Tamaño de Cheque,
apps/erpnext/erpnext/utilities/activation.py +128,Make Student Batch,Hacer lotes de Estudiante Make Student Batch,Hacer lotes de Estudiante,

Can't render this file because it has a wrong number of fields in line 2.

View File

@ -1,32 +1,32 @@
DocType: Assessment Plan,Grading Scale,Escala de Calificación Grading Scale,Escala de Calificación,
apps/erpnext/erpnext/education/report/student_and_guardian_contact_details/student_and_guardian_contact_details.py +57,Guardian1 Mobile No,Número de Móvil de Guardián 1 Guardian1 Mobile No,Número de Móvil de Guardián 1,
apps/erpnext/erpnext/accounts/report/profitability_analysis/profitability_analysis.py +152,Gross Profit / Loss,Ganancia / Pérdida Bruta Gross Profit / Loss,Ganancia / Pérdida Bruta,
apps/erpnext/erpnext/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.py +42,Cheques and Deposits incorrectly cleared,Los cheques y depósitos resueltos de forma incorrecta Cheques and Deposits incorrectly cleared,Los cheques y depósitos resueltos de forma incorrecta,
DocType: Assessment Group,Parent Assessment Group,Grupo de Evaluación Padre Parent Assessment Group,Grupo de Evaluación Padre,
DocType: Student,Guardians,Guardianes Guardians,Guardianes,
DocType: Fee Schedule,Fee Schedule,Programa de Tarifas Fee Schedule,Programa de Tarifas,
apps/erpnext/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js +743,Get Items from Product Bundle,Obtener Ítems de Paquete de Productos Get Items from Product Bundle,Obtener Ítems de Paquete de Productos,
apps/erpnext/erpnext/stock/doctype/material_request/material_request.js +1021,BOM does not contain any stock item,BOM no contiene ningún ítem de stock BOM does not contain any stock item,BOM no contiene ningún ítem de stock,
DocType: Homepage,Company Tagline for website homepage,Lema de la empresa para la página de inicio del sitio web Company Tagline for website homepage,Lema de la empresa para la página de inicio del sitio web,
DocType: Delivery Note,% Installed,% Instalado % Installed,% Instalado,
DocType: Student,Guardian Details,Detalles del Guardián Guardian Details,Detalles del Guardián,
apps/erpnext/erpnext/education/report/student_and_guardian_contact_details/student_and_guardian_contact_details.py +55,Guardian1 Name,Nombre de Guardián 1 Guardian1 Name,Nombre de Guardián 1,
DocType: Grading Scale Interval,Grade Code,Grado de Código Grade Code,Grado de Código,
DocType: Fee Schedule,Fee Structure,Estructura de Tarifas Fee Structure,Estructura de Tarifas,
DocType: Purchase Order,Get Items from Open Material Requests,Obtener Ítems de Solicitudes Abiertas de Materiales Get Items from Open Material Requests,Obtener Ítems de Solicitudes Abiertas de Materiales,
,Batch Item Expiry Status,Estatus de Expiración de Lote de Ítems Batch Item Expiry Status,Estatus de Expiración de Lote de Ítems,
DocType: Guardian,Guardian Interests,Intereses del Guardián Guardian Interests,Intereses del Guardián,
DocType: Guardian,Guardian Name,Nombre del Guardián Guardian Name,Nombre del Guardián,
apps/erpnext/erpnext/selling/doctype/product_bundle/product_bundle.py +29,Child Item should not be a Product Bundle. Please remove item `{0}` and save,Artículo hijo no debe ser un paquete de productos. Por favor remover el artículo `` {0} y guardar Child Item should not be a Product Bundle. Please remove item `{0}` and save,Artículo hijo no debe ser un paquete de productos. Por favor remover el artículo `` {0} y guardar,
DocType: BOM Scrap Item,Basic Amount (Company Currency),Monto Base (Divisa de Compañía) Basic Amount (Company Currency),Monto Base (Divisa de Compañía)
DocType: Grading Scale,Grading Scale Name,Nombre de Escala de Calificación Grading Scale Name,Nombre de Escala de Calificación,
apps/erpnext/erpnext/education/report/student_and_guardian_contact_details/student_and_guardian_contact_details.py +61,Guardian2 Mobile No,Número de Móvil de Guardián 2 Guardian2 Mobile No,Número de Móvil de Guardián 2,
apps/erpnext/erpnext/education/report/student_and_guardian_contact_details/student_and_guardian_contact_details.py +59,Guardian2 Name,Nombre de Guardián 2 Guardian2 Name,Nombre de Guardián 2,
DocType: Stock Entry,Customer or Supplier Details,Detalle de cliente o proveedor Customer or Supplier Details,Detalle de cliente o proveedor,
DocType: Course Scheduling Tool,Course Scheduling Tool,Herramienta de Programación de cursos Course Scheduling Tool,Herramienta de Programación de cursos,
DocType: Shopping Cart Settings,Checkout Settings,Ajustes de Finalización de Pedido Checkout Settings,Ajustes de Finalización de Pedido,
DocType: Guardian Interest,Guardian Interest,Interés del Guardián Guardian Interest,Interés del Guardián,
apps/erpnext/erpnext/utilities/user_progress.py +230,Classrooms/ Laboratories etc where lectures can be scheduled.,"Aulas / laboratorios, etc., donde las lecturas se pueden programar." Classrooms/ Laboratories etc where lectures can be scheduled.,"Aulas / laboratorios, etc., donde las lecturas se pueden programar."
apps/erpnext/erpnext/templates/includes/cart/cart_dropdown.html +6,Checkout,Finalizando pedido Checkout,Finalizando pedido,
DocType: Guardian Student,Guardian Student,Guardián del Estudiante Guardian Student,Guardián del Estudiante,
DocType: BOM Operation,Base Hour Rate(Company Currency),Tarifa Base por Hora (Divisa de Compañía) Base Hour Rate(Company Currency),Tarifa Base por Hora (Divisa de Compañía)

Can't render this file because it has a wrong number of fields in line 21.

View File

@ -1,3 +1,3 @@
apps/erpnext/erpnext/stock/doctype/item/item.py +529,Barcode {0} is not a valid {1} code,El código de barras {0} no es un código válido {1} Barcode {0} is not a valid {1} code,El código de barras {0} no es un código válido {1}
apps/erpnext/erpnext/healthcare/doctype/patient_appointment/patient_appointment.py +190,{0} on Half day Leave on {1},{0} Ausente medio día en {1} {0} on Half day Leave on {1},{0} Ausente medio día en {1}
apps/erpnext/erpnext/healthcare/doctype/patient_appointment/patient_appointment.py +200,{0} does not have a Healthcare Practitioner Schedule. Add it in Healthcare Practitioner master,{0} no tiene agenda del profesional médico . Añádelo al médico correspondiente. {0} does not have a Healthcare Practitioner Schedule. Add it in Healthcare Practitioner master,{0} no tiene agenda del profesional médico . Añádelo al médico correspondiente.

1 apps/erpnext/erpnext/stock/doctype/item/item.py +529 Barcode {0} is not a valid {1} code El código de barras {0} no es un código válido {1}
2 apps/erpnext/erpnext/healthcare/doctype/patient_appointment/patient_appointment.py +190 {0} on Half day Leave on {1} {0} Ausente medio día en {1}
3 apps/erpnext/erpnext/healthcare/doctype/patient_appointment/patient_appointment.py +200 {0} does not have a Healthcare Practitioner Schedule. Add it in Healthcare Practitioner master {0} no tiene agenda del profesional médico . Añádelo al médico correspondiente.

View File

@ -1,12 +1,12 @@
DocType: Supplier,Block Supplier,Bloque de Proveedor Block Supplier,Bloque de Proveedor,
apps/erpnext/erpnext/stock/doctype/item/item.py +742,"Asset is already exists against the item {0}, you cannot change the has serial no value","El activo ya existe contra el artículo {0}, no puede cambiar no tiene valor de serie" "Asset is already exists against the item {0}, you cannot change the has serial no value","El activo ya existe contra el artículo {0}, no puede cambiar no tiene valor de serie"
apps/erpnext/erpnext/hr/doctype/retention_bonus/retention_bonus.py +14,Cannot create Retention Bonus for left Employees,No se puede crear una bonificación de retención para los empleados que se han marchado Cannot create Retention Bonus for left Employees,No se puede crear una bonificación de retención para los empleados que se han marchado,
apps/erpnext/erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.py +23,Cancel the journal entry {0} first,Cancelar el ingreso diario {0} primero Cancel the journal entry {0} first,Cancelar el ingreso diario {0} primero,
apps/erpnext/erpnext/hr/doctype/employee_transfer/employee_transfer.py +15,Cannot transfer Employee with status Left,No se puede transferir Empleado con estado ah salido Cannot transfer Employee with status Left,No se puede transferir Empleado con estado ah salido,
DocType: Employee Benefit Claim,Benefit Type and Amount,Tipo de beneficio y monto Benefit Type and Amount,Tipo de beneficio y monto,
apps/erpnext/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js +878,Block Invoice,Bloque de Factura Block Invoice,Bloque de Factura,
apps/erpnext/erpnext/stock/doctype/item/item.py +742,"Asset is already exists against the item {0}, you cannot change the has serial no value","El activo ya existe contra el artículo {0}, no puede cambiar no tiene valor de serie" "Asset is already exists against the item {0}, you cannot change the has serial no value","El activo ya existe contra el artículo {0}, no puede cambiar no tiene valor de serie"
DocType: Item,Asset Naming Series,Series de Nombres de Activos Asset Naming Series,Series de Nombres de Activos,
,BOM Variance Report,Informe de varianza BOM(Lista de Materiales) BOM Variance Report,Informe de varianza BOM(Lista de Materiales)
apps/erpnext/erpnext/hr/doctype/employee_promotion/employee_promotion.py +15,Cannot promote Employee with status Left,No se puede promover Empleado con estado ha salido Cannot promote Employee with status Left,No se puede promover Empleado con estado ha salido,
apps/erpnext/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js +710,Auto repeat document updated,Repetición automática del documento actualizado Auto repeat document updated,Repetición automática del documento actualizado,

Can't render this file because it has a wrong number of fields in line 2.

View File

@ -1,7 +1,7 @@
DocType: Instructor Log,Other Details,Otros Detalles Other Details,Otros Detalles,
DocType: Material Request Item,Lead Time Date,Fecha de la Iniciativa Lead Time Date,Fecha de la Iniciativa,
apps/erpnext/erpnext/stock/report/itemwise_recommended_reorder_level/itemwise_recommended_reorder_level.py +41,Lead Time Days,Tiempo de ejecución en días Lead Time Days,Tiempo de ejecución en días,
apps/erpnext/erpnext/selling/report/customer_credit_balance/customer_credit_balance.py +47,Outstanding Amt,Saldo Pendiente Outstanding Amt,Saldo Pendiente,
DocType: Bank Statement Transaction Invoice Item,Outstanding Amount,Saldo Pendiente Outstanding Amount,Saldo Pendiente,
DocType: Payment Entry Reference,Outstanding,Pendiente Outstanding,Pendiente,
apps/erpnext/erpnext/crm/doctype/opportunity/opportunity.py +192,Lead must be set if Opportunity is made from Lead,La Iniciativa se debe establecer si la Oportunidad está hecha desde una Iniciativa Lead must be set if Opportunity is made from Lead,La Iniciativa se debe establecer si la Oportunidad está hecha desde una Iniciativa,

1 DocType: Instructor Log Other Details Otros Detalles
2 DocType: Material Request Item Lead Time Date Fecha de la Iniciativa
3 apps/erpnext/erpnext/stock/report/itemwise_recommended_reorder_level/itemwise_recommended_reorder_level.py +41 Lead Time Days Tiempo de ejecución en días
4 apps/erpnext/erpnext/selling/report/customer_credit_balance/customer_credit_balance.py +47 Outstanding Amt Saldo Pendiente
5 DocType: Bank Statement Transaction Invoice Item Outstanding Amount Saldo Pendiente
6 DocType: Payment Entry Reference Outstanding Pendiente
7 apps/erpnext/erpnext/crm/doctype/opportunity/opportunity.py +192 Lead must be set if Opportunity is made from Lead La Iniciativa se debe establecer si la Oportunidad está hecha desde una Iniciativa

View File

@ -1,22 +1,22 @@
DocType: Timesheet,Total Costing Amount,Monto Total Calculado Total Costing Amount,Monto Total Calculado,
DocType: Leave Policy,Leave Policy Details,Detalles de Política de Licencia Leave Policy Details,Detalles de Política de Licencia,
apps/erpnext/erpnext/selling/doctype/pos_closing_voucher/closing_voucher_details.html +35,Mode of Payments,Forma de pago Mode of Payments,Forma de pago,
DocType: Student Group Student,Student Group Student,Alumno de Grupo de Estudiantes Student Group Student,Alumno de Grupo de Estudiantes,
DocType: Delivery Note,% Installed,% Instalado % Installed,% Instalado,
apps/erpnext/erpnext/accounts/doctype/payment_request/payment_request.py +55,The amount of {0} set in this payment request is different from the calculated amount of all payment plans: {1}. Make sure this is correct before submitting the document.,La cantidad de {0} establecida en esta solicitud de pago es diferente de la cantidad calculada para todos los planes de pago: {1}. Verifique que esto sea correcto antes de enviar el documento. The amount of {0} set in this payment request is different from the calculated amount of all payment plans: {1}. Make sure this is correct before submitting the document.,La cantidad de {0} establecida en esta solicitud de pago es diferente de la cantidad calculada para todos los planes de pago: {1}. Verifique que esto sea correcto antes de enviar el documento.
DocType: Company,Gain/Loss Account on Asset Disposal,Cuenta de ganancia/pérdida en la disposición de activos Gain/Loss Account on Asset Disposal,Cuenta de ganancia/pérdida en la disposición de activos,
apps/erpnext/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +550,Please enter Account for Change Amount,"Por favor, introduzca la Vuenta para el Cambio Monto" Please enter Account for Change Amount,"Por favor, introduzca la Vuenta para el Cambio Monto"
DocType: Loyalty Point Entry,Loyalty Point Entry,Entrada de Punto de Lealtad Loyalty Point Entry,Entrada de Punto de Lealtad,
apps/erpnext/erpnext/manufacturing/doctype/work_order/work_order.js +372,Please set the Item Code first,"Por favor, primero define el Código del Artículo" Please set the Item Code first,"Por favor, primero define el Código del Artículo"
apps/erpnext/erpnext/accounts/report/trial_balance/trial_balance.js +76,Show unclosed fiscal year's P&L balances,Mostrar saldos de Ganancias y Perdidas de año fiscal sin cerrar Show unclosed fiscal year's P&L balances,Mostrar saldos de Ganancias y Perdidas de año fiscal sin cerrar,
,Support Hour Distribution,Distribución de Hora de Soporte Support Hour Distribution,Distribución de Hora de Soporte
apps/erpnext/erpnext/education/report/student_batch_wise_attendance/student_batch_wise_attendance.py +42,Student Group Strength,Fortaleza de Grupo Estudiante Student Group Strength,Fortaleza de Grupo Estudiante,
apps/erpnext/erpnext/assets/doctype/asset/depreciation.py +197,Please set 'Gain/Loss Account on Asset Disposal' in Company {0},Por favor defina la 'Cuenta de Ganacia/Pérdida por Ventas de Activos' en la empresa {0} Please set 'Gain/Loss Account on Asset Disposal' in Company {0},Por favor defina la 'Cuenta de Ganacia/Pérdida por Ventas de Activos' en la empresa {0}
apps/erpnext/erpnext/hr/doctype/leave_allocation/leave_allocation.py +58,Leave Type {0} cannot be allocated since it is leave without pay,Tipo de Permiso {0} no puede ser asignado ya que es un Permiso sin paga Leave Type {0} cannot be allocated since it is leave without pay,Tipo de Permiso {0} no puede ser asignado ya que es un Permiso sin paga,
apps/erpnext/erpnext/accounts/doctype/payment_request/payment_request.py +48,The payment gateway account in plan {0} is different from the payment gateway account in this payment request,La cuenta para pasarela de pago en el plan {0} es diferente de la cuenta de pasarela de pago en en esta petición de pago The payment gateway account in plan {0} is different from the payment gateway account in this payment request,La cuenta para pasarela de pago en el plan {0} es diferente de la cuenta de pasarela de pago en en esta petición de pago,
apps/erpnext/erpnext/hr/doctype/salary_structure/salary_structure.js +488,Show Salary Slip,Mostrar Recibo de Nómina Show Salary Slip,Mostrar Recibo de Nómina,
apps/erpnext/erpnext/hr/doctype/salary_slip/salary_slip.py +328,Leave Without Pay does not match with approved Leave Application records,Permiso sin sueldo no coincide con los registros de Solicitud de Permiso aprobadas Leave Without Pay does not match with approved Leave Application records,Permiso sin sueldo no coincide con los registros de Solicitud de Permiso aprobadas,
DocType: Purchase Taxes and Charges Template,"Standard tax template that can be applied to all Purchase Transactions. This template can contain list of tax heads and also other expense heads like ""Shipping"", ""Insurance"", ""Handling"" etc. "Standard tax template that can be applied to all Purchase Transactions. This template can contain list of tax heads and also other expense heads like ""Shipping"", ""Insurance"", ""Handling"" etc.
#### Note #### Note
@ -28,7 +28,7 @@ The tax rate you define here will be the standard tax rate for all **Items**. If
- This can be on **Net Total** (that is the sum of basic amount). - This can be on **Net Total** (that is the sum of basic amount).
- **On Previous Row Total / Amount** (for cumulative taxes or charges). If you select this option, the tax will be applied as a percentage of the previous row (in the tax table) amount or total. - **On Previous Row Total / Amount** (for cumulative taxes or charges). If you select this option, the tax will be applied as a percentage of the previous row (in the tax table) amount or total.
- **Actual** (as mentioned). - **Actual** (as mentioned).
2. Account Head: The Account ledger under which this tax will be booked 2. Account Head: The Account ledger under which this tax will be booked,
3. Cost Center: If the tax / charge is an income (like shipping) or expense it needs to be booked against a Cost Center. 3. Cost Center: If the tax / charge is an income (like shipping) or expense it needs to be booked against a Cost Center.
4. Description: Description of the tax (that will be printed in invoices / quotes). 4. Description: Description of the tax (that will be printed in invoices / quotes).
5. Rate: Tax rate. 5. Rate: Tax rate.
@ -57,28 +57,28 @@ La tasa impositiva que se defina aquí será la tasa de gravamen predeterminada
8. Línea de referencia: Si se basa en ""Línea anterior al total"" se puede seleccionar el número de la fila que será tomado como base para este cálculo (por defecto es la fila anterior). 8. Línea de referencia: Si se basa en ""Línea anterior al total"" se puede seleccionar el número de la fila que será tomado como base para este cálculo (por defecto es la fila anterior).
9. Considerar impuesto o cargo para: En esta sección se puede especificar si el impuesto / cargo es sólo para la valoración (no una parte del total) o sólo para el total (no agrega valor al elemento) o para ambos. 9. Considerar impuesto o cargo para: En esta sección se puede especificar si el impuesto / cargo es sólo para la valoración (no una parte del total) o sólo para el total (no agrega valor al elemento) o para ambos.
10. Añadir o deducir: Si usted quiere añadir o deducir el impuesto." 10. Añadir o deducir: Si usted quiere añadir o deducir el impuesto."
apps/erpnext/erpnext/hr/doctype/leave_allocation/leave_allocation.py +160,Leave Type {0} cannot be carry-forwarded,Tipo de Permiso {0} no se puede arrastar o trasladar Leave Type {0} cannot be carry-forwarded,Tipo de Permiso {0} no se puede arrastar o trasladar,
apps/erpnext/erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts.py +130,Gain/Loss on Asset Disposal,Ganancia/Pérdida por la venta de activos Gain/Loss on Asset Disposal,Ganancia/Pérdida por la venta de activos,
DocType: Currency Exchange,Specify Exchange Rate to convert one currency into another,Especificar el Tipo de Cambio para convertir de una divisa a otra Specify Exchange Rate to convert one currency into another,Especificar el Tipo de Cambio para convertir de una divisa a otra,
apps/erpnext/erpnext/hr/doctype/leave_application/leave_application.py +46,Only Leave Applications with status 'Approved' and 'Rejected' can be submitted,"Sólo Solicitudes de Permiso con estado ""Aprobado"" y ""Rechazado"" puede ser presentado" Only Leave Applications with status 'Approved' and 'Rejected' can be submitted,"Sólo Solicitudes de Permiso con estado ""Aprobado"" y ""Rechazado"" puede ser presentado"
DocType: Loyalty Point Entry,Loyalty Program,Programa de Lealtad Loyalty Program,Programa de Lealtad,
apps/erpnext/erpnext/stock/dashboard/item_dashboard.js +163,Source and target warehouse must be different,El almacén de origen y el de destino deben ser diferentes Source and target warehouse must be different,El almacén de origen y el de destino deben ser diferentes,
apps/erpnext/erpnext/hr/doctype/vehicle_log/vehicle_log.py +20,"Service Item,Type,frequency and expense amount are required","El Artículo de Servico, el Tipo, la Frecuencia y la Cantidad de Gasto son requeridos" "Service Item,Type,frequency and expense amount are required","El Artículo de Servico, el Tipo, la Frecuencia y la Cantidad de Gasto son requeridos"
apps/erpnext/erpnext/assets/doctype/asset/asset.py +72,Gross Purchase Amount is mandatory,El Importe Bruto de Compra es obligatorio Gross Purchase Amount is mandatory,El Importe Bruto de Compra es obligatorio,
DocType: Stock Entry,Customer or Supplier Details,Detalle de cliente o proveedor Customer or Supplier Details,Detalle de cliente o proveedor,
DocType: Lab Test Template,Standard Selling Rate,Tarifa de Venta Estándar Standard Selling Rate,Tarifa de Venta Estándar,
DocType: Program Enrollment,School House,Casa Escuela School House,Casa Escuela,
apps/erpnext/erpnext/hr/doctype/expense_claim/expense_claim.py +289,Please set default account in Expense Claim Type {0},"Por favor, establezca la Cuenta predeterminada en el Tipo de Reembolso de Gastos {0}" Please set default account in Expense Claim Type {0},"Por favor, establezca la Cuenta predeterminada en el Tipo de Reembolso de Gastos {0}"
apps/erpnext/erpnext/education/doctype/assessment_result/assessment_result.js +48,Score cannot be greater than Maximum Score,Los resultados no puede ser mayor que la Puntuación Máxima Score cannot be greater than Maximum Score,Los resultados no puede ser mayor que la Puntuación Máxima,
DocType: Item,"Example: ABCD.#####. If series is set and Batch No is not mentioned in transactions, then automatic batch number will be created based on this series. If you always want to explicitly mention Batch No for this item, leave this blank. Note: this setting will take priority over the Naming Series Prefix in Stock Settings.","Ejemplo: ABCD. #####. Si se establece una serie y no se menciona el número de lote en las transacciones, se creará un número de lote automático basado en esta serie. Si siempre quiere mencionar explícitamente el número de lote para este artículo, déjelo en blanco. Nota: esta configuración tendrá prioridad sobre el Prefijo de denominación de serie en Configuración de Inventario." "Example: ABCD.#####. If series is set and Batch No is not mentioned in transactions, then automatic batch number will be created based on this series. If you always want to explicitly mention Batch No for this item, leave this blank. Note: this setting will take priority over the Naming Series Prefix in Stock Settings.","Ejemplo: ABCD. #####. Si se establece una serie y no se menciona el número de lote en las transacciones, se creará un número de lote automático basado en esta serie. Si siempre quiere mencionar explícitamente el número de lote para este artículo, déjelo en blanco. Nota: esta configuración tendrá prioridad sobre el Prefijo de denominación de serie en Configuración de Inventario."
apps/erpnext/erpnext/stock/report/total_stock_summary/total_stock_summary.py +60,Please set Company filter blank if Group By is 'Company',"Por favor, establezca el filtro de Compañía en blanco si Agrupar Por es 'Compañía'" Please set Company filter blank if Group By is 'Company',"Por favor, establezca el filtro de Compañía en blanco si Agrupar Por es 'Compañía'"
DocType: Education Settings,"For Course based Student Group, the Course will be validated for every Student from the enrolled Courses in Program Enrollment.","Para Grupo de Estudiantes por Curso, el Curso será validado para cada Estudiante de los Cursos inscritos en la Inscripción del Programa." "For Course based Student Group, the Course will be validated for every Student from the enrolled Courses in Program Enrollment.","Para Grupo de Estudiantes por Curso, el Curso será validado para cada Estudiante de los Cursos inscritos en la Inscripción del Programa."
DocType: Leave Policy Detail,Leave Policy Detail,Detalles de política de Licencia Leave Policy Detail,Detalles de política de Licencia,
DocType: Education Settings,"For Batch based Student Group, the Student Batch will be validated for every Student from the Program Enrollment.","Para grupo de estudiantes por lotes, el lote de estudiantes se validará para cada estudiante de la inscripción del programa." "For Batch based Student Group, the Student Batch will be validated for every Student from the Program Enrollment.","Para grupo de estudiantes por lotes, el lote de estudiantes se validará para cada estudiante de la inscripción del programa."
DocType: Subscription Plan,Payment Plan,Plan de pago Payment Plan,Plan de pago,
apps/erpnext/erpnext/stock/doctype/item/item.py +731,Cannot change Variant properties after stock transaction. You will have to make a new Item to do this.,No se pueden cambiar las propiedades de Variantes después de la transacción de inventario. Deberá crear un nuevo artículo para hacer esto. Cannot change Variant properties after stock transaction. You will have to make a new Item to do this.,No se pueden cambiar las propiedades de Variantes después de la transacción de inventario. Deberá crear un nuevo artículo para hacer esto.
apps/erpnext/erpnext/healthcare/doctype/clinical_procedure/clinical_procedure.js +98,Stock quantity to start procedure is not available in the warehouse. Do you want to record a Stock Transfer,La cantidad de existencias para comenzar el procedimiento no está disponible en el almacén. ¿Desea registrar una transferencia de inventario? Stock quantity to start procedure is not available in the warehouse. Do you want to record a Stock Transfer,La cantidad de existencias para comenzar el procedimiento no está disponible en el almacén. ¿Desea registrar una transferencia de inventario?
apps/erpnext/erpnext/hr/doctype/payroll_entry/payroll_entry.js +259,"Company, Payment Account, From Date and To Date is mandatory","Empresa, cuenta de pago, fecha de inicio y fecha final son obligatorios" "Company, Payment Account, From Date and To Date is mandatory","Empresa, cuenta de pago, fecha de inicio y fecha final son obligatorios"
DocType: Leave Encashment,Leave Encashment,Cobro de Permiso Leave Encashment,Cobro de Permiso,
apps/erpnext/erpnext/selling/doctype/sales_order/sales_order.js +1211,Select Items based on Delivery Date,Seleccionar Artículos según la fecha de entrega Select Items based on Delivery Date,Seleccionar Artículos según la fecha de entrega,
DocType: Salary Structure,Leave Encashment Amount Per Day,Cantidad por día para pago por Ausencia Leave Encashment Amount Per Day,Cantidad por día para pago por Ausencia,

Can't render this file because it has a wrong number of fields in line 6.

View File

@ -1,16 +1,16 @@
DocType: Tax Rule,Tax Rule,Regla Fiscal Tax Rule,Regla Fiscal,
DocType: POS Profile,Account for Change Amount,Cuenta para el Cambio de Monto Account for Change Amount,Cuenta para el Cambio de Monto,
apps/erpnext/erpnext/stock/doctype/material_request/material_request.js +873,Bill of Materials,Lista de Materiales Bill of Materials,Lista de Materiales,
apps/erpnext/erpnext/controllers/accounts_controller.py +703,'Update Stock' cannot be checked for fixed asset sale,"""Actualización de Existencia' no puede ser escogida para venta de activo fijo" 'Update Stock' cannot be checked for fixed asset sale,"""Actualización de Existencia' no puede ser escogida para venta de activo fijo"
DocType: Purchase Invoice,Tax ID,RUC Tax ID,RUC,
DocType: BOM Item,Basic Rate (Company Currency),Taza Base (Divisa de la Empresa) Basic Rate (Company Currency),Taza Base (Divisa de la Empresa)
DocType: Timesheet Detail,Bill,Factura Bill,Factura,
DocType: Activity Cost,Billing Rate,Monto de Facturación Billing Rate,Monto de Facturación,
apps/erpnext/erpnext/config/learn.py +87,Opening Accounting Balance,Apertura de Saldos Contables Opening Accounting Balance,Apertura de Saldos Contables,
apps/erpnext/erpnext/accounts/doctype/tax_rule/tax_rule.py +97,Tax Rule Conflicts with {0},Regla Fiscal en conflicto con {0} Tax Rule Conflicts with {0},Regla Fiscal en conflicto con {0}
DocType: Tax Rule,Billing County,Municipio de Facturación Billing County,Municipio de Facturación,
DocType: Sales Invoice Timesheet,Billing Hours,Horas de Facturación Billing Hours,Horas de Facturación,
DocType: Timesheet,Billing Details,Detalles de Facturación Billing Details,Detalles de Facturación,
DocType: Tax Rule,Billing State,Región de Facturación Billing State,Región de Facturación,
DocType: Purchase Order Item,Billed Amt,Monto Facturado Billed Amt,Monto Facturado,
DocType: Item Tax,Tax Rate,Tasa de Impuesto Tax Rate,Tasa de Impuesto,

Can't render this file because it has a wrong number of fields in line 4.

File diff suppressed because it is too large Load Diff

View File

@ -1,14 +1,14 @@
DocType: Production Plan Item,Ordered Qty,Quantité commandée Ordered Qty,Quantité commandée,
apps/erpnext/erpnext/accounts/doctype/gl_entry/gl_entry.py +112,{0} {1}: Cost Center {2} does not belong to Company {3},{0} {1}: Le Centre de Coûts {2} ne fait pas partie de la Société {3} {0} {1}: Cost Center {2} does not belong to Company {3},{0} {1}: Le Centre de Coûts {2} ne fait pas partie de la Société {3}
apps/erpnext/erpnext/accounts/doctype/gl_entry/gl_entry.py +61,{0} {1}: Either debit or credit amount is required for {2},{0} {1}: Soit un montant au débit ou crédit est nécessaire pour {2} {0} {1}: Either debit or credit amount is required for {2},{0} {1}: Soit un montant au débit ou crédit est nécessaire pour {2}
DocType: Purchase Invoice Item,Price List Rate (Company Currency),Taux de la Liste de Prix (Devise de la Compagnie) Price List Rate (Company Currency),Taux de la Liste de Prix (Devise de la Compagnie)
apps/erpnext/erpnext/accounts/doctype/gl_entry/gl_entry.py +53,{0} {1}: Customer is required against Receivable account {2},{0} {1}: Client est requis envers un compte à recevoir {2} {0} {1}: Customer is required against Receivable account {2},{0} {1}: Client est requis envers un compte à recevoir {2}
apps/erpnext/erpnext/accounts/doctype/gl_entry/gl_entry.py +126,{0} {1}: Accounting Entry for {2} can only be made in currency: {3},{0} {1}: L'entrée comptable pour {2} ne peut être faite qu'en devise: {3} {0} {1}: Accounting Entry for {2} can only be made in currency: {3},{0} {1}: L'entrée comptable pour {2} ne peut être faite qu'en devise: {3}
DocType: Purchase Invoice Item,Price List Rate,Taux de la Liste de Prix Price List Rate,Taux de la Liste de Prix,
apps/erpnext/erpnext/accounts/doctype/gl_entry/gl_entry.py +56,{0} {1}: Supplier is required against Payable account {2},{0} {1}: Fournisseur est requis envers un compte à payer {2} {0} {1}: Supplier is required against Payable account {2},{0} {1}: Fournisseur est requis envers un compte à payer {2}
DocType: Stock Settings,Auto insert Price List rate if missing,Insertion automatique du taux à la Liste de Prix si manquant Auto insert Price List rate if missing,Insertion automatique du taux à la Liste de Prix si manquant,
apps/erpnext/erpnext/accounts/doctype/gl_entry/gl_entry.py +97,{0} {1}: Account {2} does not belong to Company {3},{0} {1}: Le compte {2} ne fait pas partie de la Société {3} {0} {1}: Account {2} does not belong to Company {3},{0} {1}: Le compte {2} ne fait pas partie de la Société {3}
apps/erpnext/erpnext/accounts/doctype/gl_entry/gl_entry.py +79,{0} {1}: 'Profit and Loss' type account {2} not allowed in Opening Entry,{0} {1}: Le compte {2} de type 'Profit et Perte' n'est pas admis dans une Entrée d'Ouverture {0} {1}: 'Profit and Loss' type account {2} not allowed in Opening Entry,{0} {1}: Le compte {2} de type 'Profit et Perte' n'est pas admis dans une Entrée d'Ouverture,
apps/erpnext/erpnext/accounts/doctype/gl_entry/gl_entry.py +93,{0} {1}: Account {2} is inactive,{0} {1}: Le compte {2} est inactif {0} {1}: Account {2} is inactive,{0} {1}: Le compte {2} est inactif,
DocType: Journal Entry,Difference (Dr - Cr),Différence (Dt - Ct ) Difference (Dr - Cr),Différence (Dt - Ct )
apps/erpnext/erpnext/accounts/doctype/gl_entry/gl_entry.py +89,{0} {1}: Account {2} cannot be a Group,{0} {1}: Le compte {2} ne peut pas être un Groupe {0} {1}: Account {2} cannot be a Group,{0} {1}: Le compte {2} ne peut pas être un Groupe,

1 DocType: Production Plan Item Ordered Qty,Quantité commandée, Ordered Qty Quantité commandée
2 apps/erpnext/erpnext/accounts/doctype/gl_entry/gl_entry.py +112 {0} {1}: Cost Center {2} does not belong to Company {3},{0} {1}: Le Centre de Coûts {2} ne fait pas partie de la Société {3} {0} {1}: Cost Center {2} does not belong to Company {3} {0} {1}: Le Centre de Coûts {2} ne fait pas partie de la Société {3}
3 apps/erpnext/erpnext/accounts/doctype/gl_entry/gl_entry.py +61 {0} {1}: Either debit or credit amount is required for {2},{0} {1}: Soit un montant au débit ou crédit est nécessaire pour {2} {0} {1}: Either debit or credit amount is required for {2} {0} {1}: Soit un montant au débit ou crédit est nécessaire pour {2}
4 DocType: Purchase Invoice Item Price List Rate (Company Currency),Taux de la Liste de Prix (Devise de la Compagnie) Price List Rate (Company Currency) Taux de la Liste de Prix (Devise de la Compagnie)
5 apps/erpnext/erpnext/accounts/doctype/gl_entry/gl_entry.py +53 {0} {1}: Customer is required against Receivable account {2},{0} {1}: Client est requis envers un compte à recevoir {2} {0} {1}: Customer is required against Receivable account {2} {0} {1}: Client est requis envers un compte à recevoir {2}
6 apps/erpnext/erpnext/accounts/doctype/gl_entry/gl_entry.py +126 {0} {1}: Accounting Entry for {2} can only be made in currency: {3},{0} {1}: L'entrée comptable pour {2} ne peut être faite qu'en devise: {3} {0} {1}: Accounting Entry for {2} can only be made in currency: {3} {0} {1}: L'entrée comptable pour {2} ne peut être faite qu'en devise: {3}
7 DocType: Purchase Invoice Item Price List Rate,Taux de la Liste de Prix, Price List Rate Taux de la Liste de Prix
8 apps/erpnext/erpnext/accounts/doctype/gl_entry/gl_entry.py +56 {0} {1}: Supplier is required against Payable account {2},{0} {1}: Fournisseur est requis envers un compte à payer {2} {0} {1}: Supplier is required against Payable account {2} {0} {1}: Fournisseur est requis envers un compte à payer {2}
9 DocType: Stock Settings Auto insert Price List rate if missing,Insertion automatique du taux à la Liste de Prix si manquant, Auto insert Price List rate if missing Insertion automatique du taux à la Liste de Prix si manquant
10 apps/erpnext/erpnext/accounts/doctype/gl_entry/gl_entry.py +97 {0} {1}: Account {2} does not belong to Company {3},{0} {1}: Le compte {2} ne fait pas partie de la Société {3} {0} {1}: Account {2} does not belong to Company {3} {0} {1}: Le compte {2} ne fait pas partie de la Société {3}
11 apps/erpnext/erpnext/accounts/doctype/gl_entry/gl_entry.py +79 {0} {1}: 'Profit and Loss' type account {2} not allowed in Opening Entry,{0} {1}: Le compte {2} de type 'Profit et Perte' n'est pas admis dans une Entrée d'Ouverture, {0} {1}: 'Profit and Loss' type account {2} not allowed in Opening Entry {0} {1}: Le compte {2} de type 'Profit et Perte' n'est pas admis dans une Entrée d'Ouverture
12 apps/erpnext/erpnext/accounts/doctype/gl_entry/gl_entry.py +93 {0} {1}: Account {2} is inactive,{0} {1}: Le compte {2} est inactif, {0} {1}: Account {2} is inactive {0} {1}: Le compte {2} est inactif
13 DocType: Journal Entry Difference (Dr - Cr),Différence (Dt - Ct ) Difference (Dr - Cr) Différence (Dt - Ct )
14 apps/erpnext/erpnext/accounts/doctype/gl_entry/gl_entry.py +89 {0} {1}: Account {2} cannot be a Group,{0} {1}: Le compte {2} ne peut pas être un Groupe, {0} {1}: Account {2} cannot be a Group {0} {1}: Le compte {2} ne peut pas être un Groupe

View File

@ -951,7 +951,7 @@ End time cannot be before start time,L'heure de fin ne peut pas être avant l'he
Ends On date cannot be before Next Contact Date.,La date de fin ne peut pas être avant la prochaine date de contact, Ends On date cannot be before Next Contact Date.,La date de fin ne peut pas être avant la prochaine date de contact,
Energy,Énergie, Energy,Énergie,
Engineer,Ingénieur, Engineer,Ingénieur,
Enough Parts to Build,Pièces Suffisantes pour Construire Enough Parts to Build,Pièces Suffisantes pour Construire,
Enroll,Inscrire, Enroll,Inscrire,
Enrolling student,Inscrire un étudiant, Enrolling student,Inscrire un étudiant,
Enrolling students,Inscription des étudiants, Enrolling students,Inscription des étudiants,
@ -3037,7 +3037,7 @@ To Date must be greater than From Date,La date de fin doit être supérieure à
To Date should be within the Fiscal Year. Assuming To Date = {0},La Date Finale doit être dans l'exercice. En supposant Date Finale = {0}, To Date should be within the Fiscal Year. Assuming To Date = {0},La Date Finale doit être dans l'exercice. En supposant Date Finale = {0},
To Datetime,À la Date, To Datetime,À la Date,
To Deliver,À Livrer, To Deliver,À Livrer,
{} To Deliver,{} à livrer {} To Deliver,{} à livrer,
To Deliver and Bill,À Livrer et Facturer, To Deliver and Bill,À Livrer et Facturer,
To Fiscal Year,À l'année fiscale, To Fiscal Year,À l'année fiscale,
To GSTIN,GSTIN (Destination), To GSTIN,GSTIN (Destination),
@ -4943,8 +4943,8 @@ Min Qty,Qté Min,
Max Qty,Qté Max, Max Qty,Qté Max,
Min Amt,Montant Min, Min Amt,Montant Min,
Max Amt,Montant Max, Max Amt,Montant Max,
"If rate is zero them item will be treated as ""Free Item""",Si le prix est à 0 alors l'article sera traité comme article gratuit "If rate is zero them item will be treated as ""Free Item""",Si le prix est à 0 alors l'article sera traité comme article gratuit,
Is Recursive,Est récursif Is Recursive,Est récursif,
"Discounts to be applied in sequential ranges like buy 1 get 1, buy 2 get 2, buy 3 get 3 and so on","La remise sera appliquée séquentiellement telque : acheter 1 => recupérer 1, acheter 2 => recupérer 2, acheter 3 => recupérer 3, etc..." "Discounts to be applied in sequential ranges like buy 1 get 1, buy 2 get 2, buy 3 get 3 and so on","La remise sera appliquée séquentiellement telque : acheter 1 => recupérer 1, acheter 2 => recupérer 2, acheter 3 => recupérer 3, etc..."
Period Settings,Paramètres de période, Period Settings,Paramètres de période,
Margin,Marge, Margin,Marge,
@ -7240,7 +7240,7 @@ Replace,Remplacer,
Update latest price in all BOMs,Mettre à jour le prix le plus récent dans toutes les nomenclatures, Update latest price in all BOMs,Mettre à jour le prix le plus récent dans toutes les nomenclatures,
BOM Website Item,Article de nomenclature du Site Internet, BOM Website Item,Article de nomenclature du Site Internet,
BOM Website Operation,Opération de nomenclature du Site Internet, BOM Website Operation,Opération de nomenclature du Site Internet,
Operation Time,Durée de l'Opération Operation Time,Durée de l'Opération,
PO-JOB.#####,PO-JOB. #####, PO-JOB.#####,PO-JOB. #####,
Timing Detail,Détail du timing, Timing Detail,Détail du timing,
Time Logs,Time Logs, Time Logs,Time Logs,
@ -9834,92 +9834,92 @@ Enable European Access,Activer l'accès européen,
Creating Purchase Order ...,Création d'une commande d'achat ..., Creating Purchase Order ...,Création d'une commande d'achat ...,
"Select a Supplier from the Default Suppliers of the items below. On selection, a Purchase Order will be made against items belonging to the selected Supplier only.","Sélectionnez un fournisseur parmi les fournisseurs par défaut des articles ci-dessous. Lors de la sélection, une commande d'achat sera effectué contre des articles appartenant uniquement au fournisseur sélectionné.", "Select a Supplier from the Default Suppliers of the items below. On selection, a Purchase Order will be made against items belonging to the selected Supplier only.","Sélectionnez un fournisseur parmi les fournisseurs par défaut des articles ci-dessous. Lors de la sélection, une commande d'achat sera effectué contre des articles appartenant uniquement au fournisseur sélectionné.",
Row #{}: You must select {} serial numbers for item {}.,Ligne n ° {}: vous devez sélectionner {} numéros de série pour l'article {}., Row #{}: You must select {} serial numbers for item {}.,Ligne n ° {}: vous devez sélectionner {} numéros de série pour l'article {}.,
Update Rate as per Last Purchase,Mettre à jour avec les derniers prix d'achats Update Rate as per Last Purchase,Mettre à jour avec les derniers prix d'achats,
Company Shipping Address,Adresse d'expédition Company Shipping Address,Adresse d'expédition,
Shipping Address Details,Détail d'adresse d'expédition Shipping Address Details,Détail d'adresse d'expédition,
Company Billing Address,Adresse de la société de facturation Company Billing Address,Adresse de la société de facturation,
Supplier Address Details, Supplier Address Details,
Bank Reconciliation Tool,Outil de réconcialiation d'écritures bancaires Bank Reconciliation Tool,Outil de réconcialiation d'écritures bancaires,
Supplier Contact,Contact fournisseur Supplier Contact,Contact fournisseur,
Subcontracting,Sous traitance Subcontracting,Sous traitance,
Order Status,Statut de la commande Order Status,Statut de la commande,
Build,Personnalisations avancées Build,Personnalisations avancées,
Dispatch Address Name,Adresse de livraison intermédiaire Dispatch Address Name,Adresse de livraison intermédiaire,
Amount Eligible for Commission,Montant éligible à comission Amount Eligible for Commission,Montant éligible à comission,
Grant Commission,Eligible aux commissions Grant Commission,Eligible aux commissions,
Stock Transactions Settings, Paramétre des transactions Stock Transactions Settings, Paramétre des transactions,
Role Allowed to Over Deliver/Receive, Rôle autorisé à dépasser cette limite Role Allowed to Over Deliver/Receive, Rôle autorisé à dépasser cette limite,
Users with this role are allowed to over deliver/receive against orders above the allowance percentage,Rôle Utilisateur qui sont autorisé à livrée/commandé au-delà de la limite Users with this role are allowed to over deliver/receive against orders above the allowance percentage,Rôle Utilisateur qui sont autorisé à livrée/commandé au-delà de la limite,
Over Transfer Allowance,Autorisation de limite de transfert Over Transfer Allowance,Autorisation de limite de transfert,
Quality Inspection Settings,Paramétre de l'inspection qualité Quality Inspection Settings,Paramétre de l'inspection qualits,
Action If Quality Inspection Is Rejected,Action si l'inspection qualité est rejetée Action If Quality Inspection Is Rejected,Action si l'inspection qualité est rejetée,
Disable Serial No And Batch Selector,Désactiver le sélecteur de numéro de lot/série Disable Serial No And Batch Selector,Désactiver le sélecteur de numéro de lot/série,
Is Rate Adjustment Entry (Debit Note),Est un justement du prix de la note de débit Is Rate Adjustment Entry (Debit Note),Est un justement du prix de la note de débit,
Issue a debit note with 0 qty against an existing Sales Invoice,Creer une note de débit avec une quatité à O pour la facture Issue a debit note with 0 qty against an existing Sales Invoice,Creer une note de débit avec une quatité à O pour la facture,
Control Historical Stock Transactions,Controle de l'historique des stransaction de stock Control Historical Stock Transactions,Controle de l'historique des stransaction de stock,
No stock transactions can be created or modified before this date.,Aucune transaction ne peux être créée ou modifié avant cette date. No stock transactions can be created or modified before this date.,Aucune transaction ne peux être créée ou modifié avant cette date.
Stock transactions that are older than the mentioned days cannot be modified.,Les transactions de stock plus ancienne que le nombre de jours ci-dessus ne peuvent être modifiées Stock transactions that are older than the mentioned days cannot be modified.,Les transactions de stock plus ancienne que le nombre de jours ci-dessus ne peuvent être modifiées,
Role Allowed to Create/Edit Back-dated Transactions,Rôle autorisé à créer et modifier des transactions anti-datée Role Allowed to Create/Edit Back-dated Transactions,Rôle autorisé à créer et modifier des transactions anti-datée,
"If mentioned, the system will allow only the users with this Role to create or modify any stock transaction earlier than the latest stock transaction for a specific item and warehouse. If set as blank, it allows all users to create/edit back-dated transactions.","Les utilisateur de ce role pourront creer et modifier des transactions dans le passé. Si vide tout les utilisateurs pourrons le faire" "If mentioned, the system will allow only the users with this Role to create or modify any stock transaction earlier than the latest stock transaction for a specific item and warehouse. If set as blank, it allows all users to create/edit back-dated transactions.","Les utilisateur de ce role pourront creer et modifier des transactions dans le passé. Si vide tout les utilisateurs pourrons le faire"
Auto Insert Item Price If Missing,Création du prix de l'article dans les listes de prix si abscent Auto Insert Item Price If Missing,Création du prix de l'article dans les listes de prix si abscent,
Update Existing Price List Rate,Mise a jour automatique du prix dans les listes de prix Update Existing Price List Rate,Mise a jour automatique du prix dans les listes de prix,
Show Barcode Field in Stock Transactions,Afficher le champ Code Barre dans les transactions de stock Show Barcode Field in Stock Transactions,Afficher le champ Code Barre dans les transactions de stock,
Convert Item Description to Clean HTML in Transactions,Convertir les descriptions d'articles en HTML valide lors des transactions Convert Item Description to Clean HTML in Transactions,Convertir les descriptions d'articles en HTML valide lors des transactions,
Have Default Naming Series for Batch ID?,Nom de série par défaut pour les Lots ou Séries Have Default Naming Series for Batch ID?,Nom de série par défaut pour les Lots ou Séries,
"The percentage you are allowed to transfer more against the quantity ordered. For example, if you have ordered 100 units, and your Allowance is 10%, then you are allowed transfer 110 units","Le pourcentage de quantité que vous pourrez réceptionner en plus de la quantité commandée. Par exemple, vous avez commandé 100 unités, votre pourcentage de dépassement est de 10%, vous pourrez réceptionner 110 unités" "The percentage you are allowed to transfer more against the quantity ordered. For example, if you have ordered 100 units, and your Allowance is 10%, then you are allowed transfer 110 units","Le pourcentage de quantité que vous pourrez réceptionner en plus de la quantité commandée. Par exemple, vous avez commandé 100 unités, votre pourcentage de dépassement est de 10%, vous pourrez réceptionner 110 unités"
Allowed Items,Articles autorisés Allowed Items,Articles autorisés,
Party Specific Item,Restriction d'article disponible Party Specific Item,Restriction d'article disponible,
Restrict Items Based On,Type de critére de restriction Restrict Items Based On,Type de critére de restriction,
Based On Value,critére de restriction Based On Value,critére de restriction,
Unit of Measure (UOM),Unité de mesure (UdM), Unit of Measure (UOM),Unité de mesure (UdM),
Unit Of Measure (UOM),Unité de mesure (UdM), Unit Of Measure (UOM),Unité de mesure (UdM),
CRM Settings,Paramètres CRM CRM Settings,Paramètres CRM,
Do Not Explode,Ne pas décomposer Do Not Explode,Ne pas décomposer,
Quick Access, Accés rapides Quick Access, Accés rapides,
{} Available,{} Disponible.s {} Available,{} Disponible.s,
{} Pending,{} En attente.s {} Pending,{} En attente.s,
{} To Bill,{} à facturer {} To Bill,{} à facturer,
{} To Receive,{} A recevoir {} To Receive,{} A recevoir,
{} Active,{} Actif.ve(s) {} Active,{} Actif.ve(s)
{} Open,{} Ouvert.e(s) {} Open,{} Ouvert.e(s)
Incorrect Data Report,Rapport de données incohérentes Incorrect Data Report,Rapport de données incohérentes,
Incorrect Serial No Valuation,Valorisation inccorecte par Num. Série / Lots Incorrect Serial No Valuation,Valorisation inccorecte par Num. Série / Lots,
Incorrect Balance Qty After Transaction,Equilibre des quantités aprés une transaction Incorrect Balance Qty After Transaction,Equilibre des quantités aprés une transaction,
Interview Type,Type d'entretien Interview Type,Type d'entretien,
Interview Round,Cycle d'entretien Interview Round,Cycle d'entretien,
Interview,Entretien Interview,Entretien,
Interview Feedback,Retour d'entretien Interview Feedback,Retour d'entretien,
Journal Energy Point,Historique des points d'énergies Journal Energy Point,Historique des points d'énergies,
Billing Address Details,Adresse de facturation (détails) Billing Address Details,Adresse de facturation (détails)
Supplier Address Details,Adresse Fournisseur (détails) Supplier Address Details,Adresse Fournisseur (détails)
Retail,Commerce Retail,Commerce,
Users,Utilisateurs Users,Utilisateurs,
Permission Manager,Gestion des permissions Permission Manager,Gestion des permissions,
Fetch Timesheet,Récuprer les temps saisis Fetch Timesheet,Récuprer les temps saisis,
Get Supplier Group Details,Appliquer les informations depuis le Groupe de fournisseur Get Supplier Group Details,Appliquer les informations depuis le Groupe de fournisseur,
Quality Inspection(s),Inspection(s) Qualité Quality Inspection(s),Inspection(s) Qualite,
Set Advances and Allocate (FIFO),Affecter les encours au réglement Set Advances and Allocate (FIFO),Affecter les encours au réglement,
Apply Putaway Rule,Appliquer la régle de routage d'entrepot Apply Putaway Rule,Appliquer la régle de routage d'entrepot,
Delete Transactions,Supprimer les transactions Delete Transactions,Supprimer les transactions,
Default Payment Discount Account,Compte par défaut des paiements de remise Default Payment Discount Account,Compte par défaut des paiements de remise,
Unrealized Profit / Loss Account,Compte de perte Unrealized Profit / Loss Account,Compte de perte,
Enable Provisional Accounting For Non Stock Items,Activer la provision pour les articles non stockés Enable Provisional Accounting For Non Stock Items,Activer la provision pour les articles non stockés,
Publish in Website,Publier sur le Site Web Publish in Website,Publier sur le Site Web,
List View,Vue en liste List View,Vue en liste,
Allow Excess Material Transfer,Autoriser les transfert de stock supérieurs à l'attendue Allow Excess Material Transfer,Autoriser les transfert de stock supérieurs à l'attendue,
Allow transferring raw materials even after the Required Quantity is fulfilled,Autoriser les transfert de matiéres premiére mais si la quantité requise est atteinte Allow transferring raw materials even after the Required Quantity is fulfilled,Autoriser les transfert de matiéres premiére mais si la quantité requise est atteinte,
Add Corrective Operation Cost in Finished Good Valuation,Ajouter des opérations de correction de coût pour la valorisation des produits finis Add Corrective Operation Cost in Finished Good Valuation,Ajouter des opérations de correction de coût pour la valorisation des produits finis,
Make Serial No / Batch from Work Order,Générer des numéros de séries / lots depuis les Ordres de Fabrications Make Serial No / Batch from Work Order,Générer des numéros de séries / lots depuis les Ordres de Fabrications,
System will automatically create the serial numbers / batch for the Finished Good on submission of work order,le systéme va créer des numéros de séries / lots à la validation des produit finis depuis les Ordres de Fabrications System will automatically create the serial numbers / batch for the Finished Good on submission of work order,le systéme va créer des numéros de séries / lots à la validation des produit finis depuis les Ordres de Fabrications,
Allow material consumptions without immediately manufacturing finished goods against a Work Order,Autoriser la consommation sans immédiatement fabriqué les produit fini dans les ordres de fabrication Allow material consumptions without immediately manufacturing finished goods against a Work Order,Autoriser la consommation sans immédiatement fabriqué les produit fini dans les ordres de fabrication,
Quality Inspection Parameter,Paramétre des Inspection Qualité Quality Inspection Parameter,Paramétre des Inspection Qualite,
Parameter Group,Groupe de paramétre Parameter Group,Groupe de paramétre,
E Commerce Settings,Paramétrage E-Commerce E Commerce Settings,Paramétrage E-Commerce,
Follow these steps to create a landing page for your store:,Suivez les intructions suivantes pour créer votre page d'accueil de boutique en ligne Follow these steps to create a landing page for your store:,Suivez les intructions suivantes pour créer votre page d'accueil de boutique en ligne,
Show Price in Quotation,Afficher les prix sur les devis Show Price in Quotation,Afficher les prix sur les devis,
Add-ons,Extensions Add-ons,Extensions,
Enable Wishlist,Activer la liste de souhaits Enable Wishlist,Activer la liste de souhaits,
Enable Reviews and Ratings,Activer les avis et notes Enable Reviews and Ratings,Activer les avis et notes,
Enable Recommendations,Activer les recommendations Enable Recommendations,Activer les recommendations,
Item Search Settings,Paramétrage de la recherche d'article Item Search Settings,Paramétrage de la recherche d'article,
Purchase demande,Demande de materiel Purchase demande,Demande de materiel,

Can't render this file because it is too large.

File diff suppressed because it is too large Load Diff

View File

@ -1,13 +1,13 @@
apps/erpnext/erpnext/accounts/general_ledger.py,Incorrect number of General Ledger Entries found. You might have selected a wrong Account in the transaction.,Riq jun ajilibal jechataj chupam re le nima wuj teq xa sach che le ukexik Incorrect number of General Ledger Entries found. You might have selected a wrong Account in the transaction.,Riq jun ajilibal jechataj chupam re le nima wuj teq xa sach che le ukexik,
DocType: Company,Create Chart Of Accounts Based On,Kujak uwach etal pa ri Create Chart Of Accounts Based On,Kujak uwach etal pa ri,
DocType: Program Enrollment Fee,Program Enrollment Fee,Rajil re utzibaxik pale cholbal chak Program Enrollment Fee,Rajil re utzibaxik pale cholbal chak,
DocType: Employee Transfer,New Company,Kak chakulibal New Company,Kak chakulibal,
DocType: Selling Settings,Validate Selling Price for Item against Purchase Rate or Valuation Rate,Utz re ukayixik le qatoj le copanawi le ka loqik Validate Selling Price for Item against Purchase Rate or Valuation Rate,Utz re ukayixik le qatoj le copanawi le ka loqik,
DocType: Opportunity,Opportunity Type,Uwach ramajil Opportunity Type,Uwach ramajil,
DocType: Fee Schedule,Fee Schedule,Cholbal chak utojik jujunal Fee Schedule,Cholbal chak utojik jujunal,
DocType: Cheque Print Template,Cheque Width,Nim uxach ukexwach pwaq Cheque Width,Nim uxach ukexwach pwaq,
apps/erpnext/erpnext/hr/doctype/employee/employee.js,Please enter Preferred Contact Email,Taquqxan kematzibm ujel Please enter Preferred Contact Email,Taquqxan kematzibm ujel,
DocType: Item,Supplier Items,Qataj che uyaik Supplier Items,Qataj che uyaik,
,Stock Ageing,Najtir kojik Stock Ageing,Najtir kojik,
apps/erpnext/erpnext/education/doctype/student/student.py,Date of Birth cannot be greater than today.,Ler qij kojik kumaj taj che le qij re kamik Date of Birth cannot be greater than today.,Ler qij kojik kumaj taj che le qij re kamik,
apps/erpnext/erpnext/setup/doctype/company/delete_company_transactions.py,Transactions can only be deleted by the creator of the Company,Le ukexik xaqxu kakiw ukexik le banowik le chakulibal Transactions can only be deleted by the creator of the Company,Le ukexik xaqxu kakiw ukexik le banowik le chakulibal,

1 apps/erpnext/erpnext/accounts/general_ledger.py Incorrect number of General Ledger Entries found. You might have selected a wrong Account in the transaction. Riq jun ajilib’al jechataj chupam re le nima wuj teq xa sach che le uk’exik
2 DocType: Company Create Chart Of Accounts Based On Kujak uwach etal pa ri
3 DocType: Program Enrollment Fee Program Enrollment Fee Rajil re utz’ib’axik pale cholb’al chak
4 DocType: Employee Transfer New Company K’ak’ chakulib’al
5 DocType: Selling Settings Validate Selling Price for Item against Purchase Rate or Valuation Rate Utz re uk’ayixik le q’atoj le copanawi le ka loq’ik
6 DocType: Opportunity Opportunity Type Uwach ramajil
7 DocType: Fee Schedule Fee Schedule Cholb’al chak utojik jujunal
8 DocType: Cheque Print Template Cheque Width Nim uxach uk’exwach pwaq
9 apps/erpnext/erpnext/hr/doctype/employee/employee.js Please enter Preferred Contact Email Taquqxa’n kematz’ib’m uj’el
10 DocType: Item Supplier Items Q’ataj che uyaik
11 Stock Ageing Najtir k’oji’k
12 apps/erpnext/erpnext/education/doctype/student/student.py Date of Birth cannot be greater than today. Ler q’ij k’ojik kumaj taj che le q’ij re kamik
13 apps/erpnext/erpnext/setup/doctype/company/delete_company_transactions.py Transactions can only be deleted by the creator of the Company Le uk’exik xaqxu’ kakiw uk’exik le b’anowik le chakulib’al

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -3472,7 +3472,6 @@ Completed By,Tamamlayan,
Conditions,Koşullar, Conditions,Koşullar,
County,Kontluk, County,Kontluk,
Day of Week,Haftanın günü, Day of Week,Haftanın günü,
"Dear System Manager,Sevgili Sistem Yöneticisi,",
Default Value,Varsayılan Değer, Default Value,Varsayılan Değer,
Email Group,E-posta Grubu, Email Group,E-posta Grubu,
Email Settings,E-posta Ayarları, Email Settings,E-posta Ayarları,
@ -9935,7 +9934,7 @@ Items to Order and Receive,Sipariş Edilecek ve Alınacak Ürünler,
Customize Print Formats,Baskı Biçimlerini Özelleştirin, Customize Print Formats,Baskı Biçimlerini Özelleştirin,
Generate Custom Reports,Özel Raporlar Oluşturun, Generate Custom Reports,Özel Raporlar Oluşturun,
Partly Paid,Kısmen Ödenmiş, Partly Paid,Kısmen Ödenmiş,
Partly Paid and Discounted,Kısmen Ödenmiş ve İndirimli Partly Paid and Discounted,Kısmen Ödenmiş ve İndirimli,
Fixed Time,Sabit Süre, Fixed Time,Sabit Süre,
Loan Write Off,Kredi İptali, Loan Write Off,Kredi İptali,
Returns,İadeler, Returns,İadeler,

Can't render this file because it is too large.

File diff suppressed because it is too large Load Diff