Merge pull request #4220 from nabinhait/fix21
Don't delete tax template and pos profile while deleting company transactions
diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.py b/erpnext/accounts/doctype/journal_entry/journal_entry.py
index 9525a3a..9eaf1dd 100644
--- a/erpnext/accounts/doctype/journal_entry/journal_entry.py
+++ b/erpnext/accounts/doctype/journal_entry/journal_entry.py
@@ -498,14 +498,17 @@
if voucher_type=="Bank Entry":
account = frappe.db.get_value("Company", company, "default_bank_account")
if not account:
- account = frappe.db.get_value("Account", {"company": company, "account_type": "Bank", "is_group": 0})
+ account = frappe.db.get_value("Account",
+ {"company": company, "account_type": "Bank", "is_group": 0})
elif voucher_type=="Cash Entry":
account = frappe.db.get_value("Company", company, "default_cash_account")
if not account:
- account = frappe.db.get_value("Account", {"company": company, "account_type": "Cash", "is_group": 0})
+ account = frappe.db.get_value("Account",
+ {"company": company, "account_type": "Cash", "is_group": 0})
if account:
- account_details = frappe.db.get_value("Account", account, ["account_currency", "account_type"], as_dict=1)
+ account_details = frappe.db.get_value("Account", account,
+ ["account_currency", "account_type"], as_dict=1)
return {
"account": account,
"balance": get_balance_on(account),
diff --git a/erpnext/accounts/doctype/tax_rule/tax_rule.py b/erpnext/accounts/doctype/tax_rule/tax_rule.py
index bff1898..7b62082 100644
--- a/erpnext/accounts/doctype/tax_rule/tax_rule.py
+++ b/erpnext/accounts/doctype/tax_rule/tax_rule.py
@@ -109,7 +109,8 @@
def get_tax_template(posting_date, args):
"""Get matching tax rule"""
args = frappe._dict(args)
- conditions = []
+ conditions = ["""(from_date is null or from_date = '' or from_date <= '{0}')
+ and (to_date is null or to_date = '' or to_date >= '{0}')""".format(posting_date)]
for key, value in args.iteritems():
if key in "use_for_shopping_cart":
@@ -117,16 +118,16 @@
else:
conditions.append("ifnull({0}, '') in ('', '{1}')".format(key, frappe.db.escape(cstr(value))))
- matching = frappe.db.sql("""select * from `tabTax Rule`
+ tax_rule = frappe.db.sql("""select * from `tabTax Rule`
where {0}""".format(" and ".join(conditions)), as_dict = True)
- if not matching:
+ if not tax_rule:
return None
- for rule in matching:
+ for rule in tax_rule:
rule.no_of_keys_matched = 0
for key in args:
if rule.get(key): rule.no_of_keys_matched += 1
- rule = sorted(matching, lambda b, a: cmp(a.no_of_keys_matched, b.no_of_keys_matched) or cmp(a.priority, b.priority))[0]
+ rule = sorted(tax_rule, lambda b, a: cmp(a.no_of_keys_matched, b.no_of_keys_matched) or cmp(a.priority, b.priority))[0]
return rule.sales_tax_template or rule.purchase_tax_template
diff --git a/erpnext/hr/doctype/expense_claim/expense_claim.js b/erpnext/hr/doctype/expense_claim/expense_claim.js
index 1d405da..780cd70 100644
--- a/erpnext/hr/doctype/expense_claim/expense_claim.js
+++ b/erpnext/hr/doctype/expense_claim/expense_claim.js
@@ -18,24 +18,25 @@
jv.voucher_type = 'Bank Entry';
jv.company = cur_frm.doc.company;
jv.remark = 'Payment against Expense Claim: ' + cur_frm.doc.name;
- jv.fiscal_year = cur_frm.doc.fiscal_year;
var expense = cur_frm.doc.expenses || [];
for(var i = 0; i < expense.length; i++){
var d1 = frappe.model.add_child(jv, 'Journal Entry Account', 'accounts');
- d1.debit = expense[i].sanctioned_amount;
d1.account = expense[i].default_account;
+ d1.debit_in_account_currency = expense[i].sanctioned_amount;
d1.reference_type = cur_frm.doc.doctype;
d1.reference_name = cur_frm.doc.name;
}
// credit to bank
var d1 = frappe.model.add_child(jv, 'Journal Entry Account', 'accounts');
- d1.credit = cur_frm.doc.total_sanctioned_amount;
+ d1.credit_in_account_currency = cur_frm.doc.total_sanctioned_amount;
d1.reference_type = cur_frm.doc.doctype;
d1.reference_name = cur_frm.doc.name;
if(r.message) {
d1.account = r.message.account;
d1.balance = r.message.balance;
+ d1.account_currency = r.message.account_currency;
+ d1.account_type = r.message.account_type;
}
loaddoc('Journal Entry', jv.name);
diff --git a/erpnext/public/js/utils/party.js b/erpnext/public/js/utils/party.js
index 9173b71..cc6f112 100644
--- a/erpnext/public/js/utils/party.js
+++ b/erpnext/public/js/utils/party.js
@@ -26,7 +26,12 @@
}
}
if(!args) return;
-
+
+ if(frappe.meta.get_docfield(frm.doc.doctype, "taxes")) {
+ if(!erpnext.utils.validate_mandatory(frm, "Posting/Transaction Date",
+ args.posting_date, args.party_type=="Customer" ? "customer": "supplier")) return;
+ }
+
args.currency = frm.doc.currency;
args.company = frm.doc.company;
args.doctype = frm.doc.doctype;
@@ -64,6 +69,15 @@
if(r.message){
frm.set_value(display_field, r.message)
}
+
+ if(frappe.meta.get_docfield(frm.doc.doctype, "taxes")) {
+ if(!erpnext.utils.validate_mandatory(frm, "Customer/Supplier",
+ frm.doc.customer || frm.doc.supplier, address_field)) return;
+
+ if(!erpnext.utils.validate_mandatory(frm, "Posting/Transaction Date",
+ frm.doc.posting_date || frm.doc.transaction_date, address_field)) return;
+ } else return;
+
frappe.call({
method: "erpnext.accounts.party.set_taxes",
args: {
@@ -99,3 +113,13 @@
})
}
}
+
+erpnext.utils.validate_mandatory = function(frm, label, value, trigger_on) {
+ if(!value) {
+ frm.doc[trigger_on] = "";
+ refresh_field(trigger_on);
+ frappe.msgprint(__("Please enter {0} first", [label]));
+ return false;
+ }
+ return true;
+}
\ No newline at end of file
diff --git a/erpnext/stock/doctype/delivery_note_item/delivery_note_item.json b/erpnext/stock/doctype/delivery_note_item/delivery_note_item.json
index ceefaf5..96e2660 100644
--- a/erpnext/stock/doctype/delivery_note_item/delivery_note_item.json
+++ b/erpnext/stock/doctype/delivery_note_item/delivery_note_item.json
@@ -735,7 +735,7 @@
"ignore_user_permissions": 0,
"in_filter": 0,
"in_list_view": 1,
- "label": "Warehouse",
+ "label": "From Warehouse",
"no_copy": 0,
"oldfieldname": "warehouse",
"oldfieldtype": "Link",
@@ -755,13 +755,15 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
+ "depends_on": "",
+ "description": "",
"fieldname": "target_warehouse",
"fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
"in_filter": 0,
"in_list_view": 0,
- "label": "Target Warehouse",
+ "label": "To Warehouse (Optional)",
"no_copy": 0,
"options": "Warehouse",
"permlevel": 0,
@@ -831,7 +833,7 @@
"ignore_user_permissions": 0,
"in_filter": 0,
"in_list_view": 0,
- "label": "Available Qty at Warehouse",
+ "label": "Available Qty at From Warehouse",
"no_copy": 1,
"oldfieldname": "actual_qty",
"oldfieldtype": "Currency",
@@ -857,7 +859,7 @@
"ignore_user_permissions": 0,
"in_filter": 0,
"in_list_view": 0,
- "label": "Available Batch Qty at Warehouse",
+ "label": "Available Batch Qty at From Warehouse",
"no_copy": 1,
"permlevel": 0,
"precision": "",
@@ -1160,7 +1162,7 @@
"is_submittable": 0,
"issingle": 0,
"istable": 1,
- "modified": "2015-10-19 03:04:50.887288",
+ "modified": "2015-10-26 02:19:18.053222",
"modified_by": "Administrator",
"module": "Stock",
"name": "Delivery Note Item",
diff --git a/erpnext/stock/doctype/packed_item/packed_item.json b/erpnext/stock/doctype/packed_item/packed_item.json
index bfd78bf..88e11d7 100644
--- a/erpnext/stock/doctype/packed_item/packed_item.json
+++ b/erpnext/stock/doctype/packed_item/packed_item.json
@@ -155,7 +155,7 @@
"ignore_user_permissions": 0,
"in_filter": 0,
"in_list_view": 0,
- "label": "Warehouse",
+ "label": "From Warehouse",
"no_copy": 0,
"oldfieldname": "warehouse",
"oldfieldtype": "Link",
@@ -179,7 +179,7 @@
"ignore_user_permissions": 0,
"in_filter": 0,
"in_list_view": 0,
- "label": "Target Warehouse",
+ "label": "To Warehouse (Optional)",
"no_copy": 0,
"options": "Warehouse",
"permlevel": 0,
@@ -511,7 +511,7 @@
"is_submittable": 0,
"issingle": 0,
"istable": 1,
- "modified": "2015-10-12 07:38:58.896987",
+ "modified": "2015-10-26 02:25:47.718911",
"modified_by": "Administrator",
"module": "Stock",
"name": "Packed Item",
diff --git a/erpnext/stock/report/stock_projected_qty/stock_projected_qty.py b/erpnext/stock/report/stock_projected_qty/stock_projected_qty.py
index cdc5507..51e3836 100644
--- a/erpnext/stock/report/stock_projected_qty/stock_projected_qty.py
+++ b/erpnext/stock/report/stock_projected_qty/stock_projected_qty.py
@@ -4,7 +4,7 @@
from __future__ import unicode_literals
import frappe
from frappe import _
-from frappe.utils import flt
+from frappe.utils import flt, today
def execute(filters=None):
filters = frappe._dict(filters or {})
@@ -19,12 +19,19 @@
_("Shortage Qty") + ":Float:100"]
def get_data(filters):
- item_map = {}
+ bin_list = get_bin_list(filters)
+ item_map = get_item_map(filters.get("item_code"))
warehouse_company = {}
data = []
- for bin in get_bin_list(filters):
- item = item_map.setdefault(bin.item_code, frappe.get_doc("Item", bin.item_code))
+ for bin in bin_list:
+ item = item_map.get(bin.item_code)
+
+ if not item:
+ # likely an item that has reached its end of life
+ continue
+
+ # item = item_map.setdefault(bin.item_code, get_item(bin.item_code))
company = warehouse_company.setdefault(bin.warehouse, frappe.db.get_value("Warehouse", bin.warehouse, "company"))
if filters.brand and filters.brand != item.brand:
@@ -62,3 +69,35 @@
filters=bin_filters, order_by="item_code, warehouse")
return bin_list
+
+def get_item_map(item_code):
+ """Optimization: get only the item doc and re_order_levels table"""
+
+ condition = ""
+ if item_code:
+ condition = 'and item_code = "{0}"'.format(frappe.db.escape(item_code))
+
+ items = frappe.db.sql("""select * from `tabItem` item
+ where is_stock_item = 1
+ {condition}
+ and (end_of_life > %(today)s or end_of_life is null or end_of_life='0000-00-00')
+ and exists (select name from `tabBin` bin where bin.item_code=item.name)"""\
+ .format(condition=condition), {"today": today()}, as_dict=True)
+
+ condition = ""
+ if item_code:
+ condition = 'where parent="{0}"'.format(frappe.db.escape(item_code))
+
+ reorder_levels = frappe._dict()
+ for ir in frappe.db.sql("""select * from `tabItem Reorder` {condition}""".format(condition=condition), as_dict=1):
+ if ir.parent not in reorder_levels:
+ reorder_levels[ir.parent] = []
+
+ reorder_levels[ir.parent].append(ir)
+
+ item_map = frappe._dict()
+ for item in items:
+ item["reorder_levels"] = reorder_levels.get(item.name) or []
+ item_map[item.name] = item
+
+ return item_map