[fixes] nested set fix for warehouse, tree for accounts and cost center
This commit is contained in:
parent
0e47bfeb16
commit
554f6f70aa
@ -6,7 +6,8 @@ frappe.treeview_settings["Account"] = {
|
|||||||
fieldname: "comp",
|
fieldname: "comp",
|
||||||
fieldtype:"Select",
|
fieldtype:"Select",
|
||||||
options: $.map(locals[':Company'], function(c) { return c.name; }).sort(),
|
options: $.map(locals[':Company'], function(c) { return c.name; }).sort(),
|
||||||
label: __("Company")
|
label: __("Company"),
|
||||||
|
default: frappe.defaults.get_default('company') ? frappe.defaults.get_default('company'): ""
|
||||||
}],
|
}],
|
||||||
root_label: "Accounts",
|
root_label: "Accounts",
|
||||||
get_tree_nodes: 'erpnext.accounts.page.accounts_browser.accounts_browser.get_children',
|
get_tree_nodes: 'erpnext.accounts.page.accounts_browser.accounts_browser.get_children',
|
||||||
@ -24,14 +25,28 @@ frappe.treeview_settings["Account"] = {
|
|||||||
{fieldtype:'Check', fieldname:'is_group', label:__('Is Group'),
|
{fieldtype:'Check', fieldname:'is_group', label:__('Is Group'),
|
||||||
description: __('Further accounts can be made under Groups, but entries can be made against non-Groups')},
|
description: __('Further accounts can be made under Groups, but entries can be made against non-Groups')},
|
||||||
{fieldtype:'Select', fieldname:'root_type', label:__('Root Type'),
|
{fieldtype:'Select', fieldname:'root_type', label:__('Root Type'),
|
||||||
options: ['Asset', 'Liability', 'Equity', 'Income', 'Expense'].join('\n'),
|
options: ['Asset', 'Liability', 'Equity', 'Income', 'Expense'].join('\n')},
|
||||||
},
|
|
||||||
{fieldtype:'Select', fieldname:'account_type', label:__('Account Type'),
|
{fieldtype:'Select', fieldname:'account_type', label:__('Account Type'),
|
||||||
options: ['', 'Bank', 'Cash', 'Warehouse', 'Tax', 'Chargeable'].join('\n'),
|
options: ['', 'Bank', 'Cash', 'Warehouse', 'Tax', 'Chargeable'].join('\n'),
|
||||||
description: __("Optional. This setting will be used to filter in various transactions.") },
|
description: __("Optional. This setting will be used to filter in various transactions."),
|
||||||
{fieldtype:'Float', fieldname:'tax_rate', label:__('Tax Rate')},
|
depends_on: 'eval:doc.is_group==1'},
|
||||||
{fieldtype:'Link', fieldname:'warehouse', label:__('Warehouse'), options:"Warehouse"},
|
{fieldtype:'Float', fieldname:'tax_rate', label:__('Tax Rate'),
|
||||||
|
depends_on: 'eval:doc.is_group==1&&doc.account_type=="Tax"'},
|
||||||
|
{fieldtype:'Link', fieldname:'warehouse', label:__('Warehouse'), options:"Warehouse",
|
||||||
|
depends_on: 'eval:(doc.is_group==1&&doc.account_type=="Warehouse")'},
|
||||||
{fieldtype:'Link', fieldname:'account_currency', label:__('Currency'), options:"Currency",
|
{fieldtype:'Link', fieldname:'account_currency', label:__('Currency'), options:"Currency",
|
||||||
description: __("Optional. Sets company's default currency, if not specified.")}
|
description: __("Optional. Sets company's default currency, if not specified.")}
|
||||||
]
|
],
|
||||||
|
onrender: function(node) {
|
||||||
|
var dr_or_cr = node.data.balance < 0 ? "Cr" : "Dr";
|
||||||
|
if (node.data && node.data.balance!==undefined) {
|
||||||
|
$('<span class="balance-area pull-right text-muted small">'
|
||||||
|
+ (node.data.balance_in_account_currency ?
|
||||||
|
(format_currency(Math.abs(node.data.balance_in_account_currency),
|
||||||
|
node.data.account_currency) + " / ") : "")
|
||||||
|
+ format_currency(Math.abs(node.data.balance), node.data.company_currency)
|
||||||
|
+ " " + dr_or_cr
|
||||||
|
+ '</span>').insertBefore(node.$ul);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
@ -6,6 +6,7 @@ frappe.treeview_settings["Cost Center"] = {
|
|||||||
fieldtype:"Select",
|
fieldtype:"Select",
|
||||||
options: $.map(locals[':Company'], function(c) { return c.name; }).sort(),
|
options: $.map(locals[':Company'], function(c) { return c.name; }).sort(),
|
||||||
label: __("Company"),
|
label: __("Company"),
|
||||||
|
default: frappe.defaults.get_default('company') ? frappe.defaults.get_default('company'): ""
|
||||||
}],
|
}],
|
||||||
root_label: "Cost Centers",
|
root_label: "Cost Centers",
|
||||||
get_tree_nodes: 'erpnext.accounts.page.accounts_browser.accounts_browser.get_children',
|
get_tree_nodes: 'erpnext.accounts.page.accounts_browser.accounts_browser.get_children',
|
||||||
|
@ -2,17 +2,9 @@ import frappe
|
|||||||
from frappe import _
|
from frappe import _
|
||||||
|
|
||||||
def execute():
|
def execute():
|
||||||
if not frappe.db.exists("Warehouse", {"warehouse_name": _("Warehouses")}):
|
|
||||||
parent_warehouse = frappe.get_doc({
|
|
||||||
"doctype": "Warehouse",
|
|
||||||
"warehouse_name": _("Warehouses"),
|
|
||||||
"is_group": "Yes"
|
|
||||||
}).insert(ignore_permissions=True)
|
|
||||||
|
|
||||||
for warehouse in frappe.db.sql_list("""select name from tabWarehouse
|
for warehouse in frappe.db.sql_list("""select name from tabWarehouse
|
||||||
where name != %s order by name asc""", "Warehouses - SI"):
|
order by company asc, name asc"""):
|
||||||
print warehouse
|
|
||||||
warehouse = frappe.get_doc("Warehouse", warehouse)
|
warehouse = frappe.get_doc("Warehouse", warehouse)
|
||||||
warehouse.is_group = "No"
|
warehouse.is_group = "No"
|
||||||
warehouse.parent_warehouse = parent_warehouse.name
|
warehouse.parent_warehouse = ""
|
||||||
warehouse.save(ignore_permissions=True)
|
warehouse.save(ignore_permissions=True)
|
@ -87,7 +87,7 @@ class Company(Document):
|
|||||||
.format(self.country.lower()))(self)
|
.format(self.country.lower()))(self)
|
||||||
|
|
||||||
def create_default_warehouses(self):
|
def create_default_warehouses(self):
|
||||||
for wh_detail in [{"warehouse_name": _("Warehouses"), "is_group": "Yes"},
|
for wh_detail in [
|
||||||
{"warehouse_name": _("Stores"), "is_group": "No"},
|
{"warehouse_name": _("Stores"), "is_group": "No"},
|
||||||
{"warehouse_name": _("Work In Progress"), "is_group": "No"},
|
{"warehouse_name": _("Work In Progress"), "is_group": "No"},
|
||||||
{"warehouse_name": _("Finished Goods"), "is_group": "No"}]:
|
{"warehouse_name": _("Finished Goods"), "is_group": "No"}]:
|
||||||
@ -101,8 +101,7 @@ class Company(Document):
|
|||||||
"warehouse_name": wh_detail["warehouse_name"],
|
"warehouse_name": wh_detail["warehouse_name"],
|
||||||
"is_group": wh_detail["is_group"],
|
"is_group": wh_detail["is_group"],
|
||||||
"company": self.name,
|
"company": self.name,
|
||||||
"parent_warehouse": "" if wh_detail["is_group"] == "Yes" \
|
"parent_warehouse": "",
|
||||||
else "{0} - {1}".format(_("Warehouses"), self.abbr),
|
|
||||||
"create_account_under": stock_group
|
"create_account_under": stock_group
|
||||||
})
|
})
|
||||||
warehouse.flags.ignore_permissions = True
|
warehouse.flags.ignore_permissions = True
|
||||||
|
@ -165,3 +165,43 @@ class Warehouse(NestedSet):
|
|||||||
|
|
||||||
frappe.db.set_value("Stock Settings", None, "allow_negative_stock", existing_allow_negative_stock)
|
frappe.db.set_value("Stock Settings", None, "allow_negative_stock", existing_allow_negative_stock)
|
||||||
frappe.db.auto_commit_on_many_writes = 0
|
frappe.db.auto_commit_on_many_writes = 0
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
|
def get_children():
|
||||||
|
from erpnext.stock.utils import get_stock_value_on
|
||||||
|
ctype = frappe.local.form_dict.get('ctype')
|
||||||
|
company = frappe.local.form_dict.get('comp')
|
||||||
|
|
||||||
|
parent_field = 'parent_' + ctype.lower().replace(' ', '_')
|
||||||
|
parent = frappe.form_dict.get("parent") or ""
|
||||||
|
|
||||||
|
if parent == "Warehouses":
|
||||||
|
parent = ""
|
||||||
|
|
||||||
|
warehouses = frappe.db.sql("""select name as value,
|
||||||
|
if(is_group='Yes', 1, 0) as expandable
|
||||||
|
from `tab{ctype}`
|
||||||
|
where docstatus < 2
|
||||||
|
and ifnull(`{parent_field}`,'') = %s and `company` = %s
|
||||||
|
order by name""".format(ctype=frappe.db.escape(ctype), parent_field=frappe.db.escape(parent_field)),
|
||||||
|
(parent, company), as_dict=1)
|
||||||
|
|
||||||
|
# return warehouses
|
||||||
|
for wh in warehouses:
|
||||||
|
wh["balance"] = get_stock_value_on(warehouse=wh.value)
|
||||||
|
return warehouses
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
|
def add_node():
|
||||||
|
ctype = frappe.form_dict.get('ctype')
|
||||||
|
parent_field = 'parent_' + ctype.lower().replace(' ', '_')
|
||||||
|
name_field = ctype.lower().replace(' ', '_') + '_name'
|
||||||
|
|
||||||
|
doc = frappe.new_doc(ctype)
|
||||||
|
doc.update({
|
||||||
|
name_field: frappe.form_dict['name_field'],
|
||||||
|
parent_field: frappe.form_dict['parent'],
|
||||||
|
"is_group": frappe.form_dict['is_group']
|
||||||
|
})
|
||||||
|
|
||||||
|
doc.save()
|
||||||
|
@ -1,4 +1,20 @@
|
|||||||
frappe.treeview_settings['Warehouse'] = {
|
frappe.treeview_settings['Warehouse'] = {
|
||||||
get_tree_nodes: "erpnext.selling.page.sales_browser.sales_browser.get_children",
|
get_tree_nodes: "erpnext.stock.doctype.warehouse.warehouse.get_children",
|
||||||
add_tree_node: "erpnext.selling.page.sales_browser.sales_browser.add_node"
|
add_tree_node: "erpnext.stock.doctype.warehouse.warehouse.add_node",
|
||||||
|
get_tree_root: false,
|
||||||
|
root_label: "Warehouses",
|
||||||
|
filters: [{
|
||||||
|
fieldname: "comp",
|
||||||
|
fieldtype:"Select",
|
||||||
|
options: $.map(locals[':Company'], function(c) { return c.name; }).sort(),
|
||||||
|
label: __("Company"),
|
||||||
|
default: frappe.defaults.get_default('company') ? frappe.defaults.get_default('company'): ""
|
||||||
|
}],
|
||||||
|
onrender: function(node) {
|
||||||
|
if (node.data && node.data.balance!==undefined) {
|
||||||
|
$('<span class="balance-area pull-right text-muted small">'
|
||||||
|
+ format_currency(Math.abs(node.data.balance), node.data.company_currency)
|
||||||
|
+ '</span>').insertBefore(node.$ul);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
@ -15,6 +15,16 @@ def get_stock_value_on(warehouse=None, posting_date=None, item_code=None):
|
|||||||
values, condition = [posting_date], ""
|
values, condition = [posting_date], ""
|
||||||
|
|
||||||
if warehouse:
|
if warehouse:
|
||||||
|
|
||||||
|
wh = frappe.get_doc("Warehouse", warehouse)
|
||||||
|
|
||||||
|
if wh.is_group == "Yes":
|
||||||
|
values.extend([wh.lft, wh.rgt])
|
||||||
|
condition += "and exists (\
|
||||||
|
select name from `tabWarehouse` wh where wh.name = sle.warehouse\
|
||||||
|
and wh.lft >= %s and wh.rgt <= %s)"
|
||||||
|
|
||||||
|
else:
|
||||||
values.append(warehouse)
|
values.append(warehouse)
|
||||||
condition += " AND warehouse = %s"
|
condition += " AND warehouse = %s"
|
||||||
|
|
||||||
@ -23,15 +33,15 @@ def get_stock_value_on(warehouse=None, posting_date=None, item_code=None):
|
|||||||
condition.append(" AND item_code = %s")
|
condition.append(" AND item_code = %s")
|
||||||
|
|
||||||
stock_ledger_entries = frappe.db.sql("""
|
stock_ledger_entries = frappe.db.sql("""
|
||||||
SELECT item_code, stock_value
|
SELECT item_code, stock_value, name, warehouse
|
||||||
FROM `tabStock Ledger Entry`
|
FROM `tabStock Ledger Entry` sle
|
||||||
WHERE posting_date <= %s {0}
|
WHERE posting_date <= %s {0}
|
||||||
ORDER BY timestamp(posting_date, posting_time) DESC, name DESC
|
ORDER BY timestamp(posting_date, posting_time) DESC, name DESC
|
||||||
""".format(condition), values, as_dict=1)
|
""".format(condition), values, as_dict=1)
|
||||||
|
|
||||||
sle_map = {}
|
sle_map = {}
|
||||||
for sle in stock_ledger_entries:
|
for sle in stock_ledger_entries:
|
||||||
sle_map.setdefault(sle.item_code, flt(sle.stock_value))
|
sle_map[sle.item_code] = sle_map.get(sle.item_code, 0.0) + flt(sle.stock_value)
|
||||||
|
|
||||||
return sum(sle_map.values())
|
return sum(sle_map.values())
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user