From bf7e012bde846658584b3091776cead5cab5ec4e Mon Sep 17 00:00:00 2001 From: Rohan Bansal Date: Tue, 10 Sep 2019 15:43:45 +0530 Subject: [PATCH 01/44] feat: add statuses for Serial No --- erpnext/stock/doctype/serial_no/serial_no_list.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 erpnext/stock/doctype/serial_no/serial_no_list.js diff --git a/erpnext/stock/doctype/serial_no/serial_no_list.js b/erpnext/stock/doctype/serial_no/serial_no_list.js new file mode 100644 index 0000000000..559a9a7b8a --- /dev/null +++ b/erpnext/stock/doctype/serial_no/serial_no_list.js @@ -0,0 +1,14 @@ +frappe.listview_settings['Serial No'] = { + add_fields: ["is_cancelled", "item_code", "warehouse", "warranty_expiry_date", "delivery_document_type"], + get_indicator: (doc) => { + if (doc.is_cancelled) { + return [__("Cancelled"), "red", "is_cancelled,=,Yes"]; + } else if (doc.delivery_document_type) { + return [__("Delivered"), "green", "delivery_document_type,is,set|is_cancelled,=,No"]; + } else if (doc.warranty_expiry_date && frappe.datetime.get_diff(doc.warranty_expiry_date, frappe.datetime.nowdate()) <= 0) { + return [__("Expired"), "red", "warranty_expiry_date,not in,|warranty_expiry_date,<=,Today|delivery_document_type,is,not set|is_cancelled,=,No"] + } else { + return [__("Active"), "green", "delivery_document_type,is,not set|is_cancelled,=,No"]; + }; + } +}; From adc15295678a28d0ae9275b4cf9020003774cbf8 Mon Sep 17 00:00:00 2001 From: Vijaya Raghavan Date: Sun, 13 Oct 2019 21:41:02 +0530 Subject: [PATCH 02/44] fixed typo fixes type in filter parameter --- erpnext/hr/doctype/leave_application/leave_application.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/hr/doctype/leave_application/leave_application.py b/erpnext/hr/doctype/leave_application/leave_application.py index 737f602883..5e71c00755 100755 --- a/erpnext/hr/doctype/leave_application/leave_application.py +++ b/erpnext/hr/doctype/leave_application/leave_application.py @@ -125,7 +125,7 @@ class LeaveApplication(Document): status = "Half Day" if date == self.half_day_date else "On Leave" attendance_name = frappe.db.exists('Attendance', dict(employee = self.employee, - attenance_date = date, docstatus = ('!=', 2))) + attendance_date = date, docstatus = ('!=', 2))) if attendance_name: # update existing attendance, change absent to on leave From f935e3792528a05485f7bcefb0f0b231140db698 Mon Sep 17 00:00:00 2001 From: Sagar Gharge Date: Tue, 15 Oct 2019 14:38:04 +0530 Subject: [PATCH 03/44] [Fix] restricted duplicate guardians on student doctype (#19194) --- erpnext/education/doctype/student/student.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/erpnext/education/doctype/student/student.js b/erpnext/education/doctype/student/student.js index 2c933e28b7..b6e741c4da 100644 --- a/erpnext/education/doctype/student/student.js +++ b/erpnext/education/doctype/student/student.js @@ -27,3 +27,16 @@ frappe.ui.form.on('Student', { } } }); + +frappe.ui.form.on('Student Guardian', { + guardians_add: function(frm){ + frm.fields_dict['guardians'].grid.get_field('guardian').get_query = function(doc){ + var guardian_list = []; + if(!doc.__islocal) guardian_list.push(doc.guardian); + $.each(doc.guardians, function(idx, val){ + if (val.guardian) guardian_list.push(val.guardian); + }); + return { filters: [['Guardian', 'name', 'not in', guardian_list]] }; + }; + } +}); From 441720df758ebd6f5420c067686f68c0d0fc7248 Mon Sep 17 00:00:00 2001 From: joelios Date: Tue, 15 Oct 2019 15:42:51 +0200 Subject: [PATCH 04/44] fix: linking of time_log to timesheet from project (frappe/erpnext #19315 ) --- erpnext/projects/doctype/project/project.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/erpnext/projects/doctype/project/project.js b/erpnext/projects/doctype/project/project.js index beba2bbe74..192e1bc2a5 100644 --- a/erpnext/projects/doctype/project/project.js +++ b/erpnext/projects/doctype/project/project.js @@ -11,6 +11,9 @@ frappe.ui.form.on("Project", { // add a new row and set the project let time_log = frappe.model.get_new_doc('Timesheet Detail'); time_log.project = frm.doc.name; + time_log.parent = new_doc.name; + time_log.parentfield = 'time_logs'; + time_log.parenttype = 'Timesheet'; new_doc.time_logs = [time_log]; frappe.ui.form.make_quick_entry(doctype, null, null, new_doc); From 83740de636a456f7e44c8143f917f3be41543893 Mon Sep 17 00:00:00 2001 From: Rohan Bansal Date: Fri, 5 Jul 2019 12:09:22 +0530 Subject: [PATCH 05/44] fix(selling): Add missing label to company address field --- .../doctype/sales_order/sales_order.json | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/erpnext/selling/doctype/sales_order/sales_order.json b/erpnext/selling/doctype/sales_order/sales_order.json index 78e7b4abb8..b5bb3091f8 100644 --- a/erpnext/selling/doctype/sales_order/sales_order.json +++ b/erpnext/selling/doctype/sales_order/sales_order.json @@ -31,8 +31,8 @@ "contact_phone", "contact_mobile", "contact_email", - "company_address_display", "company_address", + "company_address_display", "col_break46", "shipping_address_name", "shipping_address", @@ -342,12 +342,13 @@ { "fieldname": "company_address_display", "fieldtype": "Small Text", + "label": "Company Address", "read_only": 1 }, { "fieldname": "company_address", "fieldtype": "Link", - "label": "Company Address", + "label": "Company Address Name", "options": "Address" }, { @@ -682,10 +683,10 @@ "label": "Additional Discount and Coupon Code" }, { - "fieldname": "coupon_code", - "fieldtype": "Link", - "label": "Coupon Code", - "options": "Coupon Code" + "fieldname": "coupon_code", + "fieldtype": "Link", + "label": "Coupon Code", + "options": "Coupon Code" }, { "default": "Grand Total", @@ -1192,7 +1193,7 @@ "icon": "fa fa-file-text", "idx": 105, "is_submittable": 1, - "modified": "2019-10-14 08:46:07.540565", + "modified": "2019-10-16 00:45:55.686974", "modified_by": "Administrator", "module": "Selling", "name": "Sales Order", @@ -1269,4 +1270,4 @@ "title_field": "title", "track_changes": 1, "track_seen": 1 -} +} \ No newline at end of file From d583e412c9fab0c12993852073126b07c39d8ac4 Mon Sep 17 00:00:00 2001 From: 0Pranav Date: Tue, 22 Oct 2019 12:33:09 +0530 Subject: [PATCH 06/44] Add generic 'Appointment' doctype --- .../doctype/appointment/__init__.py | 0 .../doctype/appointment/appointment.js | 8 ++ .../doctype/appointment/appointment.json | 103 ++++++++++++++++++ .../doctype/appointment/appointment.py | 10 ++ .../doctype/appointment/test_appointment.py | 10 ++ 5 files changed, 131 insertions(+) create mode 100644 erpnext/communication/doctype/appointment/__init__.py create mode 100644 erpnext/communication/doctype/appointment/appointment.js create mode 100644 erpnext/communication/doctype/appointment/appointment.json create mode 100644 erpnext/communication/doctype/appointment/appointment.py create mode 100644 erpnext/communication/doctype/appointment/test_appointment.py diff --git a/erpnext/communication/doctype/appointment/__init__.py b/erpnext/communication/doctype/appointment/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/communication/doctype/appointment/appointment.js b/erpnext/communication/doctype/appointment/appointment.js new file mode 100644 index 0000000000..4e41047fa1 --- /dev/null +++ b/erpnext/communication/doctype/appointment/appointment.js @@ -0,0 +1,8 @@ +// Copyright (c) 2019, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Appointment', { + // refresh: function(frm) { + + // } +}); diff --git a/erpnext/communication/doctype/appointment/appointment.json b/erpnext/communication/doctype/appointment/appointment.json new file mode 100644 index 0000000000..7d808486ab --- /dev/null +++ b/erpnext/communication/doctype/appointment/appointment.json @@ -0,0 +1,103 @@ +{ + "autoname": "APMT.#####", + "creation": "2019-10-22 12:06:17.491113", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "start_time", + "appointment_duration", + "timezone", + "atendees_section", + "requester_type", + "requester", + "col_br_1", + "invitee_type", + "invitee" + ], + "fields": [ + { + "fieldname": "start_time", + "fieldtype": "Datetime", + "in_list_view": 1, + "label": "Start Time", + "reqd": 1 + }, + { + "fieldname": "appointment_duration", + "fieldtype": "Data", + "in_list_view": 1, + "label": "Duration in minutes", + "reqd": 1 + }, + { + "fieldname": "requester", + "fieldtype": "Dynamic Link", + "in_list_view": 1, + "label": "Appointment Requester ", + "options": "requester_type", + "reqd": 1 + }, + { + "fieldname": "invitee", + "fieldtype": "Dynamic Link", + "in_list_view": 1, + "label": "Appointment Invitee", + "options": "invitee_type", + "reqd": 1 + }, + { + "fieldname": "timezone", + "fieldtype": "Data", + "label": "Requester's Timezone", + "reqd": 1 + }, + { + "fieldname": "atendees_section", + "fieldtype": "Section Break", + "label": "Atendees" + }, + { + "fieldname": "requester_type", + "fieldtype": "Link", + "label": "Requester Type", + "options": "DocType", + "reqd": 1 + }, + { + "fieldname": "col_br_1", + "fieldtype": "Column Break" + }, + { + "fieldname": "invitee_type", + "fieldtype": "Link", + "label": "Invitee Type", + "options": "DocType", + "reqd": 1 + } + ], + "modified": "2019-10-22 12:18:20.719128", + "modified_by": "Administrator", + "module": "Communication", + "name": "Appointment", + "name_case": "UPPER CASE", + "owner": "Administrator", + "permissions": [ + { + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "share": 1, + "write": 1 + } + ], + "quick_entry": 1, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1 +} \ No newline at end of file diff --git a/erpnext/communication/doctype/appointment/appointment.py b/erpnext/communication/doctype/appointment/appointment.py new file mode 100644 index 0000000000..204b066031 --- /dev/null +++ b/erpnext/communication/doctype/appointment/appointment.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2019, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +# import frappe +from frappe.model.document import Document + +class Appointment(Document): + pass diff --git a/erpnext/communication/doctype/appointment/test_appointment.py b/erpnext/communication/doctype/appointment/test_appointment.py new file mode 100644 index 0000000000..702ac7176f --- /dev/null +++ b/erpnext/communication/doctype/appointment/test_appointment.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2019, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals + +# import frappe +import unittest + +class TestAppointment(unittest.TestCase): + pass From 233c0bc779effa24f5ec07d19b211fd09defd03f Mon Sep 17 00:00:00 2001 From: Mangesh-Khairnar Date: Thu, 24 Oct 2019 15:45:32 +0530 Subject: [PATCH 07/44] fix: sync delivery note status in both list view and form view --- erpnext/stock/doctype/delivery_note/delivery_note_list.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/erpnext/stock/doctype/delivery_note/delivery_note_list.js b/erpnext/stock/doctype/delivery_note/delivery_note_list.js index 6fc51ecdd9..0ae7c37b3f 100644 --- a/erpnext/stock/doctype/delivery_note/delivery_note_list.js +++ b/erpnext/stock/doctype/delivery_note/delivery_note_list.js @@ -6,9 +6,9 @@ frappe.listview_settings['Delivery Note'] = { return [__("Return"), "darkgrey", "is_return,=,Yes"]; } else if (doc.status === "Closed") { return [__("Closed"), "green", "status,=,Closed"]; - } else if (doc.grand_total !== 0 && flt(doc.per_billed, 2) < 100) { + } else if (flt(doc.per_billed, 2) < 100) { return [__("To Bill"), "orange", "per_billed,<,100"]; - } else if (doc.grand_total === 0 || flt(doc.per_billed, 2) == 100) { + } else if (flt(doc.per_billed, 2) == 100) { return [__("Completed"), "green", "per_billed,=,100"]; } }, From 8916916a03cffd22b9c26b8a0df7843d37c9ad01 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Mon, 28 Oct 2019 13:00:18 +0530 Subject: [PATCH 08/44] fix: 'NoneType' object is not iterable --- .../account_balance_timeline/account_balance_timeline.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/erpnext/accounts/dashboard_chart_source/account_balance_timeline/account_balance_timeline.py b/erpnext/accounts/dashboard_chart_source/account_balance_timeline/account_balance_timeline.py index bc07b6d807..d098d8421c 100644 --- a/erpnext/accounts/dashboard_chart_source/account_balance_timeline/account_balance_timeline.py +++ b/erpnext/accounts/dashboard_chart_source/account_balance_timeline/account_balance_timeline.py @@ -3,6 +3,7 @@ from __future__ import unicode_literals import frappe, json +from frappe import _ from frappe.utils import add_to_date, date_diff, getdate, nowdate, get_last_day, formatdate from erpnext.accounts.report.general_ledger.general_ledger import execute from frappe.core.page.dashboard.dashboard import cache_source, get_from_date_from_timespan @@ -24,6 +25,9 @@ def get(chart_name = None, chart = None, no_cache = None, from_date = None, to_d account = filters.get("account") company = filters.get("company") + if not account and chart: + frappe.throw(_("Account is not set for the dashboard chart {0}").format(chart)) + if not to_date: to_date = nowdate() if not from_date: From 3dbef9de74636f034629273f2875c498c4d027a0 Mon Sep 17 00:00:00 2001 From: marination Date: Mon, 28 Oct 2019 15:48:10 +0530 Subject: [PATCH 09/44] fix: Search field entries included in Item Link field query --- erpnext/controllers/queries.py | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/erpnext/controllers/queries.py b/erpnext/controllers/queries.py index 2f6b59f0fb..ac89588978 100644 --- a/erpnext/controllers/queries.py +++ b/erpnext/controllers/queries.py @@ -152,6 +152,17 @@ def tax_account_query(doctype, txt, searchfield, start, page_len, filters): def item_query(doctype, txt, searchfield, start, page_len, filters, as_dict=False): conditions = [] + #Get searchfields from meta and use in Item Link field query + meta = frappe.get_meta("Item") + searchfields = meta.get_search_fields() + + fields = [f for f in searchfields if not f in ["name", "item_group", "description"]] + fields = ", ".join(fields) + + searchfields = searchfields + [f for f in [searchfield or "name", "item_code", "item_group", "item_name"] + if not f in searchfields] + searchfields = " or ".join([field + " like %(txt)s" for field in searchfields]) + description_cond = '' if frappe.db.count('Item', cache=True) < 50000: # scan description only if items are less than 50000 @@ -162,17 +173,14 @@ def item_query(doctype, txt, searchfield, start, page_len, filters, as_dict=Fals concat(substr(tabItem.item_name, 1, 40), "..."), item_name) as item_name, tabItem.item_group, if(length(tabItem.description) > 40, \ - concat(substr(tabItem.description, 1, 40), "..."), description) as decription + concat(substr(tabItem.description, 1, 40), "..."), description) as description, + {fields} from tabItem where tabItem.docstatus < 2 and tabItem.has_variants=0 and tabItem.disabled=0 and (tabItem.end_of_life > %(today)s or ifnull(tabItem.end_of_life, '0000-00-00')='0000-00-00') - and (tabItem.`{key}` LIKE %(txt)s - or tabItem.item_code LIKE %(txt)s - or tabItem.item_group LIKE %(txt)s - or tabItem.item_name LIKE %(txt)s - or tabItem.item_code IN (select parent from `tabItem Barcode` where barcode LIKE %(txt)s) + and ({scond} or tabItem.item_code IN (select parent from `tabItem Barcode` where barcode LIKE %(txt)s) {description_cond}) {fcond} {mcond} order by @@ -182,6 +190,8 @@ def item_query(doctype, txt, searchfield, start, page_len, filters, as_dict=Fals name, item_name limit %(start)s, %(page_len)s """.format( key=searchfield, + fields=fields, + scond=searchfields, fcond=get_filters_cond(doctype, filters, conditions).replace('%', '%%'), mcond=get_match_cond(doctype).replace('%', '%%'), description_cond = description_cond), From 88d2c973913b68c0256e7fb4dcab35428585083b Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Mon, 28 Oct 2019 17:37:55 +0530 Subject: [PATCH 10/44] fix: default accounts are not added on creation of company --- erpnext/setup/doctype/company/company.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/erpnext/setup/doctype/company/company.py b/erpnext/setup/doctype/company/company.py index e69a6aaded..8b42b19921 100644 --- a/erpnext/setup/doctype/company/company.py +++ b/erpnext/setup/doctype/company/company.py @@ -33,6 +33,10 @@ class Company(NestedSet): return exists def validate(self): + self.update_default_account = False + if self.is_new(): + self.update_default_account = True + self.validate_abbr() self.validate_default_accounts() self.validate_currency() @@ -203,8 +207,8 @@ class Company(NestedSet): "default_expense_account": "Cost of Goods Sold" }) - for default_account in default_accounts: - if self.is_new() or frappe.flags.in_test or frappe.flags.in_demo: + if self.update_default_account or frappe.flags.in_test: + for default_account in default_accounts: self._set_default_account(default_account, default_accounts.get(default_account)) if not self.default_income_account: From 4f7885f1aa63f99320c26c8b87b2d32bfacc35ec Mon Sep 17 00:00:00 2001 From: "Chinmay D. Pai" Date: Tue, 29 Oct 2019 13:20:17 +0530 Subject: [PATCH 11/44] chore: fix unexpected keyword in shopify_settings Signed-off-by: Chinmay D. Pai --- .../doctype/shopify_settings/shopify_settings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/erpnext_integrations/doctype/shopify_settings/shopify_settings.py b/erpnext/erpnext_integrations/doctype/shopify_settings/shopify_settings.py index a4332b199e..0cad0cca72 100644 --- a/erpnext/erpnext_integrations/doctype/shopify_settings/shopify_settings.py +++ b/erpnext/erpnext_integrations/doctype/shopify_settings/shopify_settings.py @@ -43,7 +43,7 @@ class ShopifySettings(Document): d.raise_for_status() self.update_webhook_table(method, d.json()) except Exception as e: - make_shopify_log(status="Warning", message=e, exception=False) + make_shopify_log(status="Warning", exception=e, rollback=True) def unregister_webhooks(self): session = get_request_session() From 702f9f929b46b3edd25ec53b3b3cb9186beeb10d Mon Sep 17 00:00:00 2001 From: "Chinmay D. Pai" Date: Tue, 29 Oct 2019 13:30:13 +0530 Subject: [PATCH 12/44] chore: rename undefined variable in shopify_log Signed-off-by: Chinmay D. Pai --- erpnext/erpnext_integrations/doctype/shopify_log/shopify_log.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/erpnext_integrations/doctype/shopify_log/shopify_log.py b/erpnext/erpnext_integrations/doctype/shopify_log/shopify_log.py index 7d3f572978..a2b6af99b2 100644 --- a/erpnext/erpnext_integrations/doctype/shopify_log/shopify_log.py +++ b/erpnext/erpnext_integrations/doctype/shopify_log/shopify_log.py @@ -39,7 +39,7 @@ def get_message(exception): if hasattr(exception, 'message'): message = exception.message elif hasattr(exception, '__str__'): - message = e.__str__() + message = exception.__str__() else: message = "Something went wrong while syncing" return message From b051fa37df682efc9ab786076c6b8f08a3283844 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Tue, 29 Oct 2019 14:56:03 +0530 Subject: [PATCH 13/44] fix: patch, item tax template showing 'Untitled' in the name --- .../move_item_tax_to_item_tax_template.py | 23 +++++++++---------- 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/erpnext/patches/v12_0/move_item_tax_to_item_tax_template.py b/erpnext/patches/v12_0/move_item_tax_to_item_tax_template.py index 412f32030a..6769144aeb 100644 --- a/erpnext/patches/v12_0/move_item_tax_to_item_tax_template.py +++ b/erpnext/patches/v12_0/move_item_tax_to_item_tax_template.py @@ -1,5 +1,6 @@ import frappe import json +from frappe.model.naming import make_autoname from six import iteritems def execute(): @@ -7,7 +8,6 @@ def execute(): return old_item_taxes = {} item_tax_templates = {} - rename_template_to_untitled = [] for d in frappe.db.sql("""select parent as item_code, tax_type, tax_rate from `tabItem Tax`""", as_dict=1): old_item_taxes.setdefault(d.item_code, []) @@ -34,7 +34,7 @@ def execute(): for d in old_item_taxes[item_code]: item_tax_map[d.tax_type] = d.tax_rate - item_tax_template_name = get_item_tax_template(item_tax_templates, rename_template_to_untitled, + item_tax_template_name = get_item_tax_template(item_tax_templates, item_tax_map, item_code) # update the item tax table @@ -53,26 +53,19 @@ def execute(): for d in frappe.db.sql("""select name, parent, item_code, item_tax_rate from `tab{0} Item` where ifnull(item_tax_rate, '') not in ('', '{{}}')""".format(dt), as_dict=1): item_tax_map = json.loads(d.item_tax_rate) - item_tax_template = get_item_tax_template(item_tax_templates, rename_template_to_untitled, + item_tax_template = get_item_tax_template(item_tax_templates, item_tax_map, d.item_code, d.parent) frappe.db.set_value(dt + " Item", d.name, "item_tax_template", item_tax_template) - idx = 1 - for oldname in rename_template_to_untitled: - frappe.rename_doc("Item Tax Template", oldname, "Untitled {}".format(idx)) - idx += 1 - settings = frappe.get_single("Accounts Settings") settings.add_taxes_from_item_tax_template = 0 settings.determine_address_tax_category_from = "Billing Address" settings.save() -def get_item_tax_template(item_tax_templates, rename_template_to_untitled, item_tax_map, item_code, parent=None): +def get_item_tax_template(item_tax_templates, item_tax_map, item_code, parent=None): # search for previously created item tax template by comparing tax maps for template, item_tax_template_map in iteritems(item_tax_templates): if item_tax_map == item_tax_template_map: - if not parent: - rename_template_to_untitled.append(template) return template # if no item tax template found, create one @@ -97,5 +90,11 @@ def get_item_tax_template(item_tax_templates, rename_template_to_untitled, item_ item_tax_template.append("taxes", {"tax_type": tax_type, "tax_rate": tax_rate}) item_tax_templates.setdefault(item_tax_template.title, {}) item_tax_templates[item_tax_template.title][tax_type] = tax_rate - item_tax_template.save() + + try: + item_tax_template.save() + except frappe.DuplicateEntryError: + item_tax_template.name = make_autoname(item_tax_template.title + "/.###") + item_tax_template.save() + return item_tax_template.name From 2a72d1fee4bf8d6baed9632bf6dbf58495bc6fd1 Mon Sep 17 00:00:00 2001 From: ahmadRagheb Date: Tue, 29 Oct 2019 19:49:08 +0200 Subject: [PATCH 14/44] Update salary_slip.py getdate imported twice --- erpnext/hr/doctype/salary_slip/salary_slip.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/hr/doctype/salary_slip/salary_slip.py b/erpnext/hr/doctype/salary_slip/salary_slip.py index 27a51c30e7..46be4fe287 100644 --- a/erpnext/hr/doctype/salary_slip/salary_slip.py +++ b/erpnext/hr/doctype/salary_slip/salary_slip.py @@ -5,7 +5,7 @@ from __future__ import unicode_literals import frappe, erpnext import datetime, math -from frappe.utils import add_days, cint, cstr, flt, getdate, rounded, date_diff, money_in_words, getdate +from frappe.utils import add_days, cint, cstr, flt, getdate, rounded, date_diff, money_in_words from frappe.model.naming import make_autoname from frappe import msgprint, _ From abbc08cb486105d9dbedfc2a57aede39c2303f25 Mon Sep 17 00:00:00 2001 From: 0Pranav Date: Wed, 30 Oct 2019 10:46:16 +0530 Subject: [PATCH 15/44] fix: hide generate schedule button on new forms --- .../doctype/maintenance_schedule/maintenance_schedule.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.js b/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.js index ce95db3bf5..f2fc588be4 100644 --- a/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.js +++ b/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.js @@ -20,6 +20,12 @@ frappe.ui.form.on('Maintenance Schedule', { frm.set_value({transaction_date: frappe.datetime.get_today()}); } }, + refresh: function(frm) { + setTimeout(()=> { + debugger; + frm.toggle_display('generate_schedule',!(frm.is_new())); + },10); + }, customer: function(frm) { erpnext.utils.get_party_details(frm) }, From d2d0100c9a6958a7694af0575176bef497d81cd3 Mon Sep 17 00:00:00 2001 From: 0Pranav Date: Wed, 30 Oct 2019 10:48:13 +0530 Subject: [PATCH 16/44] fix:better error message when sales person is none --- .../doctype/maintenance_schedule/maintenance_schedule.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.py b/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.py index 3a64e1aa67..1ad7fc8552 100644 --- a/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.py +++ b/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.py @@ -150,7 +150,7 @@ class MaintenanceSchedule(TransactionBase): elif not d.no_of_visits: throw(_("Please mention no of visits required")) elif not d.sales_person: - throw(_("Please select Incharge Person's name")) + throw(_("Please select Incharge Person's name for item: {0}".format(d.item_name))) if getdate(d.start_date) >= getdate(d.end_date): throw(_("Start date should be less than end date for Item {0}").format(d.item_code)) From 846c03889ef5a39a824b059d1924249e59b9e9ca Mon Sep 17 00:00:00 2001 From: 0Pranav Date: Wed, 30 Oct 2019 10:51:25 +0530 Subject: [PATCH 17/44] fix: hide schedule section on new forms --- .../doctype/maintenance_schedule/maintenance_schedule.js | 1 + 1 file changed, 1 insertion(+) diff --git a/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.js b/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.js index f2fc588be4..e91f478aa4 100644 --- a/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.js +++ b/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.js @@ -24,6 +24,7 @@ frappe.ui.form.on('Maintenance Schedule', { setTimeout(()=> { debugger; frm.toggle_display('generate_schedule',!(frm.is_new())); + frm.toggle_display('schedule',!(frm.is_new())); },10); }, customer: function(frm) { From 0f0d6ce25cf2a44f18a4300d3ab0e31c2a4d6c06 Mon Sep 17 00:00:00 2001 From: 0Pranav Date: Wed, 30 Oct 2019 11:08:09 +0530 Subject: [PATCH 18/44] Remove doctype related to appointment scheduling --- .../doctype/appointment/__init__.py | 0 .../doctype/appointment/appointment.js | 8 -- .../doctype/appointment/appointment.json | 103 ------------------ .../doctype/appointment/appointment.py | 10 -- .../doctype/appointment/test_appointment.py | 10 -- 5 files changed, 131 deletions(-) delete mode 100644 erpnext/communication/doctype/appointment/__init__.py delete mode 100644 erpnext/communication/doctype/appointment/appointment.js delete mode 100644 erpnext/communication/doctype/appointment/appointment.json delete mode 100644 erpnext/communication/doctype/appointment/appointment.py delete mode 100644 erpnext/communication/doctype/appointment/test_appointment.py diff --git a/erpnext/communication/doctype/appointment/__init__.py b/erpnext/communication/doctype/appointment/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/erpnext/communication/doctype/appointment/appointment.js b/erpnext/communication/doctype/appointment/appointment.js deleted file mode 100644 index 4e41047fa1..0000000000 --- a/erpnext/communication/doctype/appointment/appointment.js +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright (c) 2019, Frappe Technologies Pvt. Ltd. and contributors -// For license information, please see license.txt - -frappe.ui.form.on('Appointment', { - // refresh: function(frm) { - - // } -}); diff --git a/erpnext/communication/doctype/appointment/appointment.json b/erpnext/communication/doctype/appointment/appointment.json deleted file mode 100644 index 7d808486ab..0000000000 --- a/erpnext/communication/doctype/appointment/appointment.json +++ /dev/null @@ -1,103 +0,0 @@ -{ - "autoname": "APMT.#####", - "creation": "2019-10-22 12:06:17.491113", - "doctype": "DocType", - "editable_grid": 1, - "engine": "InnoDB", - "field_order": [ - "start_time", - "appointment_duration", - "timezone", - "atendees_section", - "requester_type", - "requester", - "col_br_1", - "invitee_type", - "invitee" - ], - "fields": [ - { - "fieldname": "start_time", - "fieldtype": "Datetime", - "in_list_view": 1, - "label": "Start Time", - "reqd": 1 - }, - { - "fieldname": "appointment_duration", - "fieldtype": "Data", - "in_list_view": 1, - "label": "Duration in minutes", - "reqd": 1 - }, - { - "fieldname": "requester", - "fieldtype": "Dynamic Link", - "in_list_view": 1, - "label": "Appointment Requester ", - "options": "requester_type", - "reqd": 1 - }, - { - "fieldname": "invitee", - "fieldtype": "Dynamic Link", - "in_list_view": 1, - "label": "Appointment Invitee", - "options": "invitee_type", - "reqd": 1 - }, - { - "fieldname": "timezone", - "fieldtype": "Data", - "label": "Requester's Timezone", - "reqd": 1 - }, - { - "fieldname": "atendees_section", - "fieldtype": "Section Break", - "label": "Atendees" - }, - { - "fieldname": "requester_type", - "fieldtype": "Link", - "label": "Requester Type", - "options": "DocType", - "reqd": 1 - }, - { - "fieldname": "col_br_1", - "fieldtype": "Column Break" - }, - { - "fieldname": "invitee_type", - "fieldtype": "Link", - "label": "Invitee Type", - "options": "DocType", - "reqd": 1 - } - ], - "modified": "2019-10-22 12:18:20.719128", - "modified_by": "Administrator", - "module": "Communication", - "name": "Appointment", - "name_case": "UPPER CASE", - "owner": "Administrator", - "permissions": [ - { - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "print": 1, - "read": 1, - "report": 1, - "role": "System Manager", - "share": 1, - "write": 1 - } - ], - "quick_entry": 1, - "sort_field": "modified", - "sort_order": "DESC", - "track_changes": 1 -} \ No newline at end of file diff --git a/erpnext/communication/doctype/appointment/appointment.py b/erpnext/communication/doctype/appointment/appointment.py deleted file mode 100644 index 204b066031..0000000000 --- a/erpnext/communication/doctype/appointment/appointment.py +++ /dev/null @@ -1,10 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2019, Frappe Technologies Pvt. Ltd. and contributors -# For license information, please see license.txt - -from __future__ import unicode_literals -# import frappe -from frappe.model.document import Document - -class Appointment(Document): - pass diff --git a/erpnext/communication/doctype/appointment/test_appointment.py b/erpnext/communication/doctype/appointment/test_appointment.py deleted file mode 100644 index 702ac7176f..0000000000 --- a/erpnext/communication/doctype/appointment/test_appointment.py +++ /dev/null @@ -1,10 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2019, Frappe Technologies Pvt. Ltd. and Contributors -# See license.txt -from __future__ import unicode_literals - -# import frappe -import unittest - -class TestAppointment(unittest.TestCase): - pass From be5c6e7aecfd82c0bb06096ba6d3d75068a9d980 Mon Sep 17 00:00:00 2001 From: 0Pranav Date: Wed, 30 Oct 2019 11:14:49 +0530 Subject: [PATCH 19/44] fix:readability --- .../doctype/maintenance_schedule/maintenance_schedule.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.js b/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.js index e91f478aa4..41c0ccad57 100644 --- a/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.js +++ b/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.js @@ -21,10 +21,9 @@ frappe.ui.form.on('Maintenance Schedule', { } }, refresh: function(frm) { - setTimeout(()=> { - debugger; - frm.toggle_display('generate_schedule',!(frm.is_new())); - frm.toggle_display('schedule',!(frm.is_new())); + setTimeout(() => { + frm.toggle_display('generate_schedule', !(frm.is_new())); + frm.toggle_display('schedule', !(frm.is_new())); },10); }, customer: function(frm) { From da5bf5a7c41925d970f43849b19da1380ae4f27a Mon Sep 17 00:00:00 2001 From: 0Pranav Date: Wed, 30 Oct 2019 11:24:58 +0530 Subject: [PATCH 20/44] fix:indentation --- .../doctype/maintenance_schedule/maintenance_schedule.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.js b/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.js index 41c0ccad57..ea48b4ef8b 100644 --- a/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.js +++ b/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.js @@ -21,10 +21,10 @@ frappe.ui.form.on('Maintenance Schedule', { } }, refresh: function(frm) { - setTimeout(() => { - frm.toggle_display('generate_schedule', !(frm.is_new())); - frm.toggle_display('schedule', !(frm.is_new())); - },10); + setTimeout(() => { + frm.toggle_display('generate_schedule', !(frm.is_new())); + frm.toggle_display('schedule', !(frm.is_new())); + },10); }, customer: function(frm) { erpnext.utils.get_party_details(frm) From e127d937f745e58b857d425d2eacc497d49e75cd Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Wed, 30 Oct 2019 13:31:05 +0530 Subject: [PATCH 21/44] fix(ExpenseClaim): List filter config for Rejected and Unpaid (#19434) --- erpnext/hr/doctype/expense_claim/expense_claim_list.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/erpnext/hr/doctype/expense_claim/expense_claim_list.js b/erpnext/hr/doctype/expense_claim/expense_claim_list.js index 0e25e66687..6195ad414a 100644 --- a/erpnext/hr/doctype/expense_claim/expense_claim_list.js +++ b/erpnext/hr/doctype/expense_claim/expense_claim_list.js @@ -2,11 +2,11 @@ frappe.listview_settings['Expense Claim'] = { add_fields: ["total_claimed_amount", "docstatus"], get_indicator: function(doc) { if(doc.status == "Paid") { - return [__("Paid"), "green", "status,=,'Paid'"]; + return [__("Paid"), "green", "status,=,Paid"]; }else if(doc.status == "Unpaid") { - return [__("Unpaid"), "orange"]; + return [__("Unpaid"), "orange", "status,=,Unpaid"]; } else if(doc.status == "Rejected") { - return [__("Rejected"), "grey"]; + return [__("Rejected"), "grey", "status,=,Rejected"]; } } }; From 07b74533fe47b671e051e512f0d83b85eb51300a Mon Sep 17 00:00:00 2001 From: 0Pranav Date: Wed, 30 Oct 2019 13:47:49 +0530 Subject: [PATCH 22/44] fix: error message matches field name --- .../doctype/maintenance_schedule/maintenance_schedule.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.py b/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.py index 1ad7fc8552..94d85f77ef 100644 --- a/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.py +++ b/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.py @@ -150,7 +150,7 @@ class MaintenanceSchedule(TransactionBase): elif not d.no_of_visits: throw(_("Please mention no of visits required")) elif not d.sales_person: - throw(_("Please select Incharge Person's name for item: {0}".format(d.item_name))) + throw(_("Please select a Sales Person for item: {0}".format(d.item_name))) if getdate(d.start_date) >= getdate(d.end_date): throw(_("Start date should be less than end date for Item {0}").format(d.item_code)) From c8333d4b41386a386d87aa8469dcf07b1cc2b768 Mon Sep 17 00:00:00 2001 From: 0Pranav Date: Wed, 30 Oct 2019 13:48:01 +0530 Subject: [PATCH 23/44] fix: codacy --- .../doctype/maintenance_schedule/maintenance_schedule.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.js b/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.js index ea48b4ef8b..e940b6050c 100644 --- a/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.js +++ b/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.js @@ -21,7 +21,7 @@ frappe.ui.form.on('Maintenance Schedule', { } }, refresh: function(frm) { - setTimeout(() => { + setTimeout(() => { frm.toggle_display('generate_schedule', !(frm.is_new())); frm.toggle_display('schedule', !(frm.is_new())); },10); From d8abac327878bf723cc2a896eaeb41d46e7614ee Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Wed, 30 Oct 2019 14:06:56 +0530 Subject: [PATCH 24/44] fix: typo in production plan --- .../manufacturing/doctype/production_plan/production_plan.js | 2 +- erpnext/translations/af.csv | 2 +- erpnext/translations/am.csv | 2 +- erpnext/translations/ar.csv | 2 +- erpnext/translations/bg.csv | 2 +- erpnext/translations/bn.csv | 2 +- erpnext/translations/bs.csv | 2 +- erpnext/translations/ca.csv | 2 +- erpnext/translations/cs.csv | 2 +- erpnext/translations/da.csv | 2 +- erpnext/translations/de.csv | 2 +- erpnext/translations/el.csv | 2 +- erpnext/translations/es.csv | 2 +- erpnext/translations/et.csv | 2 +- erpnext/translations/fa.csv | 2 +- erpnext/translations/fi.csv | 2 +- erpnext/translations/fr.csv | 2 +- erpnext/translations/gu.csv | 2 +- erpnext/translations/hi.csv | 2 +- erpnext/translations/hr.csv | 2 +- erpnext/translations/hu.csv | 2 +- erpnext/translations/id.csv | 2 +- erpnext/translations/is.csv | 2 +- erpnext/translations/it.csv | 2 +- erpnext/translations/ja.csv | 2 +- erpnext/translations/km.csv | 2 +- erpnext/translations/kn.csv | 2 +- erpnext/translations/ko.csv | 2 +- erpnext/translations/ku.csv | 2 +- erpnext/translations/lo.csv | 2 +- erpnext/translations/lt.csv | 2 +- erpnext/translations/lv.csv | 2 +- erpnext/translations/mk.csv | 2 +- erpnext/translations/ml.csv | 2 +- erpnext/translations/mr.csv | 2 +- erpnext/translations/ms.csv | 2 +- erpnext/translations/my.csv | 2 +- erpnext/translations/nl.csv | 2 +- erpnext/translations/no.csv | 2 +- erpnext/translations/pl.csv | 2 +- erpnext/translations/ps.csv | 2 +- erpnext/translations/pt.csv | 2 +- erpnext/translations/ro.csv | 2 +- erpnext/translations/ru.csv | 2 +- erpnext/translations/si.csv | 2 +- erpnext/translations/sk.csv | 2 +- erpnext/translations/sl.csv | 2 +- erpnext/translations/sq.csv | 2 +- erpnext/translations/sr.csv | 2 +- erpnext/translations/sv.csv | 2 +- erpnext/translations/sw.csv | 2 +- erpnext/translations/ta.csv | 2 +- erpnext/translations/te.csv | 2 +- erpnext/translations/th.csv | 2 +- erpnext/translations/tr.csv | 2 +- erpnext/translations/uk.csv | 2 +- erpnext/translations/ur.csv | 2 +- erpnext/translations/uz.csv | 2 +- erpnext/translations/vi.csv | 2 +- erpnext/translations/zh.csv | 2 +- erpnext/translations/zh_tw.csv | 2 +- 61 files changed, 61 insertions(+), 61 deletions(-) diff --git a/erpnext/manufacturing/doctype/production_plan/production_plan.js b/erpnext/manufacturing/doctype/production_plan/production_plan.js index 2aeea5827d..4b654b47e6 100644 --- a/erpnext/manufacturing/doctype/production_plan/production_plan.js +++ b/erpnext/manufacturing/doctype/production_plan/production_plan.js @@ -103,7 +103,7 @@ frappe.ui.form.on('Production Plan', { ${__('Reserved Qty for Production: Raw materials quantity to make manufacturing items.')}
  • - ${__('Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.')} + ${__('Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.')}
  • diff --git a/erpnext/translations/af.csv b/erpnext/translations/af.csv index f74448e159..3cb2e8da50 100644 --- a/erpnext/translations/af.csv +++ b/erpnext/translations/af.csv @@ -1562,7 +1562,7 @@ DocType: Sales Invoice,Payment Due Date,Betaaldatum apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","Voorbehou Aantal: Hoeveelheid te koop bestel, maar nie afgelewer nie." DocType: Drug Prescription,Interval UOM,Interval UOM DocType: Customer,"Reselect, if the chosen address is edited after save","Herstel, as die gekose adres geredigeer word na die stoor" -apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,Voorbehou Aantal vir Onderkontrakte: Hoeveelheid grondstowwe om onderverpakte items te maak. +apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,Voorbehou Aantal vir Onderkontrakte: Hoeveelheid grondstowwe om onderverpakte items te maak. apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,Item Variant {0} bestaan reeds met dieselfde eienskappe DocType: Item,Hub Publishing Details,Hub Publishing Details apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening','Oopmaak' diff --git a/erpnext/translations/am.csv b/erpnext/translations/am.csv index 6b2e47b703..1d07f516f2 100644 --- a/erpnext/translations/am.csv +++ b/erpnext/translations/am.csv @@ -1560,7 +1560,7 @@ DocType: Sales Invoice,Payment Due Date,ክፍያ መጠናቀቅ ያለበት apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.",የተያዙ ጫፎች ብዛት ለሽያጭ የታዘዘ ፣ ግን አልደረሰም ፡፡ DocType: Drug Prescription,Interval UOM,የጊዜ ክፍተት UOM DocType: Customer,"Reselect, if the chosen address is edited after save",የተመረጠው አድራሻ ከተቀመጠ በኋላ ማስተካከያ ከተደረገበት አይምረጡ -apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,የተያዙ ዕቃዎች ለንዑስ-ኮንትራክተር-ንዑስ-ንዑስ ንጥል ነገሮችን ለመስራት ጥሬ ዕቃዎች ብዛት። +apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,የተያዙ ዕቃዎች ለንዑስ-ኮንትራክተር-ንዑስ-ንዑስ ንጥል ነገሮችን ለመስራት ጥሬ ዕቃዎች ብዛት። apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,ንጥል ተለዋጭ {0} ቀድሞውኑ ተመሳሳይ ባሕርያት ጋር አለ DocType: Item,Hub Publishing Details,ሃቢ የህትመት ዝርዝሮች apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening','በመክፈት ላይ' diff --git a/erpnext/translations/ar.csv b/erpnext/translations/ar.csv index 05ccdbfb46..b20bf97dc2 100644 --- a/erpnext/translations/ar.csv +++ b/erpnext/translations/ar.csv @@ -1581,7 +1581,7 @@ DocType: Sales Invoice,Payment Due Date,تاريخ استحقاق السداد apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.",الكمية المحجوزة : الكمية المطلوبة لل بيع، ولكن لم يتم تسليمها . DocType: Drug Prescription,Interval UOM,الفاصل الزمني أوم DocType: Customer,"Reselect, if the chosen address is edited after save",إعادة تحديد، إذا تم تحرير عنوان المختار بعد حفظ -apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,الكمية المحجوزة للعقد من الباطن: كمية المواد الخام لصنع سلع من الباطن. +apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,الكمية المحجوزة للعقد من الباطن: كمية المواد الخام لصنع سلع من الباطن. apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,متغير الصنف {0} موجود بالفعل مع نفس الخصائص DocType: Item,Hub Publishing Details,هاب تفاصيل النشر apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening','افتتاحي' diff --git a/erpnext/translations/bg.csv b/erpnext/translations/bg.csv index 9da1eb3a82..fbb2b0f213 100644 --- a/erpnext/translations/bg.csv +++ b/erpnext/translations/bg.csv @@ -1562,7 +1562,7 @@ DocType: Sales Invoice,Payment Due Date,Дължимото плащане Дат apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","Количество, запазено: Количество, поръчано за продажба, но не е доставено." DocType: Drug Prescription,Interval UOM,Интервал (мерна единица) DocType: Customer,"Reselect, if the chosen address is edited after save","Преименувайте отново, ако избраният адрес се редактира след запазване" -apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,"Количество, запазено за подизпълнение: Количество суровини за изработване на извадени продукти." +apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,"Количество, запазено за подизпълнение: Количество суровини за изработване на извадени продукти." apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,Позиция Variant {0} вече съществува с едни и същи атрибути DocType: Item,Hub Publishing Details,Подробна информация за издателя apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening',"""Начален баланс""" diff --git a/erpnext/translations/bn.csv b/erpnext/translations/bn.csv index 67ef37725c..26a3c33890 100644 --- a/erpnext/translations/bn.csv +++ b/erpnext/translations/bn.csv @@ -1544,7 +1544,7 @@ DocType: Sales Invoice,Payment Due Date,পরিশোধযোগ্য তা apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","সংরক্ষিত পরিমাণ: পরিমাণ বিক্রয়ের জন্য অর্ডার করা হয়েছে, তবে বিতরণ করা হয়নি।" DocType: Drug Prescription,Interval UOM,অন্তর্বর্তী UOM DocType: Customer,"Reselect, if the chosen address is edited after save",সংরক্ষণ করার পরে যদি নির্বাচিত ঠিকানাটি সম্পাদনা করা হয় তবে নির্বাচন বাতিল করুন -apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,সাবকন্ট্রাক্টের জন্য সংরক্ষিত পরিমাণ: উপকোট্রাক্ট আইটেমগুলি তৈরি করতে কাঁচামাল পরিমাণ। +apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,সাবকন্ট্রাক্টের জন্য সংরক্ষিত পরিমাণ: উপকোট্রাক্ট আইটেমগুলি তৈরি করতে কাঁচামাল পরিমাণ। apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,আইটেম ভেরিয়েন্ট {0} ইতিমধ্যে একই বৈশিষ্ট্যাবলী সঙ্গে বিদ্যমান DocType: Item,Hub Publishing Details,হাব প্রকাশনা বিবরণ apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening',' শুরু' diff --git a/erpnext/translations/bs.csv b/erpnext/translations/bs.csv index fe7d8c828e..aa148cb135 100644 --- a/erpnext/translations/bs.csv +++ b/erpnext/translations/bs.csv @@ -1581,7 +1581,7 @@ DocType: Sales Invoice,Payment Due Date,Plaćanje Due Date apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","Rezervirano Količina : Količina naručiti za prodaju , ali nije dostavljena ." DocType: Drug Prescription,Interval UOM,Interval UOM DocType: Customer,"Reselect, if the chosen address is edited after save","Ponovo odaberite, ako je izabrana adresa uređena nakon čuvanja" -apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,Količina rezervisanog za podugovor: Količina sirovina za izradu predmeta koji se oduzimaju. +apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,Količina rezervisanog za podugovor: Količina sirovina za izradu predmeta koji se oduzimaju. apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,Stavka Variant {0} već postoji s istim atributima DocType: Item,Hub Publishing Details,Detalji izdavanja stanice apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening','Otvaranje' diff --git a/erpnext/translations/ca.csv b/erpnext/translations/ca.csv index da6edd5792..fd11fe6941 100644 --- a/erpnext/translations/ca.csv +++ b/erpnext/translations/ca.csv @@ -1581,7 +1581,7 @@ DocType: Sales Invoice,Payment Due Date,Data de pagament apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","Reservats Quantitat: Quantitat va ordenar a la venda, però no entregat." DocType: Drug Prescription,Interval UOM,Interval UOM DocType: Customer,"Reselect, if the chosen address is edited after save","Torneu a seleccionar, si l'adreça escollida s'edita després de desar-la" -apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,Quantitat reservada per al subcontracte: quantitat de matèries primeres per fabricar articles subcontractats. +apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,Quantitat reservada per al subcontracte: quantitat de matèries primeres per fabricar articles subcontractats. apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,Article Variant {0} ja existeix amb els mateixos atributs DocType: Item,Hub Publishing Details,Detalls de publicació del Hub apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening','Obertura' diff --git a/erpnext/translations/cs.csv b/erpnext/translations/cs.csv index 685966548e..43dd383f50 100644 --- a/erpnext/translations/cs.csv +++ b/erpnext/translations/cs.csv @@ -1580,7 +1580,7 @@ DocType: Sales Invoice,Payment Due Date,Splatno dne apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","Reserved Množství: Množství objednal k prodeji, ale není doručena." DocType: Drug Prescription,Interval UOM,Interval UOM DocType: Customer,"Reselect, if the chosen address is edited after save","Znovu vyberte, pokud je zvolená adresa po uložení upravena" -apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,Vyhrazeno Množství pro subdodávky: Množství surovin pro výrobu subdodávek. +apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,Vyhrazeno Množství pro subdodávky: Množství surovin pro výrobu subdodávek. apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,Bod Variant {0} již existuje se stejnými vlastnostmi DocType: Item,Hub Publishing Details,Podrobnosti o publikování Hubu apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening',"""Otevírací""" diff --git a/erpnext/translations/da.csv b/erpnext/translations/da.csv index 1f185f1acd..0120e3c661 100644 --- a/erpnext/translations/da.csv +++ b/erpnext/translations/da.csv @@ -1562,7 +1562,7 @@ DocType: Sales Invoice,Payment Due Date,Sidste betalingsdato apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","Reserveret antal: Mængde bestilt til salg, men ikke leveret." DocType: Drug Prescription,Interval UOM,Interval UOM DocType: Customer,"Reselect, if the chosen address is edited after save","Vælg igen, hvis den valgte adresse redigeres efter gem" -apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,Reserveret antal til underentreprise: Råvaremængde til fremstilling af underleverede genstande. +apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,Reserveret antal til underentreprise: Råvaremængde til fremstilling af underleverede genstande. apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,Item Variant {0} findes allerede med samme attributter DocType: Item,Hub Publishing Details,Hub Publishing Detaljer apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening','Åbner' diff --git a/erpnext/translations/de.csv b/erpnext/translations/de.csv index 52394682f0..2e25a127d8 100644 --- a/erpnext/translations/de.csv +++ b/erpnext/translations/de.csv @@ -1581,7 +1581,7 @@ DocType: Sales Invoice,Payment Due Date,Zahlungsstichtag apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","Reservierte Menge: Für den Verkauf bestellte Menge, aber noch nicht geliefert." DocType: Drug Prescription,Interval UOM,Intervall UOM DocType: Customer,"Reselect, if the chosen address is edited after save","Wählen Sie erneut, wenn die gewählte Adresse nach dem Speichern bearbeitet wird" -apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,Reservierte Menge für Lohnbearbeiter: Rohstoffmenge für Lohnbearbeiter. +apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,Reservierte Menge für Lohnbearbeiter: Rohstoffmenge für Lohnbearbeiter. apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,Artikelvariante {0} mit denselben Attributen existiert bereits DocType: Item,Hub Publishing Details,Hub-Veröffentlichungsdetails apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening',"""Eröffnung""" diff --git a/erpnext/translations/el.csv b/erpnext/translations/el.csv index faac064b63..3e641e10a0 100644 --- a/erpnext/translations/el.csv +++ b/erpnext/translations/el.csv @@ -1581,7 +1581,7 @@ DocType: Sales Invoice,Payment Due Date,Ημερομηνία λήξης προθ apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.",Δεσμευμένη ποσότητα : ποσότητα που παραγγέλθηκε για πώληση αλλά δεν παραδόθηκε. DocType: Drug Prescription,Interval UOM,Διαστήματα UOM DocType: Customer,"Reselect, if the chosen address is edited after save","Επαναφέρετε την επιλογή, εάν η επιλεγμένη διεύθυνση επεξεργαστεί μετά την αποθήκευση" -apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,Προβλεπόμενη ποσότητα για υπεργολαβία: Ποσότητα πρώτων υλών για την πραγματοποίηση υποκλάδων. +apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,Προβλεπόμενη ποσότητα για υπεργολαβία: Ποσότητα πρώτων υλών για την πραγματοποίηση υποκλάδων. apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,Θέση Παραλλαγή {0} υπάρχει ήδη με ίδια χαρακτηριστικά DocType: Item,Hub Publishing Details,Στοιχεία δημοσίευσης Hub apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening',«Άνοιγμα» diff --git a/erpnext/translations/es.csv b/erpnext/translations/es.csv index 18fd8c8703..6e128923d7 100644 --- a/erpnext/translations/es.csv +++ b/erpnext/translations/es.csv @@ -1562,7 +1562,7 @@ DocType: Sales Invoice,Payment Due Date,Fecha de pago apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","Cantidad Reservada: Cantidad a pedir a la venta , pero no entregado." DocType: Drug Prescription,Interval UOM,Intervalo UOM DocType: Customer,"Reselect, if the chosen address is edited after save","Vuelva a seleccionar, si la dirección elegida se edita después de guardar" -apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,Cantidad reservada para subcontrato: Cantidad de materias primas para hacer artículos subcotractados. +apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,Cantidad reservada para subcontrato: Cantidad de materias primas para hacer artículos subcotractados. apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,Artículo Variant {0} ya existe con los mismos atributos DocType: Item,Hub Publishing Details,Detalle de Publicación del Hub apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening','Apertura' diff --git a/erpnext/translations/et.csv b/erpnext/translations/et.csv index 7b873423c8..bd042b8093 100644 --- a/erpnext/translations/et.csv +++ b/erpnext/translations/et.csv @@ -1558,7 +1558,7 @@ DocType: Sales Invoice,Payment Due Date,Maksetähtpäevast apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","Reserveeritud kogus: Müügiks tellitud kogus, kuid tarnimata." DocType: Drug Prescription,Interval UOM,Intervall UOM DocType: Customer,"Reselect, if the chosen address is edited after save","Kui valite valitud aadressi pärast salvestamist, vali uuesti" -apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,Allhankelepingu jaoks reserveeritud kogus: Tooraine kogus alamhangete jaoks. +apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,Allhankelepingu jaoks reserveeritud kogus: Tooraine kogus alamhangete jaoks. apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,Punkt Variant {0} on juba olemas sama atribuute DocType: Item,Hub Publishing Details,Hubi avaldamise üksikasjad apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening',"Avamine" diff --git a/erpnext/translations/fa.csv b/erpnext/translations/fa.csv index ffd013e8dd..f9fd4279f9 100644 --- a/erpnext/translations/fa.csv +++ b/erpnext/translations/fa.csv @@ -1544,7 +1544,7 @@ DocType: Sales Invoice,Payment Due Date,پرداخت با توجه تاریخ apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.",Qty رزرو شده: مقدار سفارش برای فروش سفارش داده می شود ، اما تحویل داده نمی شود. DocType: Drug Prescription,Interval UOM,فاصله UOM DocType: Customer,"Reselect, if the chosen address is edited after save",در صورتی که آدرس انتخاب شده پس از ذخیره ویرایش، مجددا انتخاب کنید -apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,Qty رزرو شده برای قراردادهای فرعی: مقدار مواد اولیه برای ساخت وسایل فرعی. +apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,Qty رزرو شده برای قراردادهای فرعی: مقدار مواد اولیه برای ساخت وسایل فرعی. apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,مورد متغیر {0} در حال حاضر با ویژگی های همان وجود دارد DocType: Item,Hub Publishing Details,جزئیات انتشار هاب apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening','افتتاح' diff --git a/erpnext/translations/fi.csv b/erpnext/translations/fi.csv index c028c30ba4..1b56db2b77 100644 --- a/erpnext/translations/fi.csv +++ b/erpnext/translations/fi.csv @@ -1562,7 +1562,7 @@ DocType: Sales Invoice,Payment Due Date,Maksun eräpäivä apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","Varattu määrä: Myytävänä oleva määrä, mutta ei toimitettu." DocType: Drug Prescription,Interval UOM,Interval UOM DocType: Customer,"Reselect, if the chosen address is edited after save","Vahvista valinta uudelleen, jos valittua osoitetta muokataan tallennuksen jälkeen" -apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,Varattu määrä alihankintasopimuksille: Raaka-aineiden määrä alihankittujen tuotteiden valmistamiseksi. +apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,Varattu määrä alihankintasopimuksille: Raaka-aineiden määrä alihankittujen tuotteiden valmistamiseksi. apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,Tuote Variant {0} on jo olemassa samoja ominaisuuksia DocType: Item,Hub Publishing Details,Hub-julkaisutiedot apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening','Avattu' diff --git a/erpnext/translations/fr.csv b/erpnext/translations/fr.csv index 67e9885be9..874bfb0d8b 100644 --- a/erpnext/translations/fr.csv +++ b/erpnext/translations/fr.csv @@ -1583,7 +1583,7 @@ DocType: Sales Invoice,Payment Due Date,Date d'Échéance de Paiement apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","Réservés Quantité: Quantité de commande pour la vente , mais pas livré ." DocType: Drug Prescription,Interval UOM,UDM d'Intervalle DocType: Customer,"Reselect, if the chosen address is edited after save","Re-sélectionner, si l'adresse choisie est éditée après l'enregistrement" -apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,Qté réservée aux sous-traitants: quantité de matières premières permettant de fabriquer des articles sous-traités. +apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,Qté réservée aux sous-traitants: quantité de matières premières permettant de fabriquer des articles sous-traités. apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,La Variante de l'Article {0} existe déjà avec les mêmes caractéristiques DocType: Item,Hub Publishing Details,Détails Publiés sur le Hub apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening','Ouverture' diff --git a/erpnext/translations/gu.csv b/erpnext/translations/gu.csv index eb35e24ebd..ffc0c4f695 100644 --- a/erpnext/translations/gu.csv +++ b/erpnext/translations/gu.csv @@ -1543,7 +1543,7 @@ DocType: Sales Invoice,Payment Due Date,ચુકવણી કારણે ત apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","રિઝર્વેટેડ ક્વોટી: વેચવા માટેનો જથ્થો આપ્યો, પરંતુ પહોંચાડ્યો નહીં." DocType: Drug Prescription,Interval UOM,અંતરાલ UOM DocType: Customer,"Reselect, if the chosen address is edited after save","રીસલેક્ટ કરો, જો સાચવેલા સરનામાંને સેવ કર્યા પછી સંપાદિત કરવામાં આવે છે" -apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,સબકોન્ટ્રેક્ટ માટે અનામત પ્રમાણ: સબકોટ્રેક્ટ વસ્તુઓ બનાવવા માટે કાચા માલનો જથ્થો. +apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,સબકોન્ટ્રેક્ટ માટે અનામત પ્રમાણ: સબકોટ્રેક્ટ વસ્તુઓ બનાવવા માટે કાચા માલનો જથ્થો. apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,વસ્તુ વેરિએન્ટ {0} પહેલાથી જ લક્ષણો સાથે હાજર DocType: Item,Hub Publishing Details,હબ પબ્લિશિંગ વિગતો apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening','શરૂઆત' diff --git a/erpnext/translations/hi.csv b/erpnext/translations/hi.csv index 9b5fc417c7..d745155fd7 100644 --- a/erpnext/translations/hi.csv +++ b/erpnext/translations/hi.csv @@ -1578,7 +1578,7 @@ DocType: Sales Invoice,Payment Due Date,भुगतान की नियत apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","सुरक्षित मात्रा: मात्रा बिक्री के लिए आदेश दिया है , लेकिन नहीं पहुंचा." DocType: Drug Prescription,Interval UOM,अंतराल UOM DocType: Customer,"Reselect, if the chosen address is edited after save","अचयनित करें, अगर सहेजे जाने के बाद चुना हुआ पता संपादित किया गया है" -apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,सब-कॉन्ट्रैक्ट के लिए आरक्षित मात्रा: कच्चे माल की मात्रा उप-निर्मित आइटम बनाने के लिए। +apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,सब-कॉन्ट्रैक्ट के लिए आरक्षित मात्रा: कच्चे माल की मात्रा उप-निर्मित आइटम बनाने के लिए। apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,मद संस्करण {0} पहले से ही एक ही गुण के साथ मौजूद है DocType: Item,Hub Publishing Details,हब प्रकाशन विवरण apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening','उद्घाटन' diff --git a/erpnext/translations/hr.csv b/erpnext/translations/hr.csv index d49b79a9a5..1e9d77ab4a 100644 --- a/erpnext/translations/hr.csv +++ b/erpnext/translations/hr.csv @@ -1581,7 +1581,7 @@ DocType: Sales Invoice,Payment Due Date,Plaćanje Due Date apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","Rezervirano Količina : Količina naručiti za prodaju , ali nije dostavljena ." DocType: Drug Prescription,Interval UOM,Interval UOM DocType: Customer,"Reselect, if the chosen address is edited after save",Ponovno odaberite ako je odabrana adresa uređena nakon spremanja -apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,Količina rezerviranog za podugovor: Količina sirovina za izradu poduhvata. +apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,Količina rezerviranog za podugovor: Količina sirovina za izradu poduhvata. apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,Stavka Varijanta {0} već postoji s istim atributima DocType: Item,Hub Publishing Details,Pojedinosti objavljivanja središta apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening',"Otvaranje ' diff --git a/erpnext/translations/hu.csv b/erpnext/translations/hu.csv index bd8a6f32ff..25ee33ba61 100644 --- a/erpnext/translations/hu.csv +++ b/erpnext/translations/hu.csv @@ -1562,7 +1562,7 @@ DocType: Sales Invoice,Payment Due Date,Fizetési határidő apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","Reserved Mennyiség: Rendelhető mennyiség eladó, de nem teljesített." DocType: Drug Prescription,Interval UOM,Intervallum mértékegysége DocType: Customer,"Reselect, if the chosen address is edited after save","Újra válassza ki, ha a kiválasztott cím szerkesztésre került a mentés után" -apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,Fenntartott mennyiség az alvállalkozók számára: Nyersanyag-mennyiség az alhúzásokhoz. +apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,Fenntartott mennyiség az alvállalkozók számára: Nyersanyag-mennyiség az alhúzásokhoz. apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,Tétel variáció {0} már létezik azonos Jellemzővel DocType: Item,Hub Publishing Details,Hub közzétételének részletei apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening',"""Nyitás""" diff --git a/erpnext/translations/id.csv b/erpnext/translations/id.csv index a49187fba0..127cc572e6 100644 --- a/erpnext/translations/id.csv +++ b/erpnext/translations/id.csv @@ -1562,7 +1562,7 @@ DocType: Sales Invoice,Payment Due Date,Tanggal Jatuh Tempo Pembayaran apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","Reserved Qty: Jumlah memerintahkan untuk dijual, tapi tidak disampaikan." DocType: Drug Prescription,Interval UOM,Interval UOM DocType: Customer,"Reselect, if the chosen address is edited after save","Pilih ulang, jika alamat yang dipilih diedit setelah simpan" -apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,Jumlah Pesanan untuk Sub-kontrak: Kuantitas bahan baku untuk membuat barang-barang yang disubsidi. +apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,Jumlah Pesanan untuk Sub-kontrak: Kuantitas bahan baku untuk membuat barang-barang yang disubsidi. apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,Item Varian {0} sudah ada dengan atribut yang sama DocType: Item,Hub Publishing Details,Rincian Hub Publishing apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening','Awal' diff --git a/erpnext/translations/is.csv b/erpnext/translations/is.csv index 840315752f..5e13baf524 100644 --- a/erpnext/translations/is.csv +++ b/erpnext/translations/is.csv @@ -1562,7 +1562,7 @@ DocType: Sales Invoice,Payment Due Date,Greiðsla Due Date apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","Frátekið magn: Magn pantað til sölu, en ekki afhent." DocType: Drug Prescription,Interval UOM,Interval UOM DocType: Customer,"Reselect, if the chosen address is edited after save","Veldu aftur, ef valið heimilisfang er breytt eftir að vista" -apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,Frátekið magn fyrir undirverktaka: Magn hráefna til að búa til undirverktaka hluti. +apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,Frátekið magn fyrir undirverktaka: Magn hráefna til að búa til undirverktaka hluti. apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,Liður Variant {0} er þegar til staðar með sömu eiginleika DocType: Item,Hub Publishing Details,Hub Publishing Upplýsingar apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening','Opening' diff --git a/erpnext/translations/it.csv b/erpnext/translations/it.csv index 5d3f12a796..5d38b99728 100644 --- a/erpnext/translations/it.csv +++ b/erpnext/translations/it.csv @@ -1581,7 +1581,7 @@ DocType: Sales Invoice,Payment Due Date,Scadenza apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","Riservato Quantità : quantità ordinata in vendita , ma non consegnati ." DocType: Drug Prescription,Interval UOM,Intervallo UOM DocType: Customer,"Reselect, if the chosen address is edited after save","Riseleziona, se l'indirizzo scelto viene modificato dopo il salvataggio" -apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,Qtà riservata per conto lavoro: quantità di materie prime per la produzione di articoli in conto lavoro. +apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,Qtà riservata per conto lavoro: quantità di materie prime per la produzione di articoli in conto lavoro. apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,Prodotto Modello {0} esiste già con gli stessi attributi DocType: Item,Hub Publishing Details,Dettagli di pubblicazione Hub apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening','Apertura' diff --git a/erpnext/translations/ja.csv b/erpnext/translations/ja.csv index 166d4ef724..8e72050f75 100644 --- a/erpnext/translations/ja.csv +++ b/erpnext/translations/ja.csv @@ -1589,7 +1589,7 @@ DocType: Sales Invoice,Payment Due Date,支払期日 apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.",予約数量:販売用に数量が注文されていますが、納品されていません。 DocType: Drug Prescription,Interval UOM,インターバル単位 DocType: Customer,"Reselect, if the chosen address is edited after save",選択したアドレスが保存後に編集された場合は、再選択します。 -apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,外注の予約数量:外注品目を作成するための原料数量。 +apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,外注の予約数量:外注品目を作成するための原料数量。 apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,アイテムバリエーション{0}は既に同じ属性で存在しています DocType: Item,Hub Publishing Details,ハブ公開の詳細 apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening',「オープニング」 diff --git a/erpnext/translations/km.csv b/erpnext/translations/km.csv index 812f6baa78..fefd314ba3 100644 --- a/erpnext/translations/km.csv +++ b/erpnext/translations/km.csv @@ -1553,7 +1553,7 @@ DocType: Sales Invoice,Payment Due Date,ការទូទាត់កាលប apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.",Qty បានបម្រុងទុក: បរិមាណបានបញ្ជាទិញសម្រាប់លក់ប៉ុន្តែមិនបានប្រគល់ឱ្យទេ។ DocType: Drug Prescription,Interval UOM,ចន្លោះពេលវេលា UOM DocType: Customer,"Reselect, if the chosen address is edited after save",ជ្រើសរើសបើអាសយដ្ឋានដែលបានជ្រើសត្រូវបានកែសម្រួលបន្ទាប់ពីរក្សាទុក -apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,Qty ដែលបានបម្រុងទុកសម្រាប់កិច្ចសន្យារង: បរិមាណវត្ថុធាតុដើមដើម្បីធ្វើឱ្យវត្ថុរង។ +apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,Qty ដែលបានបម្រុងទុកសម្រាប់កិច្ចសន្យារង: បរិមាណវត្ថុធាតុដើមដើម្បីធ្វើឱ្យវត្ថុរង។ apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,ធាតុវ៉ារ្យង់ {0} រួចហើយដែលមានគុណលក្ខណៈដូចគ្នា DocType: Item,Hub Publishing Details,ពត៌មានលម្អិតការបោះពុម្ព apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening',"ការបើក" diff --git a/erpnext/translations/kn.csv b/erpnext/translations/kn.csv index 471bd74b38..1673c167f9 100644 --- a/erpnext/translations/kn.csv +++ b/erpnext/translations/kn.csv @@ -1572,7 +1572,7 @@ DocType: Sales Invoice,Payment Due Date,ಪಾವತಿ ಕಾರಣ ದಿನ apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","ಕಾಯ್ದಿರಿಸಲಾಗಿದೆ ಪ್ರಮಾಣ: ಪ್ರಮಾಣ ಮಾರಾಟ ಆದೇಶ , ಆದರೆ ಈಡೇರಿಸಿಲ್ಲ ." DocType: Drug Prescription,Interval UOM,ಮಧ್ಯಂತರ UOM DocType: Customer,"Reselect, if the chosen address is edited after save","ಆಯ್ಕೆ ಮಾಡಿದ ವಿಳಾಸವನ್ನು ಉಳಿಸಿದ ನಂತರ ಸಂಪಾದಿಸಿದ್ದರೆ, ಆಯ್ಕೆ ರದ್ದುಮಾಡಿ" -apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,ಉಪಗುತ್ತಿಗೆಗಾಗಿ ಕ್ಯೂಟಿ ಕಾಯ್ದಿರಿಸಲಾಗಿದೆ: ಉಪಕೋಟ್ರಾಕ್ಟ್ ವಸ್ತುಗಳನ್ನು ತಯಾರಿಸಲು ಕಚ್ಚಾ ವಸ್ತುಗಳ ಪ್ರಮಾಣ. +apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,ಉಪಗುತ್ತಿಗೆಗಾಗಿ ಕ್ಯೂಟಿ ಕಾಯ್ದಿರಿಸಲಾಗಿದೆ: ಉಪಕೋಟ್ರಾಕ್ಟ್ ವಸ್ತುಗಳನ್ನು ತಯಾರಿಸಲು ಕಚ್ಚಾ ವಸ್ತುಗಳ ಪ್ರಮಾಣ. apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,ಐಟಂ ಭಿನ್ನ {0} ಈಗಾಗಲೇ ಅದೇ ಲಕ್ಷಣಗಳು ಅಸ್ತಿತ್ವದಲ್ಲಿದ್ದರೆ DocType: Item,Hub Publishing Details,ಹಬ್ ಪಬ್ಲಿಷಿಂಗ್ ವಿವರಗಳು apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening',ಉದ್ಘಾಟಿಸುತ್ತಿರುವುದು diff --git a/erpnext/translations/ko.csv b/erpnext/translations/ko.csv index ab079ea375..91d8198edd 100644 --- a/erpnext/translations/ko.csv +++ b/erpnext/translations/ko.csv @@ -1594,7 +1594,7 @@ DocType: Sales Invoice,Payment Due Date,지불 기한 apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","예약 수량 : 수량 판매를 위해 주문,하지만 배달되지 않습니다." DocType: Drug Prescription,Interval UOM,간격 UOM DocType: Customer,"Reselect, if the chosen address is edited after save",저장 후 선택한 주소를 다시 선택한 경우 다시 선택하십시오. -apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,외주 용 예약 수량 : 추심 품목을 만들기위한 원자재 수량. +apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,외주 용 예약 수량 : 추심 품목을 만들기위한 원자재 수량. apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,항목 변형 {0} 이미 동일한 속성을 가진 존재 DocType: Item,Hub Publishing Details,허브 출판 세부 정보 apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening','열기' diff --git a/erpnext/translations/ku.csv b/erpnext/translations/ku.csv index af961b144e..8e2d989f0f 100644 --- a/erpnext/translations/ku.csv +++ b/erpnext/translations/ku.csv @@ -1551,7 +1551,7 @@ DocType: Sales Invoice,Payment Due Date,Payment Date ji ber apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","Qty Reserve: Quantity ferman da firotanê, lê nehatiye radest kirin." DocType: Drug Prescription,Interval UOM,UOM Interfer DocType: Customer,"Reselect, if the chosen address is edited after save","Hilbijêre, eger navnîşana bijartî piştî tomarkirinê hate guherandin" -apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,Qiyama Reserve ji bo Nekokkêşanê: Kêmasiya madeyên xav ji bo çêkirina tiştên subcotracted. +apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,Qiyama Reserve ji bo Nekokkêşanê: Kêmasiya madeyên xav ji bo çêkirina tiştên subcontracted. apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,Babetê Variant {0} ji xwe bi taybetmendiyên xwe heman heye DocType: Item,Hub Publishing Details,Agahdariyên Hub apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening','Dergeh' diff --git a/erpnext/translations/lo.csv b/erpnext/translations/lo.csv index e7349a40d1..6343c61203 100644 --- a/erpnext/translations/lo.csv +++ b/erpnext/translations/lo.csv @@ -1576,7 +1576,7 @@ DocType: Sales Invoice,Payment Due Date,ການຊໍາລະເງິນກ apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","Qty ທີ່ສະຫງວນໄວ້: ຈຳ ນວນທີ່ສັ່ງຊື້, ແຕ່ບໍ່ໄດ້ສົ່ງ." DocType: Drug Prescription,Interval UOM,Interval UOM DocType: Customer,"Reselect, if the chosen address is edited after save","ແກ້ໄຂ, ຖ້າຫາກວ່າທີ່ຢູ່ທີ່ເລືອກໄດ້ຖືກແກ້ໄຂຫຼັງຈາກທີ່ບັນທຶກ" -apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,Qty ທີ່ສະຫງວນໄວ້ ສຳ ລັບສັນຍາຍ່ອຍ: ປະລິມານວັດຖຸດິບເພື່ອຜະລິດສິນຄ້າຍ່ອຍ. +apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,Qty ທີ່ສະຫງວນໄວ້ ສຳ ລັບສັນຍາຍ່ອຍ: ປະລິມານວັດຖຸດິບເພື່ອຜະລິດສິນຄ້າຍ່ອຍ. apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,ລາຍການ Variant {0} ມີຢູ່ແລ້ວກັບຄຸນລັກສະນະດຽວກັນ DocType: Item,Hub Publishing Details,Hub Publishing Details apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening',"ເປີດ ' diff --git a/erpnext/translations/lt.csv b/erpnext/translations/lt.csv index a9805ee5d9..2576ccf2e3 100644 --- a/erpnext/translations/lt.csv +++ b/erpnext/translations/lt.csv @@ -1575,7 +1575,7 @@ DocType: Sales Invoice,Payment Due Date,Sumokėti iki apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","Rezervuotas kiekis: Parduodamas kiekis, bet nepristatytas." DocType: Drug Prescription,Interval UOM,Intervalas UOM DocType: Customer,"Reselect, if the chosen address is edited after save","Iš naujo pažymėkite, jei pasirinktas adresas yra redaguotas po įrašymo" -apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,"Subrangos užsakytas kiekis: Žaliavų kiekis, iš kurio gaminami subtraktoriai." +apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,"Subrangos užsakytas kiekis: Žaliavų kiekis, iš kurio gaminami subtraktoriai." apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,Prekė variantas {0} jau egzistuoja su tais pačiais atributais DocType: Item,Hub Publishing Details,Hub Publishing duomenys apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening',"Atidarymas" diff --git a/erpnext/translations/lv.csv b/erpnext/translations/lv.csv index 12348de84d..dfc007654c 100644 --- a/erpnext/translations/lv.csv +++ b/erpnext/translations/lv.csv @@ -1572,7 +1572,7 @@ DocType: Sales Invoice,Payment Due Date,Maksājuma Due Date apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","Reserved Daudzums: pasūtīts pārdod daudzums, bet nav sniegusi." DocType: Drug Prescription,Interval UOM,Intervāls UOM DocType: Customer,"Reselect, if the chosen address is edited after save","Atkārtoti atlasiet, ja pēc saglabāšanas izvēlētā adrese tiek rediģēta" -apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,"Rezervētais daudzums apakšlīgumam: Izejvielu daudzums, lai izgatavotu apakšsavilkumus." +apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,"Rezervētais daudzums apakšlīgumam: Izejvielu daudzums, lai izgatavotu apakšsavilkumus." apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,Postenis Variant {0} jau eksistē ar tiem pašiem atribūtiem DocType: Item,Hub Publishing Details,Hub Publicēšanas informācija apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening',"Atklāšana" diff --git a/erpnext/translations/mk.csv b/erpnext/translations/mk.csv index 51f272675b..7101b25cc7 100644 --- a/erpnext/translations/mk.csv +++ b/erpnext/translations/mk.csv @@ -1563,7 +1563,7 @@ DocType: Sales Invoice,Payment Due Date,Плаќање најдоцна до Д apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","Резервирана количина: Количина нарачана за продажба, но не е доставена." DocType: Drug Prescription,Interval UOM,Интервал UOM DocType: Customer,"Reselect, if the chosen address is edited after save","Ресетирај, ако избраната адреса е изменета по зачувување" -apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,Резервирана количина за подизведувач: Количина на суровини за да се направат супструктивни производи. +apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,Резервирана количина за подизведувач: Количина на суровини за да се направат супструктивни производи. apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,Ставка Варијанта {0} веќе постои со истите атрибути DocType: Item,Hub Publishing Details,Детали за објавување на центар apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening','Отворање' diff --git a/erpnext/translations/ml.csv b/erpnext/translations/ml.csv index 33db47fb4a..495dca46b5 100644 --- a/erpnext/translations/ml.csv +++ b/erpnext/translations/ml.csv @@ -1544,7 +1544,7 @@ DocType: Sales Invoice,Payment Due Date,പെയ്മെന്റ് നിശ apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","റിസർവ്വ് ചെയ്ത ക്യൂട്ടി: അളവ് വിൽപ്പനയ്ക്ക് ഓർഡർ ചെയ്തു, പക്ഷേ വിതരണം ചെയ്തിട്ടില്ല." DocType: Drug Prescription,Interval UOM,ഇടവേള UOM DocType: Customer,"Reselect, if the chosen address is edited after save","തിരഞ്ഞെടുത്തതിനുശേഷം തിരഞ്ഞെടുത്ത വിലാസം എഡിറ്റുചെയ്തിട്ടുണ്ടെങ്കിൽ, തിരഞ്ഞെടുപ്പ് മാറ്റുക" -apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,സബ് കോൺ‌ട്രാക്റ്റിനായി റിസർവ്വ് ചെയ്‌ത ക്യൂട്ടി: സബ്‌കോട്രാക്റ്റ് ഇനങ്ങൾ‌ നിർമ്മിക്കുന്നതിനുള്ള അസംസ്കൃത വസ്തുക്കളുടെ അളവ്. +apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,സബ് കോൺ‌ട്രാക്റ്റിനായി റിസർവ്വ് ചെയ്‌ത ക്യൂട്ടി: സബ്‌കോട്രാക്റ്റ് ഇനങ്ങൾ‌ നിർമ്മിക്കുന്നതിനുള്ള അസംസ്കൃത വസ്തുക്കളുടെ അളവ്. apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,ഇനം വേരിയന്റ് {0} ഇതിനകം അതേ ആട്രിബ്യൂട്ടുകളുമുള്ള നിലവിലുണ്ട് DocType: Item,Hub Publishing Details,ഹബ് പബ്ലിഷിംഗ് വിശദാംശങ്ങൾ apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening','തുറക്കുന്നു' diff --git a/erpnext/translations/mr.csv b/erpnext/translations/mr.csv index 36df9111b4..8ad9738648 100644 --- a/erpnext/translations/mr.csv +++ b/erpnext/translations/mr.csv @@ -1557,7 +1557,7 @@ DocType: Sales Invoice,Payment Due Date,पैसे भरण्याची apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","आरक्षित मात्रा: विक्रीचे आदेश दिले, पण दिले नाहीत." DocType: Drug Prescription,Interval UOM,मध्यांतर UOM DocType: Customer,"Reselect, if the chosen address is edited after save","निवड रद्द केलेला पत्ता जतन केल्यानंतर संपादित केले असल्यास, निवड रद्द करा" -apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,सब कॉन्ट्रॅक्टसाठी राखीव क्वाटीटी: सबकोट्रेक्ट केलेल्या वस्तू तयार करण्यासाठी कच्च्या मालाचे प्रमाण. +apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,सब कॉन्ट्रॅक्टसाठी राखीव क्वाटीटी: सबकोट्रेक्ट केलेल्या वस्तू तयार करण्यासाठी कच्च्या मालाचे प्रमाण. apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,आयटम व्हेरियंट {0} आधीच समान गुणधर्म अस्तित्वात आहे DocType: Item,Hub Publishing Details,हब प्रकाशन तपशील apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening','उघडणे' diff --git a/erpnext/translations/ms.csv b/erpnext/translations/ms.csv index 0db0aa9095..e69a6aa313 100644 --- a/erpnext/translations/ms.csv +++ b/erpnext/translations/ms.csv @@ -1576,7 +1576,7 @@ DocType: Sales Invoice,Payment Due Date,Tarikh Pembayaran apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","Dicadangkan Qty: Kuantiti yang dipesan untuk dijual, tetapi tidak dihantar." DocType: Drug Prescription,Interval UOM,Selang UOM DocType: Customer,"Reselect, if the chosen address is edited after save","Pilih semula, jika alamat yang dipilih disunting selepas menyimpan" -apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,Dicadangkan Qty untuk Subkontrak: Kuantiti bahan mentah untuk membuat item subcotracted. +apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,Dicadangkan Qty untuk Subkontrak: Kuantiti bahan mentah untuk membuat item subcontracted. apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,Perkara Variant {0} telah wujud dengan sifat-sifat yang sama DocType: Item,Hub Publishing Details,Butiran Penerbitan Hab apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening','Pembukaan' diff --git a/erpnext/translations/my.csv b/erpnext/translations/my.csv index 1b4f97e186..cdb2a5ef11 100644 --- a/erpnext/translations/my.csv +++ b/erpnext/translations/my.csv @@ -1576,7 +1576,7 @@ DocType: Sales Invoice,Payment Due Date,ငွေပေးချေမှုရ apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.",ချုပ်ထိန်းထားသည်အရည်အတွက်: QUANTITY ရောင်းရန်အမိန့်ထုတ်ပေမယ့်လက်သို့အပ်ဘူး။ DocType: Drug Prescription,Interval UOM,ကြားကာလ UOM DocType: Customer,"Reselect, if the chosen address is edited after save","Reselect, ရွေးကောက်တော်မူသောလိပ်စာမှတပါးပြီးနောက် edited လျှင်" -apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,Subcontract အဘို့အချုပ်ထိန်းထားသည်အရည်အတွက်: subcotracted ပစ္စည်းများလုပ်ကုန်ကြမ်းအရေအတွက်။ +apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,Subcontract အဘို့အချုပ်ထိန်းထားသည်အရည်အတွက်: subcontracted ပစ္စည်းများလုပ်ကုန်ကြမ်းအရေအတွက်။ apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,item Variant {0} ပြီးသားအတူတူ Attribute တွေနှင့်အတူတည်ရှိမှု့ DocType: Item,Hub Publishing Details,hub ထုတ်ဝေရေးအသေးစိတ် apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening','' ဖွင့်ပွဲ '' diff --git a/erpnext/translations/nl.csv b/erpnext/translations/nl.csv index c14507c783..0f62213936 100644 --- a/erpnext/translations/nl.csv +++ b/erpnext/translations/nl.csv @@ -1591,7 +1591,7 @@ DocType: Sales Invoice,Payment Due Date,Betaling Vervaldatum apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","Gereserveerde Hoeveelheid: Aantal toegewezen aan verkoop, maar nog niet geleverd." DocType: Drug Prescription,Interval UOM,Interval UOM DocType: Customer,"Reselect, if the chosen address is edited after save","Selecteer opnieuw, als het gekozen adres is bewerkt na opslaan" -apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,Gereserveerde hoeveelheid voor onderaanneming: hoeveelheid grondstoffen voor het maken van artikelen die zijn ondergetrokken. +apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,Gereserveerde hoeveelheid voor onderaanneming: hoeveelheid grondstoffen voor het maken van artikelen die zijn ondergetrokken. apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,Artikel Variant {0} bestaat al met dezelfde kenmerken DocType: Item,Hub Publishing Details,Hub publicatie details apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening','Opening' diff --git a/erpnext/translations/no.csv b/erpnext/translations/no.csv index 0995304fb2..89c4dc1a54 100644 --- a/erpnext/translations/no.csv +++ b/erpnext/translations/no.csv @@ -1576,7 +1576,7 @@ DocType: Sales Invoice,Payment Due Date,Betalingsfrist apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","Reservert antall: Antall bestilt for salg, men ikke levert." DocType: Drug Prescription,Interval UOM,Intervall UOM DocType: Customer,"Reselect, if the chosen address is edited after save",Velg hvis den valgte adressen redigeres etter lagre -apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,Reservert antall for underleveranser: Råvaremengde for å lage underleverandørvarer. +apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,Reservert antall for underleveranser: Råvaremengde for å lage underleverandørvarer. apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,Sak Variant {0} finnes allerede med samme attributtene DocType: Item,Hub Publishing Details,Hub Publishing Detaljer apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening',"Opening" diff --git a/erpnext/translations/pl.csv b/erpnext/translations/pl.csv index 97dc1fbd25..4eff151103 100644 --- a/erpnext/translations/pl.csv +++ b/erpnext/translations/pl.csv @@ -1595,7 +1595,7 @@ DocType: Sales Invoice,Payment Due Date,Termin Płatności apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.", DocType: Drug Prescription,Interval UOM,Interwał UOM DocType: Customer,"Reselect, if the chosen address is edited after save","Ponownie wybierz, jeśli wybrany adres jest edytowany po zapisaniu" -apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,Zarezerwowana ilość na zlecenie podwykonawstwa: ilość surowców do produkcji artykułów objętych subkontraktami. +apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,Zarezerwowana ilość na zlecenie podwykonawstwa: ilość surowców do produkcji artykułów objętych subkontraktami. apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,Pozycja Wersja {0} istnieje już z samymi atrybutami DocType: Item,Hub Publishing Details,Szczegóły publikacji wydawnictwa Hub apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening',"Otwarcie" diff --git a/erpnext/translations/ps.csv b/erpnext/translations/ps.csv index 5b0bc317f5..faeaed9032 100644 --- a/erpnext/translations/ps.csv +++ b/erpnext/translations/ps.csv @@ -1550,7 +1550,7 @@ DocType: Sales Invoice,Payment Due Date,د پیسو له امله نېټه apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.",خوندي مقدار: مقدار د پلور لپاره امر کړی ، مګر تحویلی شوی نه دی. DocType: Drug Prescription,Interval UOM,د UOM منځګړیتوب DocType: Customer,"Reselect, if the chosen address is edited after save",بې ځایه کړئ، که چیرې غوره شوي پتې د خوندي کولو وروسته سمبال شي -apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,د فرعي تړون لپاره خوندي مقدار: د فرعي محصولاتو جوړولو لپاره د خامو موادو مقدار. +apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,د فرعي تړون لپاره خوندي مقدار: د فرعي محصولاتو جوړولو لپاره د خامو موادو مقدار. apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,د قالب variant {0} لا د همدې صفتونو شتون لري DocType: Item,Hub Publishing Details,د هوب د خپرولو توضیحات apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening','پرانیستل' diff --git a/erpnext/translations/pt.csv b/erpnext/translations/pt.csv index afb38be64c..60c6f95fa1 100644 --- a/erpnext/translations/pt.csv +++ b/erpnext/translations/pt.csv @@ -1589,7 +1589,7 @@ DocType: Sales Invoice,Payment Due Date,Data Limite de Pagamento apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","Gereserveerd Aantal : Aantal besteld te koop , maar niet geleverd ." DocType: Drug Prescription,Interval UOM,UOM Intervalo DocType: Customer,"Reselect, if the chosen address is edited after save","Reseleccione, se o endereço escolhido for editado após salvar" -apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,Qtd reservada para subcontratação: quantidade de matérias-primas para fazer itens subcotados. +apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,Qtd reservada para subcontratação: quantidade de matérias-primas para fazer itens subcotados. apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,A Variante do Item {0} já existe com mesmos atributos DocType: Item,Hub Publishing Details,Detalhes da publicação do hub apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening','Abertura' diff --git a/erpnext/translations/ro.csv b/erpnext/translations/ro.csv index bfa5f579b9..1678cba0f6 100644 --- a/erpnext/translations/ro.csv +++ b/erpnext/translations/ro.csv @@ -1594,7 +1594,7 @@ DocType: Sales Invoice,Payment Due Date,Data scadentă de plată apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","Rezervate Cantitate: Cantitatea comandat de vânzare, dar nu livrat." DocType: Drug Prescription,Interval UOM,Interval UOM DocType: Customer,"Reselect, if the chosen address is edited after save",Resetați dacă adresa editată este editată după salvare -apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,Cantitate rezervată pentru subcontract: cantitate de materii prime pentru a face obiecte subcontractate. +apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,Cantitate rezervată pentru subcontract: cantitate de materii prime pentru a face obiecte subcontractate. apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,Postul Varianta {0} există deja cu aceleași atribute DocType: Item,Hub Publishing Details,Detalii privind publicarea Hubului apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening',"Deschiderea" diff --git a/erpnext/translations/ru.csv b/erpnext/translations/ru.csv index 3d40fa5645..d9f434070e 100644 --- a/erpnext/translations/ru.csv +++ b/erpnext/translations/ru.csv @@ -1594,7 +1594,7 @@ DocType: Sales Invoice,Payment Due Date,Дата платежа apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","Защищены Кол-во: Количество приказал на продажу, но не поставлены." DocType: Drug Prescription,Interval UOM,Интервал UOM DocType: Customer,"Reselect, if the chosen address is edited after save","Повторно выберите, если выбранный адрес отредактирован после сохранения" -apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,Зарезервированное кол-во для субконтракта: количество сырья для изготовления субподрядных изделий. +apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,Зарезервированное кол-во для субконтракта: количество сырья для изготовления субподрядных изделий. apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,Модификация продукта {0} с этими атрибутами уже существует DocType: Item,Hub Publishing Details,Сведения о публикации концентратора apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening',«Открывается» diff --git a/erpnext/translations/si.csv b/erpnext/translations/si.csv index 25da9a8d04..1ff37159a5 100644 --- a/erpnext/translations/si.csv +++ b/erpnext/translations/si.csv @@ -1546,7 +1546,7 @@ DocType: Sales Invoice,Payment Due Date,ගෙවීම් නියමිත apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.",වෙන් කර ඇති Qty: ප්‍රමාණය විකිණීමට ඇණවුම් කළ නමුත් ලබා නොදේ. DocType: Drug Prescription,Interval UOM,UOM හි වේගය DocType: Customer,"Reselect, if the chosen address is edited after save","තෝරාගත් පසු, තෝරාගත් ලිපිනය සුරැකීමෙන් අනතුරුව සංස්කරණය කරනු ලැබේ" -apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,උප කොන්ත්‍රාත්තු සඳහා වෙන් කර ඇති Qty: උප කොන්ත්‍රාත් අයිතම සෑදීම සඳහා අමුද්‍රව්‍ය ප්‍රමාණය. +apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,උප කොන්ත්‍රාත්තු සඳහා වෙන් කර ඇති Qty: උප කොන්ත්‍රාත් අයිතම සෑදීම සඳහා අමුද්‍රව්‍ය ප්‍රමාණය. apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,අයිතමය ප්රභේද්යයක් {0} දැනටමත් එම ලක්ෂණ සහිත පවතී DocType: Item,Hub Publishing Details,තොරතුරු මධ්යස්ථානය තොරතුරු විස්තර apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening','විවෘත' diff --git a/erpnext/translations/sk.csv b/erpnext/translations/sk.csv index cb6990b5c5..6c26ccc7a9 100644 --- a/erpnext/translations/sk.csv +++ b/erpnext/translations/sk.csv @@ -1592,7 +1592,7 @@ DocType: Sales Invoice,Payment Due Date,Splatné dňa apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","Reserved Množství: Množství objednal k prodeji, ale není doručena." DocType: Drug Prescription,Interval UOM,Interval UOM DocType: Customer,"Reselect, if the chosen address is edited after save","Znovu zvoľte, ak je zvolená adresa upravená po uložení" -apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,Vyhradené množstvo pre subdodávky: Množstvo surovín na výrobu subdodávateľských položiek. +apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,Vyhradené množstvo pre subdodávky: Množstvo surovín na výrobu subdodávateľských položiek. apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,Variant Položky {0} už existuje s rovnakými vlastnosťami DocType: Item,Hub Publishing Details,Podrobnosti o publikovaní Hubu apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening',"""Otváranie""" diff --git a/erpnext/translations/sl.csv b/erpnext/translations/sl.csv index 9bfbe13640..25389d3ead 100644 --- a/erpnext/translations/sl.csv +++ b/erpnext/translations/sl.csv @@ -1575,7 +1575,7 @@ DocType: Sales Invoice,Payment Due Date,Datum zapadlosti apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","Količina rezervirana: Količina, naročena za prodajo, vendar ni dobavljena." DocType: Drug Prescription,Interval UOM,Interval UOM DocType: Customer,"Reselect, if the chosen address is edited after save","Ponovno izberite, če je izbrani naslov urejen po shranjevanju" -apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,Količina za naročila podizvajalcev: Količina surovin za izdelavo odvzetih predmetov. +apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,Količina za naročila podizvajalcev: Količina surovin za izdelavo odvzetih predmetov. apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,Postavka Variant {0} že obstaja z enakimi atributi DocType: Item,Hub Publishing Details,Podrobnosti o objavi vozlišča apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening',"Odpiranje" diff --git a/erpnext/translations/sq.csv b/erpnext/translations/sq.csv index ee7b96eaf8..b9e5278130 100644 --- a/erpnext/translations/sq.csv +++ b/erpnext/translations/sq.csv @@ -1556,7 +1556,7 @@ DocType: Sales Invoice,Payment Due Date,Afati i pageses apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","Sasia e rezervuar: Sasia e porositur për shitje, por nuk dorëzohet." DocType: Drug Prescription,Interval UOM,Interval UOM DocType: Customer,"Reselect, if the chosen address is edited after save","Reselect, nëse adresa e zgjedhur është redaktuar pas ruajtjes" -apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,Sasia e rezervuar për nënkontrakt: Sasia e lëndëve të para për të bërë sende nënkontraktuese. +apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,Sasia e rezervuar për nënkontrakt: Sasia e lëndëve të para për të bërë sende nënkontraktuese. apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,Item Varianti {0} tashmë ekziston me atributet e njëjta DocType: Item,Hub Publishing Details,Detajet e botimit të Hub apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening',"Hapja" diff --git a/erpnext/translations/sr.csv b/erpnext/translations/sr.csv index bd2ca7d760..56d5637f19 100644 --- a/erpnext/translations/sr.csv +++ b/erpnext/translations/sr.csv @@ -1593,7 +1593,7 @@ DocType: Sales Invoice,Payment Due Date,Плаћање Дуе Дате apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","Резервисано Кол : Количина наредио за продају , али не испоручује ." DocType: Drug Prescription,Interval UOM,Интервал УОМ DocType: Customer,"Reselect, if the chosen address is edited after save","Поново изабери, ако је одабрана адреса уређена након чувања" -apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,Количина резервисаног за подуговор: Количине сировина за израду предмета за подухват. +apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,Количина резервисаног за подуговор: Количине сировина за израду предмета за подухват. apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,Тачка Варијанта {0} већ постоји са истим атрибутима DocType: Item,Hub Publishing Details,Детаљи издавања станице apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening','Отварање' diff --git a/erpnext/translations/sv.csv b/erpnext/translations/sv.csv index 8d81f25e42..f32f72ea84 100644 --- a/erpnext/translations/sv.csv +++ b/erpnext/translations/sv.csv @@ -1573,7 +1573,7 @@ DocType: Sales Invoice,Payment Due Date,Förfallodag apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","Reserverad antal: Antal som beställts för försäljning, men inte levererat." DocType: Drug Prescription,Interval UOM,Intervall UOM DocType: Customer,"Reselect, if the chosen address is edited after save",Återmarkera om den valda adressen redigeras efter spara -apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,Reserverad kvantitet för underleverantör: Råvarukvantitet för att tillverka underleverantörer. +apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,Reserverad kvantitet för underleverantör: Råvarukvantitet för att tillverka underleverantörer. apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,Punkt Variant {0} finns redan med samma attribut DocType: Item,Hub Publishing Details,Hub Publishing Detaljer apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening',"Öppna" diff --git a/erpnext/translations/sw.csv b/erpnext/translations/sw.csv index cfe805f434..9641dfc765 100644 --- a/erpnext/translations/sw.csv +++ b/erpnext/translations/sw.csv @@ -1560,7 +1560,7 @@ DocType: Sales Invoice,Payment Due Date,Tarehe ya Kutayarisha Malipo apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","Qty iliyohifadhiwa: Wingi imeamuru kuuzwa, lakini haijafikishwa." DocType: Drug Prescription,Interval UOM,Muda wa UOM DocType: Customer,"Reselect, if the chosen address is edited after save","Pitia tena, ikiwa anwani iliyochaguliwa imebadilishwa baada ya kuokoa" -apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,Qty iliyohifadhiwa kwa Subcontract: Wingi wa malighafi kutengeneza vitu visivyotengwa. +apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,Qty iliyohifadhiwa kwa Subcontract: Wingi wa malighafi kutengeneza vitu visivyotengwa. apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,Tofauti ya kipengee {0} tayari ipo na sifa sawa DocType: Item,Hub Publishing Details,Maelezo ya Uchapishaji wa Hub apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening','Kufungua' diff --git a/erpnext/translations/ta.csv b/erpnext/translations/ta.csv index 34c430afa8..bde61f1188 100644 --- a/erpnext/translations/ta.csv +++ b/erpnext/translations/ta.csv @@ -1565,7 +1565,7 @@ DocType: Sales Invoice,Payment Due Date,கொடுப்பனவு கா apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","பாதுகாக்கப்பட்டவை அளவு: அளவு விற்பனை உத்தரவிட்டார் , ஆனால் கொடுத்தது இல்லை ." DocType: Drug Prescription,Interval UOM,இடைவெளி UOM DocType: Customer,"Reselect, if the chosen address is edited after save","தேர்ந்தெடுக்கப்பட்ட முகவரி சேமிக்கப்பட்ட பிறகு திருத்தப்பட்டால், தேர்வுநீக்கம் செய்யவும்" -apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,துணை ஒப்பந்தத்திற்கான ஒதுக்கப்பட்ட Qty: துணை ஒப்பந்தம் செய்யப்பட்ட பொருட்களை உருவாக்க மூலப்பொருட்களின் அளவு. +apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,துணை ஒப்பந்தத்திற்கான ஒதுக்கப்பட்ட Qty: துணை ஒப்பந்தம் செய்யப்பட்ட பொருட்களை உருவாக்க மூலப்பொருட்களின் அளவு. apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,பொருள் மாற்று {0} ஏற்கனவே அதே பண்புகளை கொண்ட உள்ளது DocType: Item,Hub Publishing Details,ஹப் பப்ளிஷிங் விவரங்கள் apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening','திறந்து' diff --git a/erpnext/translations/te.csv b/erpnext/translations/te.csv index b0a8ade164..14b40bf013 100644 --- a/erpnext/translations/te.csv +++ b/erpnext/translations/te.csv @@ -1545,7 +1545,7 @@ DocType: Sales Invoice,Payment Due Date,చెల్లింపు గడువ apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","రిజర్వు చేయబడిన Qty: పరిమాణం అమ్మకానికి ఆర్డర్ చేయబడింది, కానీ పంపిణీ చేయబడలేదు." DocType: Drug Prescription,Interval UOM,విరామం UOM DocType: Customer,"Reselect, if the chosen address is edited after save","ఎంపిక చేసిన చిరునామా సేవ్ అయిన తర్వాత సవరించబడితే, ఎంపికను తీసివేయండి" -apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,సబ్ కాంట్రాక్ట్ కోసం రిజర్వు చేయబడిన క్యూటి: సబ్‌కట్రాక్టెడ్ వస్తువులను తయారు చేయడానికి ముడి పదార్థాల పరిమాణం. +apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,సబ్ కాంట్రాక్ట్ కోసం రిజర్వు చేయబడిన క్యూటి: సబ్‌కట్రాక్టెడ్ వస్తువులను తయారు చేయడానికి ముడి పదార్థాల పరిమాణం. apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,అంశం వేరియంట్ {0} ఇప్పటికే అదే గుణ ఉంది DocType: Item,Hub Publishing Details,హబ్ ప్రచురణ వివరాలు apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening','ప్రారంభిస్తున్నాడు' diff --git a/erpnext/translations/th.csv b/erpnext/translations/th.csv index 3b32053d7d..ec2e77d0aa 100644 --- a/erpnext/translations/th.csv +++ b/erpnext/translations/th.csv @@ -1595,7 +1595,7 @@ DocType: Sales Invoice,Payment Due Date,วันที่ครบกำหน apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.",ลิขสิทธิ์ จำนวน: จำนวน ที่สั่งซื้อ สำหรับการขาย แต่ ไม่ได้ส่ง DocType: Drug Prescription,Interval UOM,ช่วง UOM DocType: Customer,"Reselect, if the chosen address is edited after save",เลือกใหม่ถ้าที่อยู่ที่เลือกถูกแก้ไขหลังจากบันทึกแล้ว -apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,ปริมาณที่สงวนไว้สำหรับการรับเหมาช่วง: ปริมาณวัตถุดิบเพื่อทำรายการย่อย +apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,ปริมาณที่สงวนไว้สำหรับการรับเหมาช่วง: ปริมาณวัตถุดิบเพื่อทำรายการย่อย apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,รายการตัวแปร {0} อยู่แล้วที่มีลักษณะเดียวกัน DocType: Item,Hub Publishing Details,รายละเอียด Hub Publishing apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening','กำลังเปิด' diff --git a/erpnext/translations/tr.csv b/erpnext/translations/tr.csv index 7a5cc76b46..a35f38c33c 100644 --- a/erpnext/translations/tr.csv +++ b/erpnext/translations/tr.csv @@ -1724,7 +1724,7 @@ DocType: Sales Invoice,Payment Due Date,Son Ödeme Tarihi apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","Ayrılan Miktar: Satış için sipariş edilen, ancak teslim edilmeyen miktar." DocType: Drug Prescription,Interval UOM,Aralık UOM'sı DocType: Customer,"Reselect, if the chosen address is edited after save",Seçilen adres kaydedildikten sonra değiştirilirse yeniden seç -apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,Ayrılmış Taşeron Miktarı: Taşeron ürün yapmak için hammadde miktarı. +apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,Ayrılmış Taşeron Miktarı: Taşeron ürün yapmak için hammadde miktarı. apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,Öğe Variant {0} zaten aynı özelliklere sahip bulunmaktadır DocType: Item,Hub Publishing Details,Hub Yayınlama Ayrıntıları apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening','Açılış' diff --git a/erpnext/translations/uk.csv b/erpnext/translations/uk.csv index 7e1eb60b3b..d7f415f839 100644 --- a/erpnext/translations/uk.csv +++ b/erpnext/translations/uk.csv @@ -1574,7 +1574,7 @@ DocType: Sales Invoice,Payment Due Date,Дата платежу apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","Кількість зарезервованих: кількість замовлена на продаж, але не доставлена." DocType: Drug Prescription,Interval UOM,Інтервал УОМ DocType: Customer,"Reselect, if the chosen address is edited after save","Змініть вибір, якщо обрана адреса буде відредагована після збереження" -apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,"Кількість зарезервованих для субпідряду: кількість сировини для виготовлення предметів, що віднімаються на підряд." +apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,"Кількість зарезервованих для субпідряду: кількість сировини для виготовлення предметів, що віднімаються на підряд." apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,Вже існує варіант позиції {0} з такими атрибутами DocType: Item,Hub Publishing Details,Публікація концентратора apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening',"""Відкривається""" diff --git a/erpnext/translations/ur.csv b/erpnext/translations/ur.csv index 5187789d8e..208fa878dd 100644 --- a/erpnext/translations/ur.csv +++ b/erpnext/translations/ur.csv @@ -1548,7 +1548,7 @@ DocType: Sales Invoice,Payment Due Date,ادائیگی کی وجہ سے تاری apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.",محفوظ مقدار: مقدار فروخت کے لئے آرڈر کی گئی ، لیکن فراہم نہیں کی گئی۔ DocType: Drug Prescription,Interval UOM,انٹرا UOM DocType: Customer,"Reselect, if the chosen address is edited after save",منتخب کرنے کے بعد، منتخب کردہ ایڈریس کو بچانے کے بعد میں ترمیم کیا جاتا ہے -apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,ذیلی معاہدے کے لئے محفوظ مقدار: سب کوٹریکٹ اشیاء بنانے کے لئے خام مال کی مقدار۔ +apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,ذیلی معاہدے کے لئے محفوظ مقدار: سب کوٹریکٹ اشیاء بنانے کے لئے خام مال کی مقدار۔ apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,آئٹم مختلف {0} پہلے ہی صفات کے ساتھ موجود DocType: Item,Hub Publishing Details,ہب پبلشنگ کی تفصیلات apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening',افتتاحی' diff --git a/erpnext/translations/uz.csv b/erpnext/translations/uz.csv index bee2f95f05..e3b0b63655 100644 --- a/erpnext/translations/uz.csv +++ b/erpnext/translations/uz.csv @@ -1558,7 +1558,7 @@ DocType: Sales Invoice,Payment Due Date,To'lov sanasi apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","Savdo zahirasi: Sotish uchun buyurtma berilgan, ammo etkazib berilmagan." DocType: Drug Prescription,Interval UOM,Intervalli UOM DocType: Customer,"Reselect, if the chosen address is edited after save","Tanlangan manzil saqlashdan so'ng tahrirlangan taqdirda, qayta belgilanadi" -apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,Subtrudrat uchun ajratilgan Qty: subkartralangan buyumlarni tayyorlash uchun xom ashyo miqdori. +apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,Subtrudrat uchun ajratilgan Qty: subkartralangan buyumlarni tayyorlash uchun xom ashyo miqdori. apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,Mavzu Variant {0} allaqachon bir xil atributlarga ega DocType: Item,Hub Publishing Details,Hub nashriyot tafsilotlari apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening',"Ochilish" diff --git a/erpnext/translations/vi.csv b/erpnext/translations/vi.csv index ccaa0de4d1..b6eb3d65fe 100644 --- a/erpnext/translations/vi.csv +++ b/erpnext/translations/vi.csv @@ -1575,7 +1575,7 @@ DocType: Sales Invoice,Payment Due Date,Thanh toán đáo hạo apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.","Dành Số lượng: Số lượng đặt hàng để bán, nhưng không chuyển giao." DocType: Drug Prescription,Interval UOM,Interval UOM DocType: Customer,"Reselect, if the chosen address is edited after save","Chọn lại, nếu địa chỉ đã chọn được chỉnh sửa sau khi lưu" -apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,Qty dành riêng cho hợp đồng thầu phụ: Số lượng nguyên liệu thô để làm các mặt hàng được thu nhỏ. +apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,Qty dành riêng cho hợp đồng thầu phụ: Số lượng nguyên liệu thô để làm các mặt hàng được thu nhỏ. apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,Biến thể mẫu hàng {0} đã tồn tại với cùng một thuộc tính DocType: Item,Hub Publishing Details,Chi tiết Xuất bản Trung tâm apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening','Đang mở' diff --git a/erpnext/translations/zh.csv b/erpnext/translations/zh.csv index 93c5e2d48a..1c7985f382 100644 --- a/erpnext/translations/zh.csv +++ b/erpnext/translations/zh.csv @@ -1585,7 +1585,7 @@ DocType: Sales Invoice,Payment Due Date,付款到期日 apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.",版权所有数量:订购数量出售,但未交付。 DocType: Drug Prescription,Interval UOM,间隔UOM DocType: Customer,"Reselect, if the chosen address is edited after save",重新选择,如果所选地址在保存后被编辑 -apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,分包合同的保留数量:制作分项目的原材料数量。 +apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,分包合同的保留数量:制作分项目的原材料数量。 apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,项目变体{0}已经具有相同属性的存在 DocType: Item,Hub Publishing Details,集线器发布细节 apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening',“打开” diff --git a/erpnext/translations/zh_tw.csv b/erpnext/translations/zh_tw.csv index 7fb0b225cb..7f83dfb7b4 100644 --- a/erpnext/translations/zh_tw.csv +++ b/erpnext/translations/zh_tw.csv @@ -1450,7 +1450,7 @@ apps/erpnext/erpnext/stock/page/stock_balance/stock_balance.js,Projected Qty,預 apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,"Reserved Qty: Quantity ordered for sale, but not delivered.",保留數量:訂購數量待出售,但尚未交付。 DocType: Drug Prescription,Interval UOM,間隔UOM DocType: Customer,"Reselect, if the chosen address is edited after save",重新選擇,如果所選地址在保存後被編輯 -apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcotracted items.,分包合同的保留數量:製作分項目的原材料數量。 +apps/erpnext/erpnext/manufacturing/doctype/production_plan/production_plan.js,Reserved Qty for Subcontract: Raw materials quantity to make subcontracted items.,分包合同的保留數量:製作分項目的原材料數量。 apps/erpnext/erpnext/stock/doctype/item/item.js,Item Variant {0} already exists with same attributes,項目變種{0}已經具有相同屬性的存在 DocType: Item,Hub Publishing Details,Hub發布細節 apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening',“開放” From 5c9d92eabf6cc06eb745ca77ca4d2374650ddab8 Mon Sep 17 00:00:00 2001 From: Anurag Mishra <32095923+Anurag810@users.noreply.github.com> Date: Wed, 30 Oct 2019 14:18:16 +0530 Subject: [PATCH 25/44] fix: On Specific case if no item code in name (#19419) --- erpnext/manufacturing/doctype/bom/bom.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/erpnext/manufacturing/doctype/bom/bom.py b/erpnext/manufacturing/doctype/bom/bom.py index 225ae29429..c15b52ea38 100644 --- a/erpnext/manufacturing/doctype/bom/bom.py +++ b/erpnext/manufacturing/doctype/bom/bom.py @@ -39,9 +39,11 @@ class BOM(WebsiteGenerator): names = [d[-1][1:] for d in filter(lambda x: len(x) > 1 and x[-1], names)] # split by (-) if cancelled - names = [cint(name.split('-')[-1]) for name in names] - - idx = max(names) + 1 + if names: + names = [cint(name.split('-')[-1]) for name in names] + idx = max(names) + 1 + else: + idx = 1 else: idx = 1 From 486a8f67a4b0160f6031fa483f6916b43630aef3 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Wed, 30 Oct 2019 14:22:49 +0530 Subject: [PATCH 26/44] fix: not able to select the project in the work order --- erpnext/manufacturing/doctype/work_order/work_order.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/manufacturing/doctype/work_order/work_order.js b/erpnext/manufacturing/doctype/work_order/work_order.js index 1789a1f883..cdbce33e1f 100644 --- a/erpnext/manufacturing/doctype/work_order/work_order.js +++ b/erpnext/manufacturing/doctype/work_order/work_order.js @@ -342,7 +342,7 @@ frappe.ui.form.on("Work Order", { }, project: function(frm) { - if(!erpnext.in_production_item_onchange) { + if(!erpnext.in_production_item_onchange && !frm.doc.bom_no) { frm.trigger("production_item"); } }, From 7638788c2f3f3fab80f2ef782bf843b17f428b46 Mon Sep 17 00:00:00 2001 From: Mangesh-Khairnar Date: Wed, 30 Oct 2019 14:23:41 +0530 Subject: [PATCH 27/44] fix: calculate pending leaves (#19411) --- .../hr/doctype/leave_application/leave_application.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/erpnext/hr/doctype/leave_application/leave_application.py b/erpnext/hr/doctype/leave_application/leave_application.py index 97de40ffee..b73028e50a 100755 --- a/erpnext/hr/doctype/leave_application/leave_application.py +++ b/erpnext/hr/doctype/leave_application/leave_application.py @@ -503,14 +503,17 @@ def get_leave_allocation_records(employee, date, leave_type=None): def get_pending_leaves_for_period(employee, leave_type, from_date, to_date): ''' Returns leaves that are pending approval ''' - return frappe.db.get_value("Leave Application", + leaves = frappe.get_all("Leave Application", filters={ "employee": employee, "leave_type": leave_type, - "from_date": ("<=", from_date), - "to_date": (">=", to_date), "status": "Open" - }, fieldname=['SUM(total_leave_days)']) or flt(0) + }, + or_filters={ + "from_date": ["between", (from_date, to_date)], + "to_date": ["between", (from_date, to_date)] + }, fields=['SUM(total_leave_days) as leaves'])[0] + return leaves['leaves'] if leaves['leaves'] else 0.0 def get_remaining_leaves(allocation, leaves_taken, date, expiry): ''' Returns minimum leaves remaining after comparing with remaining days for allocation expiry ''' From 83c7b5b44b40d3a61ec5e9f36dcfec88949a0515 Mon Sep 17 00:00:00 2001 From: Mangesh-Khairnar Date: Wed, 30 Oct 2019 14:25:50 +0530 Subject: [PATCH 28/44] fix(bom): maintain a default bom for an item (#19407) --- erpnext/manufacturing/doctype/bom/bom.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/erpnext/manufacturing/doctype/bom/bom.py b/erpnext/manufacturing/doctype/bom/bom.py index c15b52ea38..c849f5b7f2 100644 --- a/erpnext/manufacturing/doctype/bom/bom.py +++ b/erpnext/manufacturing/doctype/bom/bom.py @@ -292,7 +292,8 @@ class BOM(WebsiteGenerator): return valuation_rate def manage_default_bom(self): - """ Uncheck others if current one is selected as default, + """ Uncheck others if current one is selected as default or + check the current one as default if it the only bom for the selected item, update default bom in item master """ if self.is_default and self.is_active: @@ -301,6 +302,9 @@ class BOM(WebsiteGenerator): item = frappe.get_doc("Item", self.item) if item.default_bom != self.name: frappe.db.set_value('Item', self.item, 'default_bom', self.name) + elif not frappe.db.exists(dict(doctype='BOM', docstatus=1, item=self.item, is_default=1)) \ + and self.is_active: + frappe.db.set(self, "is_default", 1) else: frappe.db.set(self, "is_default", 0) item = frappe.get_doc("Item", self.item) From d38f5374cb8eb290ff4ed1fbccd940de3f2d25d8 Mon Sep 17 00:00:00 2001 From: Gavin D'souza Date: Wed, 30 Oct 2019 14:43:58 +0530 Subject: [PATCH 29/44] chore: moved email digest to long job --- erpnext/hooks.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/hooks.py b/erpnext/hooks.py index 5c61874f50..b1855ec9bb 100644 --- a/erpnext/hooks.py +++ b/erpnext/hooks.py @@ -283,7 +283,6 @@ scheduler_events = { ], "daily": [ "erpnext.stock.reorder_item.reorder_item", - "erpnext.setup.doctype.email_digest.email_digest.send", "erpnext.support.doctype.issue.issue.auto_close_tickets", "erpnext.crm.doctype.opportunity.opportunity.auto_close_opportunity", "erpnext.controllers.accounts_controller.update_invoice_status", @@ -306,6 +305,7 @@ scheduler_events = { "erpnext.crm.doctype.email_campaign.email_campaign.set_email_campaign_status" ], "daily_long": [ + "erpnext.setup.doctype.email_digest.email_digest.send", "erpnext.manufacturing.doctype.bom_update_tool.bom_update_tool.update_latest_price_in_all_boms", "erpnext.hr.doctype.leave_ledger_entry.leave_ledger_entry.process_expired_allocation", "erpnext.hr.utils.generate_leave_encashment" From 2e01573a40571b90be066ab87e2706d7e132c258 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Wed, 30 Oct 2019 16:22:30 +0530 Subject: [PATCH 30/44] fix: item price stock report not working --- erpnext/stock/report/item_price_stock/item_price_stock.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/stock/report/item_price_stock/item_price_stock.py b/erpnext/stock/report/item_price_stock/item_price_stock.py index e539aff59c..a0783da3aa 100644 --- a/erpnext/stock/report/item_price_stock/item_price_stock.py +++ b/erpnext/stock/report/item_price_stock/item_price_stock.py @@ -89,7 +89,7 @@ def get_item_price_qty_data(filters): {conditions}""" .format(conditions=conditions), filters, as_dict=1) - price_list_names = list(set([frappe.db.escape(item.price_list_name) for item in item_results])) + price_list_names = list(set([item.price_list_name for item in item_results])) buying_price_map = get_price_map(price_list_names, buying=1) selling_price_map = get_price_map(price_list_names, selling=1) From d8b64cd19963978c8ced612e4b23a6a87cf3b4e8 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Wed, 30 Oct 2019 16:27:58 +0530 Subject: [PATCH 31/44] replaced frappe.db.sql with frappe.get_all --- .../item_price_stock/item_price_stock.py | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/erpnext/stock/report/item_price_stock/item_price_stock.py b/erpnext/stock/report/item_price_stock/item_price_stock.py index a0783da3aa..5296211fae 100644 --- a/erpnext/stock/report/item_price_stock/item_price_stock.py +++ b/erpnext/stock/report/item_price_stock/item_price_stock.py @@ -129,17 +129,15 @@ def get_price_map(price_list_names, buying=0, selling=0): rate_key = "Buying Rate" if buying else "Selling Rate" price_list_key = "Buying Price List" if buying else "Selling Price List" - price_list_condition = " and buying=1" if buying else " and selling=1" - pricing_details = frappe.db.sql(""" - select - name,price_list,price_list_rate - from - `tabItem Price` - where - name in ({price_list_names}) {price_list_condition} - """.format(price_list_names=', '.join(['%s']*len(price_list_names)), - price_list_condition=price_list_condition), price_list_names, as_dict=1) + filters = {"name": ("in", price_list_names)} + if buying: + filters["buying"] = 1 + else: + filters["selling"] = 1 + + pricing_details = frappe.get_all("Item Price", + fields = ["name", "price_list", "price_list_rate"], filters=filters) for d in pricing_details: name = d["name"] From 6bd6039496987a987e43352f7a0b4fdc4a910e1a Mon Sep 17 00:00:00 2001 From: rohitwaghchaure Date: Wed, 30 Oct 2019 17:37:22 +0530 Subject: [PATCH 32/44] Revert "fix: patch, item tax template showing 'Untitled' in the name" --- .../move_item_tax_to_item_tax_template.py | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/erpnext/patches/v12_0/move_item_tax_to_item_tax_template.py b/erpnext/patches/v12_0/move_item_tax_to_item_tax_template.py index 6769144aeb..412f32030a 100644 --- a/erpnext/patches/v12_0/move_item_tax_to_item_tax_template.py +++ b/erpnext/patches/v12_0/move_item_tax_to_item_tax_template.py @@ -1,6 +1,5 @@ import frappe import json -from frappe.model.naming import make_autoname from six import iteritems def execute(): @@ -8,6 +7,7 @@ def execute(): return old_item_taxes = {} item_tax_templates = {} + rename_template_to_untitled = [] for d in frappe.db.sql("""select parent as item_code, tax_type, tax_rate from `tabItem Tax`""", as_dict=1): old_item_taxes.setdefault(d.item_code, []) @@ -34,7 +34,7 @@ def execute(): for d in old_item_taxes[item_code]: item_tax_map[d.tax_type] = d.tax_rate - item_tax_template_name = get_item_tax_template(item_tax_templates, + item_tax_template_name = get_item_tax_template(item_tax_templates, rename_template_to_untitled, item_tax_map, item_code) # update the item tax table @@ -53,19 +53,26 @@ def execute(): for d in frappe.db.sql("""select name, parent, item_code, item_tax_rate from `tab{0} Item` where ifnull(item_tax_rate, '') not in ('', '{{}}')""".format(dt), as_dict=1): item_tax_map = json.loads(d.item_tax_rate) - item_tax_template = get_item_tax_template(item_tax_templates, + item_tax_template = get_item_tax_template(item_tax_templates, rename_template_to_untitled, item_tax_map, d.item_code, d.parent) frappe.db.set_value(dt + " Item", d.name, "item_tax_template", item_tax_template) + idx = 1 + for oldname in rename_template_to_untitled: + frappe.rename_doc("Item Tax Template", oldname, "Untitled {}".format(idx)) + idx += 1 + settings = frappe.get_single("Accounts Settings") settings.add_taxes_from_item_tax_template = 0 settings.determine_address_tax_category_from = "Billing Address" settings.save() -def get_item_tax_template(item_tax_templates, item_tax_map, item_code, parent=None): +def get_item_tax_template(item_tax_templates, rename_template_to_untitled, item_tax_map, item_code, parent=None): # search for previously created item tax template by comparing tax maps for template, item_tax_template_map in iteritems(item_tax_templates): if item_tax_map == item_tax_template_map: + if not parent: + rename_template_to_untitled.append(template) return template # if no item tax template found, create one @@ -90,11 +97,5 @@ def get_item_tax_template(item_tax_templates, item_tax_map, item_code, parent=No item_tax_template.append("taxes", {"tax_type": tax_type, "tax_rate": tax_rate}) item_tax_templates.setdefault(item_tax_template.title, {}) item_tax_templates[item_tax_template.title][tax_type] = tax_rate - - try: - item_tax_template.save() - except frappe.DuplicateEntryError: - item_tax_template.name = make_autoname(item_tax_template.title + "/.###") - item_tax_template.save() - + item_tax_template.save() return item_tax_template.name From 1e754b161c3c091579fcb74716434bdbb2460674 Mon Sep 17 00:00:00 2001 From: marination Date: Wed, 30 Oct 2019 18:33:44 +0530 Subject: [PATCH 33/44] fix: Fetching catched meta and removed description fetch from Search Fields Description is conditionally fetched and also used in WHERE clause, that is maintained. Improved naming --- erpnext/controllers/queries.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/erpnext/controllers/queries.py b/erpnext/controllers/queries.py index ac89588978..a9e50bab5a 100644 --- a/erpnext/controllers/queries.py +++ b/erpnext/controllers/queries.py @@ -153,14 +153,17 @@ def item_query(doctype, txt, searchfield, start, page_len, filters, as_dict=Fals conditions = [] #Get searchfields from meta and use in Item Link field query - meta = frappe.get_meta("Item") + meta = frappe.get_meta("Item", cached=True) searchfields = meta.get_search_fields() - fields = [f for f in searchfields if not f in ["name", "item_group", "description"]] - fields = ", ".join(fields) + if "description" in searchfields: + searchfields.remove("description") - searchfields = searchfields + [f for f in [searchfield or "name", "item_code", "item_group", "item_name"] - if not f in searchfields] + columns = [field for field in searchfields if not field in ["name", "item_group", "description"]] + columns = ", ".join(columns) + + searchfields = searchfields + [field for field in[searchfield or "name", "item_code", "item_group", "item_name"] + if not field in searchfields] searchfields = " or ".join([field + " like %(txt)s" for field in searchfields]) description_cond = '' @@ -174,7 +177,7 @@ def item_query(doctype, txt, searchfield, start, page_len, filters, as_dict=Fals tabItem.item_group, if(length(tabItem.description) > 40, \ concat(substr(tabItem.description, 1, 40), "..."), description) as description, - {fields} + {columns} from tabItem where tabItem.docstatus < 2 and tabItem.has_variants=0 @@ -190,7 +193,7 @@ def item_query(doctype, txt, searchfield, start, page_len, filters, as_dict=Fals name, item_name limit %(start)s, %(page_len)s """.format( key=searchfield, - fields=fields, + columns=columns, scond=searchfields, fcond=get_filters_cond(doctype, filters, conditions).replace('%', '%%'), mcond=get_match_cond(doctype).replace('%', '%%'), From a11e7388017b0f5d939871949839add7fb0a360e Mon Sep 17 00:00:00 2001 From: Anurag Mishra <32095923+Anurag810@users.noreply.github.com> Date: Thu, 31 Oct 2019 15:55:03 +0530 Subject: [PATCH 34/44] feat: Stock value and account balance sync. (#19233) * feat: Allow user to sync stock_value and account_balance jv if perpetual inventory is checked * fix(test): Sales Invoice * fix(test): Purchase Invoice * fix(test): Delivery Note * fix: more test_case * fix(test): Stock Entry * fix(test): Purchase Receipt * fix(more-test): Stock Entries * fix(more-test): Sales Invoice and Delivery Note * fix: tests for delivery note * fix: tests for stock reconciliation * refactor: stock and account balance function * fix(more-test): Warehouse * fix(test): Landed Cost Voucher * fix: changes requested --- .../accounts/doctype/account/test_account.py | 2 +- .../loyalty_program/test_loyalty_program.py | 2 + .../purchase_invoice/test_purchase_invoice.py | 54 ++--- erpnext/accounts/doctype/sales_invoice/pos.py | 23 +- .../doctype/sales_invoice/sales_invoice.py | 1 - .../doctype/sales_invoice/test_records.json | 3 - .../sales_invoice/test_sales_invoice.py | 161 +++++++++----- .../shipping_rule/test_shipping_rule.py | 10 +- erpnext/accounts/general_ledger.py | 40 +++- erpnext/accounts/utils.py | 28 ++- erpnext/controllers/stock_controller.py | 35 --- .../production_plan/test_production_plan.py | 2 + .../doctype/work_order/test_work_order.py | 2 +- erpnext/setup/doctype/company/test_company.py | 18 +- .../setup/doctype/company/test_records.json | 11 + erpnext/stock/__init__.py | 2 +- erpnext/stock/doctype/batch/test_batch.py | 5 +- .../delivery_note/test_delivery_note.py | 208 ++++++++---------- .../item_alternative/test_item_alternative.py | 2 + .../test_landed_cost_voucher.py | 90 ++++---- .../purchase_receipt/test_purchase_receipt.py | 142 ++++++++---- .../purchase_receipt/test_records.json | 34 --- .../stock/doctype/serial_no/test_serial_no.py | 3 + .../doctype/stock_entry/test_stock_entry.py | 104 +++++---- .../test_stock_reconciliation.py | 39 ++-- .../stock/doctype/warehouse/test_records.json | 6 - .../stock/doctype/warehouse/test_warehouse.py | 46 +++- 27 files changed, 596 insertions(+), 477 deletions(-) diff --git a/erpnext/accounts/doctype/account/test_account.py b/erpnext/accounts/doctype/account/test_account.py index 4ee55736fe..dc23b2b2d0 100644 --- a/erpnext/accounts/doctype/account/test_account.py +++ b/erpnext/accounts/doctype/account/test_account.py @@ -160,7 +160,7 @@ def _make_test_records(verbose): ["_Test Payable USD", "Current Liabilities", 0, "Payable", "USD"] ] - for company, abbr in [["_Test Company", "_TC"], ["_Test Company 1", "_TC1"]]: + for company, abbr in [["_Test Company", "_TC"], ["_Test Company 1", "_TC1"], ["_Test Company with perpetual inventory", "TCP1"]]: test_objects = make_test_objects("Account", [{ "doctype": "Account", "account_name": account_name, diff --git a/erpnext/accounts/doctype/loyalty_program/test_loyalty_program.py b/erpnext/accounts/doctype/loyalty_program/test_loyalty_program.py index 4a7406e0cb..341884c190 100644 --- a/erpnext/accounts/doctype/loyalty_program/test_loyalty_program.py +++ b/erpnext/accounts/doctype/loyalty_program/test_loyalty_program.py @@ -8,10 +8,12 @@ import unittest from frappe.utils import today, cint, flt, getdate from erpnext.accounts.doctype.loyalty_program.loyalty_program import get_loyalty_program_details_with_points from erpnext.accounts.party import get_dashboard_info +from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import set_perpetual_inventory class TestLoyaltyProgram(unittest.TestCase): @classmethod def setUpClass(self): + set_perpetual_inventory(0) # create relevant item, customer, loyalty program, etc create_records() diff --git a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py index 6deee38148..b2ad4f4d51 100644 --- a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py @@ -10,7 +10,7 @@ from erpnext.accounts.doctype.payment_entry.payment_entry import get_payment_ent from frappe.utils import cint, flt, today, nowdate, add_days import frappe.defaults from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import set_perpetual_inventory, \ - test_records as pr_test_records + test_records as pr_test_records, make_purchase_receipt, get_taxes from erpnext.controllers.accounts_controller import get_payment_terms from erpnext.exceptions import InvalidCurrency from erpnext.stock.doctype.stock_entry.test_stock_entry import get_qty_after_transaction @@ -57,16 +57,11 @@ class TestPurchaseInvoice(unittest.TestCase): self.assertEqual([d.debit, d.credit], expected_gl_entries.get(d.account)) def test_gl_entries_with_perpetual_inventory(self): - pi = frappe.copy_doc(test_records[1]) - set_perpetual_inventory(1, pi.company) + pi = make_purchase_invoice(company="_Test Company with perpetual inventory", supplier_warehouse="Work In Progress - TCP1", warehouse= "Stores - TCP1", cost_center = "Main - TCP1", expense_account ="_Test Account Cost for Goods Sold - TCP1", get_taxes_and_charges=True, qty=10) self.assertTrue(cint(erpnext.is_perpetual_inventory_enabled(pi.company)), 1) - pi.insert() - pi.submit() self.check_gle_for_pi(pi.name) - set_perpetual_inventory(0, pi.company) - def test_terms_added_after_save(self): pi = frappe.copy_doc(test_records[1]) pi.insert() @@ -196,21 +191,21 @@ class TestPurchaseInvoice(unittest.TestCase): self.assertEqual(pi.on_hold, 0) def test_gl_entries_with_perpetual_inventory_against_pr(self): - pr = frappe.copy_doc(pr_test_records[0]) - set_perpetual_inventory(1, pr.company) - self.assertTrue(cint(erpnext.is_perpetual_inventory_enabled(pr.company)), 1) - pr.submit() - pi = frappe.copy_doc(test_records[1]) - for d in pi.get("items"): + pr = make_purchase_receipt(company="_Test Company with perpetual inventory", supplier_warehouse="Work In Progress - TCP1", warehouse= "Stores - TCP1", cost_center = "Main - TCP1", get_taxes_and_charges=True,) + + self.assertTrue(cint(erpnext.is_perpetual_inventory_enabled(pr.company)), 1) + + pi = make_purchase_invoice(company="_Test Company with perpetual inventory", supplier_warehouse="Work In Progress - TCP1", warehouse= "Stores - TCP1", cost_center = "Main - TCP1", expense_account ="_Test Account Cost for Goods Sold - TCP1", get_taxes_and_charges=True, qty=10,do_not_save= "True") + + for d in pi.items: d.purchase_receipt = pr.name + pi.insert() pi.submit() self.check_gle_for_pi(pi.name) - set_perpetual_inventory(0, pr.company) - def check_gle_for_pi(self, pi): gl_entries = frappe.db.sql("""select account, debit, credit from `tabGL Entry` where voucher_type='Purchase Invoice' and voucher_no=%s @@ -218,10 +213,10 @@ class TestPurchaseInvoice(unittest.TestCase): self.assertTrue(gl_entries) expected_values = dict((d[0], d) for d in [ - ["_Test Payable - _TC", 0, 720], - ["Stock Received But Not Billed - _TC", 500.0, 0], - ["_Test Account Shipping Charges - _TC", 100.0, 0], - ["_Test Account VAT - _TC", 120.0, 0], + ["Creditors - TCP1", 0, 720], + ["Stock Received But Not Billed - TCP1", 500.0, 0], + ["_Test Account Shipping Charges - TCP1", 100.0, 0], + ["_Test Account VAT - TCP1", 120.0, 0], ]) for i, gle in enumerate(gl_entries): @@ -524,10 +519,9 @@ class TestPurchaseInvoice(unittest.TestCase): self.assertFalse(gle) def test_purchase_invoice_update_stock_gl_entry_with_perpetual_inventory(self): - set_perpetual_inventory() pi = make_purchase_invoice(update_stock=1, posting_date=frappe.utils.nowdate(), - posting_time=frappe.utils.nowtime()) + posting_time=frappe.utils.nowtime(), cash_bank_account="Cash - TCP1", company="_Test Company with perpetual inventory", supplier_warehouse="Work In Progress - TCP1", warehouse= "Stores - TCP1", cost_center = "Main - TCP1", expense_account ="_Test Account Cost for Goods Sold - TCP1") gl_entries = frappe.db.sql("""select account, account_currency, debit, credit, debit_in_account_currency, credit_in_account_currency @@ -548,9 +542,9 @@ class TestPurchaseInvoice(unittest.TestCase): self.assertEqual(expected_gl_entries[gle.account][2], gle.credit) def test_purchase_invoice_for_is_paid_and_update_stock_gl_entry_with_perpetual_inventory(self): - set_perpetual_inventory() + pi = make_purchase_invoice(update_stock=1, posting_date=frappe.utils.nowdate(), - posting_time=frappe.utils.nowtime(), cash_bank_account="Cash - _TC", is_paid=1) + posting_time=frappe.utils.nowtime(), cash_bank_account="Cash - TCP1", is_paid=1, company="_Test Company with perpetual inventory", supplier_warehouse="Work In Progress - TCP1", warehouse= "Stores - TCP1", cost_center = "Main - TCP1", expense_account ="_Test Account Cost for Goods Sold - TCP1") gl_entries = frappe.db.sql("""select account, account_currency, sum(debit) as debit, sum(credit) as credit, debit_in_account_currency, credit_in_account_currency @@ -563,7 +557,7 @@ class TestPurchaseInvoice(unittest.TestCase): expected_gl_entries = dict((d[0], d) for d in [ [pi.credit_to, 250.0, 250.0], [stock_in_hand_account, 250.0, 0.0], - ["Cash - _TC", 0.0, 250.0] + ["Cash - TCP1", 0.0, 250.0] ]) for i, gle in enumerate(gl_entries): @@ -630,6 +624,7 @@ class TestPurchaseInvoice(unittest.TestCase): self.assertEqual(pi.get("items")[0].rm_supp_cost, flt(rm_supp_cost, 2)) def test_rejected_serial_no(self): + set_perpetual_inventory(0) pi = make_purchase_invoice(item_code="_Test Serialized Item With Series", received_qty=2, qty=1, rejected_qty=1, rate=500, update_stock=1, rejected_warehouse = "_Test Rejected Warehouse - _TC") @@ -881,7 +876,7 @@ def make_purchase_invoice(**args): pi.is_return = args.is_return pi.return_against = args.return_against pi.is_subcontracted = args.is_subcontracted or "No" - pi.supplier_warehouse = "_Test Warehouse 1 - _TC" + pi.supplier_warehouse = args.supplier_warehouse or "_Test Warehouse 1 - _TC" pi.append("items", { "item_code": args.item or args.item_code or "_Test Item", @@ -890,14 +885,21 @@ def make_purchase_invoice(**args): "received_qty": args.received_qty or 0, "rejected_qty": args.rejected_qty or 0, "rate": args.rate or 50, + 'expense_account': args.expense_account or '_Test Account Cost for Goods Sold - _TC', "conversion_factor": 1.0, "serial_no": args.serial_no, "stock_uom": "_Test UOM", - "cost_center": "_Test Cost Center - _TC", + "cost_center": args.cost_center or "_Test Cost Center - _TC", "project": args.project, "rejected_warehouse": args.rejected_warehouse or "", "rejected_serial_no": args.rejected_serial_no or "" }) + + if args.get_taxes_and_charges: + taxes = get_taxes() + for tax in taxes: + pi.append("taxes", tax) + if not args.do_not_save: pi.insert() if not args.do_not_submit: diff --git a/erpnext/accounts/doctype/sales_invoice/pos.py b/erpnext/accounts/doctype/sales_invoice/pos.py index 7d4fc63955..ed45b2cc2c 100755 --- a/erpnext/accounts/doctype/sales_invoice/pos.py +++ b/erpnext/accounts/doctype/sales_invoice/pos.py @@ -402,14 +402,21 @@ def make_invoice(doc_list={}, email_queue_list={}, customers_list={}): for docs in doc_list: for name, doc in iteritems(docs): if not frappe.db.exists('Sales Invoice', {'offline_pos_name': name}): - validate_records(doc) - si_doc = frappe.new_doc('Sales Invoice') - si_doc.offline_pos_name = name - si_doc.update(doc) - si_doc.set_posting_time = 1 - si_doc.customer = get_customer_id(doc) - si_doc.due_date = doc.get('posting_date') - name_list = submit_invoice(si_doc, name, doc, name_list) + if isinstance(doc, dict): + validate_records(doc) + si_doc = frappe.new_doc('Sales Invoice') + si_doc.offline_pos_name = name + si_doc.update(doc) + si_doc.set_posting_time = 1 + si_doc.customer = get_customer_id(doc) + si_doc.due_date = doc.get('posting_date') + name_list = submit_invoice(si_doc, name, doc, name_list) + else: + doc.due_date = doc.get('posting_date') + doc.customer = get_customer_id(doc) + doc.set_posting_time = 1 + doc.offline_pos_name = name + name_list = submit_invoice(doc, name, doc, name_list) else: name_list.append(name) diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py index e1256a78d9..5766c9a8d1 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py @@ -686,7 +686,6 @@ class SalesInvoice(SellingController): def make_gl_entries(self, gl_entries=None, repost_future_gle=True, from_repost=False): auto_accounting_for_stock = erpnext.is_perpetual_inventory_enabled(self.company) - if not gl_entries: gl_entries = self.get_gl_entries() diff --git a/erpnext/accounts/doctype/sales_invoice/test_records.json b/erpnext/accounts/doctype/sales_invoice/test_records.json index 9c8de7d5a2..ebe6e3da8d 100644 --- a/erpnext/accounts/doctype/sales_invoice/test_records.json +++ b/erpnext/accounts/doctype/sales_invoice/test_records.json @@ -68,8 +68,6 @@ "selling_price_list": "_Test Price List", "territory": "_Test Territory" }, - - { "company": "_Test Company", "conversion_rate": 1.0, @@ -276,7 +274,6 @@ "uom": "_Test UOM 1", "conversion_factor": 1, "stock_uom": "_Test UOM 1" - }, { "cost_center": "_Test Cost Center - _TC", diff --git a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py index 4f253b69f7..530bd893c0 100644 --- a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py @@ -20,6 +20,9 @@ from erpnext.stock.doctype.item.test_item import create_item from six import iteritems from erpnext.accounts.doctype.sales_invoice.sales_invoice import make_inter_company_transaction from erpnext.regional.india.utils import get_ewb_data +from erpnext.stock.doctype.stock_entry.stock_entry_utils import make_stock_entry +from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import make_purchase_receipt +from erpnext.stock.doctype.delivery_note.delivery_note import make_sales_invoice class TestSalesInvoice(unittest.TestCase): def make(self): @@ -550,7 +553,6 @@ class TestSalesInvoice(unittest.TestCase): si.get("taxes")[6].tax_amount = 2 si.insert() - print(si.name) expected_values = [ { @@ -679,56 +681,67 @@ class TestSalesInvoice(unittest.TestCase): self.assertFalse(gle) def test_pos_gl_entry_with_perpetual_inventory(self): - set_perpetual_inventory() make_pos_profile() - self._insert_purchase_receipt() - pos = copy.deepcopy(test_records[1]) - pos["is_pos"] = 1 - pos["update_stock"] = 1 - pos["payments"] = [{'mode_of_payment': 'Bank Draft', 'account': '_Test Bank - _TC', 'amount': 300}, - {'mode_of_payment': 'Cash', 'account': 'Cash - _TC', 'amount': 300}] + pr = make_purchase_receipt(company= "_Test Company with perpetual inventory",supplier_warehouse= "Work In Progress - TCP1", item_code= "_Test FG Item",warehouse= "Stores - TCP1",cost_center= "Main - TCP1") + + pos = create_sales_invoice(company= "_Test Company with perpetual inventory", debit_to="Debtors - TCP1", item_code= "_Test FG Item", warehouse="Stores - TCP1", income_account = "Sales - TCP1", expense_account = "Cost of Goods Sold - TCP1", cost_center = "Main - TCP1", do_not_save=True) + + pos.is_pos = 1 + pos.update_stock = 1 + + pos.append("payments", {'mode_of_payment': 'Bank Draft', 'account': '_Test Bank - TCP1', 'amount': 50}) + pos.append("payments", {'mode_of_payment': 'Cash', 'account': 'Cash - TCP1', 'amount': 50}) + + taxes = get_taxes_and_charges() + pos.taxes = [] + for tax in taxes: + pos.append("taxes", tax) si = frappe.copy_doc(pos) si.insert() si.submit() + self.assertEqual(si.paid_amount, 100.0) - self.assertEqual(si.paid_amount, 600.0) - - self.pos_gl_entry(si, pos, 300) + self.pos_gl_entry(si, pos, 50) def test_pos_change_amount(self): - set_perpetual_inventory() make_pos_profile() - self._insert_purchase_receipt() - pos = copy.deepcopy(test_records[1]) - pos["is_pos"] = 1 - pos["update_stock"] = 1 - pos["payments"] = [{'mode_of_payment': 'Bank Draft', 'account': '_Test Bank - _TC', 'amount': 300}, - {'mode_of_payment': 'Cash', 'account': 'Cash - _TC', 'amount': 340}] + pr = make_purchase_receipt(company= "_Test Company with perpetual inventory",supplier_warehouse= "Work In Progress - TCP1", item_code= "_Test FG Item",warehouse= "Stores - TCP1",cost_center= "Main - TCP1") - si = frappe.copy_doc(pos) - si.change_amount = 5.0 - si.insert() - si.submit() + pos = create_sales_invoice(company= "_Test Company with perpetual inventory", debit_to="Debtors - TCP1", item_code= "_Test FG Item", warehouse="Stores - TCP1", income_account = "Sales - TCP1", expense_account = "Cost of Goods Sold - TCP1", cost_center = "Main - TCP1", do_not_save=True) - self.assertEqual(si.grand_total, 630.0) - self.assertEqual(si.write_off_amount, -5) + pos.is_pos = 1 + pos.update_stock = 1 + + pos.append("payments", {'mode_of_payment': 'Bank Draft', 'account': '_Test Bank - TCP1', 'amount': 50}) + pos.append("payments", {'mode_of_payment': 'Cash', 'account': 'Cash - TCP1', 'amount': 60}) + + pos.change_amount = 5.0 + pos.insert() + pos.submit() + + self.assertEqual(pos.grand_total, 100.0) + self.assertEqual(pos.write_off_amount, -5) def test_make_pos_invoice(self): from erpnext.accounts.doctype.sales_invoice.pos import make_invoice - set_perpetual_inventory() - make_pos_profile() - self._insert_purchase_receipt() + pr = make_purchase_receipt(company= "_Test Company with perpetual inventory",supplier_warehouse= "Work In Progress - TCP1", item_code= "_Test FG Item",warehouse= "Stores - TCP1",cost_center= "Main - TCP1") + pos = create_sales_invoice(company= "_Test Company with perpetual inventory", debit_to="Debtors - TCP1", item_code= "_Test FG Item", warehouse="Stores - TCP1", income_account = "Sales - TCP1", expense_account = "Cost of Goods Sold - TCP1", cost_center = "Main - TCP1", do_not_save=True) - pos = copy.deepcopy(test_records[1]) - pos["is_pos"] = 1 - pos["update_stock"] = 1 - pos["payments"] = [{'mode_of_payment': 'Bank Draft', 'account': '_Test Bank - _TC', 'amount': 300}, - {'mode_of_payment': 'Cash', 'account': 'Cash - _TC', 'amount': 330}] + pos.is_pos = 1 + pos.update_stock = 1 + + pos.append("payments", {'mode_of_payment': 'Bank Draft', 'account': '_Test Bank - TCP1', 'amount': 50}) + pos.append("payments", {'mode_of_payment': 'Cash', 'account': 'Cash - TCP1', 'amount': 50}) + + taxes = get_taxes_and_charges() + pos.taxes = [] + for tax in taxes: + pos.append("taxes", tax) invoice_data = [{'09052016142': pos}] si = make_invoice(invoice_data).get('invoice') @@ -736,16 +749,15 @@ class TestSalesInvoice(unittest.TestCase): sales_invoice = frappe.get_all('Sales Invoice', fields =["*"], filters = {'offline_pos_name': '09052016142', 'docstatus': 1}) si = frappe.get_doc('Sales Invoice', sales_invoice[0].name) - self.assertEqual(si.grand_total, 630.0) - self.pos_gl_entry(si, pos, 330) + self.assertEqual(si.grand_total, 100) + + self.pos_gl_entry(si, pos, 50) def test_make_pos_invoice_in_draft(self): from erpnext.accounts.doctype.sales_invoice.pos import make_invoice from erpnext.stock.doctype.item.test_item import make_item - set_perpetual_inventory() - allow_negative_stock = frappe.db.get_single_value('Stock Settings', 'allow_negative_stock') if allow_negative_stock: frappe.db.set_value('Stock Settings', None, 'allow_negative_stock', 0) @@ -789,7 +801,7 @@ class TestSalesInvoice(unittest.TestCase): si.name, as_dict=1)[0] self.assertTrue(sle) self.assertEqual([sle.item_code, sle.warehouse, sle.actual_qty], - ["_Test Item", "_Test Warehouse - _TC", -1.0]) + ['_Test FG Item', 'Stores - TCP1', -1.0]) # check gl entries gl_entries = frappe.db.sql("""select account, debit, credit @@ -797,19 +809,19 @@ class TestSalesInvoice(unittest.TestCase): order by account asc, debit asc, credit asc""", si.name, as_dict=1) self.assertTrue(gl_entries) - stock_in_hand = get_inventory_account('_Test Company') - + stock_in_hand = get_inventory_account('_Test Company with perpetual inventory') expected_gl_entries = sorted([ - [si.debit_to, 630.0, 0.0], - [pos["items"][0]["income_account"], 0.0, 500.0], - [pos["taxes"][0]["account_head"], 0.0, 80.0], - [pos["taxes"][1]["account_head"], 0.0, 50.0], + [si.debit_to, 100.0, 0.0], + [pos.items[0].income_account, 0.0, 89.09], + ['Round Off - TCP1', 0.0, 0.01], + [pos.taxes[0].account_head, 0.0, 10.69], + [pos.taxes[1].account_head, 0.0, 0.21], [stock_in_hand, 0.0, abs(sle.stock_value_difference)], - [pos["items"][0]["expense_account"], abs(sle.stock_value_difference), 0.0], - [si.debit_to, 0.0, 300.0], + [pos.items[0].expense_account, abs(sle.stock_value_difference), 0.0], + [si.debit_to, 0.0, 50.0], [si.debit_to, 0.0, cash_amount], - ["_Test Bank - _TC", 300.0, 0.0], - ["Cash - _TC", cash_amount, 0.0] + ["_Test Bank - TCP1", 50, 0.0], + ["Cash - TCP1", cash_amount, 0.0] ]) for i, gle in enumerate(sorted(gl_entries, key=lambda gle: gle.account)): @@ -823,9 +835,9 @@ class TestSalesInvoice(unittest.TestCase): self.assertFalse(gle) - set_perpetual_inventory(0) frappe.db.sql("delete from `tabPOS Profile`") + si.delete() def test_pos_si_without_payment(self): set_perpetual_inventory() @@ -1008,7 +1020,6 @@ class TestSalesInvoice(unittest.TestCase): """ from erpnext.stock.doctype.stock_entry.test_stock_entry import make_serialized_item from erpnext.stock.doctype.delivery_note.test_delivery_note import create_delivery_note - from erpnext.stock.doctype.delivery_note.delivery_note import make_sales_invoice from erpnext.stock.doctype.serial_no.serial_no import get_serial_nos se = make_serialized_item() @@ -1023,14 +1034,17 @@ class TestSalesInvoice(unittest.TestCase): self.assertEqual(si.get("items")[0].serial_no, dn.get("items")[0].serial_no) def test_return_sales_invoice(self): - set_perpetual_inventory() - make_stock_entry(item_code="_Test Item", target="_Test Warehouse - _TC", qty=50, basic_rate=100) + make_stock_entry(item_code="_Test Item", target="Stores - TCP1", qty=50, basic_rate=100) - actual_qty_0 = get_qty_after_transaction() + actual_qty_0 = get_qty_after_transaction(item_code = "_Test Item", warehouse = "Stores - TCP1") - si = create_sales_invoice(qty=5, rate=500, update_stock=1) + si = create_sales_invoice(qty = 5, rate=500, update_stock=1, company= "_Test Company with perpetual inventory", debit_to="Debtors - TCP1", item_code= "_Test Item", warehouse="Stores - TCP1", income_account = "Sales - TCP1", expense_account = "Cost of Goods Sold - TCP1", cost_center = "Main - TCP1") + + + actual_qty_1 = get_qty_after_transaction(item_code = "_Test Item", warehouse = "Stores - TCP1") + + frappe.db.commit() - actual_qty_1 = get_qty_after_transaction() self.assertEqual(actual_qty_0 - 5, actual_qty_1) # outgoing_rate @@ -1038,10 +1052,9 @@ class TestSalesInvoice(unittest.TestCase): "voucher_no": si.name}, "stock_value_difference") / 5 # return entry - si1 = create_sales_invoice(is_return=1, return_against=si.name, qty=-2, rate=500, update_stock=1) - - actual_qty_2 = get_qty_after_transaction() + si1 = create_sales_invoice(is_return=1, return_against=si.name, qty=-2, rate=500, update_stock=1, company= "_Test Company with perpetual inventory", debit_to="Debtors - TCP1", item_code= "_Test Item", warehouse="Stores - TCP1", income_account = "Sales - TCP1", expense_account = "Cost of Goods Sold - TCP1", cost_center = "Main - TCP1") + actual_qty_2 = get_qty_after_transaction(item_code = "_Test Item", warehouse = "Stores - TCP1") self.assertEqual(actual_qty_1 + 2, actual_qty_2) incoming_rate, stock_value_difference = frappe.db.get_value("Stock Ledger Entry", @@ -1049,7 +1062,7 @@ class TestSalesInvoice(unittest.TestCase): ["incoming_rate", "stock_value_difference"]) self.assertEqual(flt(incoming_rate, 3), abs(flt(outgoing_rate, 3))) - stock_in_hand_account = get_inventory_account('_Test Company', si1.items[0].warehouse) + stock_in_hand_account = get_inventory_account('_Test Company with perpetual inventory', si1.items[0].warehouse) # Check gl entry gle_warehouse_amount = frappe.db.get_value("GL Entry", {"voucher_type": "Sales Invoice", @@ -1058,7 +1071,7 @@ class TestSalesInvoice(unittest.TestCase): self.assertEqual(gle_warehouse_amount, stock_value_difference) party_credited = frappe.db.get_value("GL Entry", {"voucher_type": "Sales Invoice", - "voucher_no": si1.name, "account": "Debtors - _TC", "party": "_Test Customer"}, "credit") + "voucher_no": si1.name, "account": "Debtors - TCP1", "party": "_Test Customer"}, "credit") self.assertEqual(party_credited, 1000) @@ -1066,7 +1079,6 @@ class TestSalesInvoice(unittest.TestCase): self.assertFalse(si1.outstanding_amount) self.assertEqual(frappe.db.get_value("Sales Invoice", si.name, "outstanding_amount"), 1500) - set_perpetual_inventory(0) def test_discount_on_net_total(self): si = frappe.copy_doc(test_records[2]) @@ -1524,6 +1536,8 @@ class TestSalesInvoice(unittest.TestCase): self.assertEqual(si.total_taxes_and_charges, 577.05) self.assertEqual(si.grand_total, 1827.05) + + def test_create_invoice_without_terms(self): si = create_sales_invoice(do_not_save=1) self.assertFalse(si.get('payment_schedule')) @@ -1930,4 +1944,29 @@ def get_outstanding_amount(against_voucher_type, against_voucher, account, party if against_voucher_type == 'Purchase Invoice': bal = bal * -1 - return bal \ No newline at end of file + return bal + +def get_taxes_and_charges(): + return [{ + "account_head": "_Test Account Excise Duty - TCP1", + "charge_type": "On Net Total", + "cost_center": "Main - TCP1", + "description": "Excise Duty", + "doctype": "Sales Taxes and Charges", + "idx": 1, + "included_in_print_rate": 1, + "parentfield": "taxes", + "rate": 12 + }, + { + "account_head": "_Test Account Education Cess - TCP1", + "charge_type": "On Previous Row Amount", + "cost_center": "Main - TCP1", + "description": "Education Cess", + "doctype": "Sales Taxes and Charges", + "idx": 2, + "included_in_print_rate": 1, + "parentfield": "taxes", + "rate": 2, + "row_id": 1 + }] \ No newline at end of file diff --git a/erpnext/accounts/doctype/shipping_rule/test_shipping_rule.py b/erpnext/accounts/doctype/shipping_rule/test_shipping_rule.py index 582ecb2e16..abc6ab82d3 100644 --- a/erpnext/accounts/doctype/shipping_rule/test_shipping_rule.py +++ b/erpnext/accounts/doctype/shipping_rule/test_shipping_rule.py @@ -14,13 +14,13 @@ class TestShippingRule(unittest.TestCase): shipping_rule.name = test_records[0].get('name') shipping_rule.get("conditions")[0].from_value = 101 self.assertRaises(FromGreaterThanToError, shipping_rule.insert) - + def test_many_zero_to_values(self): shipping_rule = frappe.copy_doc(test_records[0]) shipping_rule.name = test_records[0].get('name') shipping_rule.get("conditions")[0].to_value = 0 self.assertRaises(ManyBlankToValuesError, shipping_rule.insert) - + def test_overlapping_conditions(self): for range_a, range_b in [ ((50, 150), (0, 100)), @@ -38,6 +38,10 @@ class TestShippingRule(unittest.TestCase): self.assertRaises(OverlappingConditionError, shipping_rule.insert) def create_shipping_rule(shipping_rule_type, shipping_rule_name): + + if frappe.db.exists("Shipping Rule", shipping_rule_name): + return frappe.get_doc("Shipping Rule", shipping_rule_name) + sr = frappe.new_doc("Shipping Rule") sr.account = "_Test Account Shipping Charges - _TC" sr.calculate_based_on = "Net Total" @@ -70,4 +74,4 @@ def create_shipping_rule(shipping_rule_type, shipping_rule_name): }) sr.insert(ignore_permissions=True) sr.submit() - return sr + return sr diff --git a/erpnext/accounts/general_ledger.py b/erpnext/accounts/general_ledger.py index 5c9e93d019..43d9ad6435 100644 --- a/erpnext/accounts/general_ledger.py +++ b/erpnext/accounts/general_ledger.py @@ -3,8 +3,9 @@ from __future__ import unicode_literals import frappe, erpnext -from frappe.utils import flt, cstr, cint +from frappe.utils import flt, cstr, cint, comma_and from frappe import _ +from erpnext.accounts.utils import get_stock_and_account_balance from frappe.model.meta import get_field_precision from erpnext.accounts.doctype.budget.budget import validate_expense_against_budget from erpnext.accounts.doctype.accounting_dimension.accounting_dimension import get_accounting_dimensions @@ -12,6 +13,7 @@ from erpnext.accounts.doctype.accounting_dimension.accounting_dimension import g class ClosedAccountingPeriod(frappe.ValidationError): pass class StockAccountInvalidTransaction(frappe.ValidationError): pass +class StockValueAndAccountBalanceOutOfSync(frappe.ValidationError): pass def make_gl_entries(gl_map, cancel=False, adv_adj=False, merge_entries=True, update_outstanding='Yes', from_repost=False): if gl_map: @@ -115,11 +117,9 @@ def check_if_in_list(gle, gl_map, dimensions=None): def save_entries(gl_map, adv_adj, update_outstanding, from_repost=False): if not from_repost: - validate_account_for_perpetual_inventory(gl_map) validate_cwip_accounts(gl_map) round_off_debit_credit(gl_map) - for entry in gl_map: make_entry(entry, adv_adj, update_outstanding, from_repost) @@ -127,6 +127,10 @@ def save_entries(gl_map, adv_adj, update_outstanding, from_repost=False): if not from_repost: validate_expense_against_budget(entry) + if not from_repost: + validate_account_for_perpetual_inventory(gl_map) + + def make_entry(args, adv_adj, update_outstanding, from_repost=False): args.update({"doctype": "GL Entry"}) gle = frappe.get_doc(args) @@ -137,15 +141,31 @@ def make_entry(args, adv_adj, update_outstanding, from_repost=False): gle.submit() def validate_account_for_perpetual_inventory(gl_map): - if cint(erpnext.is_perpetual_inventory_enabled(gl_map[0].company)) \ - and gl_map[0].voucher_type=="Journal Entry": - aii_accounts = [d[0] for d in frappe.db.sql("""select name from tabAccount - where account_type = 'Stock' and is_group=0""")] + if cint(erpnext.is_perpetual_inventory_enabled(gl_map[0].company)): + account_list = [gl_entries.account for gl_entries in gl_map] - for entry in gl_map: - if entry.account in aii_accounts: + aii_accounts = [d.name for d in frappe.get_all("Account", + filters={'account_type': 'Stock', 'is_group': 0, 'company': gl_map[0].company})] + + for account in account_list: + if account not in aii_accounts: + continue + + account_bal, stock_bal, warehouse_list = get_stock_and_account_balance(account, + gl_map[0].posting_date, gl_map[0].company) + + if gl_map[0].voucher_type=="Journal Entry": + # In case of Journal Entry, there are no corresponding SL entries, + # hence deducting currency amount + account_bal -= flt(gl_map[0].debit) - flt(gl_map[0].credit) + if account_bal == stock_bal: frappe.throw(_("Account: {0} can only be updated via Stock Transactions") - .format(entry.account), StockAccountInvalidTransaction) + .format(account), StockAccountInvalidTransaction) + + elif account_bal != stock_bal: + frappe.throw(_("Account Balance ({0}) and Stock Value ({1}) is out of sync for account {2} and linked warehouse ({3}). Please create adjustment Journal Entry for amount {4}.") + .format(account_bal, stock_bal, account, comma_and(warehouse_list), stock_bal - account_bal), + StockValueAndAccountBalanceOutOfSync) def validate_cwip_accounts(gl_map): if not cint(frappe.db.get_value("Asset Settings", None, "disable_cwip_accounting")) \ diff --git a/erpnext/accounts/utils.py b/erpnext/accounts/utils.py index ac69fd3c96..382a89b310 100644 --- a/erpnext/accounts/utils.py +++ b/erpnext/accounts/utils.py @@ -13,6 +13,10 @@ from six import iteritems # imported to enable erpnext.accounts.utils.get_account_currency from erpnext.accounts.doctype.account.account import get_account_currency +from erpnext.stock.utils import get_stock_value_on +from erpnext.stock import get_warehouse_account_map + + class FiscalYearError(frappe.ValidationError): pass @frappe.whitelist() @@ -560,23 +564,23 @@ def fix_total_debit_credit(): (dr_or_cr, dr_or_cr, '%s', '%s', '%s', dr_or_cr), (d.diff, d.voucher_type, d.voucher_no)) -def get_stock_and_account_difference(account_list=None, posting_date=None, company=None): - from erpnext.stock.utils import get_stock_value_on - from erpnext.stock import get_warehouse_account_map - +def get_stock_and_account_balance(account=None, posting_date=None, company=None): if not posting_date: posting_date = nowdate() - difference = {} warehouse_account = get_warehouse_account_map(company) - for warehouse, account_data in iteritems(warehouse_account): - if account_data.get('account') in account_list: - account_balance = get_balance_on(account_data.get('account'), posting_date, in_account_currency=False) - stock_value = get_stock_value_on(warehouse, posting_date) - if abs(flt(stock_value) - flt(account_balance)) > 0.005: - difference.setdefault(account_data.get('account'), flt(stock_value) - flt(account_balance)) + account_balance = get_balance_on(account, posting_date, in_account_currency=False) - return difference + related_warehouses = [wh for wh, wh_details in warehouse_account.items() + if wh_details.account == account and not wh_details.is_group] + + total_stock_value = 0.0 + for warehouse in related_warehouses: + value = get_stock_value_on(warehouse, posting_date) + total_stock_value += value + + precision = frappe.get_precision("Journal Entry Account", "debit_in_account_currency") + return flt(account_balance, precision), flt(total_stock_value, precision), related_warehouses def get_currency_precision(): precision = cint(frappe.db.get_default("currency_precision")) diff --git a/erpnext/controllers/stock_controller.py b/erpnext/controllers/stock_controller.py index 2d87a98f20..542073ebd7 100644 --- a/erpnext/controllers/stock_controller.py +++ b/erpnext/controllers/stock_controller.py @@ -207,41 +207,6 @@ class StockController(AccountsController): reference_doctype=self.doctype, reference_name=self.name)).insert().name - def make_adjustment_entry(self, expected_gle, voucher_obj): - from erpnext.accounts.utils import get_stock_and_account_difference - account_list = [d.account for d in expected_gle] - acc_diff = get_stock_and_account_difference(account_list, - expected_gle[0].posting_date, self.company) - - cost_center = self.get_company_default("cost_center") - stock_adjustment_account = self.get_company_default("stock_adjustment_account") - - gl_entries = [] - for account, diff in acc_diff.items(): - if diff: - gl_entries.append([ - # stock in hand account - voucher_obj.get_gl_dict({ - "account": account, - "against": stock_adjustment_account, - "debit": diff, - "remarks": "Adjustment Accounting Entry for Stock", - }), - - # account against stock in hand - voucher_obj.get_gl_dict({ - "account": stock_adjustment_account, - "against": account, - "credit": diff, - "cost_center": cost_center or None, - "remarks": "Adjustment Accounting Entry for Stock", - }), - ]) - - if gl_entries: - from erpnext.accounts.general_ledger import make_gl_entries - make_gl_entries(gl_entries) - def check_expense_account(self, item): if not item.get("expense_account"): frappe.throw(_("Expense or Difference account is mandatory for Item {0} as it impacts overall stock value").format(item.item_code)) diff --git a/erpnext/manufacturing/doctype/production_plan/test_production_plan.py b/erpnext/manufacturing/doctype/production_plan/test_production_plan.py index f70c9cc43f..44796417d4 100644 --- a/erpnext/manufacturing/doctype/production_plan/test_production_plan.py +++ b/erpnext/manufacturing/doctype/production_plan/test_production_plan.py @@ -11,9 +11,11 @@ from erpnext.manufacturing.doctype.production_plan.production_plan import get_sa from erpnext.stock.doctype.stock_reconciliation.test_stock_reconciliation import create_stock_reconciliation from erpnext.selling.doctype.sales_order.test_sales_order import make_sales_order from erpnext.manufacturing.doctype.production_plan.production_plan import get_items_for_material_requests +from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import set_perpetual_inventory class TestProductionPlan(unittest.TestCase): def setUp(self): + set_perpetual_inventory(0) for item in ['Test Production Item 1', 'Subassembly Item 1', 'Raw Material Item 1', 'Raw Material Item 2']: create_item(item, valuation_rate=100) diff --git a/erpnext/manufacturing/doctype/work_order/test_work_order.py b/erpnext/manufacturing/doctype/work_order/test_work_order.py index d710e57056..ea2e7a96e1 100644 --- a/erpnext/manufacturing/doctype/work_order/test_work_order.py +++ b/erpnext/manufacturing/doctype/work_order/test_work_order.py @@ -17,11 +17,11 @@ from erpnext.manufacturing.doctype.production_plan.test_production_plan import m class TestWorkOrder(unittest.TestCase): def setUp(self): + set_perpetual_inventory(0) self.warehouse = '_Test Warehouse 2 - _TC' self.item = '_Test Item' def check_planned_qty(self): - set_perpetual_inventory(0) planned0 = frappe.db.get_value("Bin", {"item_code": "_Test FG Item", "warehouse": "_Test Warehouse 1 - _TC"}, "planned_qty") or 0 diff --git a/erpnext/setup/doctype/company/test_company.py b/erpnext/setup/doctype/company/test_company.py index 8debef5ff6..8d9c23a37d 100644 --- a/erpnext/setup/doctype/company/test_company.py +++ b/erpnext/setup/doctype/company/test_company.py @@ -22,7 +22,7 @@ class TestCompany(unittest.TestCase): company.create_chart_of_accounts_based_on = "Existing Company" company.existing_company = "_Test Company" company.save() - + expected_results = { "Debtors - CFEC": { "account_type": "Receivable", @@ -37,7 +37,7 @@ class TestCompany(unittest.TestCase): "parent_account": "Cash In Hand - CFEC" } } - + for account, acc_property in expected_results.items(): acc = frappe.get_doc("Account", account) for prop, val in acc_property.items(): @@ -50,14 +50,14 @@ class TestCompany(unittest.TestCase): countries = ["India", "Brazil", "United Arab Emirates", "Canada", "Germany", "France", "Guatemala", "Indonesia", "Italy", "Mexico", "Nicaragua", "Netherlands", "Singapore", "Brazil", "Argentina", "Hungary", "Taiwan"] - + for country in countries: templates = get_charts_for_country(country) if len(templates) != 1 and "Standard" in templates: templates.remove("Standard") - + self.assertTrue(templates) - + for template in templates: try: company = frappe.new_doc("Company") @@ -67,11 +67,11 @@ class TestCompany(unittest.TestCase): company.create_chart_of_accounts_based_on = "Standard Template" company.chart_of_accounts = template company.save() - - account_types = ["Cost of Goods Sold", "Depreciation", - "Expenses Included In Valuation", "Fixed Asset", "Payable", "Receivable", + + account_types = ["Cost of Goods Sold", "Depreciation", + "Expenses Included In Valuation", "Fixed Asset", "Payable", "Receivable", "Stock Adjustment", "Stock Received But Not Billed", "Bank", "Cash", "Stock"] - + for account_type in account_types: filters = { "company": template, diff --git a/erpnext/setup/doctype/company/test_records.json b/erpnext/setup/doctype/company/test_records.json index 58d8b5c334..21302417d2 100644 --- a/erpnext/setup/doctype/company/test_records.json +++ b/erpnext/setup/doctype/company/test_records.json @@ -62,5 +62,16 @@ "domain": "Manufacturing", "chart_of_accounts": "Standard", "default_holiday_list": "_Test Holiday List" + }, + { + "abbr": "TCP1", + "company_name": "_Test Company with perpetual inventory", + "country": "India", + "default_currency": "INR", + "doctype": "Company", + "domain": "Manufacturing", + "chart_of_accounts": "Standard", + "enable_perpetual_inventory": 1, + "default_holiday_list": "_Test Holiday List" } ] diff --git a/erpnext/stock/__init__.py b/erpnext/stock/__init__.py index 32a03e7373..a4d4cbd8ef 100644 --- a/erpnext/stock/__init__.py +++ b/erpnext/stock/__init__.py @@ -21,7 +21,7 @@ def get_warehouse_account_map(company=None): filters['company'] = company for d in frappe.get_all('Warehouse', - fields = ["name", "account", "parent_warehouse", "company"], + fields = ["name", "account", "parent_warehouse", "company", "is_group"], filters = filters, order_by="lft, rgt"): if not d.account: diff --git a/erpnext/stock/doctype/batch/test_batch.py b/erpnext/stock/doctype/batch/test_batch.py index 56b460781c..32445a618d 100644 --- a/erpnext/stock/doctype/batch/test_batch.py +++ b/erpnext/stock/doctype/batch/test_batch.py @@ -8,10 +8,13 @@ import unittest from erpnext.stock.doctype.batch.batch import get_batch_qty, UnableToSelectBatchError, get_batch_no from frappe.utils import cint - +from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import set_perpetual_inventory class TestBatch(unittest.TestCase): + def setUp(self): + set_perpetual_inventory(0) + def test_item_has_batch_enabled(self): self.assertRaises(ValidationError, frappe.get_doc({ "doctype": "Batch", diff --git a/erpnext/stock/doctype/delivery_note/test_delivery_note.py b/erpnext/stock/doctype/delivery_note/test_delivery_note.py index 91b6f4c606..dc92c5c9ff 100644 --- a/erpnext/stock/doctype/delivery_note/test_delivery_note.py +++ b/erpnext/stock/doctype/delivery_note/test_delivery_note.py @@ -20,18 +20,11 @@ from erpnext.stock.doctype.stock_reconciliation.test_stock_reconciliation \ import create_stock_reconciliation, set_valuation_method from erpnext.selling.doctype.sales_order.test_sales_order import make_sales_order, create_dn_against_so from erpnext.accounts.doctype.account.test_account import get_inventory_account, create_account +from erpnext.stock.doctype.warehouse.test_warehouse import get_warehouse class TestDeliveryNote(unittest.TestCase): - def tearDown(self): - target_warehouse = "_Test Warehouse 1 - _TC" - company = "_Test Company" - if not frappe.db.exists("Account", target_warehouse): - parent_account = frappe.db.get_value('Account', - {'company': company, 'is_group':1, 'account_type': 'Stock'},'name') - - account = create_account(account_name="_Test Warehouse 1", \ - account_type="Stock", parent_account= parent_account, company=company) - frappe.db.set_value('Warehouse', target_warehouse, 'account', account) + def setUp(self): + set_perpetual_inventory(0) def test_over_billing_against_dn(self): frappe.db.set_value("Stock Settings", None, "allow_negative_stock", 1) @@ -68,17 +61,16 @@ class TestDeliveryNote(unittest.TestCase): self.assertFalse(get_gl_entries("Delivery Note", dn.name)) def test_delivery_note_gl_entry(self): - company = frappe.db.get_value('Warehouse', '_Test Warehouse - _TC', 'company') - set_perpetual_inventory(1, company) + company = frappe.db.get_value('Warehouse', 'Stores - TCP1', 'company') set_valuation_method("_Test Item", "FIFO") - make_stock_entry(target="_Test Warehouse - _TC", qty=5, basic_rate=100) + make_stock_entry(target="Stores - TCP1", qty=5, basic_rate=100) - stock_in_hand_account = get_inventory_account('_Test Company') + stock_in_hand_account = get_inventory_account('_Test Company with perpetual inventory') prev_bal = get_balance_on(stock_in_hand_account) - dn = create_delivery_note() + dn = create_delivery_note(company='_Test Company with perpetual inventory', warehouse='Stores - TCP1', cost_center = 'Main - TCP1', expense_account = "Cost of Goods Sold - TCP1") gl_entries = get_gl_entries("Delivery Note", dn.name) self.assertTrue(gl_entries) @@ -88,7 +80,7 @@ class TestDeliveryNote(unittest.TestCase): expected_values = { stock_in_hand_account: [0.0, stock_value_difference], - "Cost of Goods Sold - _TC": [stock_value_difference, 0.0] + "Cost of Goods Sold - TCP1": [stock_value_difference, 0.0] } for i, gle in enumerate(gl_entries): self.assertEqual([gle.debit, gle.credit], expected_values.get(gle.account)) @@ -98,7 +90,7 @@ class TestDeliveryNote(unittest.TestCase): self.assertEqual(bal, prev_bal - stock_value_difference) # back dated incoming entry - make_stock_entry(posting_date=add_days(nowdate(), -2), target="_Test Warehouse - _TC", + make_stock_entry(posting_date=add_days(nowdate(), -2), target="Stores - TCP1", qty=5, basic_rate=100) gl_entries = get_gl_entries("Delivery Note", dn.name) @@ -109,27 +101,25 @@ class TestDeliveryNote(unittest.TestCase): expected_values = { stock_in_hand_account: [0.0, stock_value_difference], - "Cost of Goods Sold - _TC": [stock_value_difference, 0.0] + "Cost of Goods Sold - TCP1": [stock_value_difference, 0.0] } for i, gle in enumerate(gl_entries): self.assertEqual([gle.debit, gle.credit], expected_values.get(gle.account)) dn.cancel() self.assertFalse(get_gl_entries("Delivery Note", dn.name)) - set_perpetual_inventory(0, company) def test_delivery_note_gl_entry_packing_item(self): - company = frappe.db.get_value('Warehouse', '_Test Warehouse - _TC', 'company') - set_perpetual_inventory(1, company) + company = frappe.db.get_value('Warehouse', 'Stores - TCP1', 'company') - make_stock_entry(item_code="_Test Item", target="_Test Warehouse - _TC", qty=10, basic_rate=100) + make_stock_entry(item_code="_Test Item", target="Stores - TCP1", qty=10, basic_rate=100) make_stock_entry(item_code="_Test Item Home Desktop 100", - target="_Test Warehouse - _TC", qty=10, basic_rate=100) + target="Stores - TCP1", qty=10, basic_rate=100) - stock_in_hand_account = get_inventory_account('_Test Company') + stock_in_hand_account = get_inventory_account('_Test Company with perpetual inventory') prev_bal = get_balance_on(stock_in_hand_account) - dn = create_delivery_note(item_code="_Test Product Bundle Item") + dn = create_delivery_note(item_code="_Test Product Bundle Item", company='_Test Company with perpetual inventory', warehouse='Stores - TCP1', cost_center = 'Main - TCP1', expense_account = "Cost of Goods Sold - TCP1") stock_value_diff_rm1 = abs(frappe.db.get_value("Stock Ledger Entry", {"voucher_type": "Delivery Note", "voucher_no": dn.name, "item_code": "_Test Item"}, @@ -146,7 +136,7 @@ class TestDeliveryNote(unittest.TestCase): expected_values = { stock_in_hand_account: [0.0, stock_value_diff], - "Cost of Goods Sold - _TC": [stock_value_diff, 0.0] + "Cost of Goods Sold - TCP1": [stock_value_diff, 0.0] } for i, gle in enumerate(gl_entries): self.assertEqual([gle.debit, gle.credit], expected_values.get(gle.account)) @@ -158,8 +148,6 @@ class TestDeliveryNote(unittest.TestCase): dn.cancel() self.assertFalse(get_gl_entries("Delivery Note", dn.name)) - set_perpetual_inventory(0, company) - def test_serialized(self): se = make_serialized_item() serial_no = get_serial_nos(se.get("items")[0].serial_no)[0] @@ -218,16 +206,16 @@ class TestDeliveryNote(unittest.TestCase): self.assertEqual(cstr(serial_no.get(field)), value) def test_sales_return_for_non_bundled_items(self): - company = frappe.db.get_value('Warehouse', '_Test Warehouse - _TC', 'company') - set_perpetual_inventory(1, company) + company = frappe.db.get_value('Warehouse', 'Stores - TCP1', 'company') - make_stock_entry(item_code="_Test Item", target="_Test Warehouse - _TC", qty=50, basic_rate=100) + make_stock_entry(item_code="_Test Item", target="Stores - TCP1", qty=50, basic_rate=100) - actual_qty_0 = get_qty_after_transaction() + actual_qty_0 = get_qty_after_transaction(warehouse="Stores - TCP1") - dn = create_delivery_note(qty=5, rate=500) + dn = create_delivery_note(qty=5, rate=500, warehouse="Stores - TCP1", company=company, + expense_account="Cost of Goods Sold - TCP1", cost_center="Main - TCP1") - actual_qty_1 = get_qty_after_transaction() + actual_qty_1 = get_qty_after_transaction(warehouse="Stores - TCP1") self.assertEqual(actual_qty_0 - 5, actual_qty_1) # outgoing_rate @@ -235,9 +223,10 @@ class TestDeliveryNote(unittest.TestCase): "voucher_no": dn.name}, "stock_value_difference") / 5 # return entry - dn1 = create_delivery_note(is_return=1, return_against=dn.name, qty=-2, rate=500) + dn1 = create_delivery_note(is_return=1, return_against=dn.name, qty=-2, rate=500, + company=company, warehouse="Stores - TCP1", expense_account="Cost of Goods Sold - TCP1", cost_center="Main - TCP1") - actual_qty_2 = get_qty_after_transaction() + actual_qty_2 = get_qty_after_transaction(warehouse="Stores - TCP1") self.assertEqual(actual_qty_1 + 2, actual_qty_2) @@ -246,27 +235,29 @@ class TestDeliveryNote(unittest.TestCase): ["incoming_rate", "stock_value_difference"]) self.assertEqual(flt(incoming_rate, 3), abs(flt(outgoing_rate, 3))) - stock_in_hand_account = get_inventory_account('_Test Company', dn1.items[0].warehouse) + stock_in_hand_account = get_inventory_account(company, dn1.items[0].warehouse) gle_warehouse_amount = frappe.db.get_value("GL Entry", {"voucher_type": "Delivery Note", "voucher_no": dn1.name, "account": stock_in_hand_account}, "debit") self.assertEqual(gle_warehouse_amount, stock_value_difference) - set_perpetual_inventory(0, company) - def test_return_single_item_from_bundled_items(self): - company = frappe.db.get_value('Warehouse', '_Test Warehouse - _TC', 'company') - set_perpetual_inventory(1, company) + company = frappe.db.get_value('Warehouse', 'Stores - TCP1', 'company') - create_stock_reconciliation(item_code="_Test Item", target="_Test Warehouse - _TC", qty=50, rate=100) - create_stock_reconciliation(item_code="_Test Item Home Desktop 100", target="_Test Warehouse - _TC", - qty=50, rate=100) + create_stock_reconciliation(item_code="_Test Item", + warehouse="Stores - TCP1", qty=50, rate=100, + company=company, expense_account = "Stock Adjustment - TCP1") + create_stock_reconciliation(item_code="_Test Item Home Desktop 100", + warehouse="Stores - TCP1", qty=50, rate=100, + company=company, expense_account = "Stock Adjustment - TCP1") - dn = create_delivery_note(item_code="_Test Product Bundle Item", qty=5, rate=500) + dn = create_delivery_note(item_code="_Test Product Bundle Item", qty=5, rate=500, + company=company, warehouse="Stores - TCP1", + expense_account="Cost of Goods Sold - TCP1", cost_center="Main - TCP1") # Qty after delivery - actual_qty_1 = get_qty_after_transaction() + actual_qty_1 = get_qty_after_transaction(warehouse="Stores - TCP1") self.assertEqual(actual_qty_1, 25) # outgoing_rate @@ -274,10 +265,12 @@ class TestDeliveryNote(unittest.TestCase): "voucher_no": dn.name, "item_code": "_Test Item"}, "stock_value_difference") / 25 # return 'test item' from packed items - dn1 = create_delivery_note(is_return=1, return_against=dn.name, qty=-10, rate=500) + dn1 = create_delivery_note(is_return=1, return_against=dn.name, qty=-10, rate=500, + company=company, warehouse="Stores - TCP1", + expense_account="Cost of Goods Sold - TCP1", cost_center="Main - TCP1") # qty after return - actual_qty_2 = get_qty_after_transaction() + actual_qty_2 = get_qty_after_transaction(warehouse="Stores - TCP1") self.assertEqual(actual_qty_2, 35) # Check incoming rate for return entry @@ -286,7 +279,7 @@ class TestDeliveryNote(unittest.TestCase): ["incoming_rate", "stock_value_difference"]) self.assertEqual(flt(incoming_rate, 3), abs(flt(outgoing_rate, 3))) - stock_in_hand_account = get_inventory_account('_Test Company', dn1.items[0].warehouse) + stock_in_hand_account = get_inventory_account(company, dn1.items[0].warehouse) # Check gl entry for warehouse gle_warehouse_amount = frappe.db.get_value("GL Entry", {"voucher_type": "Delivery Note", @@ -294,33 +287,33 @@ class TestDeliveryNote(unittest.TestCase): self.assertEqual(gle_warehouse_amount, stock_value_difference) - set_perpetual_inventory(0, company) def test_return_entire_bundled_items(self): - company = frappe.db.get_value('Warehouse', '_Test Warehouse - _TC', 'company') - set_perpetual_inventory(1, company) + company = frappe.db.get_value('Warehouse', 'Stores - TCP1', 'company') create_stock_reconciliation(item_code="_Test Item", - target="_Test Warehouse - _TC", qty=50, rate=100) + warehouse="Stores - TCP1", qty=50, rate=100, + company=company, expense_account = "Stock Adjustment - TCP1") create_stock_reconciliation(item_code="_Test Item Home Desktop 100", - target="_Test Warehouse - _TC", qty=50, rate=100) + warehouse="Stores - TCP1", qty=50, rate=100, + company=company, expense_account = "Stock Adjustment - TCP1") - actual_qty = get_qty_after_transaction() + actual_qty = get_qty_after_transaction(warehouse="Stores - TCP1") self.assertEqual(actual_qty, 50) dn = create_delivery_note(item_code="_Test Product Bundle Item", - qty=5, rate=500) + qty=5, rate=500, company=company, warehouse="Stores - TCP1", expense_account="Cost of Goods Sold - TCP1", cost_center="Main - TCP1") # qty after return - actual_qty = get_qty_after_transaction() + actual_qty = get_qty_after_transaction(warehouse="Stores - TCP1") self.assertEqual(actual_qty, 25) # return bundled item dn1 = create_delivery_note(item_code='_Test Product Bundle Item', is_return=1, - return_against=dn.name, qty=-2, rate=500) + return_against=dn.name, qty=-2, rate=500, company=company, warehouse="Stores - TCP1", expense_account="Cost of Goods Sold - TCP1", cost_center="Main - TCP1") # qty after return - actual_qty = get_qty_after_transaction() + actual_qty = get_qty_after_transaction(warehouse="Stores - TCP1") self.assertEqual(actual_qty, 35) # Check incoming rate for return entry @@ -337,8 +330,6 @@ class TestDeliveryNote(unittest.TestCase): self.assertEqual(gle_warehouse_amount, 1400) - set_perpetual_inventory(0, company) - def test_return_for_serialized_items(self): se = make_serialized_item() serial_no = get_serial_nos(se.get("items")[0].serial_no)[0] @@ -375,56 +366,44 @@ class TestDeliveryNote(unittest.TestCase): }) def test_delivery_of_bundled_items_to_target_warehouse(self): - company = frappe.db.get_value('Warehouse', '_Test Warehouse - _TC', 'company') - set_perpetual_inventory(1, company) + company = frappe.db.get_value('Warehouse', 'Stores - TCP1', 'company') set_valuation_method("_Test Item", "FIFO") set_valuation_method("_Test Item Home Desktop 100", "FIFO") - for warehouse in ("_Test Warehouse - _TC", "_Test Warehouse 1 - _TC"): - create_stock_reconciliation(item_code="_Test Item", target=warehouse, - qty=100, rate=100) - create_stock_reconciliation(item_code="_Test Item Home Desktop 100", - target=warehouse, qty=100, rate=100) + target_warehouse=get_warehouse(company=company, abbr="TCP1", + warehouse_name="_Test Customer Warehouse").name + + for warehouse in ("Stores - TCP1", target_warehouse): + create_stock_reconciliation(item_code="_Test Item", warehouse=warehouse, company = company, + expense_account = "Stock Adjustment - TCP1", qty=500, rate=100) + create_stock_reconciliation(item_code="_Test Item Home Desktop 100", company = company, + expense_account = "Stock Adjustment - TCP1", warehouse=warehouse, qty=500, rate=100) - opening_qty_test_warehouse_1 = get_qty_after_transaction(warehouse="_Test Warehouse 1 - _TC") dn = create_delivery_note(item_code="_Test Product Bundle Item", - qty=5, rate=500, target_warehouse="_Test Warehouse 1 - _TC", do_not_submit=True) + company='_Test Company with perpetual inventory', cost_center = 'Main - TCP1', + expense_account = "Cost of Goods Sold - TCP1", do_not_submit=True, qty=5, rate=500, + warehouse="Stores - TCP1", target_warehouse=target_warehouse) dn.submit() # qty after delivery - actual_qty = get_qty_after_transaction(warehouse="_Test Warehouse - _TC") - self.assertEqual(actual_qty, 75) + actual_qty_at_source = get_qty_after_transaction(warehouse="Stores - TCP1") + self.assertEqual(actual_qty_at_source, 475) - actual_qty = get_qty_after_transaction(warehouse="_Test Warehouse 1 - _TC") - self.assertEqual(actual_qty, opening_qty_test_warehouse_1 + 25) + actual_qty_at_target = get_qty_after_transaction(warehouse=target_warehouse) + self.assertEqual(actual_qty_at_target, 525) - # stock value diff for source warehouse - # for "_Test Item" + # stock value diff for source warehouse for "_Test Item" stock_value_difference = frappe.db.get_value("Stock Ledger Entry", {"voucher_type": "Delivery Note", "voucher_no": dn.name, - "item_code": "_Test Item", "warehouse": "_Test Warehouse - _TC"}, + "item_code": "_Test Item", "warehouse": "Stores - TCP1"}, "stock_value_difference") # stock value diff for target warehouse stock_value_difference1 = frappe.db.get_value("Stock Ledger Entry", {"voucher_type": "Delivery Note", "voucher_no": dn.name, - "item_code": "_Test Item", "warehouse": "_Test Warehouse 1 - _TC"}, - "stock_value_difference") - - self.assertEqual(abs(stock_value_difference), stock_value_difference1) - - # for "_Test Item Home Desktop 100" - stock_value_difference = frappe.db.get_value("Stock Ledger Entry", - {"voucher_type": "Delivery Note", "voucher_no": dn.name, - "item_code": "_Test Item Home Desktop 100", "warehouse": "_Test Warehouse - _TC"}, - "stock_value_difference") - - # stock value diff for target warehouse - stock_value_difference1 = frappe.db.get_value("Stock Ledger Entry", - {"voucher_type": "Delivery Note", "voucher_no": dn.name, - "item_code": "_Test Item Home Desktop 100", "warehouse": "_Test Warehouse 1 - _TC"}, + "item_code": "_Test Item", "warehouse": target_warehouse}, "stock_value_difference") self.assertEqual(abs(stock_value_difference), stock_value_difference1) @@ -435,21 +414,20 @@ class TestDeliveryNote(unittest.TestCase): stock_value_difference = abs(frappe.db.sql("""select sum(stock_value_difference) from `tabStock Ledger Entry` where voucher_type='Delivery Note' and voucher_no=%s - and warehouse='_Test Warehouse - _TC'""", dn.name)[0][0]) + and warehouse='Stores - TCP1'""", dn.name)[0][0]) expected_values = { - "Stock In Hand - _TC": [0.0, stock_value_difference], - "_Test Warehouse 1 - _TC": [stock_value_difference, 0.0] + "Stock In Hand - TCP1": [0.0, stock_value_difference], + target_warehouse: [stock_value_difference, 0.0] } for i, gle in enumerate(gl_entries): self.assertEqual([gle.debit, gle.credit], expected_values.get(gle.account)) - set_perpetual_inventory(0, company) - def test_closed_delivery_note(self): from erpnext.stock.doctype.delivery_note.delivery_note import update_delivery_note_status - dn = create_delivery_note(do_not_submit=True) + dn = create_delivery_note(company='_Test Company with perpetual inventory', warehouse='Stores - TCP1', cost_center = 'Main - TCP1', expense_account = "Cost of Goods Sold - TCP1", do_not_submit=True) + dn.submit() update_delivery_note_status(dn.name, "Closed") @@ -574,24 +552,23 @@ class TestDeliveryNote(unittest.TestCase): accounts_settings = frappe.get_doc('Accounts Settings', 'Accounts Settings') accounts_settings.allow_cost_center_in_entry_of_bs_account = 1 accounts_settings.save() - cost_center = "_Test Cost Center for BS Account - _TC" - create_cost_center(cost_center_name="_Test Cost Center for BS Account", company="_Test Company") + cost_center = "_Test Cost Center for BS Account - TCP1" + create_cost_center(cost_center_name="_Test Cost Center for BS Account", company="_Test Company with perpetual inventory") - company = frappe.db.get_value('Warehouse', '_Test Warehouse - _TC', 'company') - set_perpetual_inventory(1, company) + company = frappe.db.get_value('Warehouse', 'Stores - TCP1', 'company') set_valuation_method("_Test Item", "FIFO") - make_stock_entry(target="_Test Warehouse - _TC", qty=5, basic_rate=100) + make_stock_entry(target="Stores - TCP1", qty=5, basic_rate=100) - stock_in_hand_account = get_inventory_account('_Test Company') - dn = create_delivery_note(cost_center=cost_center) + stock_in_hand_account = get_inventory_account('_Test Company with perpetual inventory') + dn = create_delivery_note(company='_Test Company with perpetual inventory', warehouse='Stores - TCP1', expense_account = "Cost of Goods Sold - TCP1", cost_center=cost_center) gl_entries = get_gl_entries("Delivery Note", dn.name) self.assertTrue(gl_entries) expected_values = { - "Cost of Goods Sold - _TC": { + "Cost of Goods Sold - TCP1": { "cost_center": cost_center }, stock_in_hand_account: { @@ -600,8 +577,6 @@ class TestDeliveryNote(unittest.TestCase): } for i, gle in enumerate(gl_entries): self.assertEqual(expected_values[gle.account]["cost_center"], gle.cost_center) - - set_perpetual_inventory(0, company) accounts_settings.allow_cost_center_in_entry_of_bs_account = 0 accounts_settings.save() @@ -609,23 +584,22 @@ class TestDeliveryNote(unittest.TestCase): accounts_settings = frappe.get_doc('Accounts Settings', 'Accounts Settings') accounts_settings.allow_cost_center_in_entry_of_bs_account = 0 accounts_settings.save() - cost_center = "_Test Cost Center - _TC" + cost_center = "Main - TCP1" - company = frappe.db.get_value('Warehouse', '_Test Warehouse - _TC', 'company') - set_perpetual_inventory(1, company) + company = frappe.db.get_value('Warehouse', 'Stores - TCP1', 'company') set_valuation_method("_Test Item", "FIFO") - make_stock_entry(target="_Test Warehouse - _TC", qty=5, basic_rate=100) + make_stock_entry(target="Stores - TCP1", qty=5, basic_rate=100) - stock_in_hand_account = get_inventory_account('_Test Company') - dn = create_delivery_note() + stock_in_hand_account = get_inventory_account('_Test Company with perpetual inventory') + dn = create_delivery_note(company='_Test Company with perpetual inventory', warehouse='Stores - TCP1', cost_center = 'Main - TCP1', expense_account = "Cost of Goods Sold - TCP1") gl_entries = get_gl_entries("Delivery Note", dn.name) self.assertTrue(gl_entries) expected_values = { - "Cost of Goods Sold - _TC": { + "Cost of Goods Sold - TCP1": { "cost_center": cost_center }, stock_in_hand_account: { @@ -635,8 +609,6 @@ class TestDeliveryNote(unittest.TestCase): for i, gle in enumerate(gl_entries): self.assertEqual(expected_values[gle.account]["cost_center"], gle.cost_center) - set_perpetual_inventory(0, company) - def test_make_sales_invoice_from_dn_for_returned_qty(self): from erpnext.selling.doctype.sales_order.sales_order import make_delivery_note from erpnext.stock.doctype.delivery_note.delivery_note import make_sales_invoice @@ -702,7 +674,7 @@ def create_delivery_note(**args): "rate": args.rate or 100, "conversion_factor": 1.0, "allow_zero_valuation_rate": args.allow_zero_valuation_rate or 1, - "expense_account": "Cost of Goods Sold - _TC", + "expense_account": args.expense_account or "Cost of Goods Sold - _TC", "cost_center": args.cost_center or "_Test Cost Center - _TC", "serial_no": args.serial_no, "target_warehouse": args.target_warehouse diff --git a/erpnext/stock/doctype/item_alternative/test_item_alternative.py b/erpnext/stock/doctype/item_alternative/test_item_alternative.py index d5700fe514..f045e4f911 100644 --- a/erpnext/stock/doctype/item_alternative/test_item_alternative.py +++ b/erpnext/stock/doctype/item_alternative/test_item_alternative.py @@ -12,9 +12,11 @@ from erpnext.stock.doctype.stock_reconciliation.test_stock_reconciliation import from erpnext.manufacturing.doctype.work_order.test_work_order import make_wo_order_test_record from erpnext.buying.doctype.purchase_order.purchase_order import make_purchase_receipt, make_rm_stock_entry import unittest +from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import set_perpetual_inventory class TestItemAlternative(unittest.TestCase): def setUp(self): + set_perpetual_inventory(0) make_items() def test_alternative_item_for_subcontract_rm(self): diff --git a/erpnext/stock/doctype/landed_cost_voucher/test_landed_cost_voucher.py b/erpnext/stock/doctype/landed_cost_voucher/test_landed_cost_voucher.py index c32f028b08..4dc0b7b059 100644 --- a/erpnext/stock/doctype/landed_cost_voucher/test_landed_cost_voucher.py +++ b/erpnext/stock/doctype/landed_cost_voucher/test_landed_cost_voucher.py @@ -14,15 +14,15 @@ from erpnext.accounts.doctype.account.test_account import get_inventory_account class TestLandedCostVoucher(unittest.TestCase): def test_landed_cost_voucher(self): frappe.db.set_value("Buying Settings", None, "allow_multiple_items", 1) - set_perpetual_inventory(1) - pr = frappe.copy_doc(pr_test_records[0]) - pr.submit() + + pr = make_purchase_receipt(company="_Test Company with perpetual inventory", warehouse = "Stores - TCP1", supplier_warehouse = "Work in Progress - TCP1", get_multiple_items = True, get_taxes_and_charges = True) + last_sle = frappe.db.get_value("Stock Ledger Entry", { "voucher_type": pr.doctype, "voucher_no": pr.name, "item_code": "_Test Item", - "warehouse": "_Test Warehouse - _TC" + "warehouse": "Stores - TCP1" }, fieldname=["qty_after_transaction", "stock_value"], as_dict=1) @@ -35,7 +35,7 @@ class TestLandedCostVoucher(unittest.TestCase): "voucher_type": pr.doctype, "voucher_no": pr.name, "item_code": "_Test Item", - "warehouse": "_Test Warehouse - _TC" + "warehouse": "Stores - TCP1" }, fieldname=["qty_after_transaction", "stock_value"], as_dict=1) @@ -48,55 +48,56 @@ class TestLandedCostVoucher(unittest.TestCase): self.assertTrue(gl_entries) stock_in_hand_account = get_inventory_account(pr.company, pr.get("items")[0].warehouse) - fixed_asset_account = get_inventory_account(pr.company, pr.get("items")[1].warehouse) + fixed_asset_account = get_inventory_account(pr.company, pr.get("items")[1].warehouse) if stock_in_hand_account == fixed_asset_account: expected_values = { stock_in_hand_account: [800.0, 0.0], - "Stock Received But Not Billed - _TC": [0.0, 500.0], - "Expenses Included In Valuation - _TC": [0.0, 300.0] + "Stock Received But Not Billed - TCP1": [0.0, 500.0], + "Expenses Included In Valuation - TCP1": [0.0, 300.0] } - + else: expected_values = { stock_in_hand_account: [400.0, 0.0], fixed_asset_account: [400.0, 0.0], - "Stock Received But Not Billed - _TC": [0.0, 500.0], - "Expenses Included In Valuation - _TC": [0.0, 300.0] + "Stock Received But Not Billed - TCP1": [0.0, 500.0], + "Expenses Included In Valuation - TCP1": [0.0, 300.0] } for gle in gl_entries: self.assertEqual(expected_values[gle.account][0], gle.debit) self.assertEqual(expected_values[gle.account][1], gle.credit) - set_perpetual_inventory(0) - + def test_landed_cost_voucher_against_purchase_invoice(self): - set_perpetual_inventory(1) - + pi = make_purchase_invoice(update_stock=1, posting_date=frappe.utils.nowdate(), - posting_time=frappe.utils.nowtime()) + posting_time=frappe.utils.nowtime(), cash_bank_account="Cash - TCP1", + company="_Test Company with perpetual inventory", supplier_warehouse="Work In Progress - TCP1", + warehouse= "Stores - TCP1", cost_center = "Main - TCP1", + expense_account ="_Test Account Cost for Goods Sold - TCP1") last_sle = frappe.db.get_value("Stock Ledger Entry", { "voucher_type": pi.doctype, "voucher_no": pi.name, "item_code": "_Test Item", - "warehouse": "_Test Warehouse - _TC" + "warehouse": "Stores - TCP1" }, fieldname=["qty_after_transaction", "stock_value"], as_dict=1) submit_landed_cost_voucher("Purchase Invoice", pi.name) - - pi_lc_value = frappe.db.get_value("Purchase Invoice Item", {"parent": pi.name}, + + pi_lc_value = frappe.db.get_value("Purchase Invoice Item", {"parent": pi.name}, "landed_cost_voucher_amount") - + self.assertEqual(pi_lc_value, 50.0) last_sle_after_landed_cost = frappe.db.get_value("Stock Ledger Entry", { "voucher_type": pi.doctype, "voucher_no": pi.name, "item_code": "_Test Item", - "warehouse": "_Test Warehouse - _TC" + "warehouse": "Stores - TCP1" }, fieldname=["qty_after_transaction", "stock_value"], as_dict=1) @@ -111,21 +112,21 @@ class TestLandedCostVoucher(unittest.TestCase): expected_values = { stock_in_hand_account: [300.0, 0.0], - "Creditors - _TC": [0.0, 250.0], - "Expenses Included In Valuation - _TC": [0.0, 50.0] + "Creditors - TCP1": [0.0, 250.0], + "Expenses Included In Valuation - TCP1": [0.0, 50.0] } for gle in gl_entries: self.assertEqual(expected_values[gle.account][0], gle.debit) self.assertEqual(expected_values[gle.account][1], gle.credit) - set_perpetual_inventory(0) - - def test_landed_cost_voucher_for_serialized_item(self): - set_perpetual_inventory(1) - frappe.db.sql("delete from `tabSerial No` where name in ('SN001', 'SN002', 'SN003', 'SN004', 'SN005')") - pr = frappe.copy_doc(pr_test_records[0]) + def test_landed_cost_voucher_for_serialized_item(self): + frappe.db.sql("delete from `tabSerial No` where name in ('SN001', 'SN002', 'SN003', 'SN004', 'SN005')") + pr = make_purchase_receipt(company="_Test Company with perpetual inventory", warehouse = "Stores - TCP1", + supplier_warehouse = "Work in Progress - TCP1", get_multiple_items = True, + get_taxes_and_charges = True, do_not_submit = True) + pr.items[0].item_code = "_Test Serialized Item" pr.items[0].serial_no = "SN001\nSN002\nSN003\nSN004\nSN005" pr.submit() @@ -138,39 +139,36 @@ class TestLandedCostVoucher(unittest.TestCase): ["warehouse", "purchase_rate"], as_dict=1) self.assertEqual(serial_no.purchase_rate - serial_no_rate, 5.0) - self.assertEqual(serial_no.warehouse, "_Test Warehouse - _TC") + self.assertEqual(serial_no.warehouse, "Stores - TCP1") - set_perpetual_inventory(0) def test_landed_cost_voucher_for_odd_numbers (self): - set_perpetual_inventory(1) - pr = make_purchase_receipt(do_not_save=True) - pr.items[0].cost_center = "_Test Company - _TC" + pr = make_purchase_receipt(company="_Test Company with perpetual inventory", warehouse = "Stores - TCP1", supplier_warehouse = "Work in Progress - TCP1", do_not_save=True) + pr.items[0].cost_center = "Main - TCP1" for x in range(2): pr.append("items", { "item_code": "_Test Item", - "warehouse": "_Test Warehouse - _TC", - "cost_center": "_Test Company - _TC", + "warehouse": "Stores - TCP1", + "cost_center": "Main - TCP1", "qty": 5, "rate": 50 }) pr.submit() lcv = submit_landed_cost_voucher("Purchase Receipt", pr.name, 123.22) - + self.assertEqual(lcv.items[0].applicable_charges, 41.07) - self.assertEqual(lcv.items[2].applicable_charges, 41.08) - - set_perpetual_inventory(0) + self.assertEqual(lcv.items[2].applicable_charges, 41.08) + def submit_landed_cost_voucher(receipt_document_type, receipt_document, charges=50): ref_doc = frappe.get_doc(receipt_document_type, receipt_document) - + lcv = frappe.new_doc("Landed Cost Voucher") lcv.company = "_Test Company" lcv.distribute_charges_based_on = 'Amount' - + lcv.set("purchase_receipts", [{ "receipt_document_type": receipt_document_type, "receipt_document": receipt_document, @@ -178,7 +176,7 @@ def submit_landed_cost_voucher(receipt_document_type, receipt_document, charges= "posting_date": ref_doc.posting_date, "grand_total": ref_doc.base_grand_total }]) - + lcv.set("taxes", [{ "description": "Insurance Charges", "account": "_Test Account Insurance Charges - _TC", @@ -186,13 +184,13 @@ def submit_landed_cost_voucher(receipt_document_type, receipt_document, charges= }]) lcv.insert() - + distribute_landed_cost_on_items(lcv) - + lcv.submit() return lcv - + def distribute_landed_cost_on_items(lcv): based_on = lcv.distribute_charges_based_on.lower() total = sum([flt(d.get(based_on)) for d in lcv.get("items")]) diff --git a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py index ab9311b480..e9ddf9d976 100644 --- a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py +++ b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py @@ -14,6 +14,7 @@ from erpnext.stock.doctype.item.test_item import make_item from six import iteritems class TestPurchaseReceipt(unittest.TestCase): def setUp(self): + set_perpetual_inventory(0) frappe.db.set_value("Buying Settings", None, "allow_multiple_items", 1) def test_make_purchase_invoice(self): @@ -32,7 +33,6 @@ class TestPurchaseReceipt(unittest.TestCase): def test_purchase_receipt_no_gl_entry(self): company = frappe.db.get_value('Warehouse', '_Test Warehouse - _TC', 'company') - set_perpetual_inventory(0, company) existing_bin_stock_value = frappe.db.get_value("Bin", {"item_code": "_Test Item", "warehouse": "_Test Warehouse - _TC"}, "stock_value") @@ -52,33 +52,29 @@ class TestPurchaseReceipt(unittest.TestCase): self.assertFalse(get_gl_entries("Purchase Receipt", pr.name)) def test_purchase_receipt_gl_entry(self): - pr = frappe.copy_doc(test_records[0]) - set_perpetual_inventory(1, pr.company) + pr = make_purchase_receipt(company="_Test Company with perpetual inventory", warehouse = "Stores - TCP1", supplier_warehouse = "Work in Progress - TCP1", get_multiple_items = True, get_taxes_and_charges = True) self.assertEqual(cint(erpnext.is_perpetual_inventory_enabled(pr.company)), 1) - pr.insert() - pr.submit() gl_entries = get_gl_entries("Purchase Receipt", pr.name) self.assertTrue(gl_entries) - stock_in_hand_account = get_inventory_account(pr.company, pr.get("items")[0].warehouse) - fixed_asset_account = get_inventory_account(pr.company, pr.get("items")[1].warehouse) + stock_in_hand_account = get_inventory_account(pr.company, pr.items[0].warehouse) + fixed_asset_account = get_inventory_account(pr.company, pr.items[1].warehouse) if stock_in_hand_account == fixed_asset_account: expected_values = { stock_in_hand_account: [750.0, 0.0], - "Stock Received But Not Billed - _TC": [0.0, 500.0], - "Expenses Included In Valuation - _TC": [0.0, 250.0] + "Stock Received But Not Billed - TCP1": [0.0, 500.0], + "Expenses Included In Valuation - TCP1": [0.0, 250.0] } else: expected_values = { stock_in_hand_account: [375.0, 0.0], fixed_asset_account: [375.0, 0.0], - "Stock Received But Not Billed - _TC": [0.0, 500.0], - "Expenses Included In Valuation - _TC": [0.0, 250.0] + "Stock Received But Not Billed - TCP1": [0.0, 500.0], + "Expenses Included In Valuation - TCP1": [0.0, 250.0] } - for gle in gl_entries: self.assertEqual(expected_values[gle.account][0], gle.debit) self.assertEqual(expected_values[gle.account][1], gle.credit) @@ -86,8 +82,6 @@ class TestPurchaseReceipt(unittest.TestCase): pr.cancel() self.assertFalse(get_gl_entries("Purchase Receipt", pr.name)) - set_perpetual_inventory(0, pr.company) - def test_subcontracting(self): from erpnext.stock.doctype.stock_entry.test_stock_entry import make_stock_entry @@ -132,11 +126,10 @@ class TestPurchaseReceipt(unittest.TestCase): pr.get("items")[0].rejected_warehouse) def test_purchase_return(self): - set_perpetual_inventory() - pr = make_purchase_receipt() + pr = make_purchase_receipt(company="_Test Company with perpetual inventory", warehouse = "Stores - TCP1", supplier_warehouse = "Work in Progress - TCP1") - return_pr = make_purchase_receipt(is_return=1, return_against=pr.name, qty=-2) + return_pr = make_purchase_receipt(company="_Test Company with perpetual inventory", warehouse = "Stores - TCP1", supplier_warehouse = "Work in Progress - TCP1", is_return=1, return_against=pr.name, qty=-2) # check sle outgoing_rate = frappe.db.get_value("Stock Ledger Entry", {"voucher_type": "Purchase Receipt", @@ -153,28 +146,28 @@ class TestPurchaseReceipt(unittest.TestCase): expected_values = { stock_in_hand_account: [0.0, 100.0], - "Stock Received But Not Billed - _TC": [100.0, 0.0], + "Stock Received But Not Billed - TCP1": [100.0, 0.0], } for gle in gl_entries: self.assertEqual(expected_values[gle.account][0], gle.debit) self.assertEqual(expected_values[gle.account][1], gle.credit) - set_perpetual_inventory(0) def test_purchase_return_for_rejected_qty(self): - set_perpetual_inventory() + from erpnext.stock.doctype.warehouse.test_warehouse import get_warehouse - pr = make_purchase_receipt(received_qty=4, qty=2) + rejected_warehouse=get_warehouse(company = "_Test Company with perpetual inventory", abbr = " - TCP1", warehouse_name = "_Test Rejected Warehouse").name + print(rejected_warehouse) + pr = make_purchase_receipt(company="_Test Company with perpetual inventory", warehouse = "Stores - TCP1", supplier_warehouse = "Work in Progress - TCP1", received_qty=4, qty=2, rejected_warehouse=rejected_warehouse) - return_pr = make_purchase_receipt(is_return=1, return_against=pr.name, received_qty = -4, qty=-2) + return_pr = make_purchase_receipt(company="_Test Company with perpetual inventory", warehouse = "Stores - TCP1", supplier_warehouse = "Work in Progress - TCP1", is_return=1, return_against=pr.name, received_qty = -4, qty=-2, rejected_warehouse=rejected_warehouse) actual_qty = frappe.db.get_value("Stock Ledger Entry", {"voucher_type": "Purchase Receipt", "voucher_no": return_pr.name, 'warehouse': return_pr.items[0].rejected_warehouse}, "actual_qty") self.assertEqual(actual_qty, -2) - set_perpetual_inventory(0) def test_purchase_return_for_serialized_items(self): def _check_serial_no_values(serial_no, field_values): @@ -337,7 +330,6 @@ class TestPurchaseReceipt(unittest.TestCase): pr.cancel() serial_nos = frappe.get_all('Serial No', {'asset': asset}, 'name') or [] self.assertEquals(len(serial_nos), 0) - #frappe.db.sql("delete from `tabLocation") frappe.db.sql("delete from `tabAsset`") def test_purchase_receipt_for_enable_allow_cost_center_in_entry_of_bs_account(self): @@ -345,8 +337,8 @@ class TestPurchaseReceipt(unittest.TestCase): accounts_settings = frappe.get_doc('Accounts Settings', 'Accounts Settings') accounts_settings.allow_cost_center_in_entry_of_bs_account = 1 accounts_settings.save() - cost_center = "_Test Cost Center for BS Account - _TC" - create_cost_center(cost_center_name="_Test Cost Center for BS Account", company="_Test Company") + cost_center = "_Test Cost Center for BS Account - TCP1" + create_cost_center(cost_center_name="_Test Cost Center for BS Account", company="_Test Company with perpetual inventory") if not frappe.db.exists('Location', 'Test Location'): frappe.get_doc({ @@ -354,8 +346,7 @@ class TestPurchaseReceipt(unittest.TestCase): 'location_name': 'Test Location' }).insert() - set_perpetual_inventory(1, "_Test Company") - pr = make_purchase_receipt(cost_center=cost_center) + pr = make_purchase_receipt(cost_center=cost_center, company="_Test Company with perpetual inventory", warehouse = "Stores - TCP1", supplier_warehouse = "Work in Progress - TCP1") stock_in_hand_account = get_inventory_account(pr.company, pr.get("items")[0].warehouse) gl_entries = get_gl_entries("Purchase Receipt", pr.name) @@ -363,7 +354,7 @@ class TestPurchaseReceipt(unittest.TestCase): self.assertTrue(gl_entries) expected_values = { - "Stock Received But Not Billed - _TC": { + "Stock Received But Not Billed - TCP1": { "cost_center": cost_center }, stock_in_hand_account: { @@ -373,7 +364,6 @@ class TestPurchaseReceipt(unittest.TestCase): for i, gle in enumerate(gl_entries): self.assertEqual(expected_values[gle.account]["cost_center"], gle.cost_center) - set_perpetual_inventory(0, pr.company) accounts_settings.allow_cost_center_in_entry_of_bs_account = 0 accounts_settings.save() @@ -387,9 +377,7 @@ class TestPurchaseReceipt(unittest.TestCase): 'doctype': 'Location', 'location_name': 'Test Location' }).insert() - - set_perpetual_inventory(1, "_Test Company") - pr = make_purchase_receipt() + pr = make_purchase_receipt(company="_Test Company with perpetual inventory", warehouse = "Stores - TCP1", supplier_warehouse = "Work in Progress - TCP1") stock_in_hand_account = get_inventory_account(pr.company, pr.get("items")[0].warehouse) gl_entries = get_gl_entries("Purchase Receipt", pr.name) @@ -397,7 +385,7 @@ class TestPurchaseReceipt(unittest.TestCase): self.assertTrue(gl_entries) expected_values = { - "Stock Received But Not Billed - _TC": { + "Stock Received But Not Billed - TCP1": { "cost_center": None }, stock_in_hand_account: { @@ -407,8 +395,6 @@ class TestPurchaseReceipt(unittest.TestCase): for i, gle in enumerate(gl_entries): self.assertEqual(expected_values[gle.account]["cost_center"], gle.cost_center) - set_perpetual_inventory(0, pr.company) - def test_make_purchase_invoice_from_pr_for_returned_qty(self): from erpnext.buying.doctype.purchase_order.test_purchase_order import create_purchase_order, create_pr_against_po @@ -452,6 +438,78 @@ def get_gl_entries(voucher_type, voucher_no): from `tabGL Entry` where voucher_type=%s and voucher_no=%s order by account desc""", (voucher_type, voucher_no), as_dict=1) +def get_taxes(**args): + + args = frappe._dict(args) + + return [{'account_head': '_Test Account Shipping Charges - TCP1', + 'add_deduct_tax': 'Add', + 'category': 'Valuation and Total', + 'charge_type': 'Actual', + 'cost_center': args.cost_center or 'Main - TCP1', + 'description': 'Shipping Charges', + 'doctype': 'Purchase Taxes and Charges', + 'parentfield': 'taxes', + 'rate': 100.0, + 'tax_amount': 100.0}, + {'account_head': '_Test Account VAT - TCP1', + 'add_deduct_tax': 'Add', + 'category': 'Total', + 'charge_type': 'Actual', + 'cost_center': args.cost_center or 'Main - TCP1', + 'description': 'VAT', + 'doctype': 'Purchase Taxes and Charges', + 'parentfield': 'taxes', + 'rate': 120.0, + 'tax_amount': 120.0}, + {'account_head': '_Test Account Customs Duty - TCP1', + 'add_deduct_tax': 'Add', + 'category': 'Valuation', + 'charge_type': 'Actual', + 'cost_center': args.cost_center or 'Main - TCP1', + 'description': 'Customs Duty', + 'doctype': 'Purchase Taxes and Charges', + 'parentfield': 'taxes', + 'rate': 150.0, + 'tax_amount': 150.0}] + +def get_items(**args): + args = frappe._dict(args) + return [{ + "base_amount": 250.0, + "conversion_factor": 1.0, + "description": "_Test Item", + "doctype": "Purchase Receipt Item", + "item_code": "_Test Item", + "item_name": "_Test Item", + "parentfield": "items", + "qty": 5.0, + "rate": 50.0, + "received_qty": 5.0, + "rejected_qty": 0.0, + "stock_uom": "_Test UOM", + "uom": "_Test UOM", + "warehouse": args.warehouse or "_Test Warehouse - _TC", + "cost_center": args.cost_center or "Main - _TC" + }, + { + "base_amount": 250.0, + "conversion_factor": 1.0, + "description": "_Test Item Home Desktop 100", + "doctype": "Purchase Receipt Item", + "item_code": "_Test Item Home Desktop 100", + "item_name": "_Test Item Home Desktop 100", + "parentfield": "items", + "qty": 5.0, + "rate": 50.0, + "received_qty": 5.0, + "rejected_qty": 0.0, + "stock_uom": "_Test UOM", + "uom": "_Test UOM", + "warehouse": args.warehouse or "_Test Warehouse 1 - _TC", + "cost_center": args.cost_center or "Main - _TC" + }] + def make_purchase_receipt(**args): if not frappe.db.exists('Location', 'Test Location'): frappe.get_doc({ @@ -468,7 +526,7 @@ def make_purchase_receipt(**args): pr.company = args.company or "_Test Company" pr.supplier = args.supplier or "_Test Supplier" pr.is_subcontracted = args.is_subcontracted or "No" - pr.supplier_warehouse = "_Test Warehouse 1 - _TC" + pr.supplier_warehouse = args.supplier_warehouse or "_Test Warehouse 1 - _TC" pr.currency = args.currency or "INR" pr.is_return = args.is_return pr.return_against = args.return_against @@ -492,6 +550,16 @@ def make_purchase_receipt(**args): "asset_location": args.location or "Test Location" }) + if args.get_multiple_items: + pr.items = [] + for item in get_items(warehouse= args.warehouse, cost_center = args.cost_center or frappe.get_cached_value('Company', pr.company, 'cost_center')): + pr.append("items", item) + + + if args.get_taxes_and_charges: + for tax in get_taxes(): + pr.append("taxes", tax) + if not args.do_not_save: pr.insert() if not args.do_not_submit: diff --git a/erpnext/stock/doctype/purchase_receipt/test_records.json b/erpnext/stock/doctype/purchase_receipt/test_records.json index 7c20991a1b..e7ea9af6b9 100644 --- a/erpnext/stock/doctype/purchase_receipt/test_records.json +++ b/erpnext/stock/doctype/purchase_receipt/test_records.json @@ -83,39 +83,5 @@ } ], "supplier": "_Test Supplier" - }, - - - { - "buying_price_list": "_Test Price List", - "company": "_Test Company", - "conversion_rate": 1.0, - "currency": "INR", - "doctype": "Purchase Receipt", - "base_grand_total": 5000.0, - "is_subcontracted": "Yes", - "base_net_total": 5000.0, - "posting_date": "2013-02-12", - "items": [ - { - "base_amount": 5000.0, - "conversion_factor": 1.0, - "description": "_Test FG Item", - "doctype": "Purchase Receipt Item", - "item_code": "_Test FG Item", - "item_name": "_Test FG Item", - "parentfield": "items", - "qty": 10.0, - "rate": 500.0, - "received_qty": 10.0, - "rejected_qty": 0.0, - "stock_uom": "_Test UOM", - "uom": "_Test UOM", - "warehouse": "_Test Warehouse - _TC", - "cost_center": "Main - _TC" - } - ], - "supplier": "_Test Supplier", - "supplier_warehouse": "_Test Warehouse - _TC" } ] \ No newline at end of file diff --git a/erpnext/stock/doctype/serial_no/test_serial_no.py b/erpnext/stock/doctype/serial_no/test_serial_no.py index ed70790b2c..ab061076e5 100644 --- a/erpnext/stock/doctype/serial_no/test_serial_no.py +++ b/erpnext/stock/doctype/serial_no/test_serial_no.py @@ -12,6 +12,7 @@ from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import make_pu from erpnext.stock.doctype.delivery_note.test_delivery_note import create_delivery_note from erpnext.stock.doctype.serial_no.serial_no import get_serial_nos from erpnext.stock.doctype.warehouse.test_warehouse import create_warehouse +from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import set_perpetual_inventory test_dependencies = ["Item"] test_records = frappe.get_test_records('Serial No') @@ -37,6 +38,8 @@ class TestSerialNo(unittest.TestCase): self.assertTrue(SerialNoCannotCannotChangeError, sr.save) def test_inter_company_transfer(self): + set_perpetual_inventory(0, "_Test Company 1") + set_perpetual_inventory(0) se = make_serialized_item(target_warehouse="_Test Warehouse - _TC") serial_nos = get_serial_nos(se.get("items")[0].serial_no) diff --git a/erpnext/stock/doctype/stock_entry/test_stock_entry.py b/erpnext/stock/doctype/stock_entry/test_stock_entry.py index 3fa815dc82..941472bbf9 100644 --- a/erpnext/stock/doctype/stock_entry/test_stock_entry.py +++ b/erpnext/stock/doctype/stock_entry/test_stock_entry.py @@ -16,7 +16,6 @@ from erpnext.stock.doctype.stock_entry.stock_entry_utils import make_stock_entry from erpnext.accounts.doctype.account.test_account import get_inventory_account from erpnext.stock.doctype.stock_entry.stock_entry import move_sample_to_retention_warehouse, make_stock_in_entry from erpnext.stock.doctype.stock_reconciliation.stock_reconciliation import OpeningEntryAccountError - from six import iteritems def get_sle(**args): @@ -132,20 +131,19 @@ class TestStockEntry(unittest.TestCase): self.assertTrue(item_code in items) def test_material_receipt_gl_entry(self): - company = frappe.db.get_value('Warehouse', '_Test Warehouse - _TC', 'company') - set_perpetual_inventory(1, company) + company = frappe.db.get_value('Warehouse', 'Stores - TCP1', 'company') - mr = make_stock_entry(item_code="_Test Item", target="_Test Warehouse - _TC", - qty=50, basic_rate=100, expense_account="Stock Adjustment - _TC") + mr = make_stock_entry(item_code="_Test Item", target="Stores - TCP1", company= company, + qty=50, basic_rate=100, expense_account="Stock Adjustment - TCP1") stock_in_hand_account = get_inventory_account(mr.company, mr.get("items")[0].t_warehouse) self.check_stock_ledger_entries("Stock Entry", mr.name, - [["_Test Item", "_Test Warehouse - _TC", 50.0]]) + [["_Test Item", "Stores - TCP1", 50.0]]) self.check_gl_entries("Stock Entry", mr.name, sorted([ [stock_in_hand_account, 5000.0, 0.0], - ["Stock Adjustment - _TC", 0.0, 5000.0] + ["Stock Adjustment - TCP1", 0.0, 5000.0] ]) ) @@ -158,29 +156,26 @@ class TestStockEntry(unittest.TestCase): where voucher_type='Stock Entry' and voucher_no=%s""", mr.name)) def test_material_issue_gl_entry(self): - company = frappe.db.get_value('Warehouse', '_Test Warehouse - _TC', 'company') - set_perpetual_inventory(1, company) + company = frappe.db.get_value('Warehouse', 'Stores - TCP1', 'company') + make_stock_entry(item_code="_Test Item", target="Stores - TCP1", company= company, + qty=50, basic_rate=100, expense_account="Stock Adjustment - TCP1") - make_stock_entry(item_code="_Test Item", target="_Test Warehouse - _TC", - qty=50, basic_rate=100, expense_account="Stock Adjustment - _TC") - - mi = make_stock_entry(item_code="_Test Item", source="_Test Warehouse - _TC", - qty=40, expense_account="Stock Adjustment - _TC") + mi = make_stock_entry(item_code="_Test Item", source="Stores - TCP1", company=company, + qty=40, expense_account="Stock Adjustment - TCP1") self.check_stock_ledger_entries("Stock Entry", mi.name, - [["_Test Item", "_Test Warehouse - _TC", -40.0]]) + [["_Test Item", "Stores - TCP1", -40.0]]) - stock_in_hand_account = get_inventory_account(mi.company, "_Test Warehouse - _TC") + stock_in_hand_account = get_inventory_account(mi.company, "Stores - TCP1") stock_value_diff = abs(frappe.db.get_value("Stock Ledger Entry", {"voucher_type": "Stock Entry", "voucher_no": mi.name}, "stock_value_difference")) self.check_gl_entries("Stock Entry", mi.name, sorted([ [stock_in_hand_account, 0.0, stock_value_diff], - ["Stock Adjustment - _TC", stock_value_diff, 0.0] + ["Stock Adjustment - TCP1", stock_value_diff, 0.0] ]) ) - mi.cancel() self.assertFalse(frappe.db.sql("""select name from `tabStock Ledger Entry` @@ -190,16 +185,15 @@ class TestStockEntry(unittest.TestCase): where voucher_type='Stock Entry' and voucher_no=%s""", mi.name)) def test_material_transfer_gl_entry(self): - company = frappe.db.get_value('Warehouse', '_Test Warehouse - _TC', 'company') - set_perpetual_inventory(1, company) + company = frappe.db.get_value('Warehouse', 'Stores - TCP1', 'company') create_stock_reconciliation(qty=100, rate=100) - mtn = make_stock_entry(item_code="_Test Item", source="_Test Warehouse - _TC", - target="_Test Warehouse 1 - _TC", qty=45) + mtn = make_stock_entry(item_code="_Test Item", source="Stores - TCP1", + target="Finished Goods - TCP1", qty=45) self.check_stock_ledger_entries("Stock Entry", mtn.name, - [["_Test Item", "_Test Warehouse - _TC", -45.0], ["_Test Item", "_Test Warehouse 1 - _TC", 45.0]]) + [["_Test Item", "Stores - TCP1", -45.0], ["_Test Item", "Finished Goods - TCP1", 45.0]]) stock_in_hand_account = get_inventory_account(mtn.company, mtn.get("items")[0].s_warehouse) @@ -212,7 +206,7 @@ class TestStockEntry(unittest.TestCase): else: stock_value_diff = abs(frappe.db.get_value("Stock Ledger Entry", {"voucher_type": "Stock Entry", - "voucher_no": mtn.name, "warehouse": "_Test Warehouse - _TC"}, "stock_value_difference")) + "voucher_no": mtn.name, "warehouse": "Stores - TCP1"}, "stock_value_difference")) self.check_gl_entries("Stock Entry", mtn.name, sorted([ @@ -255,14 +249,21 @@ class TestStockEntry(unittest.TestCase): set_perpetual_inventory(0, repack.company) def test_repack_with_additional_costs(self): - company = frappe.db.get_value('Warehouse', '_Test Warehouse - _TC', 'company') - set_perpetual_inventory(1, company) + company = frappe.db.get_value('Warehouse', 'Stores - TCP1', 'company') - make_stock_entry(item_code="_Test Item", target="_Test Warehouse - _TC", qty=50, basic_rate=100) - repack = frappe.copy_doc(test_records[3]) + make_stock_entry(item_code="_Test Item", target="Stores - TCP1", company= company, + qty=50, basic_rate=100, expense_account="Stock Adjustment - TCP1") + + + repack = make_stock_entry(company = company, purpose="Repack", do_not_save=True) repack.posting_date = nowdate() repack.posting_time = nowtime() + items = get_multiple_items() + repack.items = [] + for item in items: + repack.append("items", item) + repack.set("additional_costs", [ { "description": "Actual Oerating Cost", @@ -292,13 +293,12 @@ class TestStockEntry(unittest.TestCase): self.check_gl_entries("Stock Entry", repack.name, sorted([ [stock_in_hand_account, 1200, 0.0], - ["Expenses Included In Valuation - _TC", 0.0, 1200.0] + ["Expenses Included In Valuation - TCP1", 0.0, 1200.0] ]) ) - set_perpetual_inventory(0, repack.company) def check_stock_ledger_entries(self, voucher_type, voucher_no, expected_sle): - expected_sle.sort(key=lambda x: x[0]) + expected_sle.sort(key=lambda x: x[1]) # check stock ledger entries sle = frappe.db.sql("""select item_code, warehouse, actual_qty @@ -306,7 +306,7 @@ class TestStockEntry(unittest.TestCase): and voucher_no = %s order by item_code, warehouse, actual_qty""", (voucher_type, voucher_no), as_list=1) self.assertTrue(sle) - sle.sort(key=lambda x: x[0]) + sle.sort(key=lambda x: x[1]) for i, sle in enumerate(sle): self.assertEqual(expected_sle[i][0], sle[0]) @@ -773,14 +773,12 @@ class TestStockEntry(unittest.TestCase): self.assertEqual(doc.per_transferred, 100) def test_gle_for_opening_stock_entry(self): - set_perpetual_inventory(1) - - mr = make_stock_entry(item_code="_Test Item", target="_Test Warehouse - _TC", - qty=50, basic_rate=100, expense_account="Stock Adjustment - _TC", is_opening="Yes", do_not_save=True) + mr = make_stock_entry(item_code="_Test Item", target="Stores - TCP1", company="_Test Company with perpetual inventory",qty=50, basic_rate=100, expense_account="Stock Adjustment - TCP1", is_opening="Yes", do_not_save=True) self.assertRaises(OpeningEntryAccountError, mr.save) - mr.items[0].expense_account = "Temporary Opening - _TC" + mr.items[0].expense_account = "Temporary Opening - TCP1" + mr.save() mr.submit() @@ -805,14 +803,42 @@ def make_serialized_item(item_code=None, serial_no=None, target_warehouse=None): def get_qty_after_transaction(**args): args = frappe._dict(args) - last_sle = get_previous_sle({ "item_code": args.item_code or "_Test Item", "warehouse": args.warehouse or "_Test Warehouse - _TC", "posting_date": args.posting_date or nowdate(), "posting_time": args.posting_time or nowtime() }) - return flt(last_sle.get("qty_after_transaction")) +def get_multiple_items(): + return [ + { + "conversion_factor": 1.0, + "cost_center": "Main - TCP1", + "doctype": "Stock Entry Detail", + "expense_account": "Stock Adjustment - TCP1", + "basic_rate": 100, + "item_code": "_Test Item", + "qty": 50.0, + "s_warehouse": "Stores - TCP1", + "stock_uom": "_Test UOM", + "transfer_qty": 50.0, + "uom": "_Test UOM" + }, + { + "conversion_factor": 1.0, + "cost_center": "Main - TCP1", + "doctype": "Stock Entry Detail", + "expense_account": "Stock Adjustment - TCP1", + "basic_rate": 5000, + "item_code": "_Test Item Home Desktop 100", + "qty": 1, + "stock_uom": "_Test UOM", + "t_warehouse": "Stores - TCP1", + "transfer_qty": 1, + "uom": "_Test UOM" + } + ] + test_records = frappe.get_test_records('Stock Entry') diff --git a/erpnext/stock/doctype/stock_reconciliation/test_stock_reconciliation.py b/erpnext/stock/doctype/stock_reconciliation/test_stock_reconciliation.py index cd05929743..e6d7e3fea7 100644 --- a/erpnext/stock/doctype/stock_reconciliation/test_stock_reconciliation.py +++ b/erpnext/stock/doctype/stock_reconciliation/test_stock_reconciliation.py @@ -7,7 +7,7 @@ from __future__ import unicode_literals import frappe, unittest from frappe.utils import flt, nowdate, nowtime -from erpnext.accounts.utils import get_stock_and_account_difference +from erpnext.accounts.utils import get_stock_and_account_balance from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import set_perpetual_inventory from erpnext.stock.stock_ledger import get_previous_sle, update_entries_after from erpnext.stock.doctype.stock_reconciliation.stock_reconciliation import EmptyStockReconciliationItemsError, get_items @@ -21,7 +21,6 @@ class TestStockReconciliation(unittest.TestCase): def setUpClass(self): create_batch_or_serial_no_items() frappe.db.set_value("Stock Settings", None, "allow_negative_stock", 1) - insert_existing_sle() def test_reco_for_fifo(self): self._test_reco_sle_gle("FIFO") @@ -30,7 +29,8 @@ class TestStockReconciliation(unittest.TestCase): self._test_reco_sle_gle("Moving Average") def _test_reco_sle_gle(self, valuation_method): - set_perpetual_inventory() + insert_existing_sle(warehouse='Stores - TCP1') + company = frappe.db.get_value('Warehouse', 'Stores - TCP1', 'company') # [[qty, valuation_rate, posting_date, # posting_time, expected_stock_value, bin_qty, bin_valuation]] input_data = [ @@ -46,14 +46,15 @@ class TestStockReconciliation(unittest.TestCase): last_sle = get_previous_sle({ "item_code": "_Test Item", - "warehouse": "_Test Warehouse - _TC", + "warehouse": "Stores - TCP1", "posting_date": d[2], "posting_time": d[3] }) # submit stock reconciliation stock_reco = create_stock_reconciliation(qty=d[0], rate=d[1], - posting_date=d[2], posting_time=d[3]) + posting_date=d[2], posting_time=d[3], warehouse="Stores - TCP1", + company=company, expense_account = "Stock Adjustment - TCP1") # check stock value sle = frappe.db.sql("""select * from `tabStock Ledger Entry` @@ -73,17 +74,18 @@ class TestStockReconciliation(unittest.TestCase): # no gl entries self.assertTrue(frappe.db.get_value("Stock Ledger Entry", {"voucher_type": "Stock Reconciliation", "voucher_no": stock_reco.name})) - self.assertFalse(get_stock_and_account_difference(["_Test Account Stock In Hand - _TC"])) - stock_reco.cancel() + acc_bal, stock_bal, wh_list = get_stock_and_account_balance("Stock In Hand - TCP1", + stock_reco.posting_date, stock_reco.company) + self.assertEqual(acc_bal, stock_bal) - self.assertFalse(frappe.db.get_value("Stock Ledger Entry", - {"voucher_type": "Stock Reconciliation", "voucher_no": stock_reco.name})) + stock_reco.cancel() - self.assertFalse(frappe.db.get_value("GL Entry", - {"voucher_type": "Stock Reconciliation", "voucher_no": stock_reco.name})) + self.assertFalse(frappe.db.get_value("Stock Ledger Entry", + {"voucher_type": "Stock Reconciliation", "voucher_no": stock_reco.name})) - set_perpetual_inventory(0) + self.assertFalse(frappe.db.get_value("GL Entry", + {"voucher_type": "Stock Reconciliation", "voucher_no": stock_reco.name})) def test_get_items(self): create_warehouse("_Test Warehouse Group 1", {"is_group": 1}) @@ -203,17 +205,17 @@ class TestStockReconciliation(unittest.TestCase): stock_doc.cancel() -def insert_existing_sle(): +def insert_existing_sle(warehouse): from erpnext.stock.doctype.stock_entry.test_stock_entry import make_stock_entry make_stock_entry(posting_date="2012-12-15", posting_time="02:00", item_code="_Test Item", - target="_Test Warehouse - _TC", qty=10, basic_rate=700) + target=warehouse, qty=10, basic_rate=700) make_stock_entry(posting_date="2012-12-25", posting_time="03:00", item_code="_Test Item", - source="_Test Warehouse - _TC", qty=15) + source=warehouse, qty=15) make_stock_entry(posting_date="2013-01-05", posting_time="07:00", item_code="_Test Item", - target="_Test Warehouse - _TC", qty=15, basic_rate=1200) + target=warehouse, qty=15, basic_rate=1200) def create_batch_or_serial_no_items(): create_warehouse("_Test Warehouse for Stock Reco1", @@ -244,7 +246,10 @@ def create_stock_reconciliation(**args): sr.company = args.company or "_Test Company" sr.expense_account = args.expense_account or \ ("Stock Adjustment - _TC" if frappe.get_all("Stock Ledger Entry") else "Temporary Opening - _TC") - sr.cost_center = args.cost_center or "_Test Cost Center - _TC" + sr.cost_center = args.cost_center \ + or frappe.get_cached_value("Company", sr.company, "cost_center") \ + or "_Test Cost Center - _TC" + sr.append("items", { "item_code": args.item_code or "_Test Item", "warehouse": args.warehouse or "_Test Warehouse - _TC", diff --git a/erpnext/stock/doctype/warehouse/test_records.json b/erpnext/stock/doctype/warehouse/test_records.json index 014cf3e501..e128558ed3 100644 --- a/erpnext/stock/doctype/warehouse/test_records.json +++ b/erpnext/stock/doctype/warehouse/test_records.json @@ -1,42 +1,36 @@ [ { "company": "_Test Company", - "create_account_under": "Stock Assets - _TC", "doctype": "Warehouse", "warehouse_name": "_Test Warehouse", "is_group": 0 }, { "company": "_Test Company", - "create_account_under": "Stock Assets - _TC", "doctype": "Warehouse", "warehouse_name": "_Test Scrap Warehouse", "is_group": 0 }, { "company": "_Test Company", - "create_account_under": "Fixed Assets - _TC", "doctype": "Warehouse", "warehouse_name": "_Test Warehouse 1", "is_group": 0 }, { "company": "_Test Company", - "create_account_under": "Fixed Assets - _TC", "doctype": "Warehouse", "warehouse_name": "_Test Warehouse 2", "is_group": 0 }, { "company": "_Test Company", - "create_account_under": "Stock Assets - _TC", "doctype": "Warehouse", "warehouse_name": "_Test Rejected Warehouse", "is_group": 0 }, { "company": "_Test Company 1", - "create_account_under": "Stock Assets - _TC1", "doctype": "Warehouse", "warehouse_name": "_Test Warehouse 2", "is_group": 0 diff --git a/erpnext/stock/doctype/warehouse/test_warehouse.py b/erpnext/stock/doctype/warehouse/test_warehouse.py index dc39e101ce..121222d7bc 100644 --- a/erpnext/stock/doctype/warehouse/test_warehouse.py +++ b/erpnext/stock/doctype/warehouse/test_warehouse.py @@ -101,8 +101,7 @@ def create_warehouse(warehouse_name, properties=None, company=None): w.warehouse_name = warehouse_name w.parent_warehouse = "_Test Warehouse Group - _TC" w.company = company - make_account_for_warehouse(warehouse_name, w) - w.account = warehouse_id + w.account = get_warehouse_account(warehouse_name, company) if properties: w.update(properties) w.save() @@ -110,9 +109,40 @@ def create_warehouse(warehouse_name, properties=None, company=None): else: return warehouse_id -def make_account_for_warehouse(warehouse_name, warehouse_obj): - if not frappe.db.exists("Account", warehouse_name + " - _TC"): - parent_account = frappe.db.get_value('Account', - {'company': warehouse_obj.company, 'is_group':1, 'account_type': 'Stock'},'name') - account = create_account(account_name=warehouse_name, \ - account_type="Stock", parent_account= parent_account, company=warehouse_obj.company) \ No newline at end of file +def get_warehouse(**args): + args = frappe._dict(args) + if(frappe.db.exists("Warehouse", args.warehouse_name + " - " + args.abbr)): + return frappe.get_doc("Warehouse", args.warehouse_name + " - " + args.abbr) + else: + w = frappe.get_doc({ + "company": args.company or "_Test Company", + "doctype": "Warehouse", + "warehouse_name": args.warehouse_name, + "is_group": 0, + "account": get_warehouse_account(args.warehouse_name, args.company, args.abbr) + }) + w.insert() + return w + +def get_warehouse_account(warehouse_name, company, company_abbr=None): + if not company_abbr: + company_abbr = frappe.get_cached_value("Company", company, 'abbr') + + if not frappe.db.exists("Account", warehouse_name + " - " + company_abbr): + return create_account( + account_name=warehouse_name, + parent_account=get_group_stock_account(company, company_abbr), + account_type='Stock', + company=company) + else: + return warehouse_name + " - " + company_abbr + + +def get_group_stock_account(company, company_abbr=None): + group_stock_account = frappe.db.get_value("Account", + filters={'account_type': 'Stock', 'is_group': 1, 'company': company}, fieldname='name') + if not group_stock_account: + if not company_abbr: + company_abbr = frappe.get_cached_value("Company", company, 'abbr') + group_stock_account = "Current Assets - " + company_abbr + return group_stock_account \ No newline at end of file From 81c217584a8d30361957abdda815118c5c00f71b Mon Sep 17 00:00:00 2001 From: rohitwaghchaure Date: Thu, 31 Oct 2019 15:56:10 +0530 Subject: [PATCH 35/44] fix: purchase order issue, margin_rate_or_amount not there in the purchase documents (#19466) --- erpnext/controllers/accounts_controller.py | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index 320a618f68..67f453d2b3 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -1172,6 +1172,7 @@ def set_purchase_order_defaults(parent_doctype, parent_doctype_name, child_docna def update_child_qty_rate(parent_doctype, trans_items, parent_doctype_name, child_docname="items"): data = json.loads(trans_items) + sales_doctypes = ['Sales Order', 'Sales Invoice', 'Delivery Note', 'Quotation'] parent = frappe.get_doc(parent_doctype, parent_doctype_name) for d in data: @@ -1204,18 +1205,22 @@ def update_child_qty_rate(parent_doctype, trans_items, parent_doctype_name, chil # if rate is greater than price_list_rate, set margin # or set discount child_item.discount_percentage = 0 - child_item.margin_type = "Amount" - child_item.margin_rate_or_amount = flt(child_item.rate - child_item.price_list_rate, - child_item.precision("margin_rate_or_amount")) - child_item.rate_with_margin = child_item.rate + + if parent_doctype in sales_doctypes: + child_item.margin_type = "Amount" + child_item.margin_rate_or_amount = flt(child_item.rate - child_item.price_list_rate, + child_item.precision("margin_rate_or_amount")) + child_item.rate_with_margin = child_item.rate else: child_item.discount_percentage = flt((1 - flt(child_item.rate) / flt(child_item.price_list_rate)) * 100.0, child_item.precision("discount_percentage")) child_item.discount_amount = flt( child_item.price_list_rate) - flt(child_item.rate) - child_item.margin_type = "" - child_item.margin_rate_or_amount = 0 - child_item.rate_with_margin = 0 + + if parent_doctype in sales_doctypes: + child_item.margin_type = "" + child_item.margin_rate_or_amount = 0 + child_item.rate_with_margin = 0 child_item.flags.ignore_validate_update_after_submit = True if new_child_flag: From 4a1d000c336e640c46512134cd364e733d65e4e6 Mon Sep 17 00:00:00 2001 From: deepeshgarg007 Date: Thu, 31 Oct 2019 15:57:15 +0530 Subject: [PATCH 36/44] fix: Test Case --- .../leave_application_dashboard.py | 6 ++++++ .../test_leave_application.py | 19 +++---------------- 2 files changed, 9 insertions(+), 16 deletions(-) diff --git a/erpnext/hr/doctype/leave_application/leave_application_dashboard.py b/erpnext/hr/doctype/leave_application/leave_application_dashboard.py index 8075b7b5c5..c1d6a6665b 100644 --- a/erpnext/hr/doctype/leave_application/leave_application_dashboard.py +++ b/erpnext/hr/doctype/leave_application/leave_application_dashboard.py @@ -5,6 +5,12 @@ from frappe import _ def get_data(): return { + 'fieldname': 'leave_application', + 'transactions': [ + { + 'items': ['Attendance'] + } + ], 'reports': [ { 'label': _('Reports'), diff --git a/erpnext/hr/doctype/leave_application/test_leave_application.py b/erpnext/hr/doctype/leave_application/test_leave_application.py index ad141a5748..38ae808f27 100644 --- a/erpnext/hr/doctype/leave_application/test_leave_application.py +++ b/erpnext/hr/doctype/leave_application/test_leave_application.py @@ -72,7 +72,7 @@ class TestLeaveApplication(unittest.TestCase): application.to_date = "2013-01-05" return application - def test_attendance_creation(self): + def test_overwrite_attendance(self): '''check attendance is automatically created on leave approval''' make_allocation_record() application = self.get_application(_test_records[0]) @@ -82,7 +82,8 @@ class TestLeaveApplication(unittest.TestCase): application.insert() application.submit() - attendance = frappe.get_all('Attendance', ['name', 'status', 'attendance_date'], dict(leave_application = application.name)) + attendance = frappe.get_all('Attendance', ['name', 'status', 'attendance_date'], + dict(attendance_date=('between', ['2018-01-01', '2018-01-03']), docstatus=("!=", 2))) # attendance created for all 3 days self.assertEqual(len(attendance), 3) @@ -95,20 +96,6 @@ class TestLeaveApplication(unittest.TestCase): for d in ('2018-01-01', '2018-01-02', '2018-01-03'): self.assertTrue(getdate(d) in dates) - def test_overwrite_attendance(self): - # employee marked as absent - doc = frappe.new_doc("Attendance") - doc.employee = '_T-Employee-00001' - doc.attendance_date = '2018-01-01' - doc.company = '_Test Company' - doc.status = 'Absent' - doc.flags.ignore_validate = True - doc.insert(ignore_permissions=True) - doc.submit() - - # now check if the status has been updated - self.test_attendance_creation() - def test_block_list(self): self._clear_roles() From 77e4cf89f8bab4a4b3740007c28c154f8dff46ad Mon Sep 17 00:00:00 2001 From: Suraj Shetty <13928957+surajshetty3416@users.noreply.github.com> Date: Thu, 31 Oct 2019 15:57:31 +0530 Subject: [PATCH 37/44] fix: Pass parent_acc_name (#19450) --- erpnext/accounts/doctype/account/account.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/erpnext/accounts/doctype/account/account.py b/erpnext/accounts/doctype/account/account.py index 7cca8d2003..cccced8e0b 100644 --- a/erpnext/accounts/doctype/account/account.py +++ b/erpnext/accounts/doctype/account/account.py @@ -117,7 +117,7 @@ class Account(NestedSet): if not parent_acc_name_map: return - self.create_account_for_child_company(parent_acc_name_map, descendants) + self.create_account_for_child_company(parent_acc_name_map, descendants, parent_acc_name) def validate_group_or_ledger(self): if self.get("__islocal"): @@ -159,7 +159,7 @@ class Account(NestedSet): if frappe.db.get_value("GL Entry", {"account": self.name}): frappe.throw(_("Currency can not be changed after making entries using some other currency")) - def create_account_for_child_company(self, parent_acc_name_map, descendants): + def create_account_for_child_company(self, parent_acc_name_map, descendants, parent_acc_name): for company in descendants: if not parent_acc_name_map.get(company): frappe.throw(_("While creating account for child Company {0}, parent account {1} not found. Please create the parent account in corresponding COA") From 519ca54f539df6b648ed369a19ed91a6317dab0e Mon Sep 17 00:00:00 2001 From: Suraj Shetty <13928957+surajshetty3416@users.noreply.github.com> Date: Thu, 31 Oct 2019 16:00:04 +0530 Subject: [PATCH 38/44] feat: Show timesheets related to customer's projects on customer portal (#19443) * fix: Show timesheets related to customer's projects on customer portal * style: fix codacy --- .../projects/doctype/timesheet/timesheet.py | 34 ++++++++++++++----- .../includes/timesheet/timesheet_row.html | 23 +++++++------ 2 files changed, 38 insertions(+), 19 deletions(-) diff --git a/erpnext/projects/doctype/timesheet/timesheet.py b/erpnext/projects/doctype/timesheet/timesheet.py index 9ee292796c..bc88250c8a 100644 --- a/erpnext/projects/doctype/timesheet/timesheet.py +++ b/erpnext/projects/doctype/timesheet/timesheet.py @@ -353,17 +353,35 @@ def get_events(start, end, filters=None): def get_timesheets_list(doctype, txt, filters, limit_start, limit_page_length=20, order_by="modified"): user = frappe.session.user # find customer name from contact. - customer = frappe.db.sql('''SELECT dl.link_name FROM `tabContact` AS c inner join \ - `tabDynamic Link` AS dl ON c.first_name=dl.link_name WHERE c.email_id=%s''',user) + customer = '' + timesheets = [] + + contact = frappe.db.exists('Contact', {'user': user}) + if contact: + # find customer + contact = frappe.get_doc('Contact', contact) + customer = contact.get_link_for('Customer') if customer: - # find list of Sales Invoice for made for customer. - sales_invoice = frappe.db.sql('''SELECT name FROM `tabSales Invoice` WHERE customer = %s''',customer) + sales_invoices = [d.name for d in frappe.get_all('Sales Invoice', filters={'customer': customer})] or [None] + projects = [d.name for d in frappe.get_all('Project', filters={'customer': customer})] # Return timesheet related data to web portal. - return frappe. db.sql('''SELECT ts.name, tsd.activity_type, ts.status, ts.total_billable_hours, \ - tsd.sales_invoice, tsd.project FROM `tabTimesheet` AS ts inner join `tabTimesheet Detail` \ - AS tsd ON tsd.parent = ts.name where tsd.sales_invoice IN %s order by\ - end_date asc limit {0} , {1}'''.format(limit_start, limit_page_length), [sales_invoice], as_dict = True) + timesheets = frappe.db.sql(''' + SELECT + ts.name, tsd.activity_type, ts.status, ts.total_billable_hours, + COALESCE(ts.sales_invoice, tsd.sales_invoice) AS sales_invoice, tsd.project + FROM `tabTimesheet` ts, `tabTimesheet Detail` tsd + WHERE tsd.parent = ts.name AND + ( + ts.sales_invoice IN %(sales_invoices)s OR + tsd.sales_invoice IN %(sales_invoices)s OR + tsd.project IN %(projects)s + ) + ORDER BY `end_date` ASC + LIMIT {0}, {1} + '''.format(limit_start, limit_page_length), dict(sales_invoices=sales_invoices, projects=projects), as_dict=True) #nosec + + return timesheets def get_list_context(context=None): return { diff --git a/erpnext/templates/includes/timesheet/timesheet_row.html b/erpnext/templates/includes/timesheet/timesheet_row.html index e9cfcda812..4852f59b5d 100644 --- a/erpnext/templates/includes/timesheet/timesheet_row.html +++ b/erpnext/templates/includes/timesheet/timesheet_row.html @@ -1,13 +1,14 @@ -
    - -
    -
    - {{ doc.name }} -
    -
    Billable Hours: {{ doc.total_billable_hours}}
    -
    {{ _(doc.sales_invoice) }}
    -
    {{ _(doc.project) }}
    -
    {{ _(doc.activity_type) }}
    +
    +
    +
    + + {{ doc.name }} +
    -
    +
    {{ doc.total_billable_hours }}
    +
    {{ doc.project or '' }}
    +
    {{ doc.sales_invoice or '' }}
    +
    {{ _(doc.activity_type) }}
    +
    +
    From 45c18b318472b043681cc845534452ded7474a0b Mon Sep 17 00:00:00 2001 From: Mangesh-Khairnar Date: Thu, 31 Oct 2019 16:00:52 +0530 Subject: [PATCH 39/44] fix: fetch employee department (#19433) --- .../employee_leave_balance_summary.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/erpnext/hr/report/employee_leave_balance_summary/employee_leave_balance_summary.py b/erpnext/hr/report/employee_leave_balance_summary/employee_leave_balance_summary.py index 15a5da00f8..777de02238 100644 --- a/erpnext/hr/report/employee_leave_balance_summary/employee_leave_balance_summary.py +++ b/erpnext/hr/report/employee_leave_balance_summary/employee_leave_balance_summary.py @@ -75,7 +75,7 @@ def get_data(filters): leave_approvers = department_approver_map.get(employee.department_name, []).append(employee.leave_approver) - if (len(leave_approvers) and user in leave_approvers) or (user in ["Administrator", employee.user_id]) \ + if (leave_approvers and len(leave_approvers) and user in leave_approvers) or (user in ["Administrator", employee.user_id]) \ or ("HR Manager" in frappe.get_roles(user)): row = frappe._dict({ 'employee': employee.name, @@ -111,10 +111,10 @@ def get_conditions(filters): def get_department_leave_approver_map(department=None): conditions='' if department: - conditions='and department_name = %(department)s or parent_department = %(department)s'%{'department': department} + conditions="and (department_name = '%(department)s' or parent_department = '%(department)s')"%{'department': department} # get current department and all its child - department_list = frappe.db.sql_list(''' SELECT name FROM `tabDepartment` WHERE disabled=0 {0}'''.format(conditions)) #nosec + department_list = frappe.db.sql_list(""" SELECT name FROM `tabDepartment` WHERE disabled=0 {0}""".format(conditions)) #nosec # retrieve approvers list from current department and from its subsequent child departments approver_list = frappe.get_all('Department Approver', filters={ From 28710cdf99b453e3e3f5115b44551bfa5b6c6083 Mon Sep 17 00:00:00 2001 From: Ashish Shah Date: Thu, 31 Oct 2019 16:09:06 +0530 Subject: [PATCH 40/44] fix: coupon code changes suggested by prasad (#19352) * changes suggested by prasad * codacy correction --- erpnext/accounts/doctype/coupon_code/coupon_code.js | 9 +++++++++ erpnext/accounts/doctype/coupon_code/coupon_code.json | 10 ++++++---- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/erpnext/accounts/doctype/coupon_code/coupon_code.js b/erpnext/accounts/doctype/coupon_code/coupon_code.js index 0bf097f8d5..da3a9f8132 100644 --- a/erpnext/accounts/doctype/coupon_code/coupon_code.js +++ b/erpnext/accounts/doctype/coupon_code/coupon_code.js @@ -2,6 +2,15 @@ // For license information, please see license.txt frappe.ui.form.on('Coupon Code', { + setup: function(frm) { + frm.set_query("pricing_rule", function() { + return { + filters: [ + ["Pricing Rule","coupon_code_based", "=", "1"] + ] + }; + }); + }, coupon_name:function(frm){ if (frm.doc.__islocal===1) { frm.trigger("make_coupon_code"); diff --git a/erpnext/accounts/doctype/coupon_code/coupon_code.json b/erpnext/accounts/doctype/coupon_code/coupon_code.json index fafc63531f..7dc5e9dc78 100644 --- a/erpnext/accounts/doctype/coupon_code/coupon_code.json +++ b/erpnext/accounts/doctype/coupon_code/coupon_code.json @@ -24,6 +24,7 @@ ], "fields": [ { + "description": "e.g. \"Summer Holiday 2019 Offer 20\"", "fieldname": "coupon_name", "fieldtype": "Data", "label": "Coupon Name", @@ -50,7 +51,7 @@ "fieldtype": "Column Break" }, { - "description": "To be used to get discount", + "description": "unique e.g. SAVE20 To be used to get discount", "fieldname": "coupon_code", "fieldtype": "Data", "label": "Coupon Code", @@ -62,12 +63,13 @@ "fieldname": "pricing_rule", "fieldtype": "Link", "label": "Pricing Rule", - "options": "Pricing Rule" + "options": "Pricing Rule", + "reqd": 1 }, { "fieldname": "uses", "fieldtype": "Section Break", - "label": "Uses" + "label": "Validity and Usage" }, { "fieldname": "valid_from", @@ -113,7 +115,7 @@ "read_only": 1 } ], - "modified": "2019-10-15 14:12:22.686986", + "modified": "2019-10-19 14:48:14.602481", "modified_by": "Administrator", "module": "Accounts", "name": "Coupon Code", From c82aed071857ca2f20074704a24b0cd1801ecfa6 Mon Sep 17 00:00:00 2001 From: deepeshgarg007 Date: Fri, 1 Nov 2019 12:36:33 +0530 Subject: [PATCH 41/44] fix: Add missing semicolon --- erpnext/stock/doctype/serial_no/serial_no_list.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/erpnext/stock/doctype/serial_no/serial_no_list.js b/erpnext/stock/doctype/serial_no/serial_no_list.js index 559a9a7b8a..5b1e312f68 100644 --- a/erpnext/stock/doctype/serial_no/serial_no_list.js +++ b/erpnext/stock/doctype/serial_no/serial_no_list.js @@ -6,9 +6,9 @@ frappe.listview_settings['Serial No'] = { } else if (doc.delivery_document_type) { return [__("Delivered"), "green", "delivery_document_type,is,set|is_cancelled,=,No"]; } else if (doc.warranty_expiry_date && frappe.datetime.get_diff(doc.warranty_expiry_date, frappe.datetime.nowdate()) <= 0) { - return [__("Expired"), "red", "warranty_expiry_date,not in,|warranty_expiry_date,<=,Today|delivery_document_type,is,not set|is_cancelled,=,No"] + return [__("Expired"), "red", "warranty_expiry_date,not in,|warranty_expiry_date,<=,Today|delivery_document_type,is,not set|is_cancelled,=,No"]; } else { return [__("Active"), "green", "delivery_document_type,is,not set|is_cancelled,=,No"]; - }; + } } }; From 1bb5d0119227e69d688cc7b74dee99246f6ed760 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Fri, 1 Nov 2019 14:24:21 +0530 Subject: [PATCH 42/44] fix: Wrong warehouse fetched in production plan --- .../manufacturing/doctype/production_plan/production_plan.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/manufacturing/doctype/production_plan/production_plan.py b/erpnext/manufacturing/doctype/production_plan/production_plan.py index 4dc98e7ade..10d9a474e0 100644 --- a/erpnext/manufacturing/doctype/production_plan/production_plan.py +++ b/erpnext/manufacturing/doctype/production_plan/production_plan.py @@ -622,7 +622,7 @@ def get_items_for_material_requests(doc, ignore_existing_ordered_qty=None): for data in po_items: planned_qty = data.get('required_qty') or data.get('planned_qty') ignore_existing_ordered_qty = data.get('ignore_existing_ordered_qty') or ignore_existing_ordered_qty - warehouse = data.get("warehouse") or warehouse + warehouse = warehouse or data.get("warehouse") item_details = {} if data.get("bom") or data.get("bom_no"): From 7091a2102c6839ed0246f54cfa121813905383ca Mon Sep 17 00:00:00 2001 From: Diksha Date: Mon, 4 Nov 2019 12:03:35 +0530 Subject: [PATCH 43/44] fix(sales order): rename delivery to delivery note on sales order make button --- erpnext/selling/doctype/sales_order/sales_order.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/selling/doctype/sales_order/sales_order.js b/erpnext/selling/doctype/sales_order/sales_order.js index a2b85446be..85e81436d1 100644 --- a/erpnext/selling/doctype/sales_order/sales_order.js +++ b/erpnext/selling/doctype/sales_order/sales_order.js @@ -150,7 +150,7 @@ erpnext.selling.SalesOrderController = erpnext.selling.SellingController.extend( // delivery note if(flt(doc.per_delivered, 6) < 100 && ["Sales", "Shopping Cart"].indexOf(doc.order_type)!==-1 && allow_delivery) { - this.frm.add_custom_button(__('Delivery'), () => this.make_delivery_note_based_on_delivery_date(), __('Create')); + this.frm.add_custom_button(__('Delivery Note'), () => this.make_delivery_note_based_on_delivery_date(), __('Create')); this.frm.add_custom_button(__('Work Order'), () => this.make_work_order(), __('Create')); } From 730c8a145d782929af994d71a2c188f47628e626 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Tue, 5 Nov 2019 12:46:52 +0530 Subject: [PATCH 44/44] minor: code cleanup --- erpnext/setup/doctype/company/company.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/setup/doctype/company/company.py b/erpnext/setup/doctype/company/company.py index 8b42b19921..04e8a83e7f 100644 --- a/erpnext/setup/doctype/company/company.py +++ b/erpnext/setup/doctype/company/company.py @@ -207,7 +207,7 @@ class Company(NestedSet): "default_expense_account": "Cost of Goods Sold" }) - if self.update_default_account or frappe.flags.in_test: + if self.update_default_account: for default_account in default_accounts: self._set_default_account(default_account, default_accounts.get(default_account))