[fix] Rename and merge rewrite

This commit is contained in:
Nabin Hait
2013-11-20 13:14:12 +05:30
parent dd9e7a44df
commit ca471f41a1
12 changed files with 180 additions and 190 deletions

View File

@@ -264,15 +264,45 @@ class DocType(DocListController):
if self.doc.page_name:
from webnotes.webutils import clear_cache
clear_cache(self.doc.page_name)
def before_rename(self, olddn, newdn, merge=False):
if merge:
# Validate properties before merging
field_list = ["stock_uom", "is_stock_item", "has_serial_no", "has_batch_no"]
new_properties = [cstr(d) for d in webnotes.conn.get_value("Item", newdn, field_list)]
if new_properties != [cstr(self.doc.fields[fld]) for fld in field_list]:
webnotes.throw(_("To merge, following properties must be same for both items")
+ ": \n" + ", ".join([self.meta.get_label(fld) for fld in field_list]))
def on_rename(self, newdn, olddn, merge=False):
webnotes.conn.sql("update tabItem set item_code = %s where name = %s", (newdn, olddn))
webnotes.conn.sql("delete from `tabBin` where item_code=%s", olddn)
def after_rename(self, olddn, newdn, merge):
webnotes.conn.set_value("Item", newdn, "item_code", newdn)
self.update_website_page_name()
if merge:
self.set_last_purchase_rate(newdn)
self.recalculate_bin_qty(newdn)
def update_website_page_name(self):
if self.doc.page_name:
self.update_website()
from webnotes.webutils import clear_cache
clear_cache(self.doc.page_name)
if merge:
from stock.stock_ledger import update_entries_after
for wh in webnotes.conn.sql("""select warehouse from `tabBin`
where item_code=%s""", newdn):
update_entries_after({"item_code": newdn, "warehouse": wh[0]})
def set_last_purchase_rate(self, newdn):
from buying.utils import get_last_purchase_details
last_purchase_rate = get_last_purchase_details(newdn).get("purchase_rate", 0)
webnotes.conn.set_value("Item", newdn, "last_purchase_rate", last_purchase_rate)
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 warehouse in webnotes.conn.sql("select name from `tabWarehouse`"):
repost_stock(newdn, warehouse[0])
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

View File

@@ -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
@@ -158,11 +158,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'"""):

View File

@@ -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("Please enter the warehouse to which you want to merge?");
return;
}
var check = confirm("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: {
@@ -25,4 +13,4 @@ cur_frm.set_query("create_account_under", function() {
'group_or_ledger': "Group"
}
}
})
})

View File

@@ -58,38 +58,6 @@ class DocType:
else:
webnotes.throw(_("Please enter account group under which account \
for warehouse ") + self.doc.name +_(" will be created"))
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
@@ -103,24 +71,62 @@ class DocType:
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 sql("""select name from `tabStock Ledger Entry` where warehouse = %s""", self.doc.name):
msgprint("""Warehosue can not be deleted as stock ledger entry
msgprint("""Warehouse can not be deleted as stock ledger entry
exists for this warehouse.""", raise_exception=1)
else:
sql("delete from `tabStock Ledger Entry` where warehouse = %s", self.doc.name)
def on_rename(self, newdn, olddn, merge=False):
account = webnotes.conn.get_value("Account", {"account_type": "Warehouse",
"master_name": olddn})
webnotes.conn.set_value("Account", account, "master_name", newdn)
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:
from stock.stock_ledger import update_entries_after
for item_code in webnotes.conn.sql("""select item_code from `tabBin`
where warehouse=%s""", newdn):
update_entries_after({"item_code": item_code, "warehouse": newdn})
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)

View File

@@ -2,7 +2,7 @@
{
"creation": "2013-03-07 18:50:32",
"docstatus": 0,
"modified": "2013-09-16 10:45:49",
"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
@@ -77,14 +75,12 @@
"fieldname": "create_account_under",
"fieldtype": "Link",
"label": "Create Account Under",
"options": "Account",
"permlevel": 0
"options": "Account"
},
{
"doctype": "DocField",
"fieldname": "column_break_4",
"fieldtype": "Section Break",
"permlevel": 0,
"read_only": 0
},
{
@@ -94,7 +90,6 @@
"fieldtype": "Table",
"label": "Warehouse Users",
"options": "Warehouse User",
"permlevel": 0,
"read_only": 0
},
{
@@ -103,7 +98,6 @@
"fieldname": "warehouse_contact_info",
"fieldtype": "Section Break",
"label": "Warehouse Contact Info",
"permlevel": 0,
"read_only": 0
},
{
@@ -114,7 +108,6 @@
"label": "Email Id",
"oldfieldname": "email_id",
"oldfieldtype": "Data",
"permlevel": 0,
"print_hide": 0,
"read_only": 0
},
@@ -126,7 +119,6 @@
"oldfieldname": "phone_no",
"oldfieldtype": "Int",
"options": "Phone",
"permlevel": 0,
"read_only": 0
},
{
@@ -137,7 +129,6 @@
"oldfieldname": "mobile_no",
"oldfieldtype": "Int",
"options": "Phone",
"permlevel": 0,
"read_only": 0
},
{
@@ -145,7 +136,6 @@
"fieldname": "column_break0",
"fieldtype": "Column Break",
"oldfieldtype": "Column Break",
"permlevel": 0,
"read_only": 0
},
{
@@ -155,7 +145,6 @@
"label": "Address Line 1",
"oldfieldname": "address_line_1",
"oldfieldtype": "Data",
"permlevel": 0,
"read_only": 0
},
{
@@ -165,7 +154,6 @@
"label": "Address Line 2",
"oldfieldname": "address_line_2",
"oldfieldtype": "Data",
"permlevel": 0,
"read_only": 0
},
{
@@ -176,7 +164,6 @@
"label": "City",
"oldfieldname": "city",
"oldfieldtype": "Data",
"permlevel": 0,
"read_only": 0,
"reqd": 0
},
@@ -188,7 +175,6 @@
"oldfieldname": "state",
"oldfieldtype": "Select",
"options": "Suggest",
"permlevel": 0,
"read_only": 0
},
{
@@ -198,33 +184,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
},
{