diff --git a/erpnext/startup/report_data_map.py b/erpnext/startup/report_data_map.py index e614c71ae0..ce71310ad9 100644 --- a/erpnext/startup/report_data_map.py +++ b/erpnext/startup/report_data_map.py @@ -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" } - + } diff --git a/erpnext/stock/page/stock_balance/stock_balance.js b/erpnext/stock/page/stock_balance/stock_balance.js index dbd8830774..18f79169a9 100644 --- a/erpnext/stock/page/stock_balance/stock_balance.js +++ b/erpnext/stock/page/stock_balance/stock_balance.js @@ -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 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; } -}); \ No newline at end of file +}); diff --git a/erpnext/stock/page/stock_ledger/stock_ledger.js b/erpnext/stock/page/stock_ledger/stock_ledger.js index 02af7149f7..b4086dc66e 100644 --- a/erpnext/stock/page/stock_ledger/stock_ledger.js +++ b/erpnext/stock/page/stock_ledger/stock_ledger.js @@ -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 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