def get_materials_from_other_locations(item, warehouses, new_mr_items, company): from erpnext.stock.doctype.pick_list.pick_list import get_available_item_locations locations = get_available_item_locations(item.get("item_code"), warehouses, item.get("quantity"), company, ignore_validation=True) if not locations: new_mr_items.append(item) return required_qty = item.get("quantity") for d in locations: if required_qty <= 0: return new_dict = copy.deepcopy(item) quantity = required_qty if d.get("qty") > required_qty else d.get( "qty") if required_qty > 0: new_dict.update({ "quantity": quantity, "material_request_type": "Material Transfer", "from_warehouse": d.get("warehouse") }) required_qty -= quantity new_mr_items.append(new_dict) if required_qty: item["quantity"] = required_qty new_mr_items.append(item)
def get_materials_from_other_locations(item, warehouses, new_mr_items, company): from erpnext.stock.doctype.pick_list.pick_list import get_available_item_locations locations = get_available_item_locations(item.get("item_code"), warehouses, item.get("quantity"), company, ignore_validation=True) required_qty = item.get("quantity") # get available material by transferring to production warehouse for d in locations: if required_qty <= 0: return new_dict = copy.deepcopy(item) quantity = required_qty if d.get("qty") > required_qty else d.get( "qty") new_dict.update({ "quantity": quantity, "material_request_type": "Material Transfer", "uom": new_dict.get( "stock_uom"), # internal transfer should be in stock UOM "from_warehouse": d.get("warehouse"), }) required_qty -= quantity new_mr_items.append(new_dict) # raise purchase request for remaining qty if required_qty: stock_uom, purchase_uom = frappe.db.get_value( "Item", item["item_code"], ["stock_uom", "purchase_uom"]) if purchase_uom != stock_uom and purchase_uom == item["uom"]: conversion_factor = get_uom_conversion_factor( item["item_code"], item["uom"]) if not (conversion_factor or frappe.flags.show_qty_in_stock_uom): frappe.throw( _("UOM Conversion factor ({0} -> {1}) not found for item: {2}" ).format(purchase_uom, stock_uom, item["item_code"])) required_qty = required_qty / conversion_factor if frappe.db.get_value("UOM", purchase_uom, "must_be_whole_number"): required_qty = ceil(required_qty) item["quantity"] = required_qty new_mr_items.append(item)
def set_item_locations(self, save=False): items = self.aggregate_item_qty() self.item_location_map = frappe._dict() from_warehouses = None if self.parent_warehouse: from_warehouses = frappe.db.get_descendants( 'Warehouse', self.parent_warehouse) # reset self.delete_key('locations') for item_doc in items: item_code = item_doc.item_code self.item_location_map.setdefault( item_code, get_available_item_locations( item_code, from_warehouses, self.item_count_map.get(item_code), self.company)) locations = get_items_with_location_and_quantity( item_doc, self.item_location_map) item_doc.idx = None item_doc.name = None for row in locations: row.update({'picked_qty': row.stock_qty}) if item_doc.batch_no: row.update({'batch_no': item_doc.batch_no}) location = item_doc.as_dict() location.update(row) self.append('locations', location) if save: self.save()