示例#1
0
def get_item_warehouse(item, args, overwrite_warehouse, defaults=None):
	if not defaults:
		defaults = frappe._dict({
			'item_defaults' : get_item_defaults(item.name, args.company),
			'item_group_defaults' : get_item_group_defaults(item.name, args.company),
			'brand_defaults' : get_brand_defaults(item.name, args.company)
		})

	if overwrite_warehouse or not args.warehouse:
		warehouse = (
			args.get("set_warehouse") or
			defaults.item_defaults.get("default_warehouse") or
			defaults.item_group_defaults.get("default_warehouse") or
			defaults.brand_defaults.get("default_warehouse") or
			args.get('warehouse')
		)

		if not warehouse:
			defaults = frappe.defaults.get_defaults() or {}
			warehouse_exists = frappe.db.exists("Warehouse", {
				'name': defaults.default_warehouse,
				'company': args.company
			})
			if defaults.get("default_warehouse") and warehouse_exists:
				warehouse = defaults.default_warehouse

	else:
		warehouse = args.get('warehouse')

	if not warehouse:
		default_warehouse = frappe.db.get_single_value("Stock Settings", "default_warehouse")
		if frappe.db.get_value("Warehouse", default_warehouse, "company") == args.company:
			return default_warehouse

	return warehouse
示例#2
0
文件: api.py 项目: finbyz/snehraj
        def set_missing_values(source, target):
            target.stock_entry_type = "Manufacture"
            target.purpose = "Manufacture"
            target.from_bom = 1
            target.naming_series = "STE-.fiscal.-"
            target.fg_completed_qty = source.get(
                'for_quantity', 0) - source.get('transferred_qty', 0)

            production_item, to_warehouse = frappe.db.get_value(
                "Work Order", source.work_order,
                ['production_item', 'fg_warehouse'])
            item = get_item_defaults(production_item, source.company)

            target.add_to_stock_entry_detail({
                production_item: {
                    "to_warehouse": to_warehouse,
                    "from_warehouse": "",
                    "qty": target.fg_completed_qty,
                    "item_name": item.item_name,
                    "description": item.description,
                    "stock_uom": item.stock_uom,
                    "expense_account": item.get("expense_account"),
                    "cost_center": item.get("buying_cost_center"),
                }
            })

            #target.calculate_rate_and_amount()
            target.set_missing_values()
示例#3
0
def add_variant_item(variant_items, wo_doc, bom_no, table_name="items"):
	if isinstance(variant_items, string_types):
		variant_items = json.loads(variant_items)

	for item in variant_items:
		args = frappe._dict({
			"item_code": item.get("varint_item_code"),
			"required_qty": item.get("qty"),
			"qty": item.get("qty"), # for bom
			"source_warehouse": item.get("source_warehouse"),
			"operation": item.get("operation")
		})

		bom_doc = frappe.get_cached_doc("BOM", bom_no)
		item_data = get_item_details(args.item_code, skip_bom_info=True)
		args.update(item_data)

		args["rate"] = get_bom_item_rate({
			"item_code": args.get("item_code"),
			"qty": args.get("required_qty"),
			"uom": args.get("stock_uom"),
			"stock_uom": args.get("stock_uom"),
			"conversion_factor": 1
		}, bom_doc)

		if not args.source_warehouse:
			args["source_warehouse"] = get_item_defaults(item.get("varint_item_code"),
				wo_doc.company).default_warehouse

		args["amount"] = flt(args.get("required_qty")) * flt(args.get("rate"))
		args["uom"] = item_data.stock_uom
		wo_doc.append(table_name, args)
示例#4
0
def get_item_warehouse(item, args, overwrite_warehouse, defaults={}):
    if not defaults:
        defaults = frappe._dict({
            'item_defaults':
            get_item_defaults(item.name, args.company),
            'item_group_defaults':
            get_item_group_defaults(item.name, args.company),
            'brand_defaults':
            get_brand_defaults(item.name, args.company)
        })

    if overwrite_warehouse or not args.warehouse:
        warehouse = (args.get("set_warehouse")
                     or defaults.item_defaults.get("default_warehouse")
                     or defaults.item_group_defaults.get("default_warehouse")
                     or defaults.brand_defaults.get("default_warehouse")
                     or args.get('warehouse'))

        if not warehouse:
            defaults = frappe.defaults.get_defaults() or {}
            warehouse_exists = frappe.db.exists("Warehouse", {
                'name': defaults.default_warehouse,
                'company': args.company
            })
            if defaults.get("default_warehouse") and warehouse_exists:
                warehouse = defaults.default_warehouse

    else:
        warehouse = args.get('warehouse')

    return warehouse
