Merge branch 'develop' into maint_sch_link_fix
diff --git a/erpnext/assets/module_onboarding/assets/assets.json b/erpnext/assets/module_onboarding/assets/assets.json
index e6df88b..796245d 100644
--- a/erpnext/assets/module_onboarding/assets/assets.json
+++ b/erpnext/assets/module_onboarding/assets/assets.json
@@ -13,7 +13,7 @@
"documentation_url": "https://docs.erpnext.com/docs/user/manual/en/asset",
"idx": 0,
"is_complete": 0,
- "modified": "2021-08-24 17:50:41.573281",
+ "modified": "2021-12-02 11:24:37.963746",
"modified_by": "Administrator",
"module": "Assets",
"name": "Assets",
diff --git a/erpnext/assets/onboarding_step/asset_category/asset_category.json b/erpnext/assets/onboarding_step/asset_category/asset_category.json
index 033e866..58f322e 100644
--- a/erpnext/assets/onboarding_step/asset_category/asset_category.json
+++ b/erpnext/assets/onboarding_step/asset_category/asset_category.json
@@ -9,7 +9,7 @@
"is_complete": 0,
"is_single": 0,
"is_skipped": 0,
- "modified": "2021-08-24 12:49:37.665239",
+ "modified": "2021-11-23 10:02:03.242127",
"modified_by": "Administrator",
"name": "Asset Category",
"owner": "Administrator",
diff --git a/erpnext/assets/onboarding_step/asset_item/asset_item.json b/erpnext/assets/onboarding_step/asset_item/asset_item.json
index 8a174c5..13e3e2e 100644
--- a/erpnext/assets/onboarding_step/asset_item/asset_item.json
+++ b/erpnext/assets/onboarding_step/asset_item/asset_item.json
@@ -1,21 +1,22 @@
{
- "action": "Show Form Tour",
+ "action": "Create Entry",
"action_label": "Let's create a new Asset item",
"creation": "2021-08-13 14:27:07.277167",
"description": "# Asset Item\n\nAsset items are created based on Asset Category. You can create one or multiple items against once Asset Category. The sales and purchase transaction for Asset is done via Asset Item. ",
"docstatus": 0,
"doctype": "Onboarding Step",
+ "form_tour": "Item",
"idx": 0,
"is_complete": 0,
"is_single": 0,
"is_skipped": 0,
- "modified": "2021-08-16 13:59:18.362233",
+ "modified": "2021-12-02 11:23:48.158504",
"modified_by": "Administrator",
"name": "Asset Item",
"owner": "Administrator",
"reference_document": "Item",
- "show_form_tour": 0,
- "show_full_form": 0,
+ "show_form_tour": 1,
+ "show_full_form": 1,
"title": "Create an Asset Item",
"validate_action": 1
}
\ No newline at end of file
diff --git a/erpnext/assets/onboarding_step/asset_purchase/asset_purchase.json b/erpnext/assets/onboarding_step/asset_purchase/asset_purchase.json
index 54611ed..69fa337 100644
--- a/erpnext/assets/onboarding_step/asset_purchase/asset_purchase.json
+++ b/erpnext/assets/onboarding_step/asset_purchase/asset_purchase.json
@@ -9,7 +9,7 @@
"is_complete": 0,
"is_single": 0,
"is_skipped": 0,
- "modified": "2021-08-24 17:26:57.180637",
+ "modified": "2021-11-23 10:02:03.235498",
"modified_by": "Administrator",
"name": "Asset Purchase",
"owner": "Administrator",
diff --git a/erpnext/assets/onboarding_step/fixed_asset_accounts/fixed_asset_accounts.json b/erpnext/assets/onboarding_step/fixed_asset_accounts/fixed_asset_accounts.json
index cebee7a..2fc6c46 100644
--- a/erpnext/assets/onboarding_step/fixed_asset_accounts/fixed_asset_accounts.json
+++ b/erpnext/assets/onboarding_step/fixed_asset_accounts/fixed_asset_accounts.json
@@ -9,7 +9,7 @@
"is_complete": 0,
"is_single": 0,
"is_skipped": 0,
- "modified": "2021-08-24 17:46:37.646174",
+ "modified": "2021-11-23 10:02:03.229566",
"modified_by": "Administrator",
"name": "Fixed Asset Accounts",
"owner": "Administrator",
diff --git a/erpnext/maintenance/doctype/maintenance_schedule/test_maintenance_schedule.py b/erpnext/maintenance/doctype/maintenance_schedule/test_maintenance_schedule.py
index 7f1ea9b..7539505 100644
--- a/erpnext/maintenance/doctype/maintenance_schedule/test_maintenance_schedule.py
+++ b/erpnext/maintenance/doctype/maintenance_schedule/test_maintenance_schedule.py
@@ -59,9 +59,14 @@
ms.submit()
s_id = ms.get_pending_data(data_type = "id", item_name = i.item_name, s_date = expected_dates[1])
- test = make_maintenance_visit(source_name = ms.name, item_name = "_Test Item", s_id = s_id)
+
+ # Check if item is mapped in visit.
+ test_map_visit = make_maintenance_visit(source_name = ms.name, item_name = "_Test Item", s_id = s_id)
+ self.assertEqual(len(test_map_visit.purposes), 1)
+ self.assertEqual(test_map_visit.purposes[0].item_name, "_Test Item")
+
visit = frappe.new_doc('Maintenance Visit')
- visit = test
+ visit = test_map_visit
visit.maintenance_schedule = ms.name
visit.maintenance_schedule_detail = s_id
visit.completion_status = "Partially Completed"
diff --git a/erpnext/maintenance/doctype/maintenance_visit/maintenance_visit.js b/erpnext/maintenance/doctype/maintenance_visit/maintenance_visit.js
index edfc5e4..c54ef4a 100644
--- a/erpnext/maintenance/doctype/maintenance_visit/maintenance_visit.js
+++ b/erpnext/maintenance/doctype/maintenance_visit/maintenance_visit.js
@@ -41,7 +41,7 @@
frm.set_value({ status: 'Draft' });
}
if (frm.doc.__islocal) {
- frm.clear_table("purposes");
+ frm.doc.maintenance_type == 'Unscheduled' && frm.clear_table("purposes");
frm.set_value({ mntc_date: frappe.datetime.get_today() });
}
},
diff --git a/erpnext/manufacturing/doctype/job_card/job_card.js b/erpnext/manufacturing/doctype/job_card/job_card.js
index dac7b36..d85b8a6 100644
--- a/erpnext/manufacturing/doctype/job_card/job_card.js
+++ b/erpnext/manufacturing/doctype/job_card/job_card.js
@@ -76,6 +76,7 @@
frm.trigger("prepare_timer_buttons");
}
+ frm.trigger("setup_quality_inspection");
if (frm.doc.work_order) {
frappe.db.get_value('Work Order', frm.doc.work_order,
'transfer_material_against').then((r) => {
@@ -86,6 +87,22 @@
}
},
+ setup_quality_inspection: function(frm) {
+ let quality_inspection_field = frm.get_docfield("quality_inspection");
+ quality_inspection_field.get_route_options_for_new_doc = function(frm) {
+ return {
+ "inspection_type": "In Process",
+ "reference_type": "Job Card",
+ "reference_name": frm.doc.name,
+ "item_code": frm.doc.production_item,
+ "item_name": frm.doc.item_name,
+ "item_serial_no": frm.doc.serial_no,
+ "batch_no": frm.doc.batch_no,
+ "quality_inspection_template": frm.doc.quality_inspection_template,
+ };
+ };
+ },
+
setup_corrective_job_card: function(frm) {
frm.add_custom_button(__('Corrective Job Card'), () => {
let operations = frm.doc.sub_operations.map(d => d.sub_operation).concat(frm.doc.operation);
diff --git a/erpnext/manufacturing/doctype/job_card/job_card.json b/erpnext/manufacturing/doctype/job_card/job_card.json
index 6528199..5a071f1 100644
--- a/erpnext/manufacturing/doctype/job_card/job_card.json
+++ b/erpnext/manufacturing/doctype/job_card/job_card.json
@@ -19,6 +19,7 @@
"serial_no",
"column_break_12",
"wip_warehouse",
+ "quality_inspection_template",
"quality_inspection",
"project",
"batch_no",
@@ -408,11 +409,18 @@
"no_copy": 1,
"options": "Job Card Scrap Item",
"print_hide": 1
+ },
+ {
+ "fetch_from": "operation.quality_inspection_template",
+ "fieldname": "quality_inspection_template",
+ "fieldtype": "Link",
+ "label": "Quality Inspection Template",
+ "options": "Quality Inspection Template"
}
],
"is_submittable": 1,
"links": [],
- "modified": "2021-11-12 10:15:03.572401",
+ "modified": "2021-11-24 19:17:40.879235",
"modified_by": "Administrator",
"module": "Manufacturing",
"name": "Job Card",
diff --git a/erpnext/manufacturing/doctype/operation/operation.json b/erpnext/manufacturing/doctype/operation/operation.json
index 10a97ed..753552c 100644
--- a/erpnext/manufacturing/doctype/operation/operation.json
+++ b/erpnext/manufacturing/doctype/operation/operation.json
@@ -13,6 +13,7 @@
"is_corrective_operation",
"job_card_section",
"create_job_card_based_on_batch_size",
+ "quality_inspection_template",
"column_break_6",
"batch_size",
"sub_operations_section",
@@ -92,15 +93,22 @@
"fieldname": "is_corrective_operation",
"fieldtype": "Check",
"label": "Is Corrective Operation"
+ },
+ {
+ "fieldname": "quality_inspection_template",
+ "fieldtype": "Link",
+ "label": "Quality Inspection Template",
+ "options": "Quality Inspection Template"
}
],
"icon": "fa fa-wrench",
"index_web_pages_for_search": 1,
"links": [],
- "modified": "2021-01-12 15:09:23.593338",
+ "modified": "2021-11-24 19:15:24.357187",
"modified_by": "Administrator",
"module": "Manufacturing",
"name": "Operation",
+ "naming_rule": "Set by user",
"owner": "Administrator",
"permissions": [
{
diff --git a/erpnext/selling/form_tour/customer/customer.json b/erpnext/selling/form_tour/customer/customer.json
new file mode 100644
index 0000000..1de45b7
--- /dev/null
+++ b/erpnext/selling/form_tour/customer/customer.json
@@ -0,0 +1,29 @@
+{
+ "creation": "2021-11-23 10:44:13.185982",
+ "docstatus": 0,
+ "doctype": "Form Tour",
+ "idx": 0,
+ "is_standard": 1,
+ "modified": "2021-11-23 10:54:09.602358",
+ "modified_by": "Administrator",
+ "module": "Selling",
+ "name": "Customer",
+ "owner": "Administrator",
+ "reference_doctype": "Customer",
+ "save_on_complete": 1,
+ "steps": [
+ {
+ "description": "Enter the Full Name of the Customer",
+ "field": "",
+ "fieldname": "customer_name",
+ "fieldtype": "Data",
+ "has_next_condition": 0,
+ "is_table_field": 0,
+ "label": "Full Name",
+ "parent_field": "",
+ "position": "Left",
+ "title": "Full Name"
+ }
+ ],
+ "title": "Customer"
+}
\ No newline at end of file
diff --git a/erpnext/selling/form_tour/quotation/quotation.json b/erpnext/selling/form_tour/quotation/quotation.json
new file mode 100644
index 0000000..2a2aa5e
--- /dev/null
+++ b/erpnext/selling/form_tour/quotation/quotation.json
@@ -0,0 +1,67 @@
+{
+ "creation": "2021-11-23 12:00:36.138824",
+ "docstatus": 0,
+ "doctype": "Form Tour",
+ "idx": 0,
+ "is_standard": 1,
+ "modified": "2021-11-23 12:02:48.010298",
+ "modified_by": "Administrator",
+ "module": "Selling",
+ "name": "Quotation",
+ "owner": "Administrator",
+ "reference_doctype": "Quotation",
+ "save_on_complete": 1,
+ "steps": [
+ {
+ "description": "Select a customer or lead for whom this quotation is being prepared. Let's select a Customer.",
+ "field": "",
+ "fieldname": "quotation_to",
+ "fieldtype": "Link",
+ "has_next_condition": 0,
+ "is_table_field": 0,
+ "label": "Quotation To",
+ "parent_field": "",
+ "position": "Right",
+ "title": "Quotation To"
+ },
+ {
+ "description": "Select a specific Customer to whom this quotation will be sent.",
+ "field": "",
+ "fieldname": "party_name",
+ "fieldtype": "Dynamic Link",
+ "has_next_condition": 0,
+ "is_table_field": 0,
+ "label": "Party",
+ "parent_field": "",
+ "position": "Right",
+ "title": "Party"
+ },
+ {
+ "child_doctype": "Quotation Item",
+ "description": "Select an item for which you will be quoting a price.",
+ "field": "",
+ "fieldname": "items",
+ "fieldtype": "Table",
+ "has_next_condition": 0,
+ "is_table_field": 0,
+ "label": "Items",
+ "parent_field": "",
+ "parent_fieldname": "items",
+ "position": "Bottom",
+ "title": "Items"
+ },
+ {
+ "description": "You can select pre-populated Sales Taxes and Charges from here.",
+ "field": "",
+ "fieldname": "taxes",
+ "fieldtype": "Table",
+ "has_next_condition": 0,
+ "is_table_field": 0,
+ "label": "Sales Taxes and Charges",
+ "parent_field": "",
+ "position": "Bottom",
+ "title": "Sales Taxes and Charges"
+ }
+ ],
+ "title": "Quotation"
+}
\ No newline at end of file
diff --git a/erpnext/setup/form_tour/company/company.json b/erpnext/setup/form_tour/company/company.json
new file mode 100644
index 0000000..c66abc0
--- /dev/null
+++ b/erpnext/setup/form_tour/company/company.json
@@ -0,0 +1,67 @@
+{
+ "creation": "2021-11-24 10:17:18.534917",
+ "docstatus": 0,
+ "doctype": "Form Tour",
+ "first_document": 1,
+ "idx": 0,
+ "include_name_field": 0,
+ "is_standard": 1,
+ "modified": "2021-11-24 15:38:21.026582",
+ "modified_by": "Administrator",
+ "module": "Setup",
+ "name": "Company",
+ "owner": "Administrator",
+ "reference_doctype": "Company",
+ "save_on_complete": 0,
+ "steps": [
+ {
+ "description": "This is the default currency for this company.",
+ "field": "",
+ "fieldname": "default_currency",
+ "fieldtype": "Link",
+ "has_next_condition": 0,
+ "is_table_field": 0,
+ "label": "Default Currency",
+ "parent_field": "",
+ "position": "Right",
+ "title": "Default Currency"
+ },
+ {
+ "description": "Here, you can add multiple addresses of the company",
+ "field": "",
+ "fieldname": "company_info",
+ "fieldtype": "Section Break",
+ "has_next_condition": 0,
+ "is_table_field": 0,
+ "label": "Address & Contact",
+ "parent_field": "",
+ "position": "Top",
+ "title": "Address & Contact"
+ },
+ {
+ "description": "Here, you can set default Accounts, which will ease the creation of accounting entries.",
+ "field": "",
+ "fieldname": "default_settings",
+ "fieldtype": "Section Break",
+ "has_next_condition": 0,
+ "is_table_field": 0,
+ "label": "Accounts Settings",
+ "parent_field": "",
+ "position": "Top",
+ "title": "Accounts Settings"
+ },
+ {
+ "description": "This setting is recommended if you wish to track the real-time stock balance in your books of account. This will allow the creation of a General Ledger entry for every stock transaction.",
+ "field": "",
+ "fieldname": "enable_perpetual_inventory",
+ "fieldtype": "Check",
+ "has_next_condition": 0,
+ "is_table_field": 0,
+ "label": "Enable Perpetual Inventory",
+ "parent_field": "",
+ "position": "Right",
+ "title": "Enable Perpetual Inventory"
+ }
+ ],
+ "title": "Company"
+}
\ No newline at end of file
diff --git a/erpnext/setup/module_onboarding/home/home.json b/erpnext/setup/module_onboarding/home/home.json
new file mode 100644
index 0000000..1b2dbc6
--- /dev/null
+++ b/erpnext/setup/module_onboarding/home/home.json
@@ -0,0 +1,62 @@
+{
+ "allow_roles": [
+ {
+ "role": "Accounts Manager"
+ },
+ {
+ "role": "Stock Manager"
+ },
+ {
+ "role": "Sales Manager"
+ },
+ {
+ "role": "Purchase Manager"
+ },
+ {
+ "role": "Manufacturing Manager"
+ },
+ {
+ "role": "Item Manager"
+ }
+ ],
+ "creation": "2021-11-22 12:19:15.888642",
+ "docstatus": 0,
+ "doctype": "Module Onboarding",
+ "documentation_url": "https://docs.erpnext.com/docs/v13/user/manual/en/setting-up/company-setup",
+ "idx": 0,
+ "is_complete": 0,
+ "modified": "2021-12-15 14:23:52.460913",
+ "modified_by": "Administrator",
+ "module": "Setup",
+ "name": "Home",
+ "owner": "Administrator",
+ "steps": [
+ {
+ "step": "Company Set Up"
+ },
+ {
+ "step": "Navigation Help"
+ },
+ {
+ "step": "Data import"
+ },
+ {
+ "step": "Create an Item"
+ },
+ {
+ "step": "Create a Customer"
+ },
+ {
+ "step": "Create a Supplier"
+ },
+ {
+ "step": "Create a Quotation"
+ },
+ {
+ "step": "Letterhead"
+ }
+ ],
+ "subtitle": "Company, Item, Customer, Supplier, Navigation Help, Data Import, Letter Head, Quotation",
+ "success_message": "Masters are all set up!",
+ "title": "Let's Set Up Some Masters"
+}
\ No newline at end of file
diff --git a/erpnext/setup/onboarding_step/company_set_up/company_set_up.json b/erpnext/setup/onboarding_step/company_set_up/company_set_up.json
new file mode 100644
index 0000000..6f65832
--- /dev/null
+++ b/erpnext/setup/onboarding_step/company_set_up/company_set_up.json
@@ -0,0 +1,21 @@
+{
+ "action": "Create Entry",
+ "action_label": "Let's review your Company",
+ "creation": "2021-11-22 11:55:48.931427",
+ "description": "# Set Up a Company\n\nA company is a legal entity for which you will set up your books of account and create accounting transactions. In ERPNext, you can create multiple companies, and establish relationships (group/subsidiary) among them.\n\nWithin the company master, you can capture various default accounts for that Company and set crucial settings related to the accounting methodology followed for a company.\n",
+ "docstatus": 0,
+ "doctype": "Onboarding Step",
+ "idx": 0,
+ "is_complete": 0,
+ "is_single": 0,
+ "is_skipped": 0,
+ "modified": "2021-12-15 14:22:18.317423",
+ "modified_by": "Administrator",
+ "name": "Company Set Up",
+ "owner": "Administrator",
+ "reference_document": "Company",
+ "show_form_tour": 1,
+ "show_full_form": 1,
+ "title": "Set Up a Company",
+ "validate_action": 1
+}
\ No newline at end of file
diff --git a/erpnext/setup/onboarding_step/create_a_customer/create_a_customer.json b/erpnext/setup/onboarding_step/create_a_customer/create_a_customer.json
new file mode 100644
index 0000000..f74d745
--- /dev/null
+++ b/erpnext/setup/onboarding_step/create_a_customer/create_a_customer.json
@@ -0,0 +1,21 @@
+{
+ "action": "Create Entry",
+ "action_label": "Let\u2019s create your first Customer",
+ "creation": "2020-05-14 17:46:41.831517",
+ "description": "# Create a Customer\n\nThe Customer master is at the heart of your sales transactions. Customers are linked in Quotations, Sales Orders, Invoices, and Payments. Customers can be either numbered or identified by name (you would typically do this based on the number of customers you have).\n\nThrough Customer\u2019s master, you can effectively track essentials like:\n - Customer\u2019s multiple address and contacts\n - Account Receivables\n - Credit Limit and Credit Period\n",
+ "docstatus": 0,
+ "doctype": "Onboarding Step",
+ "idx": 0,
+ "is_complete": 0,
+ "is_single": 0,
+ "is_skipped": 0,
+ "modified": "2021-12-15 14:20:31.197564",
+ "modified_by": "Administrator",
+ "name": "Create a Customer",
+ "owner": "Administrator",
+ "reference_document": "Customer",
+ "show_form_tour": 0,
+ "show_full_form": 0,
+ "title": "Manage Customers",
+ "validate_action": 1
+}
\ No newline at end of file
diff --git a/erpnext/setup/onboarding_step/create_a_quotation/create_a_quotation.json b/erpnext/setup/onboarding_step/create_a_quotation/create_a_quotation.json
new file mode 100644
index 0000000..8bdb621
--- /dev/null
+++ b/erpnext/setup/onboarding_step/create_a_quotation/create_a_quotation.json
@@ -0,0 +1,21 @@
+{
+ "action": "Create Entry",
+ "action_label": "Let\u2019s create your first Quotation",
+ "creation": "2020-06-01 13:34:58.958641",
+ "description": "# Create a Quotation\n\nLet\u2019s get started with business transactions by creating your first Quotation. You can create a Quotation for an existing customer or a prospect. It will be an approved document, with items you sell and the proposed price + taxes applied. After completing the instructions, you will get a Quotation in a ready to share print format.",
+ "docstatus": 0,
+ "doctype": "Onboarding Step",
+ "idx": 0,
+ "is_complete": 0,
+ "is_single": 0,
+ "is_skipped": 0,
+ "modified": "2021-12-15 14:21:31.675330",
+ "modified_by": "Administrator",
+ "name": "Create a Quotation",
+ "owner": "Administrator",
+ "reference_document": "Quotation",
+ "show_form_tour": 1,
+ "show_full_form": 1,
+ "title": "Create your first Quotation",
+ "validate_action": 1
+}
\ No newline at end of file
diff --git a/erpnext/setup/onboarding_step/create_a_supplier/create_a_supplier.json b/erpnext/setup/onboarding_step/create_a_supplier/create_a_supplier.json
new file mode 100644
index 0000000..9574141
--- /dev/null
+++ b/erpnext/setup/onboarding_step/create_a_supplier/create_a_supplier.json
@@ -0,0 +1,21 @@
+{
+ "action": "Create Entry",
+ "action_label": "Let\u2019s create your first Supplier",
+ "creation": "2020-05-14 22:09:10.043554",
+ "description": "# Create a Supplier\n\nAlso known as Vendor, is a master at the center of your purchase transactions. Suppliers are linked in Request for Quotation, Purchase Orders, Receipts, and Payments. Suppliers can be either numbered or identified by name.\n\nThrough Supplier\u2019s master, you can effectively track essentials like:\n - Supplier\u2019s multiple address and contacts\n - Account Receivables\n - Credit Limit and Credit Period\n",
+ "docstatus": 0,
+ "doctype": "Onboarding Step",
+ "idx": 0,
+ "is_complete": 0,
+ "is_single": 0,
+ "is_skipped": 0,
+ "modified": "2021-12-15 14:21:23.518301",
+ "modified_by": "Administrator",
+ "name": "Create a Supplier",
+ "owner": "Administrator",
+ "reference_document": "Supplier",
+ "show_form_tour": 0,
+ "show_full_form": 0,
+ "title": "Manage Suppliers",
+ "validate_action": 1
+}
\ No newline at end of file
diff --git a/erpnext/setup/onboarding_step/create_an_item/create_an_item.json b/erpnext/setup/onboarding_step/create_an_item/create_an_item.json
new file mode 100644
index 0000000..cd29683
--- /dev/null
+++ b/erpnext/setup/onboarding_step/create_an_item/create_an_item.json
@@ -0,0 +1,23 @@
+{
+ "action": "Create Entry",
+ "action_label": "Create a new Item",
+ "creation": "2021-05-17 13:47:18.515052",
+ "description": "# Create an Item\n\nItem is a product, of a or service offered by your company, or something you buy as a part of your supplies or raw materials.\n\nItems are integral to everything you do in ERPNext - from billing, purchasing to managing inventory. Everything you buy or sell, whether it is a physical product or a service is an Item. Items can be stock, non-stock, variants, serialized, batched, assets etc.\n",
+ "docstatus": 0,
+ "doctype": "Onboarding Step",
+ "form_tour": "Item General",
+ "idx": 0,
+ "intro_video_url": "",
+ "is_complete": 0,
+ "is_single": 0,
+ "is_skipped": 0,
+ "modified": "2021-12-15 14:19:56.297772",
+ "modified_by": "Administrator",
+ "name": "Create an Item",
+ "owner": "Administrator",
+ "reference_document": "Item",
+ "show_form_tour": 1,
+ "show_full_form": 1,
+ "title": "Manage Items",
+ "validate_action": 1
+}
\ No newline at end of file
diff --git a/erpnext/setup/onboarding_step/data_import/data_import.json b/erpnext/setup/onboarding_step/data_import/data_import.json
new file mode 100644
index 0000000..48741dc
--- /dev/null
+++ b/erpnext/setup/onboarding_step/data_import/data_import.json
@@ -0,0 +1,21 @@
+{
+ "action": "Watch Video",
+ "action_label": "Learn more about data migration",
+ "creation": "2021-05-19 05:29:16.809610",
+ "description": "# Import Data from Spreadsheet\n\nIn ERPNext, you can easily migrate your historical data using spreadsheets. You can use it for migrating not just masters (like Customer, Supplier, Items), but also for transactions like (outstanding invoices, opening stock and accounting entries, etc). If you are migrating from [Tally](https://tallysolutions.com/) or [Quickbooks](https://quickbooks.intuit.com/in/), we got special migration tools for you.",
+ "docstatus": 0,
+ "doctype": "Onboarding Step",
+ "idx": 0,
+ "is_complete": 0,
+ "is_single": 0,
+ "is_skipped": 0,
+ "modified": "2021-12-15 13:10:57.346422",
+ "modified_by": "Administrator",
+ "name": "Data import",
+ "owner": "Administrator",
+ "show_form_tour": 0,
+ "show_full_form": 0,
+ "title": "Import Data from Spreadsheet",
+ "validate_action": 1,
+ "video_url": "https://youtu.be/DQyqeurPI64"
+}
\ No newline at end of file
diff --git a/erpnext/setup/onboarding_step/letterhead/letterhead.json b/erpnext/setup/onboarding_step/letterhead/letterhead.json
new file mode 100644
index 0000000..8e1bb8c
--- /dev/null
+++ b/erpnext/setup/onboarding_step/letterhead/letterhead.json
@@ -0,0 +1,21 @@
+{
+ "action": "Create Entry",
+ "action_label": "Let\u2019s setup your first Letter Head",
+ "creation": "2021-11-22 12:36:34.583783",
+ "description": "# Create a Letter Head\n\nA Letter Head contains your organization's name, logo, address, etc which appears at the header and footer portion in documents. You can learn more about Setting up Letter Head in ERPNext here.\n",
+ "docstatus": 0,
+ "doctype": "Onboarding Step",
+ "idx": 0,
+ "is_complete": 0,
+ "is_single": 0,
+ "is_skipped": 0,
+ "modified": "2021-12-15 14:21:39.037742",
+ "modified_by": "Administrator",
+ "name": "Letterhead",
+ "owner": "Administrator",
+ "reference_document": "Letter Head",
+ "show_form_tour": 1,
+ "show_full_form": 1,
+ "title": "Setup Your Letterhead",
+ "validate_action": 1
+}
\ No newline at end of file
diff --git a/erpnext/setup/onboarding_step/navigation_help/navigation_help.json b/erpnext/setup/onboarding_step/navigation_help/navigation_help.json
new file mode 100644
index 0000000..388853d
--- /dev/null
+++ b/erpnext/setup/onboarding_step/navigation_help/navigation_help.json
@@ -0,0 +1,21 @@
+{
+ "action": "Watch Video",
+ "action_label": "Learn about Navigation options",
+ "creation": "2021-11-22 12:09:52.233872",
+ "description": "# Navigation in ERPNext\n\nEase of navigating and browsing around the ERPNext is one of our core strengths. In the following video, you will learn how to reach a specific feature in ERPNext via module page or awesome bar\u2019s shortcut.\n",
+ "docstatus": 0,
+ "doctype": "Onboarding Step",
+ "idx": 0,
+ "is_complete": 0,
+ "is_single": 0,
+ "is_skipped": 0,
+ "modified": "2021-12-15 14:20:55.441678",
+ "modified_by": "Administrator",
+ "name": "Navigation Help",
+ "owner": "Administrator",
+ "show_form_tour": 0,
+ "show_full_form": 0,
+ "title": "How to Navigate in ERPNext",
+ "validate_action": 1,
+ "video_url": "https://youtu.be/j60xyNFqX_A"
+}
\ No newline at end of file
diff --git a/erpnext/setup/workspace/home/home.json b/erpnext/setup/workspace/home/home.json
index 4e1ccf9..f9c585c0 100644
--- a/erpnext/setup/workspace/home/home.json
+++ b/erpnext/setup/workspace/home/home.json
@@ -1,13 +1,18 @@
{
"charts": [],
- "content": "[{\"type\":\"header\",\"data\":{\"text\":\"Your Shortcuts\",\"level\":4,\"col\":12}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Item\",\"col\":4}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Customer\",\"col\":4}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Supplier\",\"col\":4}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Sales Invoice\",\"col\":4}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Leaderboard\",\"col\":4}},{\"type\":\"spacer\",\"data\":{\"col\":12}},{\"type\":\"header\",\"data\":{\"text\":\"Reports & Masters\",\"level\":4,\"col\":12}},{\"type\":\"card\",\"data\":{\"card_name\":\"Accounting\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Stock\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Human Resources\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"CRM\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Data Import and Settings\",\"col\":4}}]",
+ "content": "[{\"type\":\"onboarding\",\"data\":{\"onboarding_name\":\"Home\",\"col\":12}},{\"type\":\"header\",\"data\":{\"text\":\"Your Shortcuts\\n\\t\\t\\t\\n\\t\\t\\n\\t\\t\\t\\n\\t\\t\\n\\t\\t\\t\\n\\t\\t\",\"level\":4,\"col\":12}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Item\",\"col\":4}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Customer\",\"col\":4}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Supplier\",\"col\":4}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Sales Invoice\",\"col\":4}},{\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Leaderboard\",\"col\":4}},{\"type\":\"spacer\",\"data\":{\"col\":12}},{\"type\":\"header\",\"data\":{\"text\":\"Reports & Masters\\n\\t\\t\\t\\n\\t\\t\\n\\t\\t\\t\\n\\t\\t\\n\\t\\t\\t\\n\\t\\t\",\"level\":4,\"col\":12}},{\"type\":\"card\",\"data\":{\"card_name\":\"Accounting\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Stock\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Human Resources\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"CRM\",\"col\":4}},{\"type\":\"card\",\"data\":{\"card_name\":\"Data Import and Settings\",\"col\":4}}]",
"creation": "2020-01-23 13:46:38.833076",
+ "developer_mode_only": 0,
+ "disable_user_customization": 0,
"docstatus": 0,
"doctype": "Workspace",
+ "extends_another_page": 0,
"for_user": "",
"hide_custom": 0,
"icon": "getting-started",
"idx": 0,
+ "is_default": 0,
+ "is_standard": 0,
"label": "Home",
"links": [
{
@@ -271,12 +276,14 @@
"type": "Link"
}
],
- "modified": "2021-08-10 15:33:20.704741",
+ "modified": "2021-11-22 12:50:15.771366",
"modified_by": "Administrator",
"module": "Setup",
"name": "Home",
"owner": "Administrator",
"parent_page": "",
+ "pin_to_bottom": 0,
+ "pin_to_top": 0,
"public": 1,
"restrict_to_domain": "",
"roles": [],
@@ -309,4 +316,4 @@
}
],
"title": "Home"
-}
\ No newline at end of file
+}
diff --git a/erpnext/stock/doctype/quality_inspection/quality_inspection.js b/erpnext/stock/doctype/quality_inspection/quality_inspection.js
index d08dc3e..eea2879 100644
--- a/erpnext/stock/doctype/quality_inspection/quality_inspection.js
+++ b/erpnext/stock/doctype/quality_inspection/quality_inspection.js
@@ -59,7 +59,7 @@
},
item_code: function(frm) {
- if (frm.doc.item_code) {
+ if (frm.doc.item_code && !frm.doc.quality_inspection_template) {
return frm.call({
method: "get_quality_inspection_template",
doc: frm.doc,
diff --git a/erpnext/stock/doctype/quality_inspection/quality_inspection.py b/erpnext/stock/doctype/quality_inspection/quality_inspection.py
index 913ee15..4e3b80a 100644
--- a/erpnext/stock/doctype/quality_inspection/quality_inspection.py
+++ b/erpnext/stock/doctype/quality_inspection/quality_inspection.py
@@ -18,6 +18,15 @@
if not self.readings and self.item_code:
self.get_item_specification_details()
+ if self.inspection_type=="In Process" and self.reference_type=="Job Card":
+ item_qi_template = frappe.db.get_value("Item", self.item_code, 'quality_inspection_template')
+ parameters = get_template_details(item_qi_template)
+ for reading in self.readings:
+ for d in parameters:
+ if reading.specification == d.specification:
+ reading.update(d)
+ reading.status = "Accepted"
+
if self.readings:
self.inspect_and_set_status()
diff --git a/erpnext/stock/form_tour/item/item.json b/erpnext/stock/form_tour/item/item.json
index 821e91b..5369366 100644
--- a/erpnext/stock/form_tour/item/item.json
+++ b/erpnext/stock/form_tour/item/item.json
@@ -2,15 +2,17 @@
"creation": "2021-08-24 17:56:40.754909",
"docstatus": 0,
"doctype": "Form Tour",
+ "first_document": 0,
"idx": 0,
+ "include_name_field": 0,
"is_standard": 1,
- "modified": "2021-08-24 18:04:50.928431",
+ "modified": "2021-11-24 17:59:44.559001",
"modified_by": "Administrator",
"module": "Stock",
"name": "Item",
"owner": "Administrator",
"reference_doctype": "Item",
- "save_on_complete": 0,
+ "save_on_complete": 1,
"steps": [
{
"description": "Enter code for Asset Item",
@@ -37,13 +39,26 @@
"title": "Asset Item Name"
},
{
+ "description": "Select an Item Group",
+ "field": "",
+ "fieldname": "item_group",
+ "fieldtype": "Link",
+ "has_next_condition": 0,
+ "is_table_field": 0,
+ "label": "Item Group",
+ "parent_field": "",
+ "position": "Right",
+ "title": "Item Group"
+ },
+ {
"description": "Check this field to make this an Asset Item",
"field": "",
"fieldname": "is_fixed_asset",
"fieldtype": "Check",
- "has_next_condition": 0,
+ "has_next_condition": 1,
"is_table_field": 0,
"label": "Is Fixed Asset",
+ "next_step_condition": "eval:doc.is_fixed_asset",
"parent_field": "",
"position": "Bottom",
"title": "Is this a Fixed Asset?"
@@ -53,9 +68,10 @@
"field": "",
"fieldname": "auto_create_assets",
"fieldtype": "Check",
- "has_next_condition": 0,
+ "has_next_condition": 1,
"is_table_field": 0,
"label": "Auto Create Assets on Purchase",
+ "next_step_condition": "eval:doc.auto_create_assets",
"parent_field": "",
"position": "Bottom",
"title": "Auto Create Asset on Purchase"
@@ -69,7 +85,7 @@
"is_table_field": 0,
"label": "Asset Category",
"parent_field": "",
- "position": "Bottom",
+ "position": "Left",
"title": "Asset Category"
},
{
@@ -81,9 +97,9 @@
"is_table_field": 0,
"label": "Asset Naming Series",
"parent_field": "",
- "position": "Bottom",
+ "position": "Left",
"title": "Asset Naming Series"
}
],
"title": "Item"
-}
+}
\ No newline at end of file
diff --git a/erpnext/stock/form_tour/item_general/item_general.json b/erpnext/stock/form_tour/item_general/item_general.json
new file mode 100644
index 0000000..b468d27
--- /dev/null
+++ b/erpnext/stock/form_tour/item_general/item_general.json
@@ -0,0 +1,79 @@
+{
+ "creation": "2021-12-02 10:37:55.433087",
+ "docstatus": 0,
+ "doctype": "Form Tour",
+ "first_document": 0,
+ "idx": 0,
+ "include_name_field": 0,
+ "is_standard": 1,
+ "modified": "2021-12-02 10:37:55.433087",
+ "modified_by": "Administrator",
+ "module": "Stock",
+ "name": "Item General",
+ "owner": "Administrator",
+ "reference_doctype": "Item",
+ "save_on_complete": 1,
+ "steps": [
+ {
+ "description": "Enter code for the Item",
+ "field": "",
+ "fieldname": "item_code",
+ "fieldtype": "Data",
+ "has_next_condition": 0,
+ "is_table_field": 0,
+ "label": "Item Code",
+ "parent_field": "",
+ "position": "Right",
+ "title": "Item Code"
+ },
+ {
+ "description": "Enter name for the Item",
+ "field": "",
+ "fieldname": "item_name",
+ "fieldtype": "Data",
+ "has_next_condition": 0,
+ "is_table_field": 0,
+ "label": "Item Name",
+ "parent_field": "",
+ "position": "Right",
+ "title": "Item Name"
+ },
+ {
+ "description": "Select an Item Group",
+ "field": "",
+ "fieldname": "item_group",
+ "fieldtype": "Link",
+ "has_next_condition": 0,
+ "is_table_field": 0,
+ "label": "Item Group",
+ "parent_field": "",
+ "position": "Right",
+ "title": "Item Group"
+ },
+ {
+ "description": "This is the default measuring unit that you will use for your product. It could be Nos, Kgs, Meters, etc.",
+ "field": "",
+ "fieldname": "stock_uom",
+ "fieldtype": "Link",
+ "has_next_condition": 0,
+ "is_table_field": 0,
+ "label": "Default Unit of Measure",
+ "parent_field": "",
+ "position": "Right",
+ "title": "Default Unit of Measurement"
+ },
+ {
+ "description": "When creating an Item, entering a value for this field will automatically create an Item Price at the backend. Entering a value after the Item has been saved will not work. In this case, the Item Price is created from any transactions with the Item.",
+ "field": "",
+ "fieldname": "standard_rate",
+ "fieldtype": "Currency",
+ "has_next_condition": 0,
+ "is_table_field": 0,
+ "label": "Standard Selling Rate",
+ "parent_field": "",
+ "position": "Left",
+ "title": "Standard Selling Rate"
+ }
+ ],
+ "title": "Item General"
+}
\ No newline at end of file
diff --git a/erpnext/stock/report/stock_balance/stock_balance.py b/erpnext/stock/report/stock_balance/stock_balance.py
index c0b89fd..3c7b26b 100644
--- a/erpnext/stock/report/stock_balance/stock_balance.py
+++ b/erpnext/stock/report/stock_balance/stock_balance.py
@@ -167,7 +167,7 @@
sle.company, sle.voucher_type, sle.qty_after_transaction, sle.stock_value_difference,
sle.item_code as name, sle.voucher_no, sle.stock_value, sle.batch_no
from
- `tabStock Ledger Entry` sle force index (posting_sort_index)
+ `tabStock Ledger Entry` sle
where sle.docstatus < 2 %s %s
and is_cancelled = 0
order by sle.posting_date, sle.posting_time, sle.creation, sle.actual_qty""" % #nosec
diff --git a/erpnext/stock/report/stock_ledger_invariant_check/__init__.py b/erpnext/stock/report/stock_ledger_invariant_check/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/erpnext/stock/report/stock_ledger_invariant_check/__init__.py
diff --git a/erpnext/stock/report/stock_ledger_invariant_check/stock_ledger_invariant_check.js b/erpnext/stock/report/stock_ledger_invariant_check/stock_ledger_invariant_check.js
new file mode 100644
index 0000000..c484516
--- /dev/null
+++ b/erpnext/stock/report/stock_ledger_invariant_check/stock_ledger_invariant_check.js
@@ -0,0 +1,43 @@
+// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors
+// For license information, please see license.txt
+/* eslint-disable */
+
+const DIFFERNCE_FIELD_NAMES = [
+ "difference_in_qty",
+ "fifo_qty_diff",
+ "fifo_value_diff",
+ "fifo_valuation_diff",
+ "valuation_diff",
+ "fifo_difference_diff"
+];
+
+frappe.query_reports["Stock Ledger Invariant Check"] = {
+ "filters": [
+ {
+ "fieldname": "item_code",
+ "fieldtype": "Link",
+ "label": "Item",
+ "mandatory": 1,
+ "options": "Item",
+ get_query: function() {
+ return {
+ filters: {is_stock_item: 1, has_serial_no: 0}
+ }
+ }
+ },
+ {
+ "fieldname": "warehouse",
+ "fieldtype": "Link",
+ "label": "Warehouse",
+ "mandatory": 1,
+ "options": "Warehouse",
+ }
+ ],
+ formatter (value, row, column, data, default_formatter) {
+ value = default_formatter(value, row, column, data);
+ if (DIFFERNCE_FIELD_NAMES.includes(column.fieldname) && Math.abs(data[column.fieldname]) > 0.001) {
+ value = "<span style='color:red'>" + value + "</span>";
+ }
+ return value;
+ },
+};
diff --git a/erpnext/stock/report/stock_ledger_invariant_check/stock_ledger_invariant_check.json b/erpnext/stock/report/stock_ledger_invariant_check/stock_ledger_invariant_check.json
new file mode 100644
index 0000000..d28fe0f
--- /dev/null
+++ b/erpnext/stock/report/stock_ledger_invariant_check/stock_ledger_invariant_check.json
@@ -0,0 +1,26 @@
+{
+ "add_total_row": 0,
+ "columns": [],
+ "creation": "2021-12-16 06:31:23.290916",
+ "disable_prepared_report": 0,
+ "disabled": 0,
+ "docstatus": 0,
+ "doctype": "Report",
+ "filters": [],
+ "idx": 0,
+ "is_standard": "Yes",
+ "modified": "2021-12-16 09:55:58.341764",
+ "modified_by": "Administrator",
+ "module": "Stock",
+ "name": "Stock Ledger Invariant Check",
+ "owner": "Administrator",
+ "prepared_report": 0,
+ "ref_doctype": "Stock Ledger Entry",
+ "report_name": "Stock Ledger Invariant Check",
+ "report_type": "Script Report",
+ "roles": [
+ {
+ "role": "System Manager"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/erpnext/stock/report/stock_ledger_invariant_check/stock_ledger_invariant_check.py b/erpnext/stock/report/stock_ledger_invariant_check/stock_ledger_invariant_check.py
new file mode 100644
index 0000000..ca47a1e
--- /dev/null
+++ b/erpnext/stock/report/stock_ledger_invariant_check/stock_ledger_invariant_check.py
@@ -0,0 +1,236 @@
+# Copyright (c) 2021, Frappe Technologies Pvt. Ltd. and contributors
+# License: GNU GPL v3. See LICENSE
+
+import json
+
+import frappe
+
+SLE_FIELDS = (
+ "name",
+ "posting_date",
+ "posting_time",
+ "creation",
+ "voucher_type",
+ "voucher_no",
+ "actual_qty",
+ "qty_after_transaction",
+ "incoming_rate",
+ "outgoing_rate",
+ "stock_queue",
+ "batch_no",
+ "stock_value",
+ "stock_value_difference",
+ "valuation_rate",
+)
+
+
+def execute(filters=None):
+ columns = get_columns()
+ data = get_data(filters)
+ return columns, data
+
+
+def get_data(filters):
+ sles = get_stock_ledger_entries(filters)
+ return add_invariant_check_fields(sles)
+
+
+def get_stock_ledger_entries(filters):
+ return frappe.get_all(
+ "Stock Ledger Entry",
+ fields=SLE_FIELDS,
+ filters={
+ "item_code": filters.item_code,
+ "warehouse": filters.warehouse,
+ "is_cancelled": 0
+ },
+ order_by="timestamp(posting_date, posting_time), creation",
+ )
+
+
+def add_invariant_check_fields(sles):
+ balance_qty = 0.0
+ for idx, sle in enumerate(sles):
+ queue = json.loads(sle.stock_queue)
+
+ fifo_qty = 0.0
+ fifo_value = 0.0
+ for qty, rate in queue:
+ fifo_qty += qty
+ fifo_value += qty * rate
+
+ balance_qty += sle.actual_qty
+ if sle.voucher_type == "Stock Reconciliation" and not sle.batch_no:
+ balance_qty = sle.qty_after_transaction
+
+ sle.fifo_queue_qty = fifo_qty
+ sle.fifo_stock_value = fifo_value
+ sle.fifo_valuation_rate = fifo_value / fifo_qty if fifo_qty else None
+ sle.balance_value_by_qty = (
+ sle.stock_value / sle.qty_after_transaction if sle.qty_after_transaction else None
+ )
+ sle.expected_qty_after_transaction = balance_qty
+
+ # set difference fields
+ sle.difference_in_qty = sle.qty_after_transaction - sle.expected_qty_after_transaction
+ sle.fifo_qty_diff = sle.qty_after_transaction - fifo_qty
+ sle.fifo_value_diff = sle.stock_value - fifo_value
+ sle.fifo_valuation_diff = (
+ sle.valuation_rate - sle.fifo_valuation_rate if sle.fifo_valuation_rate else None
+ )
+ sle.valuation_diff = (
+ sle.valuation_rate - sle.balance_value_by_qty if sle.balance_value_by_qty else None
+ )
+
+ if idx > 0:
+ sle.fifo_stock_diff = sle.fifo_stock_value - sles[idx - 1].fifo_stock_value
+ sle.fifo_difference_diff = sle.fifo_stock_diff - sle.stock_value_difference
+
+ return sles
+
+
+def get_columns():
+ return [
+ {
+ "fieldname": "name",
+ "fieldtype": "Link",
+ "label": "Stock Ledger Entry",
+ "options": "Stock Ledger Entry",
+ },
+ {
+ "fieldname": "posting_date",
+ "fieldtype": "Date",
+ "label": "Posting Date",
+ },
+ {
+ "fieldname": "posting_time",
+ "fieldtype": "Time",
+ "label": "Posting Time",
+ },
+ {
+ "fieldname": "creation",
+ "fieldtype": "Datetime",
+ "label": "Creation",
+ },
+ {
+ "fieldname": "voucher_type",
+ "fieldtype": "Link",
+ "label": "Voucher Type",
+ "options": "DocType",
+ },
+ {
+ "fieldname": "voucher_no",
+ "fieldtype": "Dynamic Link",
+ "label": "Voucher No",
+ "options": "voucher_type",
+ },
+ {
+ "fieldname": "batch_no",
+ "fieldtype": "Link",
+ "label": "Batch",
+ "options": "Batch",
+ },
+ {
+ "fieldname": "actual_qty",
+ "fieldtype": "Float",
+ "label": "Qty Change",
+ },
+ {
+ "fieldname": "incoming_rate",
+ "fieldtype": "Float",
+ "label": "Incoming Rate",
+ },
+ {
+ "fieldname": "outgoing_rate",
+ "fieldtype": "Float",
+ "label": "Outgoing Rate",
+ },
+ {
+ "fieldname": "qty_after_transaction",
+ "fieldtype": "Float",
+ "label": "(A) Qty After Transaction",
+ },
+ {
+ "fieldname": "expected_qty_after_transaction",
+ "fieldtype": "Float",
+ "label": "(B) Expected Qty After Transaction",
+ },
+ {
+ "fieldname": "difference_in_qty",
+ "fieldtype": "Float",
+ "label": "A - B",
+ },
+ {
+ "fieldname": "stock_queue",
+ "fieldtype": "Data",
+ "label": "FIFO Queue",
+ },
+
+ {
+ "fieldname": "fifo_queue_qty",
+ "fieldtype": "Float",
+ "label": "(C) Total qty in queue",
+ },
+ {
+ "fieldname": "fifo_qty_diff",
+ "fieldtype": "Float",
+ "label": "A - C",
+ },
+ {
+ "fieldname": "stock_value",
+ "fieldtype": "Float",
+ "label": "(D) Balance Stock Value",
+ },
+ {
+ "fieldname": "fifo_stock_value",
+ "fieldtype": "Float",
+ "label": "(E) Balance Stock Value in Queue",
+ },
+ {
+ "fieldname": "fifo_value_diff",
+ "fieldtype": "Float",
+ "label": "D - E",
+ },
+
+ {
+ "fieldname": "stock_value_difference",
+ "fieldtype": "Float",
+ "label": "(F) Stock Value Difference",
+ },
+ {
+ "fieldname": "fifo_stock_diff",
+ "fieldtype": "Float",
+ "label": "(G) Stock Value difference (FIFO queue)",
+ },
+ {
+ "fieldname": "fifo_difference_diff",
+ "fieldtype": "Float",
+ "label": "F - G",
+ },
+ {
+ "fieldname": "valuation_rate",
+ "fieldtype": "Float",
+ "label": "(H) Valuation Rate",
+ },
+ {
+ "fieldname": "fifo_valuation_rate",
+ "fieldtype": "Float",
+ "label": "(I) Valuation Rate as per FIFO",
+ },
+
+ {
+ "fieldname": "fifo_valuation_diff",
+ "fieldtype": "Float",
+ "label": "H - I",
+ },
+ {
+ "fieldname": "balance_value_by_qty",
+ "fieldtype": "Float",
+ "label": "(J) Valuation = Value (D) ÷ Qty (A)",
+ },
+ {
+ "fieldname": "valuation_diff",
+ "fieldtype": "Float",
+ "label": "H - J",
+ },
+ ]
diff --git a/erpnext/stock/report/test_reports.py b/erpnext/stock/report/test_reports.py
index d7fb5b2..1dcf863 100644
--- a/erpnext/stock/report/test_reports.py
+++ b/erpnext/stock/report/test_reports.py
@@ -41,6 +41,12 @@
("Total Stock Summary", {"group_by": "warehouse",}),
("Batch Item Expiry Status", {}),
("Stock Ageing", {"range1": 30, "range2": 60, "range3": 90, "_optional": True}),
+ ("Stock Ledger Invariant Check",
+ {
+ "warehouse": "_Test Warehouse - _TC",
+ "item": "_Test Item"
+ }
+ ),
]
OPTIONAL_FILTERS = {