Incoming rate in stock ledger and valuation rate in stock balance report. Fixes #1706
This commit is contained in:
		
							parent
							
								
									c3cbe2a30c
								
							
						
					
					
						commit
						732a7e81a0
					
				| @ -18,14 +18,14 @@ data_map = { | ||||
| 
 | ||||
| 	# Accounts | ||||
| 	"Account": { | ||||
| 		"columns": ["name", "parent_account", "lft", "rgt", "report_type",  | ||||
| 		"columns": ["name", "parent_account", "lft", "rgt", "report_type", | ||||
| 			"company", "group_or_ledger"], | ||||
| 		"conditions": ["docstatus < 2"], | ||||
| 		"order_by": "lft", | ||||
| 		"links": { | ||||
| 			"company": ["Company", "name"], | ||||
| 		} | ||||
| 		 | ||||
| 
 | ||||
| 	}, | ||||
| 	"Cost Center": { | ||||
| 		"columns": ["name", "lft", "rgt"], | ||||
| @ -33,7 +33,7 @@ data_map = { | ||||
| 		"order_by": "lft" | ||||
| 	}, | ||||
| 	"GL Entry": { | ||||
| 		"columns": ["name", "account", "posting_date", "cost_center", "debit", "credit",  | ||||
| 		"columns": ["name", "account", "posting_date", "cost_center", "debit", "credit", | ||||
| 			"is_opening", "company", "voucher_type", "voucher_no", "remarks"], | ||||
| 		"order_by": "posting_date, account", | ||||
| 		"links": { | ||||
| @ -45,8 +45,8 @@ data_map = { | ||||
| 
 | ||||
| 	# Stock | ||||
| 	"Item": { | ||||
| 		"columns": ["name", "if(item_name=name, '', item_name) as item_name", "description",  | ||||
| 			"item_group as parent_item_group", "stock_uom", "brand", "valuation_method",  | ||||
| 		"columns": ["name", "if(item_name=name, '', item_name) as item_name", "description", | ||||
| 			"item_group as parent_item_group", "stock_uom", "brand", "valuation_method", | ||||
| 			"re_order_level", "re_order_qty"], | ||||
| 		# "conditions": ["docstatus < 2"], | ||||
| 		"order_by": "name", | ||||
| @ -76,7 +76,7 @@ data_map = { | ||||
| 		"order_by": "name" | ||||
| 	}, | ||||
| 	"Stock Ledger Entry": { | ||||
| 		"columns": ["name", "posting_date", "posting_time", "item_code", "warehouse",  | ||||
| 		"columns": ["name", "posting_date", "posting_time", "item_code", "warehouse", | ||||
| 			"actual_qty as qty", "voucher_type", "voucher_no", "project", | ||||
| 			"ifnull(incoming_rate,0) as incoming_rate", "stock_uom", "serial_no"], | ||||
| 		"order_by": "posting_date, posting_time, name", | ||||
| @ -98,8 +98,8 @@ data_map = { | ||||
| 		"order_by": "posting_date, posting_time, name", | ||||
| 	}, | ||||
| 	"Production Order": { | ||||
| 		"columns": ["name", "production_item as item_code",  | ||||
| 			"(ifnull(qty, 0) - ifnull(produced_qty, 0)) as qty",  | ||||
| 		"columns": ["name", "production_item as item_code", | ||||
| 			"(ifnull(qty, 0) - ifnull(produced_qty, 0)) as qty", | ||||
| 			"fg_warehouse as warehouse"], | ||||
| 		"conditions": ["docstatus=1", "status != 'Stopped'", "ifnull(fg_warehouse, '')!=''", | ||||
| 			"ifnull(qty, 0) > ifnull(produced_qty, 0)"], | ||||
| @ -109,7 +109,7 @@ data_map = { | ||||
| 		}, | ||||
| 	}, | ||||
| 	"Material Request Item": { | ||||
| 		"columns": ["item.name as name", "item_code", "warehouse",  | ||||
| 		"columns": ["item.name as name", "item_code", "warehouse", | ||||
| 			"(ifnull(qty, 0) - ifnull(ordered_qty, 0)) as qty"], | ||||
| 		"from": "`tabMaterial Request Item` item, `tabMaterial Request` main", | ||||
| 		"conditions": ["item.parent = main.name", "main.docstatus=1", "main.status != 'Stopped'", | ||||
| @ -120,21 +120,21 @@ data_map = { | ||||
| 		}, | ||||
| 	}, | ||||
| 	"Purchase Order Item": { | ||||
| 		"columns": ["item.name as name", "item_code", "warehouse",  | ||||
| 		"columns": ["item.name as name", "item_code", "warehouse", | ||||
| 			"(ifnull(qty, 0) - ifnull(received_qty, 0)) as qty"], | ||||
| 		"from": "`tabPurchase Order Item` item, `tabPurchase Order` main", | ||||
| 		"conditions": ["item.parent = main.name", "main.docstatus=1", "main.status != 'Stopped'",  | ||||
| 		"conditions": ["item.parent = main.name", "main.docstatus=1", "main.status != 'Stopped'", | ||||
| 			"ifnull(warehouse, '')!=''", "ifnull(qty, 0) > ifnull(received_qty, 0)"], | ||||
| 		"links": { | ||||
| 			"item_code": ["Item", "name"], | ||||
| 			"warehouse": ["Warehouse", "name"] | ||||
| 		}, | ||||
| 	}, | ||||
| 	 | ||||
| 
 | ||||
| 	"Sales Order Item": { | ||||
| 		"columns": ["item.name as name", "item_code", "(ifnull(qty, 0) - ifnull(delivered_qty, 0)) as qty", "warehouse"], | ||||
| 		"from": "`tabSales Order Item` item, `tabSales Order` main", | ||||
| 		"conditions": ["item.parent = main.name", "main.docstatus=1", "main.status != 'Stopped'",  | ||||
| 		"conditions": ["item.parent = main.name", "main.docstatus=1", "main.status != 'Stopped'", | ||||
| 			"ifnull(warehouse, '')!=''", "ifnull(qty, 0) > ifnull(delivered_qty, 0)"], | ||||
| 		"links": { | ||||
| 			"item_code": ["Item", "name"], | ||||
| @ -144,7 +144,7 @@ data_map = { | ||||
| 
 | ||||
| 	# Sales | ||||
| 	"Customer": { | ||||
| 		"columns": ["name", "if(customer_name=name, '', customer_name) as customer_name",  | ||||
| 		"columns": ["name", "if(customer_name=name, '', customer_name) as customer_name", | ||||
| 			"customer_group as parent_customer_group", "territory as parent_territory"], | ||||
| 		"conditions": ["docstatus < 2"], | ||||
| 		"order_by": "name", | ||||
| @ -218,7 +218,7 @@ data_map = { | ||||
| 		} | ||||
| 	}, | ||||
| 	"Supplier": { | ||||
| 		"columns": ["name", "if(supplier_name=name, '', supplier_name) as supplier_name",  | ||||
| 		"columns": ["name", "if(supplier_name=name, '', supplier_name) as supplier_name", | ||||
| 			"supplier_type as parent_supplier_type"], | ||||
| 		"conditions": ["docstatus < 2"], | ||||
| 		"order_by": "name", | ||||
| @ -291,5 +291,5 @@ data_map = { | ||||
| 		"conditions": ["docstatus < 2"], | ||||
| 		"order_by": "creation" | ||||
| 	} | ||||
| 	 | ||||
| 
 | ||||
| } | ||||
|  | ||||
| @ -3,18 +3,18 @@ | ||||
| 
 | ||||
| frappe.require("assets/erpnext/js/stock_analytics.js"); | ||||
| 
 | ||||
| frappe.pages['stock-balance'].onload = function(wrapper) {  | ||||
| frappe.pages['stock-balance'].onload = function(wrapper) { | ||||
| 	frappe.ui.make_app_page({ | ||||
| 		parent: wrapper, | ||||
| 		title: __('Stock Balance'), | ||||
| 		single_column: true | ||||
| 	}); | ||||
| 	 | ||||
| 
 | ||||
| 	new erpnext.StockBalance(wrapper); | ||||
| 	 | ||||
| 
 | ||||
| 
 | ||||
| 	wrapper.appframe.add_module_icon("Stock") | ||||
| 	 | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| erpnext.StockBalance = erpnext.StockAnalytics.extend({ | ||||
| @ -30,40 +30,42 @@ erpnext.StockBalance = erpnext.StockAnalytics.extend({ | ||||
| 			{id: "name", name: __("Item"), field: "name", width: 300, | ||||
| 				formatter: this.tree_formatter}, | ||||
| 			{id: "item_name", name: __("Item Name"), field: "item_name", width: 100}, | ||||
| 			{id: "description", name: __("Description"), field: "description", width: 200,  | ||||
| 			{id: "description", name: __("Description"), field: "description", width: 200, | ||||
| 				formatter: this.text_formatter}, | ||||
| 			{id: "brand", name: __("Brand"), field: "brand", width: 100}, | ||||
| 			{id: "stock_uom", name: __("UOM"), field: "stock_uom", width: 100}, | ||||
| 			{id: "opening_qty", name: __("Opening Qty"), field: "opening_qty", width: 100,  | ||||
| 			{id: "opening_qty", name: __("Opening Qty"), field: "opening_qty", width: 100, | ||||
| 				formatter: this.currency_formatter}, | ||||
| 			{id: "inflow_qty", name: __("In Qty"), field: "inflow_qty", width: 100,  | ||||
| 			{id: "inflow_qty", name: __("In Qty"), field: "inflow_qty", width: 100, | ||||
| 				formatter: this.currency_formatter}, | ||||
| 			{id: "outflow_qty", name: __("Out Qty"), field: "outflow_qty", width: 100,  | ||||
| 			{id: "outflow_qty", name: __("Out Qty"), field: "outflow_qty", width: 100, | ||||
| 				formatter: this.currency_formatter}, | ||||
| 			{id: "closing_qty", name: __("Closing Qty"), field: "closing_qty", width: 100,  | ||||
| 			{id: "closing_qty", name: __("Closing Qty"), field: "closing_qty", width: 100, | ||||
| 				formatter: this.currency_formatter}, | ||||
| 				 | ||||
| 			{id: "opening_value", name: __("Opening Value"), field: "opening_value", width: 100,  | ||||
| 
 | ||||
| 			{id: "opening_value", name: __("Opening Value"), field: "opening_value", width: 100, | ||||
| 				formatter: this.currency_formatter}, | ||||
| 			{id: "inflow_value", name: __("In Value"), field: "inflow_value", width: 100,  | ||||
| 			{id: "inflow_value", name: __("In Value"), field: "inflow_value", width: 100, | ||||
| 				formatter: this.currency_formatter}, | ||||
| 			{id: "outflow_value", name: __("Out Value"), field: "outflow_value", width: 100,  | ||||
| 			{id: "outflow_value", name: __("Out Value"), field: "outflow_value", width: 100, | ||||
| 				formatter: this.currency_formatter}, | ||||
| 			{id: "closing_value", name: __("Closing Value"), field: "closing_value", width: 100,  | ||||
| 			{id: "closing_value", name: __("Closing Value"), field: "closing_value", width: 100, | ||||
| 				formatter: this.currency_formatter}, | ||||
| 			{id: "valuation_rate", name: __("Valuation Rate"), field: "valuation_rate", width: 100, | ||||
| 				formatter: this.currency_formatter}, | ||||
| 		]; | ||||
| 	}, | ||||
| 	 | ||||
| 
 | ||||
| 	filters: [ | ||||
| 		{fieldtype:"Select", label: __("Brand"), link:"Brand",  | ||||
| 		{fieldtype:"Select", label: __("Brand"), link:"Brand", | ||||
| 			default_value: "Select Brand...", filter: function(val, item, opts) { | ||||
| 				return val == opts.default_value || item.brand == val || item._show; | ||||
| 			}, link_formatter: {filter_input: "brand"}}, | ||||
| 		{fieldtype:"Select", label: __("Warehouse"), link:"Warehouse",  | ||||
| 		{fieldtype:"Select", label: __("Warehouse"), link:"Warehouse", | ||||
| 			default_value: "Select Warehouse...", filter: function(val, item, opts, me) { | ||||
| 				return me.apply_zero_filter(val, item, opts, me); | ||||
| 			}}, | ||||
| 		{fieldtype:"Select", label: __("Project"), link:"Project",  | ||||
| 		{fieldtype:"Select", label: __("Project"), link:"Project", | ||||
| 			default_value: "Select Project...", filter: function(val, item, opts, me) { | ||||
| 				return me.apply_zero_filter(val, item, opts, me); | ||||
| 			}, link_formatter: {filter_input: "project"}}, | ||||
| @ -73,16 +75,16 @@ erpnext.StockBalance = erpnext.StockAnalytics.extend({ | ||||
| 		{fieldtype:"Button", label: __("Refresh"), icon:"icon-refresh icon-white"}, | ||||
| 		{fieldtype:"Button", label: __("Reset Filters"), icon: "icon-filter"} | ||||
| 	], | ||||
| 	 | ||||
| 
 | ||||
| 	setup_plot_check: function() { | ||||
| 		return; | ||||
| 	}, | ||||
| 	 | ||||
| 
 | ||||
| 	prepare_data: function() { | ||||
| 		this.stock_entry_map = this.make_name_map(frappe.report_dump.data["Stock Entry"], "name"); | ||||
| 		this._super(); | ||||
| 	}, | ||||
| 	 | ||||
| 
 | ||||
| 	prepare_balances: function() { | ||||
| 		var me = this; | ||||
| 		var from_date = dateutil.str_to_obj(this.from_date); | ||||
| @ -95,26 +97,26 @@ erpnext.StockBalance = erpnext.StockAnalytics.extend({ | ||||
| 		for(var i=0, j=data.length; i<j; i++) { | ||||
| 			var sl = data[i]; | ||||
| 			var sl_posting_date = dateutil.str_to_obj(sl.posting_date); | ||||
| 			 | ||||
| 
 | ||||
| 			if((me.is_default("warehouse") ? true : me.warehouse == sl.warehouse) && | ||||
| 				(me.is_default("project") ? true : me.project == sl.project)) { | ||||
| 				var item = me.item_by_name[sl.item_code]; | ||||
| 				var wh = me.get_item_warehouse(sl.warehouse, sl.item_code); | ||||
| 				var valuation_method = item.valuation_method ?  | ||||
| 				var valuation_method = item.valuation_method ? | ||||
| 					item.valuation_method : sys_defaults.valuation_method; | ||||
| 				var is_fifo = valuation_method == "FIFO"; | ||||
| 
 | ||||
| 				var qty_diff = sl.qty; | ||||
| 				var value_diff = me.get_value_diff(wh, sl, is_fifo); | ||||
| 				 | ||||
| 
 | ||||
| 				if(sl_posting_date < from_date) { | ||||
| 					item.opening_qty += qty_diff; | ||||
| 					item.opening_value += value_diff; | ||||
| 				} else if(sl_posting_date <= to_date) { | ||||
| 					var ignore_inflow_outflow = this.is_default("warehouse") | ||||
| 						&& sl.voucher_type=="Stock Entry"  | ||||
| 						&& sl.voucher_type=="Stock Entry" | ||||
| 						&& this.stock_entry_map[sl.voucher_no].purpose=="Material Transfer"; | ||||
| 					 | ||||
| 
 | ||||
| 					if(!ignore_inflow_outflow) { | ||||
| 						if(qty_diff < 0) { | ||||
| 							item.outflow_qty += Math.abs(qty_diff); | ||||
| @ -126,7 +128,7 @@ erpnext.StockBalance = erpnext.StockAnalytics.extend({ | ||||
| 						} else { | ||||
| 							item.inflow_value += value_diff; | ||||
| 						} | ||||
| 					 | ||||
| 
 | ||||
| 						item.closing_qty += qty_diff; | ||||
| 						item.closing_value += value_diff; | ||||
| 					} | ||||
| @ -138,13 +140,18 @@ erpnext.StockBalance = erpnext.StockAnalytics.extend({ | ||||
| 		} | ||||
| 
 | ||||
| 		// opening + diff = closing
 | ||||
| 		// adding opening, since diff already added to closing		
 | ||||
| 		// adding opening, since diff already added to closing
 | ||||
| 		$.each(me.item_by_name, function(key, item) { | ||||
| 			item.closing_qty += item.opening_qty; | ||||
| 			item.closing_value += item.opening_value; | ||||
| 
 | ||||
| 			// valuation rate
 | ||||
| 			if(!item.is_group && flt(item.closing_qty) > 0) | ||||
| 				item.valuation_rate = flt(item.closing_value) / flt(item.closing_qty); | ||||
| 			else item.valuation_rate = 0.0 | ||||
| 		}); | ||||
| 	}, | ||||
| 	 | ||||
| 
 | ||||
| 	update_groups: function() { | ||||
| 		var me = this; | ||||
| 
 | ||||
| @ -155,24 +162,22 @@ erpnext.StockBalance = erpnext.StockAnalytics.extend({ | ||||
| 				while(parent) { | ||||
| 					parent_group = me.item_by_name[parent]; | ||||
| 					$.each(me.columns, function(c, col) { | ||||
| 						if (col.formatter == me.currency_formatter) { | ||||
| 							parent_group[col.field] =  | ||||
| 								flt(parent_group[col.field]) | ||||
| 								+ flt(item[col.field]); | ||||
| 						if (col.formatter == me.currency_formatter && col.field != "valuation_rate") { | ||||
| 							parent_group[col.field] = flt(parent_group[col.field]) + flt(item[col.field]); | ||||
| 						} | ||||
| 					}); | ||||
| 					 | ||||
| 
 | ||||
| 					// show parent if filtered by brand
 | ||||
| 					if(item.brand == me.brand) | ||||
| 						parent_group._show = true; | ||||
| 					 | ||||
| 
 | ||||
| 					parent = me.parent_map[parent]; | ||||
| 				} | ||||
| 			} | ||||
| 		}); | ||||
| 	}, | ||||
| 	 | ||||
| 
 | ||||
| 	get_plot_data: function() { | ||||
| 		return; | ||||
| 	} | ||||
| }); | ||||
| }); | ||||
|  | ||||
| @ -1,13 +1,13 @@ | ||||
| // Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
 | ||||
| // License: GNU General Public License v3. See license.txt
 | ||||
| 
 | ||||
| frappe.pages['stock-ledger'].onload = function(wrapper) {  | ||||
| frappe.pages['stock-ledger'].onload = function(wrapper) { | ||||
| 	frappe.ui.make_app_page({ | ||||
| 		parent: wrapper, | ||||
| 		title: __('Stock Ledger'), | ||||
| 		single_column: true | ||||
| 	}); | ||||
| 	 | ||||
| 
 | ||||
| 	new erpnext.StockLedger(wrapper); | ||||
| 	wrapper.appframe.add_module_icon("Stock") | ||||
| } | ||||
| @ -30,7 +30,7 @@ erpnext.StockLedger = erpnext.StockGridReport.extend({ | ||||
| 		this.columns = [ | ||||
| 			{id: "posting_datetime", name: __("Posting Date"), field: "posting_datetime", width: 120, | ||||
| 				formatter: this.date_formatter}, | ||||
| 			{id: "item_code", name: __("Item Code"), field: "item_code", width: 160, 	 | ||||
| 			{id: "item_code", name: __("Item Code"), field: "item_code", width: 160, | ||||
| 				link_formatter: { | ||||
| 					filter_input: "item_code", | ||||
| 					open_btn: true, | ||||
| @ -57,10 +57,10 @@ erpnext.StockLedger = erpnext.StockGridReport.extend({ | ||||
| 					doctype: "dataContext.voucher_type" | ||||
| 				}}, | ||||
| 		]; | ||||
| 		 | ||||
| 
 | ||||
| 	}, | ||||
| 	filters: [ | ||||
| 		{fieldtype:"Select", label: __("Warehouse"), link:"Warehouse",  | ||||
| 		{fieldtype:"Select", label: __("Warehouse"), link:"Warehouse", | ||||
| 			default_value: "Select Warehouse...", filter: function(val, item, opts) { | ||||
| 				return item.warehouse == val || val == opts.default_value; | ||||
| 			}}, | ||||
| @ -68,7 +68,7 @@ erpnext.StockLedger = erpnext.StockGridReport.extend({ | ||||
| 			filter: function(val, item, opts) { | ||||
| 				return item.item_code == val || !val; | ||||
| 			}}, | ||||
| 		{fieldtype:"Select", label: "Brand", link:"Brand",  | ||||
| 		{fieldtype:"Select", label: "Brand", link:"Brand", | ||||
| 			default_value: "Select Brand...", filter: function(val, item, opts) { | ||||
| 				return val == opts.default_value || item.brand == val || item._show; | ||||
| 			}, link_formatter: {filter_input: "brand"}}, | ||||
| @ -87,17 +87,17 @@ erpnext.StockLedger = erpnext.StockGridReport.extend({ | ||||
| 		{fieldtype:"Button", label: __("Refresh"), icon:"icon-refresh icon-white"}, | ||||
| 		{fieldtype:"Button", label: __("Reset Filters"), icon: "icon-filter"} | ||||
| 	], | ||||
| 	 | ||||
| 
 | ||||
| 	setup_filters: function() { | ||||
| 		var me = this; | ||||
| 		this._super(); | ||||
| 		 | ||||
| 
 | ||||
| 		this.wrapper.bind("apply_filters_from_route", function() { me.toggle_enable_brand(); }); | ||||
| 		this.filter_inputs.item_code.change(function() { me.toggle_enable_brand(); }); | ||||
| 		 | ||||
| 
 | ||||
| 		this.trigger_refresh_on_change(["item_code", "warehouse", "brand"]); | ||||
| 	}, | ||||
| 	 | ||||
| 
 | ||||
| 	toggle_enable_brand: function() { | ||||
| 		if(!this.filter_inputs.item_code.val()) { | ||||
| 			this.filter_inputs.brand.prop("disabled", false); | ||||
| @ -107,7 +107,7 @@ erpnext.StockLedger = erpnext.StockGridReport.extend({ | ||||
| 				.prop("disabled", true); | ||||
| 		} | ||||
| 	}, | ||||
| 	 | ||||
| 
 | ||||
| 	init_filter_values: function() { | ||||
| 		this._super(); | ||||
| 		this.filter_inputs.warehouse.get(0).selectedIndex = 0; | ||||
| @ -131,19 +131,19 @@ erpnext.StockLedger = erpnext.StockGridReport.extend({ | ||||
| 			item_code: "Total Out", qty: 0.0, balance: 0.0, balance_value: 0.0, | ||||
| 				id:"_total_out", _show: true, _style: "font-weight: bold" | ||||
| 		} | ||||
| 		 | ||||
| 
 | ||||
| 		// clear balance
 | ||||
| 		$.each(frappe.report_dump.data["Item"], function(i, item) { | ||||
| 			item.balance = item.balance_value = 0.0;  | ||||
| 			item.balance = item.balance_value = 0.0; | ||||
| 		}); | ||||
| 		 | ||||
| 
 | ||||
| 		// initialize warehouse-item map
 | ||||
| 		this.item_warehouse = {}; | ||||
| 		this.serialized_buying_rates = this.get_serialized_buying_rates(); | ||||
| 		var from_datetime = dateutil.str_to_obj(me.from_date + " 00:00:00"); | ||||
| 		var to_datetime = dateutil.str_to_obj(me.to_date + " 23:59:59"); | ||||
| 		 | ||||
| 		// 
 | ||||
| 
 | ||||
| 		//
 | ||||
| 		for(var i=0, j=data.length; i<j; i++) { | ||||
| 			var sl = data[i]; | ||||
| 			var item = me.item_by_name[sl.item_code] | ||||
| @ -152,8 +152,8 @@ erpnext.StockLedger = erpnext.StockGridReport.extend({ | ||||
| 			sl.posting_datetime = sl.posting_date + " " + (sl.posting_time || "00:00:00"); | ||||
| 			sl.brand = item.brand; | ||||
| 			var posting_datetime = dateutil.str_to_obj(sl.posting_datetime); | ||||
| 			 | ||||
| 			var is_fifo = item.valuation_method ? item.valuation_method=="FIFO"  | ||||
| 
 | ||||
| 			var is_fifo = item.valuation_method ? item.valuation_method=="FIFO" | ||||
| 				: sys_defaults.valuation_method=="FIFO"; | ||||
| 			var value_diff = me.get_value_diff(wh, sl, is_fifo); | ||||
| 
 | ||||
| @ -175,27 +175,27 @@ erpnext.StockLedger = erpnext.StockGridReport.extend({ | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 			 | ||||
| 
 | ||||
| 			if(!before_end) break; | ||||
| 
 | ||||
| 			// apply filters
 | ||||
| 			if(me.apply_filters(sl)) { | ||||
| 				out.push(sl); | ||||
| 			} | ||||
| 			 | ||||
| 
 | ||||
| 			// update balance
 | ||||
| 			if((!me.is_default("warehouse") ? me.apply_filter(sl, "warehouse") : true)) { | ||||
| 				sl.balance = me.item_by_name[sl.item_code].balance + sl.qty; | ||||
| 				me.item_by_name[sl.item_code].balance = sl.balance; | ||||
| 				 | ||||
| 
 | ||||
| 				sl.balance_value = me.item_by_name[sl.item_code].balance_value + value_diff; | ||||
| 				me.item_by_name[sl.item_code].balance_value = sl.balance_value;		 | ||||
| 				me.item_by_name[sl.item_code].balance_value = sl.balance_value; | ||||
| 			} | ||||
| 		} | ||||
| 					 | ||||
| 
 | ||||
| 		if(me.item_code && !me.voucher_no) { | ||||
| 			var closing = { | ||||
| 				item_code: "On " + dateutil.str_to_user(this.to_date),  | ||||
| 				item_code: "On " + dateutil.str_to_user(this.to_date), | ||||
| 				balance: (out.length ? out[out.length-1].balance : 0), qty: 0, | ||||
| 				balance_value: (out.length ? out[out.length-1].balance_value : 0), | ||||
| 				id:"_closing", _show: true, _style: "font-weight: bold" | ||||
| @ -203,7 +203,7 @@ erpnext.StockLedger = erpnext.StockGridReport.extend({ | ||||
| 			total_out.balance_value = -total_out.balance_value; | ||||
| 			var out = [opening].concat(out).concat([total_in, total_out, closing]); | ||||
| 		} | ||||
| 		 | ||||
| 
 | ||||
| 		this.data = out; | ||||
| 	}, | ||||
| 	get_plot_data: function() { | ||||
| @ -231,7 +231,7 @@ erpnext.StockLedger = erpnext.StockGridReport.extend({ | ||||
| 	get_plot_options: function() { | ||||
| 		return { | ||||
| 			grid: { hoverable: true, clickable: true }, | ||||
| 			xaxis: { mode: "time",  | ||||
| 			xaxis: { mode: "time", | ||||
| 				min: dateutil.str_to_obj(this.from_date).getTime(), | ||||
| 				max: dateutil.str_to_obj(this.to_date).getTime(), | ||||
| 			}, | ||||
| @ -244,4 +244,4 @@ erpnext.StockLedger = erpnext.StockGridReport.extend({ | ||||
| 	 	var value = format_number(y); | ||||
| 		return value.bold() + " on " + date; | ||||
| 	} | ||||
| }); | ||||
| }); | ||||
|  | ||||
| @ -17,23 +17,25 @@ def execute(filters=None): | ||||
| 			% ("/".join(["#Form", sle.voucher_type, sle.voucher_no]),) | ||||
| 
 | ||||
| 		data.append([sle.date, sle.item_code, item_detail.item_name, item_detail.item_group, | ||||
| 			item_detail.brand, item_detail.description, sle.warehouse, item_detail.stock_uom, | ||||
| 			sle.actual_qty, sle.qty_after_transaction, sle.valuation_rate, sle.stock_value, | ||||
| 			sle.voucher_type, sle.voucher_no, voucher_link_icon, sle.batch_no, sle.serial_no, sle.company]) | ||||
| 			item_detail.brand, item_detail.description, sle.warehouse, | ||||
| 			item_detail.stock_uom, sle.actual_qty, sle.qty_after_transaction, | ||||
| 			(sle.incoming_rate if sle.actual_qty > 0 else 0.0), | ||||
| 			sle.valuation_rate, sle.stock_value, sle.voucher_type, sle.voucher_no, | ||||
| 			voucher_link_icon, sle.batch_no, sle.serial_no, sle.company]) | ||||
| 
 | ||||
| 	return columns, data | ||||
| 
 | ||||
| def get_columns(): | ||||
| 	return ["Date:Datetime:95", "Item:Link/Item:130", "Item Name::100", | ||||
| 		"Item Group:Link/Item Group:100", "Brand:Link/Brand:100", | ||||
| 		"Description::200", "Warehouse:Link/Warehouse:100", | ||||
| 		"Stock UOM:Link/UOM:100", "Qty:Float:50", "Balance Qty:Float:100", "Valuation Rate:Currency:110", | ||||
| 		"Balance Value:Currency:110", "Voucher Type::110", "Voucher #::100", "Link::30", | ||||
| 		"Batch:Link/Batch:100", "Serial #:Link/Serial No:100", "Company:Link/Company:100"] | ||||
| 	return ["Date:Datetime:95", "Item:Link/Item:130", "Item Name::100", "Item Group:Link/Item Group:100", | ||||
| 		"Brand:Link/Brand:100", "Description::200", "Warehouse:Link/Warehouse:100", | ||||
| 		"Stock UOM:Link/UOM:100", "Qty:Float:50", "Balance Qty:Float:100", | ||||
| 		"Incoming Rate:Currency:110", "Valuation Rate:Currency:110", "Balance Value:Currency:110", | ||||
| 		"Voucher Type::110", "Voucher #::100", "Link::30", "Batch:Link/Batch:100", | ||||
| 		"Serial #:Link/Serial No:100", "Company:Link/Company:100"] | ||||
| 
 | ||||
| def get_stock_ledger_entries(filters): | ||||
| 	return frappe.db.sql("""select concat_ws(" ", posting_date, posting_time) as date, | ||||
| 			item_code, warehouse, actual_qty, qty_after_transaction, valuation_rate, | ||||
| 			item_code, warehouse, actual_qty, qty_after_transaction, incoming_rate, valuation_rate, | ||||
| 			stock_value, voucher_type, voucher_no, batch_no, serial_no, company | ||||
| 		from `tabStock Ledger Entry` | ||||
| 		where company = %(company)s and | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user