示例#5
0
def get_valuation_rate(item_code, company, warehouse=None):
    item = get_item_defaults(item_code, company)
    item_group = get_item_group_defaults(item_code, company)
    brand = get_brand_defaults(item_code, company)
    # item = frappe.get_doc("Item", item_code)
    if item.get("is_stock_item"):
        if not warehouse:
            warehouse = item.get("default_warehouse") or item_group.get(
                "default_warehouse") or brand.get("default_warehouse")

        return frappe.db.get_value("Bin", {
            "item_code": item_code,
            "warehouse": warehouse
        }, ["valuation_rate"],
                                   as_dict=True) or {
                                       "valuation_rate": 0
                                   }

    elif not item.get("is_stock_item"):
        valuation_rate = frappe.db.sql(
            """select sum(base_net_amount) / sum(qty*conversion_factor)
			from `tabPurchase Invoice Item`
			where item_code = %s and docstatus=1""", item_code)

        if valuation_rate:
            return {"valuation_rate": valuation_rate[0][0] or 0.0}
    else:
        return {"valuation_rate": 0.0}
def get_item_default_expense_account(item_code):
	item_defaults = get_item_defaults(item_code, frappe.db.get_single_value("Global Defaults", "default_company"))
	item_group_defaults = get_item_group_defaults(item_code, frappe.db.get_single_value("Global Defaults", "default_company"))
	expense_account = get_asset_category_account(fieldname = "fixed_asset_account", item = item_code, company= frappe.db.get_single_value("Global Defaults", "default_company"))
	if not expense_account:
		expense_account = item_defaults.get("expense_account") or item_group_defaults.get("expense_account") or get_brand_defaults(item_code,frappe.db.get_single_value("Global Defaults", "default_company") )
	frappe.response["expense_account"] = expense_account
	frappe.response["company"]= frappe.db.get_single_value("Global Defaults", "default_company")
示例#7
0
 def update_item(source, target, source_parent):
     target_qty = source.get("qty") - source.get("ordered_qty")
     target.qty = target_qty if not flt(target_qty) < 0 else 0
     item = get_item_defaults(target.item_code, source_parent.company)
     if item:
         target.item_name = item.get("item_name")
         target.description = item.get("description")
         target.uom = item.get("stock_uom")
	def update_item(obj, target, source_parent):
		target.amount = flt(obj.amount) - flt(obj.billed_amt)
		target.base_amount = target.amount * flt(source_parent.conversion_rate)
		target.qty = target.amount / flt(obj.rate) if (flt(obj.rate) and flt(obj.billed_amt)) else flt(obj.qty)

		item = get_item_defaults(target.item_code, source_parent.company)
		item_group = get_item_group_defaults(target.item_code, source_parent.company)
		target.cost_center = frappe.db.get_value("Project", obj.project, "cost_center") \
			or item.get("buying_cost_center") \
			or item_group.get("buying_cost_center")
示例#9
0
	def update_item(obj, target, source_parent):
		target.amount = flt(obj.amount) - flt(obj.billed_amt)
		target.base_amount = target.amount * flt(source_parent.conversion_rate)
		target.qty = target.amount / flt(obj.rate) if (flt(obj.rate) and flt(obj.billed_amt)) else flt(obj.qty)

		item = get_item_defaults(target.item_code, source_parent.company)
		item_group = get_item_group_defaults(target.item_code, source_parent.company)
		target.cost_center = frappe.db.get_value("Project", obj.project, "cost_center") \
			or item.get("buying_cost_center") \
			or item_group.get("buying_cost_center")
示例#10
0
	def postprocess(source, target_doc):
		if frappe.flags.args and frappe.flags.args.default_supplier:
			# items only for given default supplier
			supplier_items = []
			for d in target_doc.items:
				default_supplier = get_item_defaults(d.item_code, target_doc.company).get('default_supplier')
				if frappe.flags.args.default_supplier == default_supplier:
					supplier_items.append(d)
			target_doc.items = supplier_items

		set_missing_values(source, target_doc)
示例#11
0
	def postprocess(source, target_doc):
		if frappe.flags.args and frappe.flags.args.default_supplier:
			# items only for given default supplier
			supplier_items = []
			for d in target_doc.items:
				default_supplier = get_item_defaults(d.item_code, target_doc.company).get('default_supplier')
				if frappe.flags.args.default_supplier == default_supplier:
					supplier_items.append(d)
			target_doc.items = supplier_items

		set_missing_values(source, target_doc)
示例#12
0
	def update_item(source, target, source_parent):
		target.amount = flt(source.amount) - flt(source.billed_amt)
		target.base_amount = target.amount * flt(source_parent.conversion_rate)
		target.qty = target.amount / flt(source.rate) if (source.rate and source.billed_amt) else source.qty - source.returned_qty

		if source_parent.project:
			target.cost_center = frappe.db.get_value("Project", source_parent.project, "cost_center")
		if not target.cost_center and target.item_code:
			item = get_item_defaults(target.item_code, source_parent.company)
			item_group = get_item_group_defaults(target.item_code, source_parent.company)
			target.cost_center = item.get("selling_cost_center") \
				or item_group.get("selling_cost_center")
示例#13
0
	def update_item(source, target, source_parent):
		target.base_amount = (flt(source.qty) - flt(source.delivered_qty)) * flt(source.base_rate)
		target.amount = (flt(source.qty) - flt(source.delivered_qty)) * flt(source.rate)
		target.qty = flt(source.qty) - flt(source.delivered_qty)

		item = get_item_defaults(target.item_code, source_parent.company)
		item_group = get_item_group_defaults(target.item_code, source_parent.company)

		if item:
			target.cost_center = frappe.db.get_value("Project", source_parent.project, "cost_center") \
				or item.get("selling_cost_center") \
				or item_group.get("selling_cost_center")
示例#14
0
def get_item_cost_center(item_code=None, company=None, project=None, customer=None):
    cost_center = frappe.get_cached_value("Company", company, "cost_center")
    if not item_code:
        return cost_center
    item_defaults = get_item_defaults(item_code, company)
    item_group_defaults = get_item_group_defaults(item_code, company)
    args = {
        "project": project,
        "customer": customer,
        "cost_center": cost_center,
    }
    return get_default_cost_center(args, item_defaults, item_group_defaults, company)
示例#15
0
	def update_item(source, target, source_parent):
		target.amount = flt(source.amount) - flt(source.billed_amt)
		target.base_amount = target.amount * flt(source_parent.conversion_rate)
		target.qty = target.amount / flt(source.rate) if (source.rate and source.billed_amt) else source.qty - source.returned_qty

		if source_parent.project:
			target.cost_center = frappe.db.get_value("Project", source_parent.project, "cost_center")
		if not target.cost_center and target.item_code:
			item = get_item_defaults(target.item_code, source_parent.company)
			item_group = get_item_group_defaults(target.item_code, source_parent.company)
			target.cost_center = item.get("selling_cost_center") \
				or item_group.get("selling_cost_center")
示例#16
0
	def update_item(source, target, source_parent):
		target.base_amount = (flt(source.qty) - flt(source.delivered_qty)) * flt(source.base_rate)
		target.amount = (flt(source.qty) - flt(source.delivered_qty)) * flt(source.rate)
		target.qty = flt(source.qty) - flt(source.delivered_qty)

		item = get_item_defaults(target.item_code, source_parent.company)
		item_group = get_item_group_defaults(target.item_code, source_parent.company)

		if item:
			target.cost_center = frappe.db.get_value("Project", source_parent.project, "cost_center") \
				or item.get("buying_cost_center") \
				or item_group.get("buying_cost_center")
示例#17
0
def get_product_discount_rule(pricing_rule, item_details, args=None, doc=None):
    free_item = pricing_rule.free_item
    if pricing_rule.same_item and pricing_rule.get(
            "apply_on") != 'Transaction':
        free_item = item_details.item_code or args.item_code

    if not free_item:
        frappe.throw(
            _("Free item not set in the pricing rule {0}").format(
                get_link_to_form("Pricing Rule", pricing_rule.name)))

    item_details.free_item_data = {
        'item_code': free_item,
        'qty': pricing_rule.free_qty or 1,
        'rate': pricing_rule.free_item_rate or 0,
        'price_list_rate': pricing_rule.free_item_rate or 0,
        'is_free_item': 1
    }

    item_data = frappe.get_cached_value(
        'Item',
        free_item, ['item_name', 'description', 'stock_uom'],
        as_dict=1)

    item_details.free_item_data.update(item_data)
    item_details.free_item_data[
        'uom'] = pricing_rule.free_item_uom or item_data.stock_uom
    item_details.free_item_data['conversion_factor'] = get_conversion_factor(
        free_item,
        item_details.free_item_data['uom']).get("conversion_factor", 1)

    if item_details.get("parenttype") == 'Purchase Order':
        item_details.free_item_data[
            'schedule_date'] = doc.schedule_date if doc else today()

    if item_details.get("parenttype") == 'Sales Order':
        item_details.free_item_data[
            'delivery_date'] = doc.delivery_date if doc else today()

    company = doc.company
    if args and args.get("company"):
        company = args.get("company")

    if args:
        item_details.free_item_data[
            'income_account'] = get_default_income_account(
                args=args,
                item=get_item_defaults(free_item, company),
                item_group=get_item_group_defaults(free_item, company),
                brand=get_brand_defaults(free_item, company),
            )
def set_required_item_wharehouse(work_order, method=None):
	if print_debug: frappe.logger().debug("---radplusplus.manufacturing_controllers.set_required_item_wharehouse:")
	for d in work_order.required_items:
		item = frappe.get_doc("Item",d.item_code)

		from erpnext.stock.doctype.item.item import get_item_defaults
		item_default = get_item_defaults(d.item_code, work_order.company)
		default_warehouse = item_default.get("default_warehouse")
		
		if print_debug: frappe.logger().debug("---default_warehouse : " + default_warehouse)
		
		if work_order.sales_order_item and item.variant_of in ["PM","PV","PH","PS"] and frappe.db.get_value("Sales Order Item", work_order.sales_order_item, "description_sous_traitance"):
			d.source_warehouse = frappe.db.get_value("Customer", frappe.db.get_value("Sales Order", work_order.sales_order, "customer"), "default_warehouse")
		elif default_warehouse:	
			d.source_warehouse = default_warehouse
		else:
			d.source_warehouse = work_order.source_warehouse
示例#19
0
def get_valuation_rate(item_code, company, warehouse=None):
	item = get_item_defaults(item_code, company)
	item_group = get_item_group_defaults(item_code, company)
	# item = frappe.get_doc("Item", item_code)
	if item.get("is_stock_item"):
		if not warehouse:
			warehouse = item.get("default_warehouse") or item_group.get("default_warehouse")

		return frappe.db.get_value("Bin", {"item_code": item_code, "warehouse": warehouse},
			["valuation_rate"], as_dict=True) or {"valuation_rate": 0}

	elif not item.get("is_stock_item"):
		valuation_rate =frappe.db.sql("""select sum(base_net_amount) / sum(qty*conversion_factor)
			from `tabPurchase Invoice Item`
			where item_code = %s and docstatus=1""", item_code)

		if valuation_rate:
			return {"valuation_rate": valuation_rate[0][0] or 0.0}
	else:
		return {"valuation_rate": 0.0}
示例#20
0
    def update_item(source, target, source_parent):
        target.base_amount = flt(source.base_rate)
        target.amount = flt(source.rate)
        target.is_maintenance_applicable_cf = source.is_maintenance_applicable_cf
        target.maintenance_for_years_cf = source.maintenance_for_years_cf
        target.qty = 1
        serial_no_warehouse = None
        if serial_no:
            target.serial_no = serial_no
            serial_no_warehouse = frappe.db.get_value('Serial No', serial_no,
                                                      'warehouse')
        target.warehouse = serial_no_warehouse or source.warehouse or None
        item = get_item_defaults(target.item_code, source_parent.company)
        item_group = get_item_group_defaults(target.item_code,
                                             source_parent.company)

        if item:
            target.cost_center = frappe.db.get_value("Project", source_parent.project, "cost_center") \
                or item.get("buying_cost_center") \
                or item_group.get("buying_cost_center")
