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", "uom_conversion_graph": [ dict(from_qty=1, from_uom='Carat', to_uom='Gram', to_qty=get_uom_conv_factor('Carat', 'Gram')), dict(from_qty=1, from_uom='Kg', to_uom='Gram', to_qty=get_uom_conv_factor('Kg', 'Gram')) ] }) carat = filter(lambda d: d.uom == "Carat", item_doc.uoms) self.assertEqual(len(carat), 1) self.assertEqual(carat[0].conversion_factor, 0.2) kg = filter(lambda d: d.uom == "Kg", item_doc.uoms) self.assertEqual(len(kg), 1) self.assertEqual(kg[0].conversion_factor, 1000)
def convert_to_ounces(uom, qty): conversion_factor = get_uom_conv_factor(uom, 'Ounce') if not conversion_factor: frappe.throw(_("Please set Conversion Factor for {0} to Ounce").format(uom)) qty_in_ounce = qty * conversion_factor return qty_in_ounce
def get_conversion_factor(item_code, uom): variant_of = frappe.db.get_value("Item", item_code, "variant_of", cache=True) filters = {"parent": item_code, "uom": uom} if variant_of: filters["parent"] = ("in", (item_code, variant_of)) conversion_factor = frappe.db.get_value("UOM Conversion Detail", filters, "conversion_factor") if not conversion_factor: stock_uom = frappe.db.get_value("Item", item_code, "stock_uom") conversion_factor = get_uom_conv_factor(uom, stock_uom) return {"conversion_factor": conversion_factor or 1.0}
def get_conversion_factor(item_code, uom): variant_of = frappe.db.get_value("Item", item_code, "variant_of", cache=True) filters = {"parent": item_code, "uom": uom} if variant_of: filters["parent"] = ("in", (item_code, variant_of)) conversion_factor = frappe.db.get_value("UOM Conversion Detail", filters, "conversion_factor") if not conversion_factor: stock_uom = frappe.db.get_value("Item", item_code, "stock_uom") conversion_factor = get_uom_conv_factor(uom, stock_uom) return {"conversion_factor": conversion_factor or 1.0}
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, 0.2) self.assertEqual(item_doc.uoms[1].uom, "Kg") self.assertEqual(item_doc.uoms[1].conversion_factor, 1000)
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, 0.2) self.assertEqual(item_doc.uoms[1].uom, "Kg") self.assertEqual(item_doc.uoms[1].conversion_factor, 1000)
def get_conversion_factor(item_code, uom): variant_of = frappe.db.get_value("Item", item_code, "variant_of", cache=True) stock_uom = frappe.db.get_value("Item", item_code, "stock_uom") filters = {"parent": item_code, "uom": uom} if variant_of: filters["parent"] = ("in", (item_code, variant_of)) conversion_factor = frappe.db.get_value("UOM Conversion Detail", filters, "conversion_factor") if not conversion_factor: if uom == "Sheet" and stock_uom == "Nos": conversion_factor = 1.0 elif uom == "Nos" and stock_uom == "Sheet": conversion_factor = 1.0 conversion_factor = get_uom_conv_factor(uom, stock_uom) # conversion_factor = convert_SI(1,stock_uom,uom) # if conversion_factor: # return {"conversion_factor": conversion_factor} # else: # filters["uom"] = ("in",get_SI_units().keys()) # conversion_factor,test_uom = frappe.db.get_value("UOM Conversion Detail", filters, ["conversion_factor","uom"]) # if conversion_factor: # SI_Conversion = convert_SI(conversion_factor,uom,test_uom) # if SI_Conversion: # return {"conversion_factor": SI_Conversion} # else: # return {"conversion_factor": None} # else: # return {"conversion_factor": None} return {"conversion_factor": conversion_factor or 1.0}
def make_material_request(self): '''Create Material Requests grouped by Sales Order and Material Request Type''' material_request_list = [] material_request_map = {} for item in self.mr_items: item_doc = frappe.get_cached_doc('Item', item.item_code) material_request_type = item.material_request_type or item_doc.default_material_request_type # key for Sales Order:Material Request Type:Customer key = '{}:{}:{}'.format(item.sales_order, material_request_type, item_doc.customer or '') schedule_date = add_days(nowdate(), cint(item_doc.lead_time_days)) # make a new MR material_request_map[key] = frappe.new_doc("Material Request") material_request_doc = material_request_map[key] material_request_doc.update({ "transaction_date" : nowdate(), "status": "Draft", "company": self.company, "requested_by": frappe.session.user, "material_request_type": material_request_type, "customer": item_doc.customer or '' }) if item_doc.min_order_qty and item.quantity < item_doc.min_order_qty: frappe.msgprint(_("Order Quantity is set to <b>{0}</b> as Minimum Order Qty for Item <b>{1}</b> is <b>{2}</b>").format(item_doc.min_order_qty, item_doc.item_code, item_doc.min_order_qty)) item.quantity = item_doc.min_order_qty conversion_factor = get_uom_conv_factor(item_doc.purchase_uom, item_doc.stock_uom) if conversion_factor: item.quantity = item.quantity * conversion_factor # add item material_request_doc.append("items", { "item_code": item.item_code, "qty": item.quantity, "schedule_date": schedule_date, "warehouse": item.warehouse, "sales_order": item.sales_order, 'production_plan': self.name, 'material_request_plan_item': item.name, 'production_plan_item': item.name, "project": frappe.db.get_value("Sales Order", item.sales_order, "project") \ if item.sales_order else None }) material_request_doc.run_method("set_missing_values") material_request_doc.flags.ignore_permissions = 1 material_request_list.append(material_request_doc) material_request_doc.save() frappe.flags.mute_messages = False if material_request_list: material_request_list = ["""<a href="#Form/Material Request/{0}">{1}</a>""".format(m.name, m.name) \ for m in material_request_list] msgprint(_("{0} created").format(comma_and(material_request_list))) self.db_set("status", "Material Requested") else : msgprint(_("No material request created"))
def validate(self): base_uom = frappe.get_doc("Senstech Messgroesse", self.measurand).base_uom if self.uom != base_uom: if get_uom_conv_factor(self.uom, base_uom) == '': frappe.throw(_("Unit of measure cannot be converted to measurand's base unit")+" ({from_uom} => {to_uom})".format(from_uom=self.uom, to_uom=base_uom))
def test_uom_conv_base_case(self): factor = get_uom_conv_factor("m", "m") self.assertEqual(factor, 1.0)
def test_uom_conv_intermediate(self): factor = get_uom_conv_factor("Pound", "Gram") self.assertAlmostEqual(factor, 453.592, 3)