コード例 #1
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}
コード例 #2
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
コード例 #3
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
コード例 #4
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_group_defaults.get("expense_account") or get_brand_defaults(item_code,frappe.db.get_single_value("Global Defaults", "default_company")) or item_defaults.get("expense_account")
	frappe.response["expense_account"] = expense_account
	frappe.response["company"]= frappe.db.get_single_value("Global Defaults", "default_company")
	return expense_account
コード例 #5
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),
            )
コード例 #6
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