Merge branch 'master' of github.com:webnotes/erpnext
diff --git a/accounts/doctype/purchase_invoice/purchase_invoice.py b/accounts/doctype/purchase_invoice/purchase_invoice.py
index fac976e..539cef5 100644
--- a/accounts/doctype/purchase_invoice/purchase_invoice.py
+++ b/accounts/doctype/purchase_invoice/purchase_invoice.py
@@ -196,7 +196,8 @@
"Purchase Order Item": {
"ref_dn_field": "po_detail",
"compare_fields": [["project_name", "="], ["item_code", "="], ["uom", "="]],
- "is_child_table": True
+ "is_child_table": True,
+ "allow_duplicate_prev_row_id": True
},
"Purchase Receipt": {
"ref_dn_field": "purchase_receipt",
@@ -214,7 +215,8 @@
"Purchase Order Item": {
"ref_dn_field": "po_detail",
"compare_fields": [["import_rate", "="]],
- "is_child_table": True
+ "is_child_table": True,
+ "allow_duplicate_prev_row_id": True
},
"Purchase Receipt Item": {
"ref_dn_field": "pr_detail",
diff --git a/accounts/doctype/sales_invoice/sales_invoice.js b/accounts/doctype/sales_invoice/sales_invoice.js
index cfb5e95..ac072ef 100644
--- a/accounts/doctype/sales_invoice/sales_invoice.js
+++ b/accounts/doctype/sales_invoice/sales_invoice.js
@@ -65,7 +65,7 @@
cur_frm.add_custom_button('Send SMS', cur_frm.cscript.send_sms);
- if(doc.is_pos==1 && doc.update_stock!=1)
+ if(cint(doc.update_stock)!=1)
cur_frm.add_custom_button('Make Delivery', cur_frm.cscript['Make Delivery Note']);
if(doc.outstanding_amount!=0)
@@ -198,8 +198,7 @@
'total_commission', 'advances'];
item_flds_normal = ['sales_order', 'delivery_note']
- item_flds_pos = ['warehouse', 'serial_no', 'batch_no', 'actual_qty',
- 'delivered_qty', 'expense_account']
+ item_flds_pos = ['serial_no', 'batch_no', 'actual_qty', 'expense_account']
if(cint(doc.is_pos) == 1) {
hide_field(par_flds);
@@ -212,7 +211,7 @@
}
cur_frm.fields_dict['entries'].grid.set_column_disp(item_flds_pos, (cint(doc.update_stock)==1?true:false));
-
+
// India related fields
var cp = wn.control_panel;
if (cp.country == 'India') unhide_field(['c_form_applicable', 'c_form_no']);
diff --git a/accounts/doctype/sales_invoice/sales_invoice.py b/accounts/doctype/sales_invoice/sales_invoice.py
index ceab40a..8f33eb3 100644
--- a/accounts/doctype/sales_invoice/sales_invoice.py
+++ b/accounts/doctype/sales_invoice/sales_invoice.py
@@ -388,7 +388,8 @@
"Sales Order Item": {
"ref_dn_field": "so_detail",
"compare_fields": [["export_rate", "="]],
- "is_child_table": True
+ "is_child_table": True,
+ "allow_duplicate_prev_row_id": True
},
"Delivery Note Item": {
"ref_dn_field": "dn_detail",
@@ -983,3 +984,49 @@
and tabAccount.%(key)s LIKE '%(txt)s'
%(mcond)s""" % {'company': filters['company'], 'key': searchfield,
'txt': "%%%s%%" % txt, 'mcond':get_match_cond(doctype, searchfield)})
+
+
+@webnotes.whitelist()
+def make_delivery_note(source_name, target_doclist=None):
+ from webnotes.model.mapper import get_mapped_doclist
+
+ def set_missing_values(source, target):
+ bean = webnotes.bean(target)
+ bean.run_method("onload_post_render")
+
+ def update_item(obj, target, source_parent):
+ target.amount = (flt(obj.qty) - flt(obj.delivered_qty)) * flt(obj.basic_rate)
+ target.export_amount = (flt(obj.qty) - flt(obj.delivered_qty)) * flt(obj.export_rate)
+ target.qty = flt(obj.qty) - flt(obj.delivered_qty)
+
+ doclist = get_mapped_doclist("Sales Invoice", source_name, {
+ "Sales Invoice": {
+ "doctype": "Delivery Note",
+ "validation": {
+ "docstatus": ["=", 1]
+ }
+ },
+ "Sales Invoice Item": {
+ "doctype": "Delivery Note Item",
+ "field_map": {
+ "name": "prevdoc_detail_docname",
+ "parent": "prevdoc_docname",
+ "parenttype": "prevdoc_doctype",
+ "serial_no": "serial_no"
+ },
+ "postprocess": update_item
+ },
+ "Sales Taxes and Charges": {
+ "doctype": "Sales Taxes and Charges",
+ "add_if_empty": True
+ },
+ "Sales Team": {
+ "doctype": "Sales Team",
+ "field_map": {
+ "incentives": "incentives"
+ },
+ "add_if_empty": True
+ }
+ }, target_doclist, set_missing_values)
+
+ return [d.fields for d in doclist]
\ No newline at end of file
diff --git a/accounts/doctype/sales_invoice/test_sales_invoice.py b/accounts/doctype/sales_invoice/test_sales_invoice.py
index ec4535b..7b32ea0 100644
--- a/accounts/doctype/sales_invoice/test_sales_invoice.py
+++ b/accounts/doctype/sales_invoice/test_sales_invoice.py
@@ -607,8 +607,6 @@
self.assertEquals(new_si.doc.invoice_period_to_date,
unicode(add_months(base_si.doc.invoice_period_to_date, no_of_months)))
- self.assertEquals(getdate(new_si.doc.posting_date).day,
- base_si.doc.repeat_on_day_of_month)
return new_si
diff --git a/buying/doctype/purchase_common/purchase_common.js b/buying/doctype/purchase_common/purchase_common.js
index 148ba1c..87f79a0 100644
--- a/buying/doctype/purchase_common/purchase_common.js
+++ b/buying/doctype/purchase_common/purchase_common.js
@@ -49,6 +49,14 @@
});
}
+ $.each([["supplier", "supplier"],
+ ["contact_person", "supplier_filter"],
+ ["supplier_address", "supplier_filter"]],
+ function(i, opts) {
+ if(me.frm.fields_dict[opts[0]])
+ me.frm.set_query(opts[0], erpnext.queries[opts[1]]);
+ });
+
if(this.frm.fields_dict.supplier) {
this.frm.set_query("supplier", function() {
return{ query:"controllers.queries.supplier_query" }});
diff --git a/controllers/queries.py b/controllers/queries.py
index 478971a..219fc74 100644
--- a/controllers/queries.py
+++ b/controllers/queries.py
@@ -169,15 +169,13 @@
if(length(tabItem.description) > 40, \
concat(substr(tabItem.description, 1, 40), "..."), description) as decription
from tabItem
- where tabItem.docstatus!=2
- and (ifnull(`tabItem`.`end_of_life`,"") in ("", "0000-00-00")
- or `tabItem`.`end_of_life` > NOW())
+ where tabItem.docstatus<2
and (tabItem.%(key)s LIKE "%(txt)s"
or tabItem.item_name LIKE "%(txt)s")
%(fcond)s %(mcond)s
limit %(start)s,%(page_len)s """ % {'key': searchfield, 'txt': "%%%s%%" % txt,
'fcond': get_filters_cond(doctype, filters, conditions),
- 'mcond':get_match_cond(doctype, searchfield), 'start': start, 'page_len': page_len})
+ 'mcond': get_match_cond(doctype, searchfield), 'start': start, 'page_len': page_len})
def bom(doctype, txt, searchfield, start, page_len, filters):
conditions = []
diff --git a/manufacturing/doctype/bom/bom.js b/manufacturing/doctype/bom/bom.js
index ce246d9..87bc4aa 100644
--- a/manufacturing/doctype/bom/bom.js
+++ b/manufacturing/doctype/bom/bom.js
@@ -18,10 +18,9 @@
cur_frm.cscript.refresh = function(doc,dt,dn){
cur_frm.toggle_enable("item", doc.__islocal);
- if (!doc.__islocal && doc.docstatus==0) {
- cur_frm.set_intro("Submit the BOM to use it for manufacturing or repacking.");
+ if (!doc.__islocal && doc.docstatus<2) {
cur_frm.add_custom_button("Update Cost", cur_frm.cscript.update_cost);
- } else cur_frm.set_intro("");
+ }
cur_frm.cscript.with_operations(doc);
set_operation_no(doc);
diff --git a/manufacturing/doctype/bom/bom.py b/manufacturing/doctype/bom/bom.py
index e4c81ff..15f59ec 100644
--- a/manufacturing/doctype/bom/bom.py
+++ b/manufacturing/doctype/bom/bom.py
@@ -144,8 +144,12 @@
'qty': d.qty
})["rate"]
- self.on_update()
-
+ if self.doc.docstatus == 0:
+ webnotes.bean(self.doclist).save()
+ elif self.doc.docstatus == 1:
+ self.calculate_cost()
+ self.update_exploded_items()
+ webnotes.bean(self.doclist).update_after_submit()
def get_bom_unitcost(self, bom_no):
bom = sql("""select name, total_cost/quantity as unit_cost from `tabBOM`
diff --git a/patches/july_2013/p11_update_price_list_currency.py b/patches/july_2013/p11_update_price_list_currency.py
new file mode 100644
index 0000000..887149d
--- /dev/null
+++ b/patches/july_2013/p11_update_price_list_currency.py
@@ -0,0 +1,9 @@
+import webnotes
+
+def execute():
+ for price_list_name in webnotes.conn.sql_list("""select name from `tabPrice List`
+ where ifnull(currency, '')=''"""):
+ res = webnotes.conn.sql("""select distinct ref_currency from `tabItem Price`
+ where price_list_name=%s""", price_list_name)
+ if res and len(res)==1 and res[0][0]:
+ webnotes.conn.set_value("Price List", price_list_name, "currency", res[0][0])
diff --git a/patches/patch_list.py b/patches/patch_list.py
index 9b6bb0f..1426539 100644
--- a/patches/patch_list.py
+++ b/patches/patch_list.py
@@ -262,4 +262,6 @@
"patches.july_2013.p08_custom_print_format_net_total_export",
"patches.july_2013.p09_remove_website_pyc",
"patches.july_2013.p10_change_partner_user_to_website_user",
+ "patches.july_2013.p11_update_price_list_currency",
+ "execute:webnotes.bean('Selling Settings').save() #2013-07-29",
]
\ No newline at end of file
diff --git a/public/js/queries.js b/public/js/queries.js
index 8c3dd01..090c393 100644
--- a/public/js/queries.js
+++ b/public/js/queries.js
@@ -58,6 +58,15 @@
return { filters: { customer: doc.customer } };
},
+ supplier_filter: function(doc) {
+ if(!doc.supplier) {
+ wn.throw(wn._("Please specify a") + " " +
+ wn._(wn.meta.get_label(doc.doctype, "supplier", doc.name)));
+ }
+
+ return { filters: { supplier: doc.supplier } };
+ },
+
not_a_group_filter: function() {
return { filters: { is_group: "No" } };
},
diff --git a/selling/doctype/sales_common/sales_common.js b/selling/doctype/sales_common/sales_common.js
index dbd0a1a..d2461af 100644
--- a/selling/doctype/sales_common/sales_common.js
+++ b/selling/doctype/sales_common/sales_common.js
@@ -36,22 +36,15 @@
this.frm.add_fetch("sales_partner", "commission_rate", "commission_rate");
- if(this.frm.fields_dict.shipping_address_name && this.frm.fields_dict.customer_address) {
- this.frm.fields_dict.shipping_address_name.get_query =
- this.frm.fields_dict['customer_address'].get_query;
- }
-
- this.frm.set_query("customer_address", function() {
- return {
- filters: {'customer': me.frm.doc.customer }
- }
- });
-
- this.frm.set_query("contact_person", function() {
- return {
- filters: {'customer': me.frm.doc.customer }
- }
- });
+ $.each([["customer_address", "customer_filter"],
+ ["shipping_address_name", "customer_filter"],
+ ["contact_person", "customer_filter"],
+ ["customer", "customer"],
+ ["lead", "lead"]],
+ function(i, opts) {
+ if(me.frm.fields_dict[opts[0]])
+ me.frm.set_query(opts[0], erpnext.queries[opts[1]]);
+ });
if(this.frm.fields_dict.charge) {
this.frm.set_query("charge", function() {
@@ -63,13 +56,7 @@
}
});
}
-
- this.frm.fields_dict.customer.get_query = function(doc,cdt,cdn) {
- return{ query:"controllers.queries.customer_query" } }
- this.frm.fields_dict.lead && this.frm.set_query("lead", function(doc,cdt,cdn) {
- return{ query:"controllers.queries.lead_query" } });
-
if(this.frm.fields_dict.price_list_name) {
this.frm.set_query("price_list_name", function() {
return { filters: { buying_or_selling: "Selling" } };
@@ -130,11 +117,7 @@
}
if(this.frm.fields_dict.sales_team && this.frm.fields_dict.sales_team.grid.get_field("sales_person")) {
- this.frm.set_query("sales_person", "sales_team", function() {
- return {
- filters: { is_group: "No" }
- };
- });
+ this.frm.set_query("sales_person", "sales_team", erpnext.queries.not_a_group_filter);
}
},
diff --git a/selling/doctype/selling_settings/selling_settings.py b/selling/doctype/selling_settings/selling_settings.py
index 4716228..febf375 100644
--- a/selling/doctype/selling_settings/selling_settings.py
+++ b/selling/doctype/selling_settings/selling_settings.py
@@ -8,5 +8,5 @@
self.doc, self.doclist = d, dl
def validate(self):
- for key in ["cust_master_name", "customer_group", "territory", "allow_same_sales_rate"]:
+ for key in ["cust_master_name", "customer_group", "territory", "maintain_same_sales_rate"]:
webnotes.conn.set_default(key, self.doc.fields.get(key, ""))
diff --git a/stock/doctype/delivery_note/delivery_note.py b/stock/doctype/delivery_note/delivery_note.py
index f7283eb..3f8a438 100644
--- a/stock/doctype/delivery_note/delivery_note.py
+++ b/stock/doctype/delivery_note/delivery_note.py
@@ -113,21 +113,24 @@
if not self.doc.installation_status: self.doc.installation_status = 'Not Installed'
def validate_with_previous_doc(self):
- super(DocType, self).validate_with_previous_doc(self.tname, {
- "Sales Order": {
- "ref_dn_field": "prevdoc_docname",
- "compare_fields": [["customer", "="], ["company", "="], ["project_name", "="],
- ["currency", "="]],
- },
- })
- if cint(webnotes.defaults.get_global_default('maintain_same_sales_rate')):
+ prev_doctype = [d.prevdoc_doctype for d in self.doclist.get({
+ "parentfield": "delivery_note_details", "prevdoc_doctype": ["!=", ""]})]
+ if prev_doctype:
super(DocType, self).validate_with_previous_doc(self.tname, {
- "Sales Order Item": {
- "ref_dn_field": "prevdoc_detail_docname",
- "compare_fields": [["export_rate", "="]],
- "is_child_table": True
- }
+ prev_doctype[0]: {
+ "ref_dn_field": "prevdoc_docname",
+ "compare_fields": [["customer", "="], ["company", "="], ["project_name", "="],
+ ["currency", "="]],
+ },
})
+ if cint(webnotes.defaults.get_global_default('maintain_same_sales_rate')):
+ super(DocType, self).validate_with_previous_doc(self.tname, {
+ prev_doctype[0] + " Item": {
+ "ref_dn_field": "prevdoc_detail_docname",
+ "compare_fields": [["export_rate", "="]],
+ "is_child_table": True
+ }
+ })
def validate_proj_cust(self):
diff --git a/utilities/transaction_base.py b/utilities/transaction_base.py
index 6628601..b688200 100644
--- a/utilities/transaction_base.py
+++ b/utilities/transaction_base.py
@@ -308,7 +308,7 @@
self.compare_values({key: [ref_dn]}, val["compare_fields"], d)
if ref_dn not in item_ref_dn:
item_ref_dn.append(ref_dn)
- else:
+ elif not val.get("allow_duplicate_prev_row_id"):
webnotes.msgprint(_("Row ") + cstr(d.idx + 1) +
_(": Duplicate row from same ") + key, raise_exception=1)
elif ref_dn: