def validate_items_stock_level(doc,method): settings = frappe.get_single("Extraesia Settings") if not settings.sales_order_items_validation: return for item in doc.items: item_data = get_data(item.item_code) for data in item_data: if data["warehouse"] == item.warehouse: if data["projected_qty"] < item.qty: frappe.throw(_("Available for item {0} in warehouse {1} quantity {2} available for sale".format(item.item_code,item.warehouse,data["projected_qty"])))
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 on_submit(doc, method): """Handle sample item""" if frappe.flags.in_import or frappe.flags.in_test: return if not doc.is_sample: return valid_groups = [ _('Flower Lot'), _('CO2 Hash Oil'), _('Food Grade Solvent Extract'), _('Hydrocarbon Wax'), _('Marijuana Extract for Inhalation'), _('Solid Marijuana Infused Edible'), _('Usable Marijuana') ] item_group = frappe.get_value("Item", doc.item_code, "item_group") if not _(item_group) in valid_groups: frappe.throw( _("Item is not eligible for making sample."), title="Invalid Item") # Stock update had been handled by delivery_note if doc.inspection_type == "Outgoing" and doc.delivery_note_no: return inventories = get_data(item_code=doc.item_code) source_warehouse = None actual_qty = 0 for inventory in inventories: if inventory.actual_qty > actual_qty: actual_qty = inventory.actual_qty if inventory.actual_qty >= doc.sample_size: source_warehouse = inventory.warehouse break if not source_warehouse: frappe.throw( _("Qty is not available for provided sample size. Qty remaining <strong>{0}</strong>.").format(actual_qty), title="Insufficient Stock") make_stock_entry(item_code=doc.item_code, source=source_warehouse, qty=doc.sample_size)
def execute_board_detail(filters=None): columns = get_detailed_corrugation_columns() items = get_data(None, None, "Board Layer") data = [] for item in items: if item.actual_qty == 0: continue orders = frappe.db.sql("""select mfg_date, name, stock_batch_qty from `tabCM Corrugation Order` where board_name='{0}' and stock_batch_qty > 0 and docstatus != 2""".format(item.item_code), as_dict=1) for order in orders: if (order.stock_batch_qty == 0): continue lt = list() lt.append(order.mfg_date) lt.append (item.item_code) lt.append (order.stock_batch_qty) lt.append(order.name) data.append (lt) print("Returning data") return columns, data
def execute(filters=None): item_groups = [filters.get("group_name")] if ("Board Detail" in item_groups): return execute_board_detail(filters) if (filters.get("group_name") == "Others"): item_groups = ["Gum", "Ink"] columns, data, items = [], [], [] for item_group in item_groups: items += get_data(None, None, item_group) if (filters.get("group_name") == "Products"): columns = get_detailed_production_columns() else: columns = get_columns () for item in items: if item.actual_qty == 0: continue lt = list() lt.append (item.item_code) lt.append (item.actual_qty) lt.append (item.warehouse) notes = "" if (item_group == "Paper"): rolls = frappe.db.sql("""select number, weight from `tabCM Paper Roll` where paper='{0}'""".format(item.item_code), as_dict=1) notes = ", ".join(roll.number + "(" + str(int(roll.weight)) + ")" for roll in rolls if roll.weight > 10) elif (item_group == "Board Layer"): orders = frappe.db.sql("""select name, stock_batch_qty from `tabCM Corrugation Order` where board_name='{0}' and stock_batch_qty > 0 and docstatus != 2""".format(item.item_code), as_dict=1) notes = ", ".join(order.name + "(" + str(order.stock_batch_qty) + ")" for order in orders) elif (item_group == "Products"): orders = frappe.db.sql("""select name from `tabCM Corrugation Order` where box ='{0}' and stock_qty > 0 """.format(item.item_code), as_dict=1) production_order = ", ".join(order.name for order in orders) lt.append(production_order) if (item_group <> "Products"): lt.append(notes) data.append (lt) return columns, data
def test_item_dashboard(self): from erpnext.stock.dashboard.item_dashboard import get_data self.assertTrue(get_data(item_code="_Test Item")) self.assertTrue(get_data(warehouse="_Test Warehouse - _TC")) self.assertTrue(get_data(item_group="All Item Groups"))
def get_item_available_qty(item): item_available_qty = 0 item_data = get_data(item) for data in item_data: item_available_qty += data["projected_qty"] return item_available_qty