diff --git a/accounts/doctype/account/account.py b/accounts/doctype/account/account.py index 1f2d060bdba..992c4dc48b1 100644 --- a/accounts/doctype/account/account.py +++ b/accounts/doctype/account/account.py @@ -192,41 +192,40 @@ class DocType: if self.check_gle_exists(): msgprint("""Account with existing transaction (Sales Invoice / Purchase Invoice / \ - Journal Voucher) can not be trashed""", raise_exception=1) + Journal Voucher) can not be deleted""", raise_exception=1) if self.check_if_child_exists(): - msgprint("Child account exists for this account. You can not trash this account.", + msgprint("Child account exists for this account. You can not delete this account.", raise_exception=1) def on_trash(self): self.validate_trash() self.update_nsm_model() - - def on_rename(self, new, old, merge=False): - company_abbr = webnotes.conn.get_value("Company", self.doc.company, "abbr") - parts = new.split(" - ") - - if parts[-1].lower() != company_abbr.lower(): - parts.append(company_abbr) - # rename account name - new_account_name = " - ".join(parts[:-1]) - webnotes.conn.sql("update `tabAccount` set account_name = %s where name = %s", (new_account_name, old)) + def before_rename(self, old, new, merge=False): + # Add company abbr if not provided + from setup.doctype.company.company import get_name_with_abbr + new_account = get_name_with_abbr(new, self.doc.company) + # Validate properties before merging if merge: - new_name = " - ".join(parts) - val = list(webnotes.conn.get_value("Account", new_name, + val = list(webnotes.conn.get_value("Account", new_account, ["group_or_ledger", "debit_or_credit", "is_pl_account"])) if val != [self.doc.group_or_ledger, self.doc.debit_or_credit, self.doc.is_pl_account]: - msgprint(_("""Merging is only possible if following \ + webnotes.throw(_("""Merging is only possible if following \ properties are same in both records. - Group or Ledger, Debit or Credit, Is PL Account"""), raise_exception=1) + Group or Ledger, Debit or Credit, Is PL Account""")) + + return new_account + def after_rename(self, old, new, merge=False): + if not merge: + webnotes.conn.set_value("Account", new, "account_name", + " - ".join(new.split(" - ")[:-1])) + else: from webnotes.utils.nestedset import rebuild_tree rebuild_tree("Account", "parent_account") - return " - ".join(parts) - def get_master_name(doctype, txt, searchfield, start, page_len, filters): conditions = (" and company='%s'"% filters["company"]) if doctype == "Warehouse" else "" diff --git a/accounts/doctype/cost_center/cost_center.py b/accounts/doctype/cost_center/cost_center.py index 4900edd7f15..692d47e5aed 100644 --- a/accounts/doctype/cost_center/cost_center.py +++ b/accounts/doctype/cost_center/cost_center.py @@ -16,7 +16,7 @@ class DocType(DocTypeNestedSet): def autoname(self): company_abbr = webnotes.conn.sql("select abbr from tabCompany where name=%s", self.doc.company)[0][0] - self.doc.name = self.doc.cost_center_name.strip() + ' - ' + company_abbr + self.doc.name = self.doc.cost_center_name.strip() + ' - ' + company_abbr def validate_mandatory(self): if not self.doc.group_or_ledger: @@ -73,18 +73,20 @@ class DocType(DocTypeNestedSet): self.validate_mandatory() self.validate_budget_details() - def on_rename(self, new, old, merge=False): - company_abbr = webnotes.conn.get_value("Company", self.doc.company, "abbr") - parts = new.split(" - ") - - if parts[-1].lower() != company_abbr.lower(): - parts.append(company_abbr) - - # rename account name - cost_center_name = " - ".join(parts[:-1]) - webnotes.conn.sql("update `tabCost Center` set cost_center_name = %s where name = %s", \ - (cost_center_name, old)) + def before_rename(self, olddn, newdn, merge=False): + # Add company abbr if not provided + from setup.doctype.company.company import get_name_with_abbr + new_cost_center = get_name_with_abbr(newdn, self.doc.company) + + # Validate properties before merging + super(DocType, self).before_rename(olddn, new_cost_center, merge, "group_or_ledger") + + return new_cost_center + + def after_rename(self, olddn, newdn, merge=False): + if not merge: + webnotes.conn.set_value("Cost Center", newdn, "cost_center_name", + " - ".join(newdn.split(" - ")[:-1])) + else: + super(DocType, self).after_rename(olddn, newdn, merge) - super(DocType, self).on_rename(new, old, merge, "group_or_ledger") - - return " - ".join(parts) diff --git a/accounts/doctype/purchase_taxes_and_charges_master/purchase_taxes_and_charges_master.js b/accounts/doctype/purchase_taxes_and_charges_master/purchase_taxes_and_charges_master.js index e8333cba865..e1a0d14dccf 100644 --- a/accounts/doctype/purchase_taxes_and_charges_master/purchase_taxes_and_charges_master.js +++ b/accounts/doctype/purchase_taxes_and_charges_master/purchase_taxes_and_charges_master.js @@ -29,6 +29,11 @@ cur_frm.pformat.purchase_tax_details= function(doc){ var new_val = flt(val)/flt(doc.conversion_rate); return new_val; } + + function print_hide(fieldname) { + var doc_field = wn.meta.get_docfield(doc.doctype, fieldname, doc.name); + return doc_field.print_hide; + } var cl = getchildren('Purchase Taxes and Charges',doc.name,'purchase_tax_details'); @@ -38,18 +43,21 @@ cur_frm.pformat.purchase_tax_details= function(doc){ // main table out +='' - +make_row('Net Total',convert_rate(doc.net_total),1); - + if(!print_hide('net_total')) { + out += make_row('Net Total', convert_rate(doc.net_total), 1); + } + // add rows if(cl.length){ for(var i=0;i 0) else 0 payment_received = invoiced_amount - outstanding_amount - row = [gle.posting_date, gle.account, self.get_customer(gle.account), - gle.voucher_type, gle.voucher_no, gle.remarks, due_date, - self.get_territory(gle.account), invoiced_amount, payment_received, + row = [gle.posting_date, gle.account, + gle.voucher_type, gle.voucher_no, due_date, + invoiced_amount, payment_received, outstanding_amount] entry_date = due_date if self.filters.ageing_based_on=="Due Date" \ else gle.posting_date row += get_ageing_data(self.age_as_on, entry_date, outstanding_amount) + row += [self.get_customer(gle.account), self.get_territory(gle.account), gle.remarks] data.append(row) + + for i in range(0,len(data)): + data[i].insert(4, """""" \ + % ("/".join(["#Form", data[i][2], data[i][3]]),)) + return data def get_entries_after(self, report_date): @@ -157,4 +164,4 @@ def get_ageing_data(age_as_on, entry_date, outstanding_amount): if index is None: index = 3 outstanding_range[index] = outstanding_amount - return [age] + outstanding_range \ No newline at end of file + return [age] + outstanding_range diff --git a/accounts/report/budget_variance_report/budget_variance_report.py b/accounts/report/budget_variance_report/budget_variance_report.py index 1f426c0135a..2cbbd622e60 100644 --- a/accounts/report/budget_variance_report/budget_variance_report.py +++ b/accounts/report/budget_variance_report/budget_variance_report.py @@ -73,10 +73,10 @@ def get_costcenter_target_details(filters): def get_target_distribution_details(filters): target_details = {} - for d in webnotes.conn.sql("""select bd.name, bdd.month, bdd.percentage_allocation \ + for d in webnotes.conn.sql("""select bd.name, bdd.month, bdd.percentage_allocation from `tabBudget Distribution Detail` bdd, `tabBudget Distribution` bd where bdd.parent=bd.name and bd.fiscal_year=%s""", (filters["fiscal_year"]), as_dict=1): - target_details.setdefault(d.name, {}).setdefault(d.month, d.percentage_allocation) + target_details.setdefault(d.name, {}).setdefault(d.month, flt(d.percentage_allocation)) return target_details @@ -113,10 +113,11 @@ def get_costcenter_account_month_map(filters): })) tav_dict = cam_map[ccd.name][ccd.account][month] - month_percentage = ccd.distribution_id and \ - tdd.get(ccd.distribution_id, {}).get(month, 0) or 100.0/12 + + month_percentage = tdd.get(ccd.distribution_id, {}).get(month, 0) \ + if ccd.distribution_id else 100.0/12 - tav_dict.target = flt(ccd.budget_allocated) * month_percentage /100 + tav_dict.target = flt(ccd.budget_allocated) * month_percentage / 100 for ad in actual_details.get(ccd.name, {}).get(ccd.account, []): if ad.month_name == month: diff --git a/buying/doctype/purchase_order/purchase_order.js b/buying/doctype/purchase_order/purchase_order.js index a0bac3fc01c..dad2864ab24 100644 --- a/buying/doctype/purchase_order/purchase_order.js +++ b/buying/doctype/purchase_order/purchase_order.js @@ -23,8 +23,8 @@ erpnext.buying.PurchaseOrderController = erpnext.buying.BuyingController.extend( cur_frm.dashboard.add_progress(cint(doc.per_billed) + wn._("% Billed"), doc.per_billed); + cur_frm.add_custom_button('Send SMS', cur_frm.cscript.send_sms); - cur_frm.appframe.add_button(wn._('Send SMS'), cur_frm.cscript['Send SMS'], "icon-mobile-phone"); if(flt(doc.per_received, 2) < 100) cur_frm.add_custom_button(wn._('Make Purchase Receipt'), this.make_purchase_receipt); if(flt(doc.per_billed, 2) < 100) diff --git a/buying/doctype/supplier/supplier.py b/buying/doctype/supplier/supplier.py index 46abe899fc3..f60d4dd191f 100644 --- a/buying/doctype/supplier/supplier.py +++ b/buying/doctype/supplier/supplier.py @@ -148,29 +148,21 @@ class DocType(TransactionBase): self.delete_supplier_contact() self.delete_supplier_account() - def on_rename(self, new, old, merge=False): + def after_rename(self, old, new, merge=False): #update supplier_name if not naming series if webnotes.defaults.get_global_default('supp_master_name') == 'Supplier Name': - update_fields = [ - ('Supplier', 'name'), - ('Address', 'supplier'), - ('Contact', 'supplier'), - ('Purchase Invoice', 'supplier'), - ('Purchase Order', 'supplier'), - ('Purchase Receipt', 'supplier'), - ('Serial No', 'supplier')] - for rec in update_fields: - webnotes.conn.sql("update `tab%s` set supplier_name = %s where `%s` = %s" % \ - (rec[0], '%s', rec[1], '%s'), (new, old)) + webnotes.conn.set(self.doc, "supplier_name", new) for account in webnotes.conn.sql("""select name, account_name from tabAccount where master_name=%s and master_type='Supplier'""", old, as_dict=1): if account.account_name != new: - webnotes.rename_doc("Account", account.name, new, merge=merge) + merge_account = True if merge and webnotes.conn.get_value("Account", + {"master_name": new, "master_type": "Supplier"}) else False + webnotes.rename_doc("Account", account.name, new, merge=merge_account) #update master_name in doctype account webnotes.conn.sql("""update `tabAccount` set master_name = %s, - master_type = 'Supplier' where master_name = %s""" , (new,old)) + master_type = 'Supplier' where master_name = %s""" , (new, old)) @webnotes.whitelist() def get_dashboard_info(supplier): diff --git a/buying/utils.py b/buying/utils.py index a0c150d2213..0d9c8fa8385 100644 --- a/buying/utils.py +++ b/buying/utils.py @@ -4,7 +4,7 @@ from __future__ import unicode_literals import webnotes from webnotes import msgprint, _ -from webnotes.utils import getdate, flt, add_days +from webnotes.utils import getdate, flt, add_days, cstr import json @webnotes.whitelist() @@ -94,7 +94,6 @@ def _get_price_list_rate(args, item_bean, meta): (args.buying_price_list, args.item_code), as_dict=1) if price_list_rate: - from utilities.transaction_base import validate_currency validate_currency(args, item_bean.doc, meta) out.import_ref_rate = flt(price_list_rate[0].ref_rate) * \ @@ -132,7 +131,7 @@ def _validate_item_details(args, item): _("Please select a sub-contracted item or do not sub-contract the transaction."), raise_exception=True) -def get_last_purchase_details(item_code, doc_name, conversion_rate=1.0): +def get_last_purchase_details(item_code, doc_name=None, conversion_rate=1.0): """returns last purchase details in stock uom""" # get last purchase order item details last_purchase_order = webnotes.conn.sql("""\ @@ -143,7 +142,7 @@ def get_last_purchase_details(item_code, doc_name, conversion_rate=1.0): where po.docstatus = 1 and po_item.item_code = %s and po.name != %s and po.name = po_item.parent order by po.transaction_date desc, po.name desc - limit 1""", (item_code, doc_name), as_dict=1) + limit 1""", (item_code, cstr(doc_name)), as_dict=1) # get last purchase receipt item details last_purchase_receipt = webnotes.conn.sql("""\ @@ -154,7 +153,7 @@ def get_last_purchase_details(item_code, doc_name, conversion_rate=1.0): where pr.docstatus = 1 and pr_item.item_code = %s and pr.name != %s and pr.name = pr_item.parent order by pr.posting_date desc, pr.posting_time desc, pr.name desc - limit 1""", (item_code, doc_name), as_dict=1) + limit 1""", (item_code, cstr(doc_name)), as_dict=1) purchase_order_date = getdate(last_purchase_order and last_purchase_order[0].transaction_date \ or "1900-01-01") diff --git a/controllers/stock_controller.py b/controllers/stock_controller.py index 1e3f3ae2e67..8a4a4029901 100644 --- a/controllers/stock_controller.py +++ b/controllers/stock_controller.py @@ -48,7 +48,7 @@ class StockController(AccountsController): "against": detail.expense_account, "cost_center": detail.cost_center, "remarks": self.doc.remarks or "Accounting Entry for Stock", - "debit": sle.stock_value_difference + "debit": flt(sle.stock_value_difference, 2) })) # to target warehouse / expense account @@ -57,7 +57,7 @@ class StockController(AccountsController): "against": warehouse_account[sle.warehouse], "cost_center": detail.cost_center, "remarks": self.doc.remarks or "Accounting Entry for Stock", - "credit": sle.stock_value_difference + "credit": flt(sle.stock_value_difference, 2) })) elif sle.warehouse not in warehouse_with_no_account: warehouse_with_no_account.append(sle.warehouse) diff --git a/hr/doctype/job_applicant/get_job_applications.py b/hr/doctype/job_applicant/get_job_applications.py index 213a78a1405..33e1261bc44 100644 --- a/hr/doctype/job_applicant/get_job_applications.py +++ b/hr/doctype/job_applicant/get_job_applications.py @@ -36,7 +36,7 @@ class JobsMailbox(POP3Mailbox): mail.save_attachments_in_doc(applicant.doc) - make(content=mail.content, sender=mail.from_email, + make(content=mail.content, sender=mail.from_email, subject=mail.subject or "No Subject", doctype="Job Applicant", name=applicant.doc.name, sent_or_received="Received") def get_job_applications(): diff --git a/patches/1311/p04_update_comments.py b/patches/1311/p04_update_comments.py new file mode 100644 index 00000000000..aefb7e7b245 --- /dev/null +++ b/patches/1311/p04_update_comments.py @@ -0,0 +1,8 @@ +# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors +# License: GNU General Public License v3. See license.txt + +def execute(): + import webnotes + for name in webnotes.conn.sql_list("""select name from tabComment"""): + webnotes.get_obj("Comment", name).update_comment_in_doc() + \ No newline at end of file diff --git a/patches/1311/p05_website_brand_html.py b/patches/1311/p05_website_brand_html.py new file mode 100644 index 00000000000..04d2f83aaf2 --- /dev/null +++ b/patches/1311/p05_website_brand_html.py @@ -0,0 +1,16 @@ +# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors +# License: GNU General Public License v3. See license.txt + +from __future__ import unicode_literals +import webnotes + +def execute(): + bean = webnotes.bean("Website Settings") + for company in webnotes.conn.sql_list("select name from `tabCompany`"): + if bean.doc.banner_html == ("""

""" + company + "

"): + bean.doc.banner_html = None + if not bean.doc.brand_html: + bean.doc.brand_html = company + + bean.save() + break \ No newline at end of file diff --git a/patches/october_2013/p01_fix_serial_no_status.py b/patches/october_2013/p01_fix_serial_no_status.py index f523845ad03..4f00b27882d 100644 --- a/patches/october_2013/p01_fix_serial_no_status.py +++ b/patches/october_2013/p01_fix_serial_no_status.py @@ -11,7 +11,6 @@ def execute(): try: sr_bean = webnotes.bean("Serial No", sr[0]) sr_bean.make_controller().via_stock_ledger = True - sr_bean.run_method("validate") sr_bean.save() webnotes.conn.commit() except: diff --git a/patches/patch_list.py b/patches/patch_list.py index abe96f9a3cc..d09cec1f409 100644 --- a/patches/patch_list.py +++ b/patches/patch_list.py @@ -245,10 +245,12 @@ patch_list = [ "execute:webnotes.reload_doc('core', 'doctype', 'comment') #2013-11-15", "patches.1311.p02_index_singles", "patches.1311.p01_make_gl_entries_for_si", - "patches.1311.p03_update_reqd_report_fields", + "patches.1311.p03_update_reqd_report_fields", "execute:webnotes.reload_doc('website', 'doctype', 'website_sitemap_config') #2013-11-20", "execute:webnotes.reload_doc('website', 'doctype', 'website_sitemap') #2013-11-20", "execute:webnotes.bean('Style Settings').save() #2013-11-20", "execute:webnotes.get_module('website.doctype.website_sitemap_config.website_sitemap_config').rebuild_website_sitemap_config()", "patches.1311.p04_update_year_end_date_of_fiscal_year", + "patches.1311.p04_update_comments", + "patches.1311.p05_website_brand_html", ] \ No newline at end of file diff --git a/portal/templates/includes/footer.html b/portal/templates/includes/footer.html index 6963175d913..cd75fd16f63 100644 --- a/portal/templates/includes/footer.html +++ b/portal/templates/includes/footer.html @@ -1,16 +1,18 @@ {% extends "lib/website/templates/includes/footer.html" %} -{% block powered %}ERPNext Powered{% endblock %} +{% block powered %}ERPNext Powered{% endblock %} {% block extension %} -
-
- - - - +
+
+
+ + + + +
+
-
{% include "app/stock/doctype/item/templates/includes/product_search_box.html" %} -
+

Search Results

diff --git a/stock/doctype/purchase_receipt/purchase_receipt.js b/stock/doctype/purchase_receipt/purchase_receipt.js index 365444a3df1..c6473055d8a 100644 --- a/stock/doctype/purchase_receipt/purchase_receipt.js +++ b/stock/doctype/purchase_receipt/purchase_receipt.js @@ -20,7 +20,7 @@ erpnext.stock.PurchaseReceiptController = erpnext.buying.BuyingController.extend cur_frm.add_custom_button(wn._('Make Purchase Invoice'), this.make_purchase_invoice); } - cur_frm.add_custom_button(wn._('Send SMS'), cur_frm.cscript['Send SMS'], "icon-mobile-phone"); + cur_frm.add_custom_button('Send SMS', cur_frm.cscript.send_sms); this.show_stock_ledger(); this.show_general_ledger(); diff --git a/stock/doctype/serial_no/serial_no.py b/stock/doctype/serial_no/serial_no.py index c0f8b4e6a73..c7a10ed078d 100644 --- a/stock/doctype/serial_no/serial_no.py +++ b/stock/doctype/serial_no/serial_no.py @@ -6,7 +6,7 @@ import webnotes from webnotes.utils import cint, getdate, cstr, flt, add_days import datetime -from webnotes import msgprint, _, ValidationError +from webnotes import _, ValidationError from controllers.stock_controller import StockController @@ -157,11 +157,12 @@ class DocType(StockController): webnotes.throw(_("Cannot delete Serial No in warehouse. \ First remove from warehouse, then delete.") + ": " + self.doc.name) - def on_rename(self, new, old, merge=False): - """rename serial_no text fields""" + def before_rename(self, old, new, merge=False): if merge: - msgprint(_("Sorry. Serial Nos. cannot be merged"), raise_exception=True) - + webnotes.throw(_("Sorry, Serial Nos cannot be merged")) + + def after_rename(self, old, new, merge=False): + """rename serial_no text fields""" for dt in webnotes.conn.sql("""select parent from tabDocField where fieldname='serial_no' and fieldtype='Text'"""): diff --git a/stock/doctype/warehouse/warehouse.js b/stock/doctype/warehouse/warehouse.js index 62d9ae7892d..ac6ac630258 100644 --- a/stock/doctype/warehouse/warehouse.js +++ b/stock/doctype/warehouse/warehouse.js @@ -5,18 +5,6 @@ cur_frm.cscript.refresh = function(doc) { cur_frm.toggle_display('warehouse_name', doc.__islocal); } -cur_frm.cscript.merge = function(doc, cdt, cdn) { - if (!doc.merge_with) { - msgprint(wn._("Please enter the warehouse to which you want to merge?")); - return; - } - var check = confirm(wn._("Are you sure you want to merge this warehouse into " - + doc.merge_with + "?")); - if (check) { - return $c_obj(make_doclist(cdt, cdn), 'merge_warehouses', '', ''); - } -} - cur_frm.set_query("create_account_under", function() { return { filters: { diff --git a/stock/doctype/warehouse/warehouse.py b/stock/doctype/warehouse/warehouse.py index 567cf289394..4869d3939c4 100644 --- a/stock/doctype/warehouse/warehouse.py +++ b/stock/doctype/warehouse/warehouse.py @@ -55,47 +55,6 @@ class DocType: else: webnotes.throw(_("Please enter account group under which account \ for warehouse ") + self.doc.name +_(" will be created")) - - def on_rename(self, new, old, merge=False): - webnotes.conn.set_value("Account", {"account_type": "Warehouse", "master_name": old}, - "master_name", new) - - if merge: - from stock.stock_ledger import update_entries_after - for item_code in webnotes.conn.sql("""select item_code from `tabBin` - where warehouse=%s""", new): - update_entries_after({"item_code": item_code, "warehouse": new}) - - def merge_warehouses(self): - webnotes.conn.auto_commit_on_many_writes = 1 - - # get items which dealt with current warehouse - items = webnotes.conn.sql("select item_code from tabBin where warehouse=%s" , self.doc.name) - # delete old bins - webnotes.conn.sql("delete from tabBin where warehouse=%s", self.doc.name) - - # replace link fields - from webnotes.model import rename_doc - link_fields = rename_doc.get_link_fields('Warehouse') - rename_doc.update_link_field_values(link_fields, self.doc.name, self.doc.merge_with) - - account_link_fields = rename_doc.get_link_fields('Account') - old_warehouse_account = webnotes.conn.get_value("Account", {"master_name": self.doc.name}) - new_warehouse_account = webnotes.conn.get_value("Account", - {"master_name": self.doc.merge_with}) - rename_doc.update_link_field_values(account_link_fields, old_warehouse_account, - new_warehouse_account) - - webnotes.conn.delete_doc("Account", old_warehouse_account) - - from utilities.repost_stock import repost - for item_code in items: - repost(item_code[0], self.doc.merge_with) - - webnotes.conn.auto_commit_on_many_writes = 0 - - msgprint("Warehouse %s merged into %s. Now you can delete warehouse: %s" - % (self.doc.name, self.doc.merge_with, self.doc.name)) def on_trash(self): # delete bin @@ -110,15 +69,61 @@ class DocType: webnotes.conn.sql("delete from `tabBin` where name = %s", d['name']) warehouse_account = webnotes.conn.get_value("Account", - {"account_type": "Warehosue", "master_name": self.doc.name}) + {"account_type": "Warehouse", "master_name": self.doc.name}) if warehouse_account: webnotes.delete_doc("Account", warehouse_account) - # delete cancelled sle - if webnotes.conn.sql("""select name from `tabStock Ledger Entry` where warehouse = %s""", - self.doc.name): - msgprint("""Warehosue can not be deleted as stock ledger entry + if sql("""select name from `tabStock Ledger Entry` where warehouse = %s""", self.doc.name): + msgprint("""Warehouse can not be deleted as stock ledger entry exists for this warehouse.""", raise_exception=1) - else: - webnotes.conn.sql("delete from `tabStock Ledger Entry` where warehouse = %s", - self.doc.name) + + def before_rename(self, olddn, newdn, merge=False): + # Add company abbr if not provided + from setup.doctype.company.company import get_name_with_abbr + new_warehouse = get_name_with_abbr(newdn, self.doc.company) + + if merge: + if self.doc.company != webnotes.conn.get_value("Warehouse", new_warehouse, "company"): + webnotes.throw(_("Both Warehouse must belong to same Company")) + + webnotes.conn.sql("delete from `tabBin` where warehouse=%s", olddn) + + self.rename_account(olddn, new_warehouse, merge) + + return new_warehouse + + def after_rename(self, olddn, newdn, merge=False): + if merge: + self.recalculate_bin_qty(newdn) + + def recalculate_bin_qty(self, newdn): + from utilities.repost_stock import repost_stock + webnotes.conn.auto_commit_on_many_writes = 1 + webnotes.conn.set_default("allow_negative_stock", 1) + + for item in webnotes.conn.sql("""select distinct item_code from ( + select name as item_code from `tabItem` where ifnull(is_stock_item, 'Yes')='Yes' + union + select distinct item_code from tabBin) a"""): + repost_stock(item[0], newdn) + + webnotes.conn.set_default("allow_negative_stock", + webnotes.conn.get_value("Stock Settings", None, "allow_negative_stock")) + webnotes.conn.auto_commit_on_many_writes = 0 + + def rename_account(self, olddn, newdn, merge): + old_account = webnotes.conn.get_value("Account", + {"account_type": "Warehouse", "master_name": olddn}) + if old_account: + new_account = None + if not merge: + if old_account == olddn: + new_account = webnotes.rename_doc("Account", olddn, newdn) + else: + existing_new_account = webnotes.conn.get_value("Account", + {"account_type": "Warehouse", "master_name": newdn}) + new_account = webnotes.rename_doc("Account", old_account, + existing_new_account or newdn, merge=True if existing_new_account else False) + + if new_account: + webnotes.conn.set_value("Account", new_account, "master_name", newdn) \ No newline at end of file diff --git a/stock/doctype/warehouse/warehouse.txt b/stock/doctype/warehouse/warehouse.txt index 39e335fac5a..e1943499476 100644 --- a/stock/doctype/warehouse/warehouse.txt +++ b/stock/doctype/warehouse/warehouse.txt @@ -2,7 +2,7 @@ { "creation": "2013-03-07 18:50:32", "docstatus": 0, - "modified": "2013-10-28 16:42:07", + "modified": "2013-11-19 12:12:33", "modified_by": "Administrator", "owner": "Administrator" }, @@ -20,7 +20,8 @@ "name": "__common__", "parent": "Warehouse", "parentfield": "fields", - "parenttype": "DocType" + "parenttype": "DocType", + "permlevel": 0 }, { "doctype": "DocPerm", @@ -42,7 +43,6 @@ "fieldtype": "Section Break", "label": "Warehouse Detail", "oldfieldtype": "Section Break", - "permlevel": 0, "read_only": 0 }, { @@ -52,7 +52,6 @@ "label": "Warehouse Name", "oldfieldname": "warehouse_name", "oldfieldtype": "Data", - "permlevel": 0, "read_only": 0, "reqd": 1 }, @@ -65,7 +64,6 @@ "oldfieldname": "company", "oldfieldtype": "Link", "options": "Company", - "permlevel": 0, "read_only": 0, "reqd": 1, "search_index": 1 @@ -95,7 +93,6 @@ "fieldtype": "Table", "label": "Warehouse Users", "options": "Warehouse User", - "permlevel": 0, "read_only": 0 }, { @@ -104,7 +101,6 @@ "fieldname": "warehouse_contact_info", "fieldtype": "Section Break", "label": "Warehouse Contact Info", - "permlevel": 0, "read_only": 0 }, { @@ -115,7 +111,6 @@ "label": "Email Id", "oldfieldname": "email_id", "oldfieldtype": "Data", - "permlevel": 0, "print_hide": 0, "read_only": 0 }, @@ -127,7 +122,6 @@ "oldfieldname": "phone_no", "oldfieldtype": "Int", "options": "Phone", - "permlevel": 0, "read_only": 0 }, { @@ -138,7 +132,6 @@ "oldfieldname": "mobile_no", "oldfieldtype": "Int", "options": "Phone", - "permlevel": 0, "read_only": 0 }, { @@ -146,7 +139,6 @@ "fieldname": "column_break0", "fieldtype": "Column Break", "oldfieldtype": "Column Break", - "permlevel": 0, "read_only": 0 }, { @@ -156,7 +148,6 @@ "label": "Address Line 1", "oldfieldname": "address_line_1", "oldfieldtype": "Data", - "permlevel": 0, "read_only": 0 }, { @@ -166,7 +157,6 @@ "label": "Address Line 2", "oldfieldname": "address_line_2", "oldfieldtype": "Data", - "permlevel": 0, "read_only": 0 }, { @@ -177,7 +167,6 @@ "label": "City", "oldfieldname": "city", "oldfieldtype": "Data", - "permlevel": 0, "read_only": 0, "reqd": 0 }, @@ -189,7 +178,6 @@ "oldfieldname": "state", "oldfieldtype": "Select", "options": "Suggest", - "permlevel": 0, "read_only": 0 }, { @@ -199,33 +187,6 @@ "label": "PIN", "oldfieldname": "pin", "oldfieldtype": "Int", - "permlevel": 0, - "read_only": 0 - }, - { - "description": "This feature is for merging duplicate warehouses. It will replace all the links of this warehouse by \"Merge Into\" warehouse. After merging you can delete this warehouse, as stock level for this warehouse will be zero.", - "doctype": "DocField", - "fieldname": "merge_warehouses_section", - "fieldtype": "Section Break", - "label": "Merge Warehouses", - "permlevel": 2, - "read_only": 0 - }, - { - "doctype": "DocField", - "fieldname": "merge_with", - "fieldtype": "Link", - "label": "Merge Into", - "options": "Warehouse", - "permlevel": 2, - "read_only": 0 - }, - { - "doctype": "DocField", - "fieldname": "merge", - "fieldtype": "Button", - "label": "Merge", - "permlevel": 2, "read_only": 0 }, { diff --git a/stock/page/stock_ageing/stock_ageing.js b/stock/page/stock_ageing/stock_ageing.js index 7728e3c4917..6c626e22edd 100644 --- a/stock/page/stock_ageing/stock_ageing.js +++ b/stock/page/stock_ageing/stock_ageing.js @@ -25,7 +25,7 @@ erpnext.StockAgeing = erpnext.StockGridReport.extend({ page: wrapper, parent: $(wrapper).find('.layout-main'), appframe: wrapper.appframe, - doctypes: ["Item", "Warehouse", "Stock Ledger Entry", "Item Group", "Brand"], + doctypes: ["Item", "Warehouse", "Stock Ledger Entry", "Item Group", "Brand", "Serial No"], }) }, setup_columns: function() { @@ -175,7 +175,7 @@ erpnext.StockAgeing = erpnext.StockGridReport.extend({ grid: { hoverable: true, clickable: true }, xaxis: { ticks: $.map(me.data, function(item, idx) { return [[idx+1, item.name]] }), - max: 20 + max: 15 }, series: { downsample: { threshold: 1000 } } } diff --git a/stock/page/stock_ledger/stock_ledger.js b/stock/page/stock_ledger/stock_ledger.js index 8ffe0ff628a..08a455e1d34 100644 --- a/stock/page/stock_ledger/stock_ledger.js +++ b/stock/page/stock_ledger/stock_ledger.js @@ -21,7 +21,7 @@ erpnext.StockLedger = erpnext.StockGridReport.extend({ page: wrapper, parent: $(wrapper).find('.layout-main'), appframe: wrapper.appframe, - doctypes: ["Item", "Item Group", "Warehouse", "Stock Ledger Entry", "Brand"], + doctypes: ["Item", "Item Group", "Warehouse", "Stock Ledger Entry", "Brand", "Serial No"], }) }, diff --git a/stock/page/stock_level/stock_level.js b/stock/page/stock_level/stock_level.js index 088a256c49f..c50879160ea 100644 --- a/stock/page/stock_level/stock_level.js +++ b/stock/page/stock_level/stock_level.js @@ -27,7 +27,7 @@ erpnext.StockLevel = erpnext.StockGridReport.extend({ parent: $(wrapper).find('.layout-main'), appframe: wrapper.appframe, doctypes: ["Item", "Warehouse", "Stock Ledger Entry", "Production Order", - "Material Request Item", "Purchase Order Item", "Sales Order Item", "Brand"], + "Material Request Item", "Purchase Order Item", "Sales Order Item", "Brand", "Serial No"], }); this.wrapper.bind("make", function() { diff --git a/support/doctype/support_ticket/templates/pages/ticket.html b/support/doctype/support_ticket/templates/pages/ticket.html index 4b41dc21e96..1732e770cb1 100644 --- a/support/doctype/support_ticket/templates/pages/ticket.html +++ b/support/doctype/support_ticket/templates/pages/ticket.html @@ -9,7 +9,7 @@ } %} {% block content %} -
+