[Enhancement] UOM Conversion Factors (#13853)

* new doctype UOM category

* new doctype UOM Conversion Factor

* bootstrap json data for uom conversions

* uom conversion in item

* Patch to add all conversions and categories

* Fetch conversions multi-way

* fix codacy

* Rebase with develop

* [minor] Fix

* Add a test case

* Improvise as per review comment

* Add json data for UOMs

* Commonify function and call from patch

* Update uom_conversion_data.py
This commit is contained in:
Shreya Shah 2018-06-06 09:44:46 +05:30 committed by Nabin Hait
parent d458f7710f
commit 59af3a0296
20 changed files with 3050 additions and 17 deletions

View File

@ -520,6 +520,7 @@ erpnext.patches.v11_0.move_leave_approvers_from_employee
erpnext.patches.v11_0.update_department_lft_rgt
erpnext.patches.v11_0.add_default_email_template_for_leave
erpnext.patches.v11_0.set_default_email_template_in_hr
erpnext.patches.v11_0.uom_conversion_data
erpnext.patches.v10_0.taxes_issue_with_pos
erpnext.patches.v11_0.update_account_type_in_party_type
erpnext.patches.v10_1.transfer_subscription_to_auto_repeat

View File

@ -0,0 +1,11 @@
import frappe, json
def execute():
from erpnext.setup.setup_wizard.operations.install_fixtures import add_uom_data
frappe.reload_doc("setup", "doctype", "UOM Conversion Factor")
frappe.reload_doc("setup", "doctype", "UOM")
frappe.reload_doc("stock", "doctype", "UOM Category")
if not frappe.db.a_row_exists("UOM Conversion Factor"):
add_uom_data()

View File

@ -0,0 +1,23 @@
/* eslint-disable */
// rename this file from _test_[name] to test_[name] to activate
// and remove above this line
QUnit.test("test: UOM Conversion Factor", function (assert) {
let done = assert.async();
// number of asserts
assert.expect(1);
frappe.run_serially([
// insert a new UOM Conversion Factor
() => frappe.tests.make('UOM Conversion Factor', [
// values to be set
{key: 'value'}
]),
() => {
assert.equal(cur_frm.doc.key, 'value');
},
() => done()
]);
});

View File

@ -0,0 +1,9 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors
# See license.txt
from __future__ import unicode_literals
import unittest
class TestUOMConversionFactor(unittest.TestCase):
pass

View File

@ -0,0 +1,8 @@
// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors
// For license information, please see license.txt
frappe.ui.form.on('UOM Conversion Factor', {
refresh: function() {
}
});

View File

@ -0,0 +1,224 @@
{
"allow_copy": 0,
"allow_guest_to_view": 0,
"allow_import": 0,
"allow_rename": 0,
"autoname": "UOM.#####",
"beta": 0,
"creation": "2018-04-30 17:37:02.347217",
"custom": 0,
"docstatus": 0,
"doctype": "DocType",
"document_type": "",
"editable_grid": 1,
"engine": "InnoDB",
"fields": [
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "category",
"fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 1,
"in_standard_filter": 1,
"label": "Category",
"length": 0,
"no_copy": 0,
"options": "UOM Category",
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "section_break_2",
"fieldtype": "Section Break",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "from_uom",
"fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 1,
"in_standard_filter": 1,
"label": "From",
"length": 0,
"no_copy": 0,
"options": "UOM",
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "to_uom",
"fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 1,
"in_standard_filter": 1,
"label": "To",
"length": 0,
"no_copy": 0,
"options": "UOM",
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "value",
"fieldtype": "Float",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 1,
"in_standard_filter": 0,
"label": "Value",
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
}
],
"has_web_view": 0,
"hide_heading": 0,
"hide_toolbar": 0,
"idx": 0,
"image_view": 0,
"in_create": 0,
"is_submittable": 0,
"issingle": 0,
"istable": 0,
"max_attachments": 0,
"modified": "2018-06-05 12:50:02.648100",
"modified_by": "Administrator",
"module": "Setup",
"name": "UOM Conversion Factor",
"name_case": "",
"owner": "Administrator",
"permissions": [
{
"amend": 0,
"cancel": 0,
"create": 1,
"delete": 1,
"email": 1,
"export": 1,
"if_owner": 0,
"import": 0,
"permlevel": 0,
"print": 1,
"read": 1,
"report": 1,
"role": "System Manager",
"set_user_permissions": 0,
"share": 1,
"submit": 0,
"write": 1
}
],
"quick_entry": 1,
"read_only": 0,
"read_only_onload": 0,
"show_name_in_global_search": 0,
"sort_field": "modified",
"sort_order": "DESC",
"track_changes": 1,
"track_seen": 0
}

View File

@ -0,0 +1,9 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors
# For license information, please see license.txt
from __future__ import unicode_literals
from frappe.model.document import Document
class UOMConversionFactor(Document):
pass

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,952 @@
[
{
"uom_name": "Unit",
"must_be_whole_number": 1
},
{
"uom_name": "Box",
"must_be_whole_number": 1
}, {
"uom_name": "Nos",
"must_be_whole_number": 1
}, {
"uom_name": "Pair",
"must_be_whole_number": 1
}, {
"uom_name": "Set",
"must_be_whole_number": 1
},
{
"uom_name": "Meter",
"must_be_whole_number": 0
},
{
"uom_name": "Barleycorn",
"must_be_whole_number": 0
},
{
"uom_name": "Calibre",
"must_be_whole_number": 0
},
{
"uom_name": "Cable Length (UK)",
"must_be_whole_number": 0
},
{
"uom_name": "Cable Length (US)",
"must_be_whole_number": 0
},
{
"uom_name": "Cable Length",
"must_be_whole_number": 0
},
{
"uom_name": "Centimeter",
"must_be_whole_number": 0
},
{
"uom_name": "Chain",
"must_be_whole_number": 0
},
{
"uom_name": "Decimeter",
"must_be_whole_number": 0
},
{
"uom_name": "Ells (UK)",
"must_be_whole_number": 0
},
{
"uom_name": "Ems(Pica)",
"must_be_whole_number": 0
},
{
"uom_name": "Fathom",
"must_be_whole_number": 0
},
{
"uom_name": "Foot",
"must_be_whole_number": 0
},
{
"uom_name": "Furlong",
"must_be_whole_number": 0
},
{
"uom_name": "Hand",
"must_be_whole_number": 0
},
{
"uom_name": "Hectometer",
"must_be_whole_number": 0
},
{
"uom_name": "Inch",
"must_be_whole_number": 0
},
{
"uom_name": "Kilometer",
"must_be_whole_number": 0
},
{
"uom_name": "Link",
"must_be_whole_number": 0
},
{
"uom_name": "Micrometer",
"must_be_whole_number": 0
},
{
"uom_name": "Mile",
"must_be_whole_number": 0
},
{
"uom_name": "Mile (Nautical)",
"must_be_whole_number": 0
},
{
"uom_name": "Millimeter",
"must_be_whole_number": 0
},
{
"uom_name": "Nanometer",
"must_be_whole_number": 0
},
{
"uom_name": "Rod",
"must_be_whole_number": 0
},
{
"uom_name": "Vara",
"must_be_whole_number": 0
},
{
"uom_name": "Versta",
"must_be_whole_number": 0
},
{
"uom_name": "Yard",
"must_be_whole_number": 0
},
{
"uom_name": "Arshin",
"must_be_whole_number": 0
},
{
"uom_name": "Sazhen",
"must_be_whole_number": 0
},
{
"uom_name": "Medio Metro",
"must_be_whole_number": 0
},
{
"uom_name": "Square Meter",
"must_be_whole_number": 0
},
{
"uom_name": "Centiarea",
"must_be_whole_number": 0
},
{
"uom_name": "Area",
"must_be_whole_number": 0
},
{
"uom_name": "Manzana",
"must_be_whole_number": 0
},
{
"uom_name": "Caballeria",
"must_be_whole_number": 0
},
{
"uom_name": "Square Kilometer",
"must_be_whole_number": 0
},
{
"uom_name": "Are",
"must_be_whole_number": 0
},
{
"uom_name": "Acre",
"must_be_whole_number": 0
},
{
"uom_name": "Acre (US)",
"must_be_whole_number": 0
},
{
"uom_name": "Hectare",
"must_be_whole_number": 0
},
{
"uom_name": "Square Yard",
"must_be_whole_number": 0
},
{
"uom_name": "Square Foot",
"must_be_whole_number": 0
},
{
"uom_name": "Square Inch",
"must_be_whole_number": 0
},
{
"uom_name": "Square Centimeter",
"must_be_whole_number": 0
},
{
"uom_name": "Square Mile",
"must_be_whole_number": 0
},
{
"uom_name": "Meter/Second",
"must_be_whole_number": 0
},
{
"uom_name": "Inch/Minute",
"must_be_whole_number": 0
},
{
"uom_name": "Foot/Minute",
"must_be_whole_number": 0
},
{
"uom_name": "Inch/Second",
"must_be_whole_number": 0
},
{
"uom_name": "Kilometer/Hour",
"must_be_whole_number": 0
},
{
"uom_name": "Foot/Second",
"must_be_whole_number": 0
},
{
"uom_name": "Mile/Hour",
"must_be_whole_number": 0
},
{
"uom_name": "Knot",
"must_be_whole_number": 0
},
{
"uom_name": "Mile/Minute",
"must_be_whole_number": 0
},
{
"uom_name": "Mile/Second",
"must_be_whole_number": 0
},
{
"uom_name": "Carat",
"must_be_whole_number": 0
},
{
"uom_name": "Cental",
"must_be_whole_number": 0
},
{
"uom_name": "Dram",
"must_be_whole_number": 0
},
{
"uom_name": "Grain",
"must_be_whole_number": 0
},
{
"uom_name": "Gram",
"must_be_whole_number": 0
},
{
"uom_name": "Hundredweight",
"must_be_whole_number": 0
},
{
"uom_name": "Quintal",
"must_be_whole_number": 0
},
{
"uom_name": "Kg",
"must_be_whole_number": 0
},
{
"uom_name": "Microgram",
"must_be_whole_number": 0
},
{
"uom_name": "Milligram",
"must_be_whole_number": 0
},
{
"uom_name": "Ounce",
"must_be_whole_number": 0
},
{
"uom_name": "Pood",
"must_be_whole_number": 0
},
{
"uom_name": "Pound",
"must_be_whole_number": 0
},
{
"uom_name": "Slug",
"must_be_whole_number": 0
},
{
"uom_name": "Stone",
"must_be_whole_number": 0
},
{
"uom_name": "Tonne",
"must_be_whole_number": 0
},
{
"uom_name": "Kip",
"must_be_whole_number": 0
},
{
"uom_name": "Barrel(Beer)",
"must_be_whole_number": 0
},
{
"uom_name": "Barrel (Oil)",
"must_be_whole_number": 0
},
{
"uom_name": "Bushel (UK)",
"must_be_whole_number": 0
},
{
"uom_name": "Bushel (US Dry Level)",
"must_be_whole_number": 0
},
{
"uom_name": "Centilitre",
"must_be_whole_number": 0
},
{
"uom_name": "Cubic Centimeter",
"must_be_whole_number": 0
},
{
"uom_name": "Cubic Decimeter",
"must_be_whole_number": 0
},
{
"uom_name": "Cubic Foot",
"must_be_whole_number": 0
},
{
"uom_name": "Cubic Inch",
"must_be_whole_number": 0
},
{
"uom_name": "Cubic Meter",
"must_be_whole_number": 0
},
{
"uom_name": "Cubic Millimeter",
"must_be_whole_number": 0
},
{
"uom_name": "Cubic Yard",
"must_be_whole_number": 0
},
{
"uom_name": "Cup",
"must_be_whole_number": 0
},
{
"uom_name": "Decilitre",
"must_be_whole_number": 0
},
{
"uom_name": "Fluid Ounce (UK)",
"must_be_whole_number": 0
},
{
"uom_name": "Fluid Ounce (US)",
"must_be_whole_number": 0
},
{
"uom_name": "Gallon (UK)",
"must_be_whole_number": 0
},
{
"uom_name": "Gallon Dry (US)",
"must_be_whole_number": 0
},
{
"uom_name": "Gallon Liquid (US)",
"must_be_whole_number": 0
},
{
"uom_name": "Litre",
"must_be_whole_number": 0
},
{
"uom_name": "Millilitre",
"must_be_whole_number": 0
},
{
"uom_name": "Peck",
"must_be_whole_number": 0
},
{
"uom_name": "Pint (UK)",
"must_be_whole_number": 0
},
{
"uom_name": "Pint, Dry (US)",
"must_be_whole_number": 0
},
{
"uom_name": "Pint, Liquid (US)",
"must_be_whole_number": 0
},
{
"uom_name": "Quart (UK)",
"must_be_whole_number": 0
},
{
"uom_name": "Quart Dry (US)",
"must_be_whole_number": 0
},
{
"uom_name": "Quart Liquid (US)",
"must_be_whole_number": 0
},
{
"uom_name": "Tablespoon (US)",
"must_be_whole_number": 0
},
{
"uom_name": "Teaspoon",
"must_be_whole_number": 0
},
{
"uom_name": "Day",
"must_be_whole_number": 0
},
{
"uom_name": "Hour",
"must_be_whole_number": 0
},
{
"uom_name": "Minute",
"must_be_whole_number": 0
},
{
"uom_name": "Second",
"must_be_whole_number": 0
},
{
"uom_name": "Millisecond",
"must_be_whole_number": 0
},
{
"uom_name": "Microsecond",
"must_be_whole_number": 0
},
{
"uom_name": "Nanosecond",
"must_be_whole_number": 0
},
{
"uom_name": "Week",
"must_be_whole_number": 0
},
{
"uom_name": "Atmosphere",
"must_be_whole_number": 0
},
{
"uom_name": "Pascal",
"must_be_whole_number": 0
},
{
"uom_name": "Bar",
"must_be_whole_number": 0
},
{
"uom_name": "Foot Of Water",
"must_be_whole_number": 0
},
{
"uom_name": "Hectopascal",
"must_be_whole_number": 0
},
{
"uom_name": "Iches Of Water",
"must_be_whole_number": 0
},
{
"uom_name": "Inches Of Mercury",
"must_be_whole_number": 0
},
{
"uom_name": "Kilopascal",
"must_be_whole_number": 0
},
{
"uom_name": "Meter Of Water",
"must_be_whole_number": 0
},
{
"uom_name": "Microbar",
"must_be_whole_number": 0
},
{
"uom_name": "Milibar",
"must_be_whole_number": 0
},
{
"uom_name": "Millimeter Of Mercury",
"must_be_whole_number": 0
},
{
"uom_name": "Millimeter Of Water",
"must_be_whole_number": 0
},
{
"uom_name": "Technical Atmosphere",
"must_be_whole_number": 0
},
{
"uom_name": "Torr",
"must_be_whole_number": 0
},
{
"uom_name": "Dyne",
"must_be_whole_number": 0
},
{
"uom_name": "Gram-Force",
"must_be_whole_number": 0
},
{
"uom_name": "Joule/Meter",
"must_be_whole_number": 0
},
{
"uom_name": "Kilogram-Force",
"must_be_whole_number": 0
},
{
"uom_name": "Kilopond",
"must_be_whole_number": 0
},
{
"uom_name": "Kilopound-Force",
"must_be_whole_number": 0
},
{
"uom_name": "Newton",
"must_be_whole_number": 0
},
{
"uom_name": "Ounce-Force",
"must_be_whole_number": 0
},
{
"uom_name": "Pond",
"must_be_whole_number": 0
},
{
"uom_name": "Pound-Force",
"must_be_whole_number": 0
},
{
"uom_name": "Poundal",
"must_be_whole_number": 0
},
{
"uom_name": "Tonne-Force(Metric)",
"must_be_whole_number": 0
},
{
"uom_name": "Ton-Force (UK)",
"must_be_whole_number": 0
},
{
"uom_name": "Ton-Force (US)",
"must_be_whole_number": 0
},
{
"uom_name": "Btu (It)",
"must_be_whole_number": 0
},
{
"uom_name": "Btu (Th)",
"must_be_whole_number": 0
},
{
"uom_name": "Btu (Mean)",
"must_be_whole_number": 0
},
{
"uom_name": "Calorie (It)",
"must_be_whole_number": 0
},
{
"uom_name": "Calorie (Th)",
"must_be_whole_number": 0
},
{
"uom_name": "Calorie (Mean)",
"must_be_whole_number": 0
},
{
"uom_name": "Calorie (Food)",
"must_be_whole_number": 0
},
{
"uom_name": "Erg",
"must_be_whole_number": 0
},
{
"uom_name": "Horsepower-Hours",
"must_be_whole_number": 0
},
{
"uom_name": "Inch Pound-Force",
"must_be_whole_number": 0
},
{
"uom_name": "Joule",
"must_be_whole_number": 0
},
{
"uom_name": "Kilojoule",
"must_be_whole_number": 0
},
{
"uom_name": "Kilocalorie",
"must_be_whole_number": 0
},
{
"uom_name": "Kilowatt-Hour",
"must_be_whole_number": 0
},
{
"uom_name": "Litre-Atmosphere",
"must_be_whole_number": 0
},
{
"uom_name": "Megajoule",
"must_be_whole_number": 0
},
{
"uom_name": "Watt-Hour",
"must_be_whole_number": 0
},
{
"uom_name": "Btu/Hour",
"must_be_whole_number": 0
},
{
"uom_name": "Btu/Minutes",
"must_be_whole_number": 0
},
{
"uom_name": "Btu/Seconds",
"must_be_whole_number": 0
},
{
"uom_name": "Calorie/Seconds",
"must_be_whole_number": 0
},
{
"uom_name": "Horsepower",
"must_be_whole_number": 0
},
{
"uom_name": "Kilowatt",
"must_be_whole_number": 0
},
{
"uom_name": "Megawatt",
"must_be_whole_number": 0
},
{
"uom_name": "Volt-Ampere",
"must_be_whole_number": 0
},
{
"uom_name": "Watt",
"must_be_whole_number": 0
},
{
"uom_name": "Centigram/Litre",
"must_be_whole_number": 0
},
{
"uom_name": "Decigram/Litre",
"must_be_whole_number": 0
},
{
"uom_name": "Dekagram/Litre",
"must_be_whole_number": 0
},
{
"uom_name": "Hectogram/Litre",
"must_be_whole_number": 0
},
{
"uom_name": "Gram/Cubic Meter",
"must_be_whole_number": 0
},
{
"uom_name": "Gram/Cubic Centimeter",
"must_be_whole_number": 0
},
{
"uom_name": "Gram/Cubic Millimeter",
"must_be_whole_number": 0
},
{
"uom_name": "Gram/Litre",
"must_be_whole_number": 0
},
{
"uom_name": "Grain/Gallon (US)",
"must_be_whole_number": 0
},
{
"uom_name": "Grain/Gallon (UK)",
"must_be_whole_number": 0
},
{
"uom_name": "Grain/Cubic Foot",
"must_be_whole_number": 0
},
{
"uom_name": "Kilogram/Cubic Meter",
"must_be_whole_number": 0
},
{
"uom_name": "Kilogram/Cubic Centimeter",
"must_be_whole_number": 0
},
{
"uom_name": "Kilogram/Litre",
"must_be_whole_number": 0
},
{
"uom_name": "Milligram/Cubic Meter",
"must_be_whole_number": 0
},
{
"uom_name": "Milligram/Cubic Centimeter",
"must_be_whole_number": 0
},
{
"uom_name": "Milligram/Cubic Millimeter",
"must_be_whole_number": 0
},
{
"uom_name": "Megagram/Litre",
"must_be_whole_number": 0
},
{
"uom_name": "Milligram/Litre",
"must_be_whole_number": 0
},
{
"uom_name": "Microgram/Litre",
"must_be_whole_number": 0
},
{
"uom_name": "Nanogram/Litre",
"must_be_whole_number": 0
},
{
"uom_name": "Ounce/Cubic Inch",
"must_be_whole_number": 0
},
{
"uom_name": "Ounce/Cubic Foot",
"must_be_whole_number": 0
},
{
"uom_name": "Ounce/Gallon (US)",
"must_be_whole_number": 0
},
{
"uom_name": "Ounce/Gallon (UK)",
"must_be_whole_number": 0
},
{
"uom_name": "Pound/Cubic Inch",
"must_be_whole_number": 0
},
{
"uom_name": "Pound/Cubic Foot",
"must_be_whole_number": 0
},
{
"uom_name": "Pound Cubic Yard",
"must_be_whole_number": 0
},
{
"uom_name": "Pound/Gallon (US)",
"must_be_whole_number": 0
},
{
"uom_name": "Pound/Gallon (UK)",
"must_be_whole_number": 0
},
{
"uom_name": "Psi/1000 Feet",
"must_be_whole_number": 0
},
{
"uom_name": "Slug/Cubic Foot",
"must_be_whole_number": 0
},
{
"uom_name": "Ton (Short)/Cubic Yard",
"must_be_whole_number": 0
},
{
"uom_name": "Ton (Long)/Cubic Yard",
"must_be_whole_number": 0
},
{
"uom_name": "Celsius",
"must_be_whole_number": 0
},
{
"uom_name": "Fahrenheit",
"must_be_whole_number": 0
},
{
"uom_name": "Kelvin",
"must_be_whole_number": 0
},
{
"uom_name": "Cycle/Second",
"must_be_whole_number": 0
},
{
"uom_name": "Nanohertz",
"must_be_whole_number": 0
},
{
"uom_name": "Millihertz",
"must_be_whole_number": 0
},
{
"uom_name": "Hertz",
"must_be_whole_number": 0
},
{
"uom_name": "Kilohertz",
"must_be_whole_number": 0
},
{
"uom_name": "Megahertz",
"must_be_whole_number": 0
},
{
"uom_name": "Wavelength In Gigametres",
"must_be_whole_number": 0
},
{
"uom_name": "Wavelength In Megametres",
"must_be_whole_number": 0
},
{
"uom_name": "Wavelength In Kilometres",
"must_be_whole_number": 0
},
{
"uom_name": "Ampere-Hour",
"must_be_whole_number": 0
},
{
"uom_name": "Ampere-Minute",
"must_be_whole_number": 0
},
{
"uom_name": "Ampere-Second",
"must_be_whole_number": 0
},
{
"uom_name": "Coulomb",
"must_be_whole_number": 0
},
{
"uom_name": "EMU Of Charge",
"must_be_whole_number": 0
},
{
"uom_name": "Faraday",
"must_be_whole_number": 0
},
{
"uom_name": "Kilocoulomb",
"must_be_whole_number": 0
},
{
"uom_name": "Megacoulomb",
"must_be_whole_number": 0
},
{
"uom_name": "Millicoulomb",
"must_be_whole_number": 0
},
{
"uom_name": "Nanocoulomb",
"must_be_whole_number": 0
},
{
"uom_name": "Ampere",
"must_be_whole_number": 0
},
{
"uom_name": "Abampere",
"must_be_whole_number": 0
},
{
"uom_name": "Biot",
"must_be_whole_number": 0
},
{
"uom_name": "EMU of current",
"must_be_whole_number": 0
},
{
"uom_name": "Kiloampere",
"must_be_whole_number": 0
},
{
"uom_name": "Milliampere",
"must_be_whole_number": 0
},
{
"uom_name": "Gamma",
"must_be_whole_number": 0
},
{
"uom_name": "Gauss",
"must_be_whole_number": 0
},
{
"uom_name": "Tesla",
"must_be_whole_number": 0
},
{
"uom_name": "Percent",
"must_be_whole_number": 0
},
{
"uom_name": "Parts Per Million",
"must_be_whole_number": 0
}
]

View File

@ -3,7 +3,7 @@
from __future__ import unicode_literals
import frappe, os
import frappe, os, json
from frappe import _
@ -144,19 +144,6 @@ def install(country=None):
# Sales Person
{'doctype': 'Sales Person', 'sales_person_name': _('Sales Team'), 'is_group': 1, "parent_sales_person": ""},
# UOM
{'uom_name': _('Unit'), 'doctype': 'UOM', 'name': _('Unit'), "must_be_whole_number": 1},
{'uom_name': _('Box'), 'doctype': 'UOM', 'name': _('Box'), "must_be_whole_number": 1},
{'uom_name': _('Kg'), 'doctype': 'UOM', 'name': _('Kg')},
{'uom_name': _('Meter'), 'doctype': 'UOM', 'name': _('Meter')},
{'uom_name': _('Litre'), 'doctype': 'UOM', 'name': _('Litre')},
{'uom_name': _('Gram'), 'doctype': 'UOM', 'name': _('Gram')},
{'uom_name': _('Nos'), 'doctype': 'UOM', 'name': _('Nos'), "must_be_whole_number": 1},
{'uom_name': _('Pair'), 'doctype': 'UOM', 'name': _('Pair'), "must_be_whole_number": 1},
{'uom_name': _('Set'), 'doctype': 'UOM', 'name': _('Set'), "must_be_whole_number": 1},
{'uom_name': _('Hour'), 'doctype': 'UOM', 'name': _('Hour')},
{'uom_name': _('Minute'), 'doctype': 'UOM', 'name': _('Minute')},
# Mode of Payment
{'doctype': 'Mode of Payment',
'mode_of_payment': 'Check' if country=="United States" else _('Cheque'),
@ -244,7 +231,6 @@ def install(country=None):
from erpnext.setup.setup_wizard.data.industry_type import get_industry_types
records += [{"doctype":"Industry Type", "industry": d} for d in get_industry_types()]
# records += [{"doctype":"Operation", "operation": d} for d in get_operations()]
records += [{'doctype': 'Lead Source', 'source_name': _(d)} for d in default_lead_sources]
base_path = frappe.get_app_path("erpnext", "hr", "doctype")
@ -267,6 +253,30 @@ def install(country=None):
selling_settings.set_default_customer_group_and_territory()
selling_settings.save()
add_uom_data()
def add_uom_data():
# add UOMs
uoms = json.loads(open(frappe.get_app_path("erpnext", "setup", "setup_wizard", "data", "uom_data.json")).read())
for d in uoms:
if not frappe.db.exists('UOM', d.get("uom_name")):
uom_doc = frappe.new_doc('UOM')
uom_doc.update(d)
uom_doc.save(ignore_permissions=True)
# bootstrap uom conversion factors
uom_conversions = json.loads(open(frappe.get_app_path("erpnext", "setup", "setup_wizard", "data", "uom_conversion_data.json")).read())
for d in uom_conversions:
if not frappe.db.exists("UOM Category", d.get("category")):
frappe.get_doc({
"doctype": "UOM Category",
"category_name": d.get("category")
}).insert(ignore_permissions=True)
uom_conversion = frappe.new_doc('UOM Conversion Factor')
uom_conversion.update(d)
uom_conversion.save(ignore_permissions=True)
def make_fixture_records(records):
from frappe.modules import scrub
for r in records:

View File

@ -694,3 +694,23 @@ frappe.ui.form.on("Item", {
cur_frm.add_fetch('item_group', 'default_income_account', 'income_account');
},
});
frappe.ui.form.on("UOM Conversion Detail", {
uom: function(frm, cdt, cdn) {
var row = locals[cdt][cdn];
if (row.uom) {
frappe.call({
method:"erpnext.stock.doctype.item.item.get_uom_conv_factor",
args: {
"uom": row.uom,
"stock_uom": frm.doc.stock_uom
},
callback: function(r) {
if (!r.exc && r.message) {
frappe.model.set_value(cdt, cdn, "conversion_factor", r.message);
}
}
});
}
}
})

View File

@ -119,6 +119,7 @@ class Item(WebsiteGenerator):
self.make_thumbnail()
self.validate_fixed_asset()
self.validate_retain_sample()
self.validate_uom_conversion_factor()
if not self.get("__islocal"):
self.old_item_group = frappe.db.get_value(self.doctype, self.name, "item_group")
@ -704,6 +705,13 @@ class Item(WebsiteGenerator):
frappe.throw(_("Default Unit of Measure for Variant '{0}' must be same as in Template '{1}'")
.format(self.stock_uom, template_uom))
def validate_uom_conversion_factor(self):
if self.uoms:
for d in self.uoms:
value = get_uom_conv_factor(d.uom, self.stock_uom)
if value:
d.conversion_factor = value
def validate_attributes(self):
if (self.has_variants or self.variant_of) and self.variant_based_on == 'Item Attribute':
attributes = []
@ -902,3 +910,26 @@ def get_item_defaults(item, company):
else:
return frappe.db.get_value("Item", item, ["name", "item_name", "description", "stock_uom",
"is_stock_item", "item_code", "item_group"], as_dict=1)
@frappe.whitelist()
def get_uom_conv_factor(uom, stock_uom):
uoms = [uom, stock_uom]
value = ""
uom_details = frappe.db.sql("""select to_uom, from_uom, value from `tabUOM Conversion Factor`\
where to_uom in ({0})
""".format(', '.join(['"' + frappe.db.escape(i, percent=False) + '"' for i in uoms])), as_dict=True)
for d in uom_details:
if d.from_uom == stock_uom and d.to_uom == uom:
value = d.value
elif d.from_uom == uom and d.to_uom == stock_uom:
value = 1/flt(d.value)
else:
uom_stock = frappe.db.get_value("UOM Conversion Factor", {"to_uom": stock_uom}, ["from_uom", "value"], as_dict=1)
uom_row = frappe.db.get_value("UOM Conversion Factor", {"to_uom": uom}, ["from_uom", "value"], as_dict=1)
if uom_stock and uom_row:
if uom_stock.from_uom == uom_row.from_uom:
value = flt(uom_stock.value) * 1/flt(uom_row.value)
return value

