merge
This commit is contained in:
commit
9b1ddfd9ef
@ -243,13 +243,9 @@ erpnext.GeneralLedger = wn.views.GridReport.extend({
|
||||
out = this.group_data_by_ledger(grouped_ledgers);
|
||||
}
|
||||
|
||||
if(me.account_by_name[me.account].debit_or_credit == "Debit") {
|
||||
opening.debit -= opening.credit; opening.credit = 0;
|
||||
closing.debit -= closing.credit; closing.credit = 0;
|
||||
} else {
|
||||
opening.credit -= opening.debit; opening.debit = 0;
|
||||
closing.credit -= closing.debit; closing.debit = 0;
|
||||
}
|
||||
opening = me.get_balance(me.account_by_name[me.account].debit_or_credit, opening)
|
||||
closing = me.get_balance(me.account_by_name[me.account].debit_or_credit, closing)
|
||||
|
||||
out = [opening].concat(out).concat([totals, closing]);
|
||||
} else {
|
||||
me.appframe.set_title("General Ledger");
|
||||
@ -260,6 +256,7 @@ erpnext.GeneralLedger = wn.views.GridReport.extend({
|
||||
},
|
||||
|
||||
group_data_by_ledger: function(grouped_ledgers) {
|
||||
var me = this;
|
||||
var out = []
|
||||
$.each(Object.keys(grouped_ledgers).sort(), function(i, account) {
|
||||
if(grouped_ledgers[account].entries.length) {
|
||||
@ -270,7 +267,14 @@ erpnext.GeneralLedger = wn.views.GridReport.extend({
|
||||
grouped_ledgers[account].closing.credit =
|
||||
grouped_ledgers[account].opening.credit
|
||||
+ grouped_ledgers[account].totals.credit;
|
||||
|
||||
|
||||
grouped_ledgers[account].opening =
|
||||
me.get_balance(me.account_by_name[me.account].debit_or_credit,
|
||||
grouped_ledgers[account].opening)
|
||||
grouped_ledgers[account].closing =
|
||||
me.get_balance(me.account_by_name[me.account].debit_or_credit,
|
||||
grouped_ledgers[account].closing)
|
||||
|
||||
out = out.concat([grouped_ledgers[account].opening])
|
||||
.concat(grouped_ledgers[account].entries)
|
||||
.concat([grouped_ledgers[account].totals,
|
||||
@ -280,6 +284,15 @@ erpnext.GeneralLedger = wn.views.GridReport.extend({
|
||||
});
|
||||
return [{id: "_blank_first", _no_format: true, debit: "", credit: ""}].concat(out);
|
||||
},
|
||||
|
||||
get_balance: function(debit_or_credit, balance) {
|
||||
if(debit_or_credit == "Debit") {
|
||||
balance.debit -= balance.credit; balance.credit = 0;
|
||||
} else {
|
||||
balance.credit -= balance.debit; balance.debit = 0;
|
||||
}
|
||||
return balance
|
||||
},
|
||||
|
||||
make_summary_row: function(label, item_account) {
|
||||
return {
|
||||
|
@ -1,4 +1,11 @@
|
||||
erpnext.updates = [
|
||||
["1st January 2013", [
|
||||
"Trial Balance: Added an option to see the report <b>without period closing entry</b>\
|
||||
You will find this checkbox at the bottom of the report.",
|
||||
"General Ledger: Now, on filter of any account group, you will have an option to see \
|
||||
the report <b>grouped by ledgers</b> under that group and with opening \
|
||||
and closing balance for each of them."
|
||||
]],
|
||||
["28th December 2012", [
|
||||
"Workflow: Added System for Multi-level approval before Submission. \
|
||||
<br>See video at <a href='https://www.youtube.com/watch?v=zuGv59_wJKw' \
|
||||
|
9
patches/january_2013/deprecate_stock_search_criteria.py
Normal file
9
patches/january_2013/deprecate_stock_search_criteria.py
Normal file
@ -0,0 +1,9 @@
|
||||
import webnotes
|
||||
|
||||
def execute():
|
||||
for sc in ["itemwise_price_list", "itemwise_receipt_details",
|
||||
"shortage_to_purchase_request", "stock_aging_report",
|
||||
"stock_ledger", "stock_level", "stock_report",
|
||||
"custom_test2", "custom_test3", "custom_test4",
|
||||
"test_so2", "test_so3"]:
|
||||
webnotes.delete_doc("Search Criteria", sc)
|
@ -578,4 +578,8 @@ patch_list = [
|
||||
'patch_module': 'patches.january_2013',
|
||||
'patch_file': 'remove_bad_permissions',
|
||||
},
|
||||
{
|
||||
'patch_module': 'patches.january_2013',
|
||||
'patch_file': 'deprecate_stock_search_criteria',
|
||||
},
|
||||
]
|
@ -53,10 +53,6 @@
|
||||
<b><a href="#Trash">Recycle Bin</a></b><br>
|
||||
<span class="help">Un-trash items</span>
|
||||
</p>
|
||||
<p>
|
||||
<b>Rename Master</b><br>
|
||||
<span class="help">Click on "Rename" on the sidebar of an item for renaming.</span>
|
||||
</p>
|
||||
</div>
|
||||
<div class="setup-column">
|
||||
<h3>Email and Notifications</h3>
|
||||
|
0
stock/report/item_wise_price_list/__init__.py
Normal file
0
stock/report/item_wise_price_list/__init__.py
Normal file
20
stock/report/item_wise_price_list/item_wise_price_list.txt
Normal file
20
stock/report/item_wise_price_list/item_wise_price_list.txt
Normal file
@ -0,0 +1,20 @@
|
||||
[
|
||||
{
|
||||
"owner": "Administrator",
|
||||
"docstatus": 0,
|
||||
"creation": "2013-01-02 11:56:33",
|
||||
"modified_by": "Administrator",
|
||||
"modified": "2013-01-02 12:00:38"
|
||||
},
|
||||
{
|
||||
"name": "__common__",
|
||||
"ref_doctype": "Item",
|
||||
"doctype": "Report",
|
||||
"is_standard": "Yes",
|
||||
"query": "select\n item.name as \"ID:Link/Item:120\", \n item.item_name as \"Item Name::120\", \n item_price.price_list_name as \"Price List::80\",\n item_price.ref_currency as \"Currency::40\", \n item_price.ref_rate as \"Rate:Currency:80\",\n item.description as \"Description::160\",\n item.item_group as \"Item Group:Link/Item Group:100\",\n item.brand as \"Brand::100\"\nfrom `tabItem` item, `tabItem Price` item_price\nwhere\n item_price.parent = item.name"
|
||||
},
|
||||
{
|
||||
"name": "Item-Wise Price List",
|
||||
"doctype": "Report"
|
||||
}
|
||||
]
|
@ -1 +0,0 @@
|
||||
from __future__ import unicode_literals
|
@ -1 +0,0 @@
|
||||
from __future__ import unicode_literals
|
@ -1,19 +0,0 @@
|
||||
// ERPNext - web based ERP (http://erpnext.com)
|
||||
// Copyright (C) 2012 Web Notes Technologies Pvt Ltd
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
report.customize_filters = function() {
|
||||
this.filter_fields_dict['Item'+FILTER_SEP +'ID'].df.in_first_page = 1;
|
||||
}
|
@ -1,27 +0,0 @@
|
||||
[
|
||||
{
|
||||
"owner": "harshada@webnotestech.com",
|
||||
"docstatus": 0,
|
||||
"creation": "2012-04-03 12:49:51",
|
||||
"modified_by": "Administrator",
|
||||
"modified": "2012-04-03 12:49:51"
|
||||
},
|
||||
{
|
||||
"parent_doc_type": "Item",
|
||||
"module": "Stock",
|
||||
"standard": "Yes",
|
||||
"sort_order": "DESC",
|
||||
"filters": "{'Item\u0001Saved':1,'Item Price\u0001Price List Name':'','Item Price\u0001Currency':''}",
|
||||
"doc_type": "Item Price",
|
||||
"name": "__common__",
|
||||
"doctype": "Search Criteria",
|
||||
"sort_by": "`tabItem`.`item_name`",
|
||||
"page_len": 50,
|
||||
"criteria_name": "Itemwise Price List",
|
||||
"columns": "Item\u0001Item Name,Item\u0001Item Group,Item Price\u0001Price List Name,Item Price\u0001Ref Rate,Item Price\u0001Currency"
|
||||
},
|
||||
{
|
||||
"name": "itemwise_price_list",
|
||||
"doctype": "Search Criteria"
|
||||
}
|
||||
]
|
@ -1 +0,0 @@
|
||||
from __future__ import unicode_literals
|
@ -1,25 +0,0 @@
|
||||
// ERPNext - web based ERP (http://erpnext.com)
|
||||
// Copyright (C) 2012 Web Notes Technologies Pvt Ltd
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
report.customize_filters = function() {
|
||||
this.filter_fields_dict['Purchase Receipt'+FILTER_SEP +'From Transaction Date'].df['report_default'] = sys_defaults.year_start_date;
|
||||
this.filter_fields_dict['Purchase Receipt'+FILTER_SEP +'To Transaction Date'].df['report_default'] = dateutil.obj_to_str(new Date());
|
||||
this.filter_fields_dict['Purchase Receipt'+FILTER_SEP +'From Posting Date'].df['report_default'] = sys_defaults.year_start_date;
|
||||
this.filter_fields_dict['Purchase Receipt'+FILTER_SEP +'To Posting Date'].df['report_default'] = dateutil.obj_to_str(new Date());
|
||||
this.filter_fields_dict['Purchase Receipt'+FILTER_SEP +'Company'].df['report_default'] = sys_defaults.company;
|
||||
this.filter_fields_dict['Purchase Receipt'+FILTER_SEP +'Fiscal Year'].df['report_default'] = sys_defaults.fiscal_year;
|
||||
|
||||
}
|
@ -1,27 +0,0 @@
|
||||
[
|
||||
{
|
||||
"owner": "Administrator",
|
||||
"docstatus": 0,
|
||||
"creation": "2012-04-11 13:16:55",
|
||||
"modified_by": "Administrator",
|
||||
"modified": "2012-04-13 11:16:40"
|
||||
},
|
||||
{
|
||||
"parent_doc_type": "Purchase Receipt",
|
||||
"module": "Stock",
|
||||
"standard": "Yes",
|
||||
"sort_order": "DESC",
|
||||
"filters": "{\"Purchase Receipt\\u0001Submitted\":1,\"Purchase Receipt\\u0001Status\":[\"\"],\"Purchase Receipt\\u0001Fiscal Year\":[\"\"]}",
|
||||
"doc_type": "Purchase Receipt Item",
|
||||
"name": "__common__",
|
||||
"doctype": "Search Criteria",
|
||||
"sort_by": "`tabPurchase Receipt`.`name`",
|
||||
"page_len": 50,
|
||||
"criteria_name": "Itemwise Receipt Details",
|
||||
"columns": "Purchase Receipt\u0001ID,Purchase Receipt\u0001Posting Date,Purchase Receipt Item\u0001Item Code,Purchase Receipt Item\u0001Item Name,Purchase Receipt Item\u0001Accepted Quantity,Purchase Receipt Item\u0001Rejected Quantity,Purchase Receipt Item\u0001UOM,Purchase Receipt Item\u0001Accepted Warehouse,Purchase Receipt Item\u0001Rejected Warehouse,Purchase Receipt Item\u0001Amount"
|
||||
},
|
||||
{
|
||||
"name": "itemwise_receipt_details",
|
||||
"doctype": "Search Criteria"
|
||||
}
|
||||
]
|
@ -1 +0,0 @@
|
||||
from __future__ import unicode_literals
|
@ -1,26 +0,0 @@
|
||||
[
|
||||
{
|
||||
"owner": "wasim@webnotestech.com",
|
||||
"docstatus": 0,
|
||||
"creation": "2012-03-30 14:50:44",
|
||||
"modified_by": "Administrator",
|
||||
"modified": "2012-03-30 14:50:44"
|
||||
},
|
||||
{
|
||||
"module": "Stock",
|
||||
"standard": "Yes",
|
||||
"sort_order": "DESC",
|
||||
"filters": "{'Item\u0001Saved':1}",
|
||||
"doctype": "Search Criteria",
|
||||
"doc_type": "Item",
|
||||
"name": "__common__",
|
||||
"sort_by": "`tabItem`.`name`",
|
||||
"page_len": 50,
|
||||
"criteria_name": "Shortage To Purchase Request",
|
||||
"columns": "Item\u0001ID,Item\u0001Item Name,Item\u0001Description,Item\u0001Lead Time Days"
|
||||
},
|
||||
{
|
||||
"name": "shortage_to_purchase_request",
|
||||
"doctype": "Search Criteria"
|
||||
}
|
||||
]
|
@ -1 +0,0 @@
|
||||
from __future__ import unicode_literals
|
@ -1,28 +0,0 @@
|
||||
// ERPNext - web based ERP (http://erpnext.com)
|
||||
// Copyright (C) 2012 Web Notes Technologies Pvt Ltd
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
report.customize_filters = function() {
|
||||
//this.hide_all_filters();
|
||||
|
||||
this.filter_fields_dict['Serial No'+FILTER_SEP +'Status'].df.filter_hide = 1;
|
||||
|
||||
this.filter_fields_dict['Serial No'+FILTER_SEP +'ID'].df.in_first_page = 1;
|
||||
this.filter_fields_dict['Serial No'+FILTER_SEP +'From Purchase Date'].df.in_first_page = 1;
|
||||
this.filter_fields_dict['Serial No'+FILTER_SEP +'To Purchase Date'].df.in_first_page = 1;
|
||||
}
|
||||
|
||||
//this.mytabs.items['Select Columns'].hide();
|
||||
this.mytabs.items['More Filters'].hide();
|
@ -1,32 +0,0 @@
|
||||
# ERPNext - web based ERP (http://erpnext.com)
|
||||
# Copyright (C) 2012 Web Notes Technologies Pvt Ltd
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
from __future__ import unicode_literals
|
||||
col = [['In Store Period (in days)', 'Data', '']]
|
||||
for c in col:
|
||||
colnames.append(str(c[0]))
|
||||
coltypes.append(str(c[1]))
|
||||
colwidths.append('150px')
|
||||
coloptions.append(str(c[2]))
|
||||
col_idx[str(c)] = len(colnames) - 1
|
||||
|
||||
import datetime
|
||||
for r in res:
|
||||
if r[col_idx['Purchase Date']]:
|
||||
dt = (datetime.date.today() - getdate(r[col_idx['Purchase Date']])).days
|
||||
else:
|
||||
dt = ''
|
||||
r.append(dt)
|
@ -1,27 +0,0 @@
|
||||
[
|
||||
{
|
||||
"owner": "ashwini@webnotestech.com",
|
||||
"docstatus": 0,
|
||||
"creation": "2012-04-03 12:49:53",
|
||||
"modified_by": "Administrator",
|
||||
"modified": "2012-04-03 12:49:53"
|
||||
},
|
||||
{
|
||||
"module": "Stock",
|
||||
"standard": "Yes",
|
||||
"sort_order": "DESC",
|
||||
"filters": "{'Serial No\u0001Saved':1,'Serial No\u0001Submitted':1,'Serial No\u0001Status':'In Store','Serial No\u0001Maintenance Status':''}",
|
||||
"doc_type": "Serial No",
|
||||
"name": "__common__",
|
||||
"add_cond": "`tabSerial No`.status = 'In Store'",
|
||||
"doctype": "Search Criteria",
|
||||
"sort_by": "`tabSerial No`.`name`",
|
||||
"page_len": 1000,
|
||||
"criteria_name": "Stock Aging Report",
|
||||
"columns": "Serial No\u0001ID,Serial No\u0001Item Code,Serial No\u0001Description,Serial No\u0001Item Group,Serial No\u0001Purchase Date"
|
||||
},
|
||||
{
|
||||
"name": "stock_aging_report",
|
||||
"doctype": "Search Criteria"
|
||||
}
|
||||
]
|
@ -1 +0,0 @@
|
||||
from __future__ import unicode_literals
|
@ -1,20 +0,0 @@
|
||||
// ERPNext - web based ERP (http://erpnext.com)
|
||||
// Copyright (C) 2012 Web Notes Technologies Pvt Ltd
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
report.customize_filters = function() {
|
||||
this.add_filter({fieldname:'item_name', label:'Item Name', fieldtype:'Data', options:'', parent:'Item'});
|
||||
this.add_filter({fieldname:'description', label:'Description', fieldtype:'Small Text', options: '', parent:'Item'});
|
||||
}
|
@ -1,29 +0,0 @@
|
||||
[
|
||||
{
|
||||
"owner": "Administrator",
|
||||
"docstatus": 0,
|
||||
"creation": "2012-09-14 11:30:39",
|
||||
"modified_by": "Administrator",
|
||||
"modified": "2012-11-06 10:27:11"
|
||||
},
|
||||
{
|
||||
"add_col": "`tabItem`.`item_name`\n`tabItem`.`description`",
|
||||
"module": "Stock",
|
||||
"standard": "Yes",
|
||||
"sort_order": "ASC",
|
||||
"add_tab": "`tabItem`",
|
||||
"doc_type": "Stock Ledger Entry",
|
||||
"name": "__common__",
|
||||
"filters": "{\"Stock Ledger Entry\\u0001Warehouse Type\":[],\"Stock Ledger Entry\\u0001Company\":[],\"Stock Ledger Entry\\u0001Is Cancelled\":[\"No\"],\"Stock Ledger Entry\\u0001Is Stock Entry\":[]}",
|
||||
"add_cond": "`tabItem`.`name` = `tabStock Ledger Entry`.`item_code`",
|
||||
"doctype": "Search Criteria",
|
||||
"sort_by": "`tabStock Ledger Entry`.`posting_date`, `tabStock Ledger Entry`.`posting_time`, `tabStock Ledger Entry`.`name`",
|
||||
"page_len": 50,
|
||||
"criteria_name": "Stock Ledger",
|
||||
"columns": "Stock Ledger Entry\u0001Item Code,Stock Ledger Entry\u0001Warehouse,Stock Ledger Entry\u0001Posting Date,Stock Ledger Entry\u0001Posting Time,Stock Ledger Entry\u0001Actual Quantity,Stock Ledger Entry\u0001Bin Actual Qty After Transaction,Stock Ledger Entry\u0001Voucher Type,Stock Ledger Entry\u0001Voucher No"
|
||||
},
|
||||
{
|
||||
"name": "stock_ledger",
|
||||
"doctype": "Search Criteria"
|
||||
}
|
||||
]
|
@ -1 +0,0 @@
|
||||
from __future__ import unicode_literals
|
@ -1,22 +0,0 @@
|
||||
// ERPNext - web based ERP (http://erpnext.com)
|
||||
// Copyright (C) 2012 Web Notes Technologies Pvt Ltd
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
report.customize_filters = function() {
|
||||
this.add_filter({fieldname:'item_name', label:'Item Name', fieldtype:'Data', options:'', parent:'Item', in_first_page : 0});
|
||||
this.add_filter({fieldname:'description', label:'Description', fieldtype:'Small Text', options: '', parent:'Item', in_first_page : 0});
|
||||
this.add_filter({fieldname:'item_group', label:'Item Group', fieldtype:'link', options: 'Item Group', parent:'Item', in_first_page : 1});
|
||||
this.add_filter({fieldname:'brand', label:'Brand', fieldtype:'link', options: 'Brand', parent:'Item', in_first_page : 1});
|
||||
}
|
@ -1,19 +0,0 @@
|
||||
# ERPNext - web based ERP (http://erpnext.com)
|
||||
# Copyright (C) 2012 Web Notes Technologies Pvt Ltd
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
from __future__ import unicode_literals
|
||||
colwidths[col_idx['Reserved Quantity']]= "120px"
|
||||
colwidths[col_idx['Ordered Quantity']] = "120px"
|
@ -1,29 +0,0 @@
|
||||
[
|
||||
{
|
||||
"owner": "Administrator",
|
||||
"docstatus": 0,
|
||||
"creation": "2012-04-03 12:49:53",
|
||||
"modified_by": "Administrator",
|
||||
"modified": "2012-04-03 12:49:53"
|
||||
},
|
||||
{
|
||||
"add_col": "`tabItem`.`item_name`\n`tabItem`.`description`",
|
||||
"module": "Stock",
|
||||
"standard": "Yes",
|
||||
"sort_order": "DESC",
|
||||
"add_tab": "`tabItem`",
|
||||
"doc_type": "Bin",
|
||||
"name": "__common__",
|
||||
"filters": "{}",
|
||||
"add_cond": "`tabItem`.name = `tabBin`.item_code",
|
||||
"doctype": "Search Criteria",
|
||||
"sort_by": "`tabBin`.`warehouse`",
|
||||
"page_len": 50,
|
||||
"criteria_name": "Stock Level",
|
||||
"columns": "Bin\u0001Warehouse,Bin\u0001Item Code,Bin\u0001UOM,Bin\u0001Reserved Quantity,Bin\u0001Actual Quantity,Bin\u0001Ordered Quantity,Bin\u0001Planned Qty,Bin\u0001Projected Qty,Bin\u0001Quantity Requested for Purchase,Bin\u0001Valuation Rate,Bin\u0001Stock Value"
|
||||
},
|
||||
{
|
||||
"name": "stock_level",
|
||||
"doctype": "Search Criteria"
|
||||
}
|
||||
]
|
@ -1 +0,0 @@
|
||||
from __future__ import unicode_literals
|
@ -1,89 +0,0 @@
|
||||
// ERPNext - web based ERP (http://erpnext.com)
|
||||
// Copyright (C) 2012 Web Notes Technologies Pvt Ltd
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
//233
|
||||
report.customize_filters = function() {
|
||||
this.mytabs.items['Select Columns'].hide()
|
||||
this.mytabs.items['More Filters'].hide()
|
||||
this.hide_all_filters();
|
||||
this.add_filter({fieldname:'based_on', label:'Based On', fieldtype:'Select', options:'Warehouse'+NEWLINE+'Item Code',ignore : 1,parent:'Stock Ledger Entry'});
|
||||
this.filter_fields_dict['Stock Ledger Entry'+FILTER_SEP +'To Posting Date'].df.filter_hide = 0;
|
||||
this.filter_fields_dict['Stock Ledger Entry'+FILTER_SEP +'Item Code'].df.filter_hide = 0;
|
||||
this.filter_fields_dict['Stock Ledger Entry'+FILTER_SEP +'Warehouse'].df.filter_hide = 0;
|
||||
this.filter_fields_dict['Stock Ledger Entry'+FILTER_SEP +'Warehouse Type'].df.filter_hide = 0;
|
||||
this.filter_fields_dict['Stock Ledger Entry'+FILTER_SEP +'From Posting Date'].df.filter_hide = 1;
|
||||
|
||||
this.filter_fields_dict['Stock Ledger Entry'+FILTER_SEP +'Item Code'].df.in_first_page = 1;
|
||||
this.filter_fields_dict['Stock Ledger Entry'+FILTER_SEP +'Warehouse'].df.in_first_page = 1;
|
||||
this.filter_fields_dict['Stock Ledger Entry'+FILTER_SEP +'Based On'].df.in_first_page = 1;
|
||||
this.filter_fields_dict['Stock Ledger Entry'+FILTER_SEP +'Warehouse Type'].df.in_first_page = 1;
|
||||
this.filter_fields_dict['Stock Ledger Entry'+FILTER_SEP +'To Posting Date'].df.in_first_page = 1;
|
||||
}
|
||||
|
||||
|
||||
report.get_query = function(){
|
||||
based_on = this.filter_fields_dict['Stock Ledger Entry'+FILTER_SEP+'Based On'].get_value();
|
||||
as_on = this.filter_fields_dict['Stock Ledger Entry'+FILTER_SEP+'To Posting Date'].get_value();
|
||||
warehouse = this.filter_fields_dict['Stock Ledger Entry'+FILTER_SEP+'Warehouse'].get_value();
|
||||
warehouse_type = this.filter_fields_dict['Stock Ledger Entry'+FILTER_SEP+'Warehouse Type'].get_value();
|
||||
item_code = this.filter_fields_dict['Stock Ledger Entry'+FILTER_SEP+'Item Code'].get_value();
|
||||
|
||||
cond = '';
|
||||
date_cond = '';
|
||||
tables = '';
|
||||
cols = '';
|
||||
group_by = '';
|
||||
ware_type_cond = '';
|
||||
war = '';
|
||||
if(!as_on) as_on = get_today();
|
||||
|
||||
date_cond = repl(' AND `tabStock Ledger Entry`.posting_date <= "%(as_on)s" ', {as_on:as_on});
|
||||
|
||||
if(warehouse_type.length > 0 && warehouse_type != ''){
|
||||
for(var i = 0; i<warehouse_type.length; i++) war += "'"+warehouse_type[i]+"',";
|
||||
ware_type_cond = repl(' AND `tabWarehouse`.warehouse_type IN (%(war)s)', {war: war.substr(0,war.length-1)})
|
||||
}
|
||||
|
||||
if(based_on.length == 1 && based_on[0]){
|
||||
if(based_on[0] == 'Item Code'){
|
||||
cols = '`tabItem`.name AS "Item Code", `tabItem`.item_name AS "Item Name", `tabItem`.description AS "Description", `tabItem`.stock_uom AS "Stock UOM"';
|
||||
cond = '(IFNULL(`tabItem`.`end_of_life`,"") = "" OR `tabItem`.`end_of_life` = "0000-00-00" OR `tabItem`.`end_of_life` > NOW()) AND `tabItem`.is_stock_item = "Yes"';
|
||||
if(item_code) cond += repl(' AND `tabItem`.name = %(item)s', {item:'"'+item_code+'"'});
|
||||
cond += ' AND `tabStock Ledger Entry`.item_code = `tabItem`.name'
|
||||
tables = '`tabItem`';
|
||||
group_by = '`tabStock Ledger Entry`.item_code';
|
||||
}
|
||||
else if(based_on[0] == 'Warehouse'){
|
||||
cols = '`tabWarehouse`.name AS "Warehouse", `tabWarehouse`.warehouse_type AS "Warehouse Type"';
|
||||
cond = '`tabWarehouse`.docstatus < 2'
|
||||
if(warehouse) cond += repl(' AND `tabWarehouse`.name = %(warehouse)s', {warehouse:'"'+warehouse+'"'});
|
||||
cond += repl(' AND `tabStock Ledger Entry`.warehouse = `tabWarehouse`.name %(ware_type_cond)s', {ware_type_cond:ware_type_cond})
|
||||
tables = '`tabWarehouse`';
|
||||
group_by = '`tabStock Ledger Entry`.warehouse';
|
||||
}
|
||||
} else {
|
||||
cols = '`tabItem`.name AS "Item Code", `tabItem`.item_name AS "Item Name", `tabItem`.description AS "Description", `tabItem`.stock_uom AS "Stock UOM", `tabWarehouse`.name AS "Warehouse", `tabWarehouse`.warehouse_type AS "Warehouse Type"';
|
||||
cond = '(IFNULL(`tabItem`.`end_of_life`,"") = "" OR `tabItem`.`end_of_life` = "0000-00-00" OR `tabItem`.`end_of_life` > NOW()) AND `tabItem`.is_stock_item = "Yes" AND `tabWarehouse`.docstatus < 2';
|
||||
if(item_code) cond += repl(" AND `tabItem`.name = %(item)s", {item:"'"+item_code+"'"});
|
||||
if(warehouse) cond += repl(" AND `tabWarehouse`.name = %(warehouse)s", {warehouse:"'"+warehouse+"'"});
|
||||
cond += repl(' AND `tabStock Ledger Entry`.item_code = `tabItem`.name AND `tabStock Ledger Entry`.warehouse = `tabWarehouse`.name %(ware_type_cond)s', {ware_type_cond:ware_type_cond})
|
||||
tables = '`tabItem`, `tabWarehouse`';
|
||||
group_by = '`tabStock Ledger Entry`.item_code, `tabStock Ledger Entry`.warehouse';
|
||||
}
|
||||
|
||||
q = repl("SELECT %(cols)s FROM %(tables)s, `tabStock Ledger Entry` WHERE %(cond)s %(date_cond)s GROUP BY %(group_by)s", {cols:cols, tables:tables, cond:cond, date_cond:date_cond, group_by:group_by});
|
||||
return q;
|
||||
}
|
@ -1,88 +0,0 @@
|
||||
# ERPNext - web based ERP (http://erpnext.com)
|
||||
# Copyright (C) 2012 Web Notes Technologies Pvt Ltd
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
from __future__ import unicode_literals
|
||||
cols, columns = [], []
|
||||
# Add columns
|
||||
# ------------
|
||||
based_on = filter_values.get('based_on').split(NEWLINE)
|
||||
if len(based_on) == 1 and based_on[0]:
|
||||
if based_on[0] == 'Item Code':
|
||||
cols = ["Item Code", "Item Name", "Description", "Stock UOM"]
|
||||
elif based_on[0] == 'Warehouse':
|
||||
cols = ["Warehouse", "Warehouse Type"]
|
||||
else:
|
||||
cols = ["Item Code", "Item Name", "Description", "Stock UOM", "Warehouse", "Warehouse Type"]
|
||||
|
||||
for d in cols:
|
||||
columns.append([d,'Data','150px',''])
|
||||
|
||||
columns.append(['Closing Balance','Currency','200px',''])
|
||||
columns.append(['Stock Value','Currency','150px',''])
|
||||
|
||||
posting_date = filter_values.get('posting_date1')
|
||||
if not posting_date: posting_date = nowdate()
|
||||
|
||||
for c in columns:
|
||||
colnames.append(c[0])
|
||||
coltypes.append(c[1])
|
||||
colwidths.append(c[2])
|
||||
coloptions.append(c[3])
|
||||
col_idx[c[0]] = len(colnames)-1
|
||||
|
||||
def get_values(msgprint, flt, posting_date, item_code = '', warehouse = ''):
|
||||
cl_bal, stock_val = 0,0
|
||||
if item_code and not warehouse:
|
||||
war_list = sql("select distinct warehouse from `tabStock Ledger Entry` where item_code = %s", item_code)
|
||||
for d in war_list:
|
||||
act = sql("select bin_aqat, stock_value from `tabStock Ledger Entry` where item_code = %s and warehouse = %s and ifnull(is_cancelled, 'No') = 'No' and timestamp(posting_date, posting_time) <= timestamp(%s, %s) Order by timestamp(posting_date, posting_time) DESC, name DESC LIMIT 1", (item_code, d[0], posting_date, '23:55'))
|
||||
cl_bal += act and flt(act[0][0]) or 0.00
|
||||
stock_val += act and flt(act[0][1]) or 0.00
|
||||
elif warehouse and not item_code:
|
||||
item_list = sql("select distinct item_code from `tabStock Ledger Entry` where warehouse = %s", warehouse)
|
||||
for d in item_list:
|
||||
act = sql("select bin_aqat, stock_value from `tabStock Ledger Entry` where item_code = %s and warehouse = %s and ifnull(is_cancelled, 'No') = 'No' and timestamp(posting_date, posting_time) <= timestamp(%s, %s) Order by timestamp(posting_date, posting_time) DESC, name DESC LIMIT 1", (d[0], warehouse, posting_date, '23:55'))
|
||||
cl_bal += act and flt(act[0][0]) or 0.00
|
||||
stock_val += act and flt(act[0][1]) or 0.00
|
||||
return cl_bal, stock_val
|
||||
|
||||
out=[]
|
||||
cl_bal,tot_stock = 0,0
|
||||
|
||||
for r in res:
|
||||
if len(based_on) == 1 and based_on[0]:
|
||||
if based_on[0] == 'Item Code': closing_balance, stock_value = get_values(msgprint, flt, posting_date, item_code = r[col_idx['Item Code']])
|
||||
elif based_on[0] == 'Warehouse': closing_balance, stock_value = get_values(msgprint, flt, posting_date, warehouse = r[col_idx['Warehouse']])
|
||||
r.append(closing_balance)
|
||||
r.append(stock_value)
|
||||
else:
|
||||
det = sql("select bin_aqat, stock_value from `tabStock Ledger Entry` where item_code = %s and warehouse = %s and ifnull(is_cancelled, 'No') = 'No' and timestamp(posting_date, posting_time) <= timestamp(%s, %s) Order by timestamp(posting_date, posting_time) DESC, name DESC LIMIT 1", (r[col_idx['Item Code']], r[col_idx['Warehouse']], posting_date, '23:55'))
|
||||
|
||||
r.append(det and flt(det[0][0]) or 0.00)
|
||||
r.append(det and flt(det[0][1]) or 0.00)
|
||||
cl_bal += flt(r[col_idx['Closing Balance']])
|
||||
tot_stock += flt(r[col_idx['Stock Value']])
|
||||
out.append(r)
|
||||
|
||||
# Add the totals row
|
||||
l_row = ['' for i in range(len(colnames))]
|
||||
if len(based_on) == 1 and based_on[0] == 'Warehouse':
|
||||
l_row[col_idx['Warehouse Type']] = '<b>TOTALS</b>'
|
||||
else:
|
||||
l_row[col_idx['Stock UOM']] = '<b>TOTALS</b>'
|
||||
l_row[col_idx['Closing Balance']] = cl_bal
|
||||
l_row[col_idx['Stock Value']] = tot_stock
|
||||
out.append(l_row)
|
@ -1,26 +0,0 @@
|
||||
[
|
||||
{
|
||||
"owner": "Administrator",
|
||||
"docstatus": 0,
|
||||
"creation": "2012-04-03 12:49:53",
|
||||
"modified_by": "Administrator",
|
||||
"modified": "2012-04-03 12:49:53"
|
||||
},
|
||||
{
|
||||
"module": "Stock",
|
||||
"standard": "Yes",
|
||||
"sort_order": "DESC",
|
||||
"filters": "{'Stock Ledger Entry\u0001Is Cancelled':'','Stock Ledger Entry\u0001Is Stock Entry':''}",
|
||||
"doctype": "Search Criteria",
|
||||
"doc_type": "Stock Ledger Entry",
|
||||
"name": "__common__",
|
||||
"sort_by": "`tabStock Ledger Entry`.`name`",
|
||||
"page_len": 50,
|
||||
"criteria_name": "Stock Report",
|
||||
"columns": "Stock Ledger Entry\u0001ID"
|
||||
},
|
||||
{
|
||||
"name": "stock_report",
|
||||
"doctype": "Search Criteria"
|
||||
}
|
||||
]
|
@ -16,11 +16,17 @@
|
||||
|
||||
cur_frm.cscript.refresh = function(doc) {
|
||||
erpnext.hide_naming_series();
|
||||
if(!doc.__islocal && !cint(doc.email_sent) && !doc.__unsaved) {
|
||||
if(!doc.__islocal && !cint(doc.email_sent) && !doc.__unsaved
|
||||
&& inList(wn.boot.profile.can_write, doc.doctype)) {
|
||||
cur_frm.add_custom_button('Send', function() {
|
||||
$c_obj(make_doclist(doc.doctype, doc.name), 'send_emails', '', function(r) {
|
||||
cur_frm.refresh();
|
||||
});
|
||||
})
|
||||
}
|
||||
|
||||
if(doc.__islocal && !doc.send_from) {
|
||||
cur_frm.set_value("send_from",
|
||||
repl("%(fullname)s <%(email)s>", wn.user_info(doc.owner)));
|
||||
}
|
||||
}
|
@ -20,6 +20,7 @@ import webnotes
|
||||
import webnotes.utils
|
||||
from webnotes.utils import cstr
|
||||
from webnotes.model.doc import Document
|
||||
from webnotes import _
|
||||
|
||||
class DocType():
|
||||
def __init__(self, d, dl):
|
||||
@ -51,7 +52,7 @@ class DocType():
|
||||
"""send emails to leads and customers"""
|
||||
if self.doc.email_sent:
|
||||
webnotes.msgprint("""Newsletter has already been sent""", raise_exception=1)
|
||||
|
||||
|
||||
self.all_recipients = []
|
||||
self.send_count = {}
|
||||
|
||||
@ -82,8 +83,11 @@ class DocType():
|
||||
", ".join(["%d %s(s)" % (self.send_count[s], s) for s in self.send_count]))
|
||||
|
||||
def test_send(self, doctype="Lead"):
|
||||
self.validate_send()
|
||||
|
||||
args = self.dt_map[doctype]
|
||||
sender = webnotes.utils.get_email_id(self.doc.owner)
|
||||
|
||||
sender = self.doc.send_from or webnotes.utils.get_email_id(self.doc.owner)
|
||||
recipients = self.doc.test_email_id.split(",")
|
||||
from webnotes.utils.email_lib.bulk import send
|
||||
send(recipients = recipients, sender = sender,
|
||||
@ -98,12 +102,14 @@ class DocType():
|
||||
return recipients
|
||||
|
||||
def send(self, query_key, doctype):
|
||||
self.validate_send()
|
||||
|
||||
webnotes.conn.auto_commit_on_many_writes = True
|
||||
if isinstance(query_key, basestring) and self.query_map.has_key(query_key):
|
||||
recipients = self.get_recipients(query_key)
|
||||
else:
|
||||
recipients = query_key
|
||||
sender = webnotes.utils.get_email_id(self.doc.owner)
|
||||
sender = self.doc.send_from or webnotes.utils.get_email_id(self.doc.owner)
|
||||
args = self.dt_map[doctype]
|
||||
self.send_count[doctype] = self.send_count.setdefault(doctype, 0) + \
|
||||
len(recipients)
|
||||
@ -112,7 +118,17 @@ class DocType():
|
||||
send(recipients = recipients, sender = sender,
|
||||
subject = self.doc.subject, message = self.doc.message,
|
||||
doctype = doctype, email_field = args["email_field"])
|
||||
|
||||
|
||||
def validate_send(self):
|
||||
if self.doc.fields.get("__islocal"):
|
||||
webnotes.msgprint(_("""Please save the Newsletter before sending."""),
|
||||
raise_exception=1)
|
||||
|
||||
import conf
|
||||
if getattr(conf, "status", None) == "Trial":
|
||||
webnotes.msgprint(_("""Sending newsletters is not allowed for Trial users, \
|
||||
to prevent abuse of this feature."""), raise_exception=1)
|
||||
|
||||
lead_naming_series = None
|
||||
def create_lead(email_id):
|
||||
"""create a lead if it does not exist"""
|
||||
|
@ -2,9 +2,9 @@
|
||||
{
|
||||
"owner": "Administrator",
|
||||
"docstatus": 0,
|
||||
"creation": "2012-12-07 15:15:31",
|
||||
"creation": "2013-01-01 13:46:34",
|
||||
"modified_by": "Administrator",
|
||||
"modified": "2013-01-01 10:54:40"
|
||||
"modified": "2013-01-02 13:47:36"
|
||||
},
|
||||
{
|
||||
"autoname": "naming_series:",
|
||||
@ -107,6 +107,15 @@
|
||||
"fieldtype": "Section Break",
|
||||
"permlevel": 0
|
||||
},
|
||||
{
|
||||
"description": "If specified, send the newsletter using this email address",
|
||||
"no_copy": 1,
|
||||
"doctype": "DocField",
|
||||
"label": "Send From",
|
||||
"fieldname": "send_from",
|
||||
"fieldtype": "Data",
|
||||
"permlevel": 0
|
||||
},
|
||||
{
|
||||
"doctype": "DocField",
|
||||
"label": "Subject",
|
||||
|
Loading…
x
Reference in New Issue
Block a user