def get_basic_details(args, item):
	"""
	:param args: {
			"item_code": "",
			"warehouse": None,
			"customer": "",
			"conversion_rate": 1.0,
			"selling_price_list": None,
			"price_list_currency": None,
			"price_list_uom_dependant": None,
			"plc_conversion_rate": 1.0,
			"doctype": "",
			"name": "",
			"supplier": None,
			"transaction_date": None,
			"conversion_rate": 1.0,
			"buying_price_list": None,
			"is_subcontracted": "Yes" / "No",
			"ignore_pricing_rule": 0/1
			"project": "",
			barcode: "",
			serial_no: "",
			currency: "",
			update_stock: "",
			price_list: "",
			company: "",
			order_type: "",
			is_pos: "",
			project: "",
			qty: "",
			stock_qty: "",
			conversion_factor: ""
		}
	:param item: `item_code` of Item object
	:return: frappe._dict
	"""

	if not item:
		item = frappe.get_doc("Item", args.get("item_code"))

	if item.variant_of:
		item.update_template_tables()

	from frappe.defaults import get_user_default_as_list
	user_default_warehouse_list = get_user_default_as_list('Warehouse')
	user_default_warehouse = user_default_warehouse_list[0] \
		if len(user_default_warehouse_list) == 1 else ""

	item_defaults = get_item_defaults(item.name, args.company)
	item_group_defaults = get_item_group_defaults(item.name, args.company)

	warehouse = args.get("set_warehouse") or user_default_warehouse or item_defaults.get("default_warehouse") or\
		item_group_defaults.get("default_warehouse") or args.warehouse

	if args.get('doctype') == "Material Request" and not args.get('material_request_type'):
		args['material_request_type'] = frappe.db.get_value('Material Request',
			args.get('name'), 'material_request_type', cache=True)

	#Set the UOM to the Default Sales UOM or Default Purchase UOM if configured in the Item Master
	if not args.uom:
		if args.get('doctype') in sales_doctypes:
			args.uom = item.sales_uom if item.sales_uom else item.stock_uom
		elif (args.get('doctype') in ['Purchase Order', 'Purchase Receipt', 'Purchase Invoice']) or \
			(args.get('doctype') == 'Material Request' and args.get('material_request_type') == 'Purchase'):
			args.uom = item.purchase_uom if item.purchase_uom else item.stock_uom
		else:
			args.uom = item.stock_uom

	out = frappe._dict({
		"item_code": item.name,
		"item_name": item.item_name,
		"description": cstr(item.description).strip(),
		"image": cstr(item.image).strip(),
		"warehouse": warehouse,
		"income_account": get_default_income_account(args, item_defaults, item_group_defaults),
		"expense_account": get_default_expense_account(args, item_defaults, item_group_defaults),
		"cost_center": get_default_cost_center(args, item_defaults, item_group_defaults),
		'has_serial_no': item.has_serial_no,
		'has_batch_no': item.has_batch_no,
		"batch_no": None,
		"item_tax_rate": json.dumps(dict(([d.tax_type, d.tax_rate] for d in
			item.get("taxes")))),
		"uom": args.uom,
		"min_order_qty": flt(item.min_order_qty) if args.doctype == "Material Request" else "",
		"qty": args.qty or 1.0,
		"stock_qty": args.qty or 1.0,
		"price_list_rate": 0.0,
		"base_price_list_rate": 0.0,
		"rate": 0.0,
		"base_rate": 0.0,
		"amount": 0.0,
		"base_amount": 0.0,
		"net_rate": 0.0,
		"net_amount": 0.0,
		"discount_percentage": 0.0,
		"supplier": get_default_supplier(args, item_defaults, item_group_defaults),
		"update_stock": args.get("update_stock") if args.get('doctype') in ['Sales Invoice', 'Purchase Invoice'] else 0,
		"delivered_by_supplier": item.delivered_by_supplier if args.get("doctype") in ["Sales Order", "Sales Invoice"] else 0,
		"is_fixed_asset": item.is_fixed_asset,
		"weight_per_unit":item.weight_per_unit,
		"weight_uom":item.weight_uom,
		"last_purchase_rate": item.last_purchase_rate if args.get("doctype") in ["Purchase Order"] else 0,
		"transaction_date": args.get("transaction_date")
	})

	if item.get("enable_deferred_revenue") or item.get("enable_deferred_expense"):
		out.update(calculate_service_end_date(args, item))

	# calculate conversion factor
	if item.stock_uom == args.uom:
		out.conversion_factor = 1.0
	else:
		out.conversion_factor = args.conversion_factor or \
			get_conversion_factor(item.name, args.uom).get("conversion_factor")

	args.conversion_factor = out.conversion_factor
	out.stock_qty = out.qty * out.conversion_factor

	# calculate last purchase rate
	if args.get('doctype') in purchase_doctypes:
		from erpnext.buying.doctype.purchase_order.purchase_order import item_last_purchase_rate
		out.last_purchase_rate = item_last_purchase_rate(args.name, args.conversion_rate, item.name, out.conversion_factor)

	# if default specified in item is for another company, fetch from company
	for d in [
		["Account", "income_account", "default_income_account"],
		["Account", "expense_account", "default_expense_account"],
		["Cost Center", "cost_center", "cost_center"],
		["Warehouse", "warehouse", ""]]:
			if not out[d[1]]:
				out[d[1]] = frappe.get_cached_value('Company',  args.company,  d[2]) if d[2] else None

	for fieldname in ("item_name", "item_group", "barcodes", "brand", "stock_uom"):
		out[fieldname] = item.get(fieldname)

	return out