View File

@ -9,7 +9,7 @@ from frappe.test_runner import make_test_objects
from erpnext.controllers.item_variant import (create_variant, ItemVariantExistsError,
InvalidItemAttributeValueError, get_variant)
from erpnext.stock.doctype.item.item import StockExistsForTemplate
from erpnext.stock.doctype.item.item import get_uom_conv_factor
from frappe.model.rename_doc import rename_doc
from erpnext.stock.doctype.stock_entry.stock_entry_utils import make_stock_entry
from erpnext.stock.get_item_details import get_item_details
@ -34,7 +34,6 @@ def make_item(item_code, properties=None):
if properties:
item.update(properties)
if item.is_stock_item:
for item_default in [doc for doc in item.get("item_defaults") if not doc.default_warehouse]:
item_default.default_warehouse = "_Test Warehouse - _TC"
@ -241,6 +240,24 @@ class TestItem(unittest.TestCase):
self.assertTrue(frappe.db.get_value("Bin",
{"item_code": "Test Item for Merging 2", "warehouse": "_Test Warehouse 1 - _TC"}))
def test_uom_conversion_factor(self):
if frappe.db.exists('Item', 'Test Item UOM'):
frappe.delete_doc('Item', 'Test Item UOM')
item_doc = make_item("Test Item UOM", {
"stock_uom": "Gram",
"uoms": [dict(uom='Carat'), dict(uom='Kg')]
})
for d in item_doc.uoms:
value = get_uom_conv_factor(d.uom, item_doc.stock_uom)
d.conversion_factor = value
self.assertEqual(item_doc.uoms[0].uom, "Carat")
self.assertEqual(item_doc.uoms[0].conversion_factor, 5)
self.assertEqual(item_doc.uoms[1].uom, "Kg")
self.assertEqual(item_doc.uoms[1].conversion_factor, 0.001)
def test_item_variant_by_manufacturer(self):
fields = [{'field_name': 'description'}, {'field_name': 'variant_based_on'}]
set_item_variant_settings(fields)
@ -315,3 +332,4 @@ def create_item(item_code, is_stock_item=None, valuation_rate=0, warehouse=None)
"company": "_Test Company"
})
item.save()

