more bis fixes

This commit is contained in:
Sahil Khan
2018-12-21 17:56:28 +05:30
committed by Nabin Hait
parent 34766c0c50
commit 693e81db48

View File

@@ -436,8 +436,7 @@ def get_subitems(doc, data, bom_wise_item_details, bom_no, company, include_non_
return bom_wise_item_details return bom_wise_item_details
def add_item_in_material_request_items(doc, planned_qty, ignore_existing_ordered_qty, item, row, data, warehouse, company): def add_item_in_material_request_items(doc, planned_qty, ignore_existing_ordered_qty, item, row, data, warehouse, company):
print("add item in material request") total_qty = row['qty'] * planned_qty
total_qty = row.qty * planned_qty
projected_qty, actual_qty = get_bin_details(row) projected_qty, actual_qty = get_bin_details(row)
requested_qty = 0 requested_qty = 0
@@ -445,29 +444,27 @@ def add_item_in_material_request_items(doc, planned_qty, ignore_existing_ordered
requested_qty = total_qty requested_qty = total_qty
elif total_qty > projected_qty: elif total_qty > projected_qty:
requested_qty = total_qty - projected_qty requested_qty = total_qty - projected_qty
if requested_qty > 0 and requested_qty < row.min_order_qty: if requested_qty > 0 and requested_qty < row['min_order_qty']:
requested_qty = row.min_order_qty requested_qty = row['min_order_qty']
item_group_defaults = get_item_group_defaults(item, company) item_group_defaults = get_item_group_defaults(item, company)
if not row.purchase_uom: if not row['purchase_uom']:
row.purchase_uom = row.stock_uom row['purchase_uom'] = row['stock_uom']
if row.purchase_uom != row.stock_uom: if row['purchase_uom'] != row['stock_uom']:
if not row.conversion_factor: if not row['conversion_factor']:
frappe.throw(_("UOM Conversion factor ({0} -> {1}) not found for item: {2}").format(row.purchase_uom, row.stock_uom, item)) frappe.throw(_("UOM Conversion factor ({0} -> {1}) not found for item: {2}").format(row['purchase_uom'], row['stock_uom'], item))
requested_qty = requested_qty / row['conversion_factor']
requested_qty = requested_qty / row.conversion_factor if frappe.db.get_value("UOM", row['purchase_uom'], "must_be_whole_number"):
if frappe.db.get_value("UOM", row.purchase_uom, "must_be_whole_number"):
requested_qty = ceil(requested_qty) requested_qty = ceil(requested_qty)
print(row)
if requested_qty > 0: if requested_qty > 0:
doc.setdefault('mr_items', []).append({ doc.setdefault('mr_items', []).append({
'item_code': item, 'item_code': item,
'item_name': row.item_name, 'item_name': row['item_name'],
'quantity': requested_qty, 'quantity': requested_qty,
'warehouse': warehouse or row.source_warehouse or row.default_warehouse or item_group_defaults.get("default_warehouse"), 'warehouse': warehouse or row.get('source_warehouse') or row.get('default_warehouse') or item_group_defaults.get("default_warehouse"),
'actual_qty': actual_qty, 'actual_qty': actual_qty,
'min_order_qty': row.min_order_qty, 'min_order_qty': row['min_order_qty'],
'sales_order': data.get('sales_order') 'sales_order': data.get('sales_order')
}) })
@@ -515,7 +512,7 @@ def get_bin_details(row):
row = frappe._dict(json.loads(row)) row = frappe._dict(json.loads(row))
conditions = "" conditions = ""
warehouse = row.source_warehouse or row.default_warehouse or row.warehouse warehouse = row.get('source_warehouse') or row.get('default_warehouse')
if warehouse: if warehouse:
lft, rgt = frappe.db.get_value("Warehouse", warehouse, ["lft", "rgt"]) lft, rgt = frappe.db.get_value("Warehouse", warehouse, ["lft", "rgt"])
conditions = " and exists(select name from `tabWarehouse` where lft >= {0} and rgt <= {1} and name=`tabBin`.warehouse)".format(lft, rgt) conditions = " and exists(select name from `tabWarehouse` where lft >= {0} and rgt <= {1} and name=`tabBin`.warehouse)".format(lft, rgt)
@@ -523,13 +520,12 @@ def get_bin_details(row):
item_projected_qty = frappe.db.sql(""" select ifnull(sum(projected_qty),0) as projected_qty, item_projected_qty = frappe.db.sql(""" select ifnull(sum(projected_qty),0) as projected_qty,
ifnull(sum(actual_qty),0) as actual_qty from `tabBin` ifnull(sum(actual_qty),0) as actual_qty from `tabBin`
where item_code = %(item_code)s {conditions} where item_code = %(item_code)s {conditions}
""".format(conditions=conditions), { "item_code": row.item_code }, as_list=1) """.format(conditions=conditions), { "item_code": row['item_code'] }, as_list=1)
return item_projected_qty and item_projected_qty[0] or (0,0) return item_projected_qty and item_projected_qty[0] or (0,0)
@frappe.whitelist() @frappe.whitelist()
def get_items_for_material_requests(doc, company=None): def get_items_for_material_requests(doc, company=None):
print("get items for material request")
if isinstance(doc, string_types): if isinstance(doc, string_types):
doc = frappe._dict(json.loads(doc)) doc = frappe._dict(json.loads(doc))
@@ -540,7 +536,6 @@ def get_items_for_material_requests(doc, company=None):
warehouse = None warehouse = None
bom_wise_item_details = {} bom_wise_item_details = {}
if data.get("bom"): if data.get("bom"):
print(doc),print("-------------------------------------------------")
if data.get('required_qty'): if data.get('required_qty'):
planned_qty = data.get('required_qty') planned_qty = data.get('required_qty')
bom_no = data.get('bom') bom_no = data.get('bom')
@@ -565,43 +560,39 @@ def get_items_for_material_requests(doc, company=None):
# fetch exploded items from BOM # fetch exploded items from BOM
bom_wise_item_details = get_exploded_items(bom_wise_item_details, company, bom_no, include_non_stock_items) bom_wise_item_details = get_exploded_items(bom_wise_item_details, company, bom_no, include_non_stock_items)
else: else:
bom_wise_item_details = get_subitems(doc, data, bom_wise_item_details, bom_no, company, include_non_stock_items, include_subcontracted_items, 1) bom_wise_item_details = get_subitems(doc, data, bom_wise_item_details, bom_no, company,
include_non_stock_items, include_subcontracted_items, 1)
for item, item_details in bom_wise_item_details.items(): for item, item_details in bom_wise_item_details.items():
print(item),print(item_details)
if item_details.qty > 0: if item_details.qty > 0:
add_item_in_material_request_items(doc, planned_qty, ignore_existing_ordered_qty, item, item_details, data, warehouse, company) add_item_in_material_request_items(doc, planned_qty, ignore_existing_ordered_qty,
item, item_details, data, warehouse, company)
else: else:
sales_order_item = frappe.get_doc('Sales OrderItem', data.sales_order_item).as_dict() item_master = frappe.get_doc('Item', data['item_code']).as_dict()
planned_qty = data.get('required_qty') planned_qty = data.get('required_qty')
ignore_existing_ordered_qty = data.get('ignore_existing_ordered_qty')
item = doc.item_code purchase_uom = item_master.purchase_uom or item_master.stock_uom
purchase_uom = sales_order_item.uom conversion_factor = 0
stock_uom = sales_order_item.stock_uom for d in item_master.get("uoms"):
conversion_factor = sales_order_item.conversion_factor if d.uom == purchase_uom:
qty = doc.required_qty conversion_factor = d.conversion_factor
if not purchase_uom == stock_uom:
qty = qty / conversion_factor item_details = frappe._dict({
if frappe.db.get_value("UOM", purchase_uom, "must_be_whole_number"): 'item_name' : item_master.item_name,
qty = ceil(qty) 'default_bom' : doc.bom,
item_details = { 'purchase_uom' : purchase_uom,
'item_name' = sales_order_item.item_name, 'default_warehouse': item_master.default_warehouse,
'default_bom' = doc.bom, 'min_order_qty' : item_master.min_order_qty,
'purchase_uom' = purchase_uom, 'default_material_request_type' : item_master.default_material_request_type,
'default_warehouse' = doc.warehouse, 'qty': 1,
'min_order_qty' = 'is_sub_contracted' : item_master.is_subcontracted_item,
'default_material_request_type' = 'item_code' : item_master.name,
'qty' = qty, 'description' : item_master.description,
'is_sub_contracted' = , 'stock_uom' : item_master.stock_uom,
'item_code' = doc.item_code, 'conversion_factor' : conversion_factor,
'description' = sales_order_item.description, })
'stock_uom' = stock_uom,
'conversion_factor' = conversion_factor, if item_details['qty'] > 0:
'source_warehouse' = , add_item_in_material_request_items(doc, planned_qty, data.get('ignore_existing_ordered_qty'), item_master.name,
} item_details, data, data.get('for_warehouse'), company)
warehouse = doc.warehouse
company =
if item_details.qty > 0:
add_item_in_material_request_items(doc, planned_qty, ignore_existing_ordered_qty, item, item_details, data, warehouse, company)
print(doc),print("-------------------------------------------------")
return doc['mr_items'] return doc['mr_items']