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_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
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
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
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 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