示例#22
0
def get_basic_details(args, item, overwrite_warehouse=True):
    """
	:param args: {
			"item_code": "",
			"warehouse": None,
			"customer": "",
			"conversion_rate": 1.0,
			"selling_price_list": None,
			"price_list_currency": None,
			"price_list_uom_dependant": None,
			"plc_conversion_rate": 1.0,
			"doctype": "",
			"name": "",
			"supplier": None,
			"transaction_date": None,
			"conversion_rate": 1.0,
			"buying_price_list": None,
			"is_subcontracted": "Yes" / "No",
			"ignore_pricing_rule": 0/1
			"project": "",
			barcode: "",
			serial_no: "",
			currency: "",
			update_stock: "",
			price_list: "",
			company: "",
			order_type: "",
			is_pos: "",
			project: "",
			qty: "",
			stock_qty: "",
			conversion_factor: "",
			against_blanket_order: 0/1
		}
	:param item: `item_code` of Item object
	:return: frappe._dict
	"""

    if not item:
        item = frappe.get_doc("Item", args.get("item_code"))

    if item.variant_of:
        item.update_template_tables()

    item_defaults = get_item_defaults(item.name, args.company)
    item_group_defaults = get_item_group_defaults(item.name, args.company)
    brand_defaults = get_brand_defaults(item.name, args.company)

    defaults = frappe._dict({
        'item_defaults': item_defaults,
        'item_group_defaults': item_group_defaults,
        'brand_defaults': brand_defaults
    })

    warehouse = get_item_warehouse(item, args, overwrite_warehouse, defaults)

    if args.get('doctype') == "Material Request" and not args.get(
            'material_request_type'):
        args['material_request_type'] = frappe.db.get_value(
            'Material Request',
            args.get('name'),
            'material_request_type',
            cache=True)

    expense_account = None

    if args.get('doctype') == 'Purchase Invoice' and item.is_fixed_asset:
        from erpnext.assets.doctype.asset_category.asset_category import get_asset_category_account
        expense_account = get_asset_category_account(
            fieldname="fixed_asset_account",
            item=args.item_code,
            company=args.company)

    #Set the UOM to the Default Sales UOM or Default Purchase UOM if configured in the Item Master
    if not args.get('uom'):
        if args.get('doctype') in sales_doctypes:
            args.uom = item.sales_uom if item.sales_uom else item.stock_uom
        elif (args.get('doctype') in ['Purchase Order', 'Purchase Receipt', 'Purchase Invoice']) or \
         (args.get('doctype') == 'Material Request' and args.get('material_request_type') == 'Purchase'):
            args.uom = item.purchase_uom if item.purchase_uom else item.stock_uom
        else:
            args.uom = item.stock_uom

    out = frappe._dict({
        "item_code":
        item.name,
        "item_name":
        item.item_name,
        "description":
        cstr(item.description).strip(),
        "image":
        cstr(item.image).strip(),
        "warehouse":
        warehouse,
        "income_account":
        get_default_income_account(args, item_defaults, item_group_defaults,
                                   brand_defaults),
        "expense_account":
        expense_account or get_default_expense_account(
            args, item_defaults, item_group_defaults, brand_defaults),
        "cost_center":
        get_default_cost_center(args, item_defaults, item_group_defaults,
                                brand_defaults),
        'has_serial_no':
        item.has_serial_no,
        'has_batch_no':
        item.has_batch_no,
        "batch_no":
        args.get("batch_no"),
        "uom":
        args.uom,
        "min_order_qty":
        flt(item.min_order_qty) if args.doctype == "Material Request" else "",
        "qty":
        flt(args.qty) or 1.0,
        "stock_qty":
        flt(args.qty) or 1.0,
        "price_list_rate":
        0.0,
        "base_price_list_rate":
        0.0,
        "rate":
        0.0,
        "base_rate":
        0.0,
        "amount":
        0.0,
        "base_amount":
        0.0,
        "net_rate":
        0.0,
        "net_amount":
        0.0,
        "discount_percentage":
        0.0,
        "supplier":
        get_default_supplier(args, item_defaults, item_group_defaults,
                             brand_defaults),
        "update_stock":
        args.get("update_stock")
        if args.get('doctype') in ['Sales Invoice', 'Purchase Invoice'] else 0,
        "delivered_by_supplier":
        item.delivered_by_supplier
        if args.get("doctype") in ["Sales Order", "Sales Invoice"] else 0,
        "is_fixed_asset":
        item.is_fixed_asset,
        "weight_per_unit":
        item.weight_per_unit,
        "weight_uom":
        item.weight_uom,
        "last_purchase_rate":
        item.last_purchase_rate
        if args.get("doctype") in ["Purchase Order"] else 0,
        "transaction_date":
        args.get("transaction_date"),
        "against_blanket_order":
        args.get("against_blanket_order"),
        "bom_no":
        item.get("default_bom")
    })

    if item.get("enable_deferred_revenue") or item.get(
            "enable_deferred_expense"):
        out.update(calculate_service_end_date(args, item))

    # calculate conversion factor
    if item.stock_uom == args.uom:
        out.conversion_factor = 1.0
    else:
        out.conversion_factor = args.conversion_factor or \
         get_conversion_factor(item.name, args.uom).get("conversion_factor")

    args.conversion_factor = out.conversion_factor
    out.stock_qty = out.qty * out.conversion_factor

    # calculate last purchase rate
    if args.get('doctype') in purchase_doctypes:
        from erpnext.buying.doctype.purchase_order.purchase_order import item_last_purchase_rate
        out.last_purchase_rate = item_last_purchase_rate(
            args.name, args.conversion_rate, item.name, out.conversion_factor)

    # if default specified in item is for another company, fetch from company
    for d in [["Account", "income_account", "default_income_account"],
              ["Account", "expense_account", "default_expense_account"],
              ["Cost Center", "cost_center", "cost_center"],
              ["Warehouse", "warehouse", ""]]:
        if not out[d[1]]:
            out[d[1]] = frappe.get_cached_value('Company', args.company,
                                                d[2]) if d[2] else None

    for fieldname in ("item_name", "item_group", "barcodes", "brand",
                      "stock_uom"):
        out[fieldname] = item.get(fieldname)

    if args.get("manufacturer"):
        part_no = get_item_manufacturer_part_no(args.get("item_code"),
                                                args.get("manufacturer"))
        if part_no:
            out["manufacturer_part_no"] = part_no
        else:
            out["manufacturer_part_no"] = None
            out["manufacturer"] = None
    else:
        data = frappe.get_value(
            "Item",
            item.name,
            ["default_item_manufacturer", "default_manufacturer_part_no"],
            as_dict=1)

        if data:
            out.update({
                "manufacturer":
                data.default_item_manufacturer,
                "manufacturer_part_no":
                data.default_manufacturer_part_no
            })

    child_doctype = args.doctype + ' Item'
    meta = frappe.get_meta(child_doctype)
    if meta.get_field("barcode"):
        update_barcode_value(out)

    return out