View File

@ -0,0 +1,23 @@
/* eslint-disable */
// rename this file from _test_[name] to test_[name] to activate
// and remove above this line
QUnit.test("test: UOM Category", function (assert) {
let done = assert.async();
// number of asserts
assert.expect(1);
frappe.run_serially([
// insert a new UOM Category
() => frappe.tests.make('UOM Category', [
// values to be set
{key: 'value'}
]),
() => {
assert.equal(cur_frm.doc.key, 'value');
},
() => done()
]);
});

View File

@ -0,0 +1,9 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors
# See license.txt
from __future__ import unicode_literals
import unittest
class TestUOMCategory(unittest.TestCase):
pass

View File

@ -0,0 +1,8 @@
// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors
// For license information, please see license.txt
frappe.ui.form.on('UOM Category', {
refresh: function() {
}
});

View File

@ -0,0 +1,93 @@
{
"allow_copy": 0,
"allow_guest_to_view": 0,
"allow_import": 0,
"allow_rename": 1,
"autoname": "field:category_name",
"beta": 0,
"creation": "2018-04-30 17:27:14.742005",
"custom": 0,
"docstatus": 0,
"doctype": "DocType",
"document_type": "",
"editable_grid": 1,
"engine": "InnoDB",
"fields": [
{
"allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "category_name",
"fieldtype": "Data",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 1,
"in_standard_filter": 0,
"label": "Category Name",
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
}
],
"has_web_view": 0,
"hide_heading": 0,
"hide_toolbar": 0,
"idx": 0,
"image_view": 0,
"in_create": 0,
"is_submittable": 0,
"issingle": 0,
"istable": 0,
"max_attachments": 0,
"modified": "2018-04-30 17:33:25.638223",
"modified_by": "Administrator",
"module": "Stock",
"name": "UOM Category",
"name_case": "",
"owner": "Administrator",
"permissions": [
{
"amend": 0,
"cancel": 0,
"create": 1,
"delete": 1,
"email": 1,
"export": 1,
"if_owner": 0,
"import": 0,
"permlevel": 0,
"print": 1,
"read": 1,
"report": 1,
"role": "System Manager",
"set_user_permissions": 0,
"share": 1,
"submit": 0,
"write": 1
}
],
"quick_entry": 1,
"read_only": 0,
"read_only_onload": 0,
"show_name_in_global_search": 0,
"sort_field": "modified",
"sort_order": "DESC",
"track_changes": 1,
"track_seen": 0
}

View File

@ -0,0 +1,9 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors
# For license information, please see license.txt
from __future__ import unicode_literals
from frappe.model.document import Document
class UOMCategory(Document):
pass