def get_bom_item_rate(args, bom_doc): if bom_doc.rm_cost_as_per == 'Valuation Rate': rate = get_valuation_rate(args) * (args.get("conversion_factor") or 1) elif bom_doc.rm_cost_as_per == 'Last Purchase Rate': rate = ( flt(args.get('last_purchase_rate')) \ or frappe.db.get_value("Item", args['item_code'], "last_purchase_rate")) \ * (args.get("conversion_factor") or 1) elif bom_doc.rm_cost_as_per == "Price List": if not bom_doc.buying_price_list: frappe.throw(_("Please select Price List")) bom_args = frappe._dict({ "doctype": "BOM", "price_list": bom_doc.buying_price_list, "qty": args.get("qty") or 1, "uom": args.get("uom") or args.get("stock_uom"), "stock_uom": args.get("stock_uom"), "transaction_type": "buying", "company": bom_doc.company, "currency": bom_doc.currency, "conversion_rate": 1, # Passed conversion rate as 1 purposefully, as conversion rate is applied at the end of the function "conversion_factor": args.get("conversion_factor") or 1, "plc_conversion_rate": 1, "ignore_party": True }) item_doc = frappe.get_cached_doc("Item", args.get("item_code")) out = frappe._dict() get_price_list_rate(bom_args, item_doc, out) rate = out.price_list_rate return rate
def get_stock_and_rate(self): from erpnext.stock.dashboard.item_dashboard import get_data from erpnext.stock.get_item_details import get_price_list_rate stock_data = get_data(self.itemid) data = [] total_stock = 0 for d in stock_data: total_stock += d.actual_qty data.append({ 'warehouse': d.warehouse, 'actual_qty': d.actual_qty, 'uom': self.stock_uom }) args = frappe._dict({ "doctype": self.doctype, "price_list": frappe.db.get_single_value("NGSE BOM Setting", "buying_price_list"), "qty": 1, "uom": self.uom or "Nos", "stock_uom": self.stock_uom, "transaction_type": "buying", "company": frappe.defaults.get_defaults("Company")["company"], "currency": frappe.defaults.get_defaults("Company")["currency"], "conversion_rate": 1, # Passed conversion rate as 1 purposefully, as conversion rate is applied at the end of the function "conversion_factor": 1, "plc_conversion_rate": 1, "ignore_party": True }) item_doc = frappe.get_doc("Item", self.itemid) out = frappe._dict() get_price_list_rate(args, item_doc, out) rate = out.price_list_rate data.append({ 'warehouse': "Total Stock", 'actual_qty': total_stock, 'uom': self.stock_uom }) data.append({ 'warehouse': "Rate", 'actual_qty': rate, 'uom': frappe.defaults.get_defaults("Company")["currency"] }) return data, total_stock, rate
def get_rm_rate(self, arg): """ Get raw material rate as per selected method, if bom exists takes bom cost """ rate = 0 if not self.rm_cost_as_per: self.rm_cost_as_per = "Valuation Rate" if arg.get('scrap_items'): rate = self.get_valuation_rate(arg) elif arg: #Customer Provided parts will have zero rate if not frappe.db.get_value('Item', arg["item_code"], 'is_customer_provided_item'): if arg.get('bom_no') and self.set_rate_of_sub_assembly_item_based_on_bom: rate = flt(self.get_bom_unitcost(arg['bom_no'])) * (arg.get("conversion_factor") or 1) else: if self.rm_cost_as_per == 'Valuation Rate': rate = self.get_valuation_rate(arg) * (arg.get("conversion_factor") or 1) elif self.rm_cost_as_per == 'Last Purchase Rate': rate = (arg.get('last_purchase_rate') \ or frappe.db.get_value("Item", arg['item_code'], "last_purchase_rate")) \ * (arg.get("conversion_factor") or 1) elif self.rm_cost_as_per == "Price List": if not self.buying_price_list: frappe.throw(_("Please select Price List")) args = frappe._dict({ "doctype": "BOM", "price_list": self.buying_price_list, "qty": arg.get("qty") or 1, "uom": arg.get("uom") or arg.get("stock_uom"), "stock_uom": arg.get("stock_uom"), "transaction_type": "buying", "company": self.company, "currency": self.currency, "conversion_rate": 1, # Passed conversion rate as 1 purposefully, as conversion rate is applied at the end of the function "conversion_factor": arg.get("conversion_factor") or 1, "plc_conversion_rate": 1, "ignore_party": True }) item_doc = frappe.get_doc("Item", arg.get("item_code")) out = frappe._dict() get_price_list_rate(args, item_doc, out) rate = out.price_list_rate if not rate: if self.rm_cost_as_per == "Price List": frappe.msgprint(_("Price not found for item {0} in price list {1}") .format(arg["item_code"], self.buying_price_list), alert=True) else: frappe.msgprint(_("{0} not found for item {1}") .format(self.rm_cost_as_per, arg["item_code"]), alert=True) return flt(rate) / (self.conversion_rate or 1)
def get_rm_rate(self, arg): """ Get raw material rate as per selected method, if bom exists takes bom cost """ rate = 0 if not self.rm_cost_as_per: self.rm_cost_as_per = "Valuation Rate" if arg.get('scrap_items'): rate = self.get_valuation_rate(arg) elif arg: if arg.get('bom_no') and self.set_rate_of_sub_assembly_item_based_on_bom: rate = self.get_bom_unitcost(arg['bom_no']) else: if self.rm_cost_as_per == 'Valuation Rate': rate = self.get_valuation_rate(arg) elif self.rm_cost_as_per == 'Last Purchase Rate': rate = arg.get('last_purchase_rate') \ or frappe.db.get_value("Item", arg['item_code'], "last_purchase_rate") elif self.rm_cost_as_per == "Price List": if not self.buying_price_list: frappe.throw(_("Please select Price List")) args = frappe._dict({ "doctype": "BOM", "price_list": self.buying_price_list, "qty": arg.get("qty") or 1, "uom": arg.get("uom") or arg.get("stock_uom"), "stock_uom": arg.get("stock_uom"), "transaction_type": "buying", "company": self.company, "currency": self.currency, "conversion_rate": self.conversion_rate or 1, "conversion_factor": arg.get("conversion_factor") or 1, "plc_conversion_rate": 1, "ignore_party": True }) item_doc = frappe.get_doc("Item", arg.get("item_code")) out = frappe._dict() get_price_list_rate(args, item_doc, out) rate = out.price_list_rate if not rate: if self.rm_cost_as_per == "Price List": frappe.msgprint(_("Price not found for item {0} and price list {1}") .format(arg["item_code"], self.buying_price_list), alert=True) else: frappe.msgprint(_("{0} not found for item {1}") .format(self.rm_cost_as_per, arg["item_code"]), alert=True) return flt(rate)
def update_packed_item_price_data(pi_row, item_data, doc): "Set price as per price list or from the Item master." if pi_row.rate: return item_doc = frappe.get_cached_doc("Item", pi_row.item_code) row_data = pi_row.as_dict().copy() row_data.update( { "company": doc.get("company"), "price_list": doc.get("selling_price_list"), "currency": doc.get("currency"), "conversion_rate": doc.get("conversion_rate"), } ) rate = get_price_list_rate(row_data, item_doc).get("price_list_rate") pi_row.rate = rate or item_data.get("valuation_rate") or 0.0