예제 #1
0
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)
예제 #2
0
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)
예제 #3
0
    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()