Merge branch '4.0.0-wip' of github.com:webnotes/erpnext into 4.0-hotfix

This commit is contained in:
Akhilesh Darjee 2014-01-27 17:32:32 +05:30
commit ffa4769b51
43 changed files with 500 additions and 400 deletions

View File

@ -127,6 +127,7 @@ erpnext.POS = Class.extend({
this.party = party; this.party = party;
this.price_list = (party == "Customer" ? this.price_list = (party == "Customer" ?
this.frm.doc.selling_price_list : this.frm.doc.buying_price_list); this.frm.doc.selling_price_list : this.frm.doc.buying_price_list);
this.price_list_field = (party == "Customer" ? "selling_price_list" : "buying_price_list");
this.sales_or_purchase = (party == "Customer" ? "Sales" : "Purchase"); this.sales_or_purchase = (party == "Customer" ? "Sales" : "Purchase");
this.net_total = "net_total_" + export_or_import; this.net_total = "net_total_" + export_or_import;
this.grand_total = "grand_total_" + export_or_import; this.grand_total = "grand_total_" + export_or_import;
@ -287,22 +288,17 @@ erpnext.POS = Class.extend({
this.frm.cscript.fname, this.frm.doctype), function(i, d) { this.frm.cscript.fname, this.frm.doctype), function(i, d) {
if (d.item_code == item_code) { if (d.item_code == item_code) {
caught = true; caught = true;
if (serial_no) { if (serial_no)
d.serial_no += '\n' + serial_no; wn.model.set_value(d.doctype, d.name, "serial_no", d.serial_no + '\n' + serial_no);
me.frm.script_manager.trigger("serial_no", d.doctype, d.name); else
} wn.model.set_value(d.doctype, d.name, "qty", d.qty + 1);
else {
d.qty += 1;
me.frm.script_manager.trigger("qty", d.doctype, d.name);
}
} }
}); });
} }
// if item not found then add new item // if item not found then add new item
if (!caught) { if (!caught)
this.add_new_item_to_grid(item_code, serial_no); this.add_new_item_to_grid(item_code, serial_no);
}
this.refresh(); this.refresh();
this.refresh_search_box(); this.refresh_search_box();
@ -337,15 +333,16 @@ erpnext.POS = Class.extend({
wn.model.clear_doc(d.doctype, d.name); wn.model.clear_doc(d.doctype, d.name);
me.refresh_grid(); me.refresh_grid();
} else { } else {
d.qty = qty; wn.model.set_value(d.doctype, d.name, "qty", qty);
me.frm.script_manager.trigger("qty", d.doctype, d.name);
} }
} }
}); });
me.refresh(); this.refresh();
}, },
refresh: function() { refresh: function() {
var me = this; var me = this;
this.refresh_item_list();
this.party_field.set_input(this.frm.doc[this.party.toLowerCase()]); this.party_field.set_input(this.frm.doc[this.party.toLowerCase()]);
this.wrapper.find('input.discount-amount').val(this.frm.doc.discount_amount); this.wrapper.find('input.discount-amount').val(this.frm.doc.discount_amount);
this.barcode.set_input(""); this.barcode.set_input("");
@ -369,6 +366,14 @@ erpnext.POS = Class.extend({
this.make_party(); this.make_party();
} }
}, },
refresh_item_list: function() {
var me = this;
// refresh item list on change of price list
if (this.frm.doc[this.price_list_field] != this.price_list) {
this.price_list = this.frm.doc[this.price_list_field];
this.make_item_list();
}
},
show_items_in_item_cart: function() { show_items_in_item_cart: function() {
var me = this; var me = this;
var $items = this.wrapper.find("#cart tbody").empty(); var $items = this.wrapper.find("#cart tbody").empty();
@ -402,9 +407,8 @@ erpnext.POS = Class.extend({
)).appendTo($items); )).appendTo($items);
}); });
this.wrapper.find(".increase-qty, .decrease-qty").on("click", function() { this.wrapper.find("input.qty").on("focus", function() {
var item_code = $(this).closest("tr").attr("id"); $(this).select();
me.selected_item_qty_operation(item_code, $(this).attr("class"));
}); });
}, },
show_taxes: function() { show_taxes: function() {
@ -441,10 +445,16 @@ erpnext.POS = Class.extend({
// append quantity to the respective item after change from input box // append quantity to the respective item after change from input box
$(this.wrapper).find("input.qty").on("change", function() { $(this.wrapper).find("input.qty").on("change", function() {
var item_code = $(this).closest("tr")[0].id; var item_code = $(this).closest("tr").attr("id");
me.update_qty(item_code, $(this).val()); me.update_qty(item_code, $(this).val());
}); });
// increase/decrease qty on plus/minus button
$(this.wrapper).find(".increase-qty, .decrease-qty").on("click", function() {
var tr = $(this).closest("tr");
me.increase_decrease_qty(tr, $(this).attr("class"));
});
// on td click toggle the highlighting of row // on td click toggle the highlighting of row
$(this.wrapper).find("#cart tbody tr td").on("click", function() { $(this.wrapper).find("#cart tbody tr td").on("click", function() {
var row = $(this).closest("tr"); var row = $(this).closest("tr");
@ -462,6 +472,15 @@ erpnext.POS = Class.extend({
me.refresh_delete_btn(); me.refresh_delete_btn();
this.barcode.$input.focus(); this.barcode.$input.focus();
}, },
increase_decrease_qty: function(tr, operation) {
var item_code = tr.attr("id");
var item_qty = cint(tr.find("input.qty").val());
if (operation == "increase-qty")
this.update_qty(item_code, item_qty + 1);
else if (operation == "decrease-qty" && item_qty != 1)
this.update_qty(item_code, item_qty - 1);
},
disable_text_box_and_button: function() { disable_text_box_and_button: function() {
var me = this; var me = this;
// if form is submitted & cancelled then disable all input box & buttons // if form is submitted & cancelled then disable all input box & buttons
@ -533,26 +552,11 @@ erpnext.POS = Class.extend({
this.refresh_grid(); this.refresh_grid();
}, },
refresh_grid: function() { refresh_grid: function() {
this.frm.dirty();
this.frm.fields_dict[this.frm.cscript.fname].grid.refresh(); this.frm.fields_dict[this.frm.cscript.fname].grid.refresh();
this.frm.script_manager.trigger("calculate_taxes_and_totals"); this.frm.script_manager.trigger("calculate_taxes_and_totals");
this.refresh(); this.refresh();
}, },
selected_item_qty_operation: function(item_code, operation) {
var me = this;
var child = wn.model.get_children(this.frm.doctype + " Item", this.frm.doc.name,
this.frm.cscript.fname, this.frm.doctype);
$.each(child, function(i, d) {
if (d.item_code == item_code) {
if (operation == "increase-qty")
d.qty += 1;
else if (operation == "decrease-qty")
d.qty != 1 ? d.qty -= 1 : d.qty = 1;
me.refresh();
}
});
},
make_payment: function() { make_payment: function() {
var me = this; var me = this;
var no_of_items = $(this.wrapper).find("#cart tbody tr").length; var no_of_items = $(this.wrapper).find("#cart tbody tr").length;

View File

@ -320,12 +320,9 @@ class DocType(SellingController):
item = webnotes.conn.sql("select name,is_asset_item,is_sales_item from `tabItem` where name = '%s' and (ifnull(end_of_life,'')='' or end_of_life = '0000-00-00' or end_of_life > now())"% d.item_code) item = webnotes.conn.sql("select name,is_asset_item,is_sales_item from `tabItem` where name = '%s' and (ifnull(end_of_life,'')='' or end_of_life = '0000-00-00' or end_of_life > now())"% d.item_code)
acc = webnotes.conn.sql("select account_type from `tabAccount` where name = '%s' and docstatus != 2" % d.income_account) acc = webnotes.conn.sql("select account_type from `tabAccount` where name = '%s' and docstatus != 2" % d.income_account)
if not acc: if not acc:
msgprint("Account: "+d.income_account+" does not exist in the system") msgprint("Account: "+d.income_account+" does not exist in the system", raise_exception=True)
raise Exception
elif item and item[0][1] == 'Yes' and not acc[0][0] == 'Fixed Asset Account': elif item and item[0][1] == 'Yes' and not acc[0][0] == 'Fixed Asset Account':
msgprint("Please select income head with account type 'Fixed Asset Account' as Item %s is an asset item" % d.item_code) msgprint("Please select income head with account type 'Fixed Asset Account' as Item %s is an asset item" % d.item_code, raise_exception=True)
raise Exception
def validate_with_previous_doc(self): def validate_with_previous_doc(self):
super(DocType, self).validate_with_previous_doc(self.tname, { super(DocType, self).validate_with_previous_doc(self.tname, {

View File

@ -37,12 +37,15 @@ class AccountsReceivableReport(object):
return columns return columns
def get_data(self, customer_naming_by): def get_data(self, customer_naming_by):
from erpnext.accounts.utils import get_currency_precision
currency_precision = get_currency_precision() or 2
data = [] data = []
future_vouchers = self.get_entries_after(self.filters.report_date) future_vouchers = self.get_entries_after(self.filters.report_date)
for gle in self.get_entries_till(self.filters.report_date): for gle in self.get_entries_till(self.filters.report_date):
if self.is_receivable(gle, future_vouchers): if self.is_receivable(gle, future_vouchers):
outstanding_amount = self.get_outstanding_amount(gle, self.filters.report_date) outstanding_amount = self.get_outstanding_amount(gle, self.filters.report_date)
if abs(outstanding_amount) > 0.0: if abs(outstanding_amount) > 0.1/10**currency_precision:
due_date = self.get_due_date(gle) due_date = self.get_due_date(gle)
invoiced_amount = gle.debit if (gle.debit > 0) else 0 invoiced_amount = gle.debit if (gle.debit > 0) else 0
payment_received = invoiced_amount - outstanding_amount payment_received = invoiced_amount - outstanding_amount

View File

@ -34,7 +34,7 @@ def validate_filters(filters, account_details):
def get_columns(): def get_columns():
return ["Posting Date:Date:100", "Account:Link/Account:200", "Debit:Float:100", return ["Posting Date:Date:100", "Account:Link/Account:200", "Debit:Float:100",
"Credit:Float:100", "Voucher Type::120", "Voucher No::160", "Link::20", "Credit:Float:100", "Voucher Type::120", "Voucher No::160", "Link::20",
"Against Account::120", "Cost Center:Link/Cost Center:100", "Remarks::200"] "Against Account::120", "Cost Center:Link/Cost Center:100", "Remarks::400"]
def get_result(filters, account_details): def get_result(filters, account_details):
gl_entries = get_gl_entries(filters) gl_entries = get_gl_entries(filters)
@ -51,7 +51,7 @@ def get_gl_entries(filters):
gl_entries = webnotes.conn.sql("""select posting_date, account, gl_entries = webnotes.conn.sql("""select posting_date, account,
sum(ifnull(debit, 0)) as debit, sum(ifnull(credit, 0)) as credit, sum(ifnull(debit, 0)) as debit, sum(ifnull(credit, 0)) as credit,
voucher_type, voucher_no, cost_center, remarks, is_advance, against voucher_type, voucher_no, cost_center, remarks, is_opening, against
from `tabGL Entry` from `tabGL Entry`
where company=%(company)s {conditions} where company=%(company)s {conditions}
{group_by_condition} {group_by_condition}
@ -138,7 +138,7 @@ def get_accountwise_gle(filters, gl_entries, gle_map):
for gle in gl_entries: for gle in gl_entries:
amount = flt(gle.debit) - flt(gle.credit) amount = flt(gle.debit) - flt(gle.credit)
if filters.get("account") and (gle.posting_date < filters.from_date if filters.get("account") and (gle.posting_date < filters.from_date
or cstr(gle.is_advance) == "Yes"): or cstr(gle.is_opening) == "Yes"):
gle_map[gle.account].opening += amount gle_map[gle.account].opening += amount
opening += amount opening += amount
elif gle.posting_date <= filters.to_date: elif gle.posting_date <= filters.to_date:

View File

@ -379,3 +379,12 @@ def get_account_for(account_for_doctype, account_for):
return webnotes.conn.get_value("Account", {account_for_field: account_for_doctype, return webnotes.conn.get_value("Account", {account_for_field: account_for_doctype,
"master_name": account_for}) "master_name": account_for})
def get_currency_precision(currency=None):
if not currency:
currency = webnotes.conn.get_value("Company",
webnotes.conn.get_default("company"), "default_currency")
currency_format = webnotes.conn.get_value("Currency", currency, "number_format")
from webnotes.utils import get_number_format_info
return get_number_format_info(currency_format)[2]

View File

@ -3,7 +3,7 @@
{% include 'setup/doctype/contact_control/contact_control.js' %}; {% include 'setup/doctype/contact_control/contact_control.js' %};
cur_frm.cscript.refresh = function(doc,dt,dn) { cur_frm.cscript.refresh = function(doc, dt, dn) {
cur_frm.cscript.make_dashboard(doc); cur_frm.cscript.make_dashboard(doc);
erpnext.hide_naming_series(); erpnext.hide_naming_series();
@ -93,7 +93,7 @@ cur_frm.cscript.make_contact = function() {
cur_frm.contact_list.run(); cur_frm.contact_list.run();
} }
cur_frm.fields_dict['default_price_list'].get_query = function(doc,cdt,cdn) { cur_frm.fields_dict['default_price_list'].get_query = function(doc, cdt, cdn) {
return{ return{
filters:{'buying': 1} filters:{'buying': 1}
} }

View File

@ -2,7 +2,7 @@
{ {
"creation": "2013-05-13 16:10:02", "creation": "2013-05-13 16:10:02",
"docstatus": 0, "docstatus": 0,
"modified": "2013-05-13 16:21:07", "modified": "2014-01-24 18:19:11",
"modified_by": "Administrator", "modified_by": "Administrator",
"owner": "Administrator" "owner": "Administrator"
}, },
@ -11,7 +11,7 @@
"doctype": "Report", "doctype": "Report",
"is_standard": "Yes", "is_standard": "Yes",
"name": "__common__", "name": "__common__",
"query": "select \n mr.name as \"Material Request:Link/Material Request:120\",\n\tmr.transaction_date as \"Date:Date:100\",\n\tmr_item.item_code as \"Item Code:Link/Item:120\",\n\tmr_item.qty as \"Qty:Float:100\",\n\tmr_item.ordered_qty as \"Ordered Qty:Float:100\", \n\t(mr_item.qty - ifnull(mr_item.ordered_qty, 0)) as \"Qty to Order:Float:100\",\n\tmr_item.item_name as \"Item Name::150\",\n\tmr_item.description as \"Description::200\"\nfrom\n\t`tabMaterial Request` mr, `tabMaterial Request Item` mr_item\nwhere\n\tmr_item.parent = mr.name\n\tand mr.material_request_type = \"Purchase\"\n\tand mr.docstatus = 1\n\tand mr.status != \"Stopped\"\n\tand ifnull(mr_item.ordered_qty, 0) < ifnull(mr_item.qty, 0)\norder by mr.transaction_date asc", "query": "select \n mr.name as \"Material Request:Link/Material Request:120\",\n\tmr.transaction_date as \"Date:Date:100\",\n\tmr_item.item_code as \"Item Code:Link/Item:120\",\n\tsum(ifnull(mr_item.qty, 0)) as \"Qty:Float:100\",\n\tsum(ifnull(mr_item.ordered_qty, 0)) as \"Ordered Qty:Float:100\", \n\t(sum(mr_item.qty) - sum(ifnull(mr_item.ordered_qty, 0))) as \"Qty to Order:Float:100\",\n\tmr_item.item_name as \"Item Name::150\",\n\tmr_item.description as \"Description::200\"\nfrom\n\t`tabMaterial Request` mr, `tabMaterial Request Item` mr_item\nwhere\n\tmr_item.parent = mr.name\n\tand mr.material_request_type = \"Purchase\"\n\tand mr.docstatus = 1\n\tand mr.status != \"Stopped\"\ngroup by mr.name, mr_item.item_code\nhaving\n\tsum(ifnull(mr_item.ordered_qty, 0)) < sum(ifnull(mr_item.qty, 0))\norder by mr.transaction_date asc",
"ref_doctype": "Purchase Order", "ref_doctype": "Purchase Order",
"report_name": "Requested Items To Be Ordered", "report_name": "Requested Items To Be Ordered",
"report_type": "Query Report" "report_type": "Query Report"

View File

@ -89,8 +89,10 @@ def _get_price_list_rate(args, item_bean, meta):
# try fetching from price list # try fetching from price list
if args.buying_price_list and args.price_list_currency: if args.buying_price_list and args.price_list_currency:
price_list_rate = webnotes.conn.sql("""select ref_rate from `tabItem Price` price_list_rate = webnotes.conn.sql("""select ip.ref_rate from
where price_list=%s and item_code=%s and buying=1""", `tabItem Price` ip, `tabPrice List` pl
where ip.price_list=pl.name and ip.price_list=%s and
ip.item_code=%s and ip.buying=1 and pl.enabled=1""",
(args.buying_price_list, args.item_code), as_dict=1) (args.buying_price_list, args.item_code), as_dict=1)
if price_list_rate: if price_list_rate:

View File

@ -2,7 +2,7 @@
{ {
"creation": "2013-01-10 16:34:12", "creation": "2013-01-10 16:34:12",
"docstatus": 0, "docstatus": 0,
"modified": "2014-01-20 17:48:22", "modified": "2014-01-22 16:05:34",
"modified_by": "Administrator", "modified_by": "Administrator",
"owner": "ashwini@webnotestech.com" "owner": "ashwini@webnotestech.com"
}, },
@ -233,7 +233,7 @@
"cancel": 0, "cancel": 0,
"delete": 0, "delete": 0,
"doctype": "DocPerm", "doctype": "DocPerm",
"match": "owner", "restricted": 1,
"role": "Employee", "role": "Employee",
"submit": 0 "submit": 0
}, },

View File

@ -4,10 +4,10 @@
wn.provide("erpnext.hr"); wn.provide("erpnext.hr");
erpnext.hr.EmployeeController = wn.ui.form.Controller.extend({ erpnext.hr.EmployeeController = wn.ui.form.Controller.extend({
setup: function() { setup: function() {
this.frm.fields_dict.user_id.get_query = function(doc,cdt,cdn) { this.frm.fields_dict.user_id.get_query = function(doc, cdt, cdn) {
return { query:"webnotes.core.doctype.profile.profile.profile_query"} } return { query:"webnotes.core.doctype.profile.profile.profile_query"} }
this.frm.fields_dict.reports_to.get_query = function(doc,cdt,cdn) { this.frm.fields_dict.reports_to.get_query = function(doc, cdt, cdn) {
return{ query: "erpnext.controllers.queries.employee_query"} } return { query: "erpnext.controllers.queries.employee_query"} }
}, },
onload: function() { onload: function() {

View File

@ -2,7 +2,7 @@
{ {
"creation": "2013-01-10 16:34:14", "creation": "2013-01-10 16:34:14",
"docstatus": 0, "docstatus": 0,
"modified": "2014-01-20 17:48:44", "modified": "2014-01-22 16:05:34",
"modified_by": "Administrator", "modified_by": "Administrator",
"owner": "harshada@webnotestech.com" "owner": "harshada@webnotestech.com"
}, },
@ -223,7 +223,7 @@
{ {
"delete": 0, "delete": 0,
"doctype": "DocPerm", "doctype": "DocPerm",
"match": "owner", "restricted": 1,
"role": "Employee" "role": "Employee"
}, },
{ {

View File

@ -8,9 +8,7 @@ from webnotes.utils import add_days, add_years, cint, getdate
from webnotes.model import db_exists from webnotes.model import db_exists
from webnotes.model.doc import addchild, make_autoname from webnotes.model.doc import addchild, make_autoname
from webnotes.model.bean import copy_doclist from webnotes.model.bean import copy_doclist
from webnotes import msgprint from webnotes import msgprint, throw, _
import datetime import datetime
class DocType: class DocType:
@ -19,7 +17,7 @@ class DocType:
self.doclist = doclist self.doclist = doclist
def autoname(self): def autoname(self):
self.doc.name = make_autoname(self.doc.fiscal_year +"/"+ self.doc.holiday_list_name+"/.###") self.doc.name = make_autoname(self.doc.fiscal_year + "/" + self.doc.holiday_list_name + "/.###")
def validate(self): def validate(self):
self.update_default_holiday_list() self.update_default_holiday_list()
@ -38,11 +36,9 @@ class DocType:
def validate_values(self): def validate_values(self):
if not self.doc.fiscal_year: if not self.doc.fiscal_year:
msgprint("Please select Fiscal Year") throw(_("Please select Fiscal Year"))
raise Exception
if not self.doc.weekly_off: if not self.doc.weekly_off:
msgprint("Please select weekly off day") throw(_("Please select weekly off day"))
raise Exception
def get_fy_start_end_dates(self): def get_fy_start_end_dates(self):
return webnotes.conn.sql("""select year_start_date, year_end_date return webnotes.conn.sql("""select year_start_date, year_end_date

View File

@ -2,7 +2,7 @@
{ {
"creation": "2013-02-20 19:10:38", "creation": "2013-02-20 19:10:38",
"docstatus": 0, "docstatus": 0,
"modified": "2014-01-20 17:48:54", "modified": "2014-01-22 16:05:35",
"modified_by": "Administrator", "modified_by": "Administrator",
"owner": "Administrator" "owner": "Administrator"
}, },
@ -171,7 +171,7 @@
}, },
{ {
"doctype": "DocPerm", "doctype": "DocPerm",
"match": "owner", "restricted": 1,
"role": "HR User" "role": "HR User"
}, },
{ {

View File

@ -243,10 +243,10 @@ class DocType:
"item_code": [qty_required, description, stock_uom, min_order_qty] "item_code": [qty_required, description, stock_uom, min_order_qty]
} }
""" """
bom_wise_item_details = {}
item_list = [] item_list = []
for bom, so_wise_qty in bom_dict.items(): for bom, so_wise_qty in bom_dict.items():
bom_wise_item_details = {}
if self.doc.use_multi_level_bom: if self.doc.use_multi_level_bom:
# get all raw materials with sub assembly childs # get all raw materials with sub assembly childs
for d in webnotes.conn.sql("""select fb.item_code, for d in webnotes.conn.sql("""select fb.item_code,

View File

@ -1,7 +1,8 @@
erpnext.patches.1401.enable_all_price_list
erpnext.patches.4_0.update_user_properties erpnext.patches.4_0.update_user_properties
erpnext.patches.4_0.move_warehouse_user_to_restrictions erpnext.patches.4_0.move_warehouse_user_to_restrictions
erpnext.patches.4_0.new_permissions erpnext.patches.4_0.new_permissions
erpnext.patches.4_0.update_incharge_name_to_sales_person_in_maintenance_schedule
execute:webnotes.reload_doc('accounts', 'doctype', 'sales_invoice') # 2014-01-03 execute:webnotes.reload_doc('accounts', 'doctype', 'sales_invoice') # 2014-01-03
execute:webnotes.reload_doc('selling', 'doctype', 'sales_order') # 2014-01-03 execute:webnotes.reload_doc('selling', 'doctype', 'sales_order') # 2014-01-03
execute:webnotes.reload_doc('selling', 'doctype', 'quotation') # 2014-01-03 execute:webnotes.reload_doc('selling', 'doctype', 'quotation') # 2014-01-03

View File

@ -0,0 +1,9 @@
# Copyright (c) 2014, 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():
webnotes.reload_doc("stock", "doctype", "price_list")
webnotes.conn.sql("""update `tabPrice List` set enabled=1""")

View File

@ -0,0 +1,12 @@
# 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():
webnotes.reload_doc("support", "doctype", "maintenance_schedule_detail")
webnotes.reload_doc("support", "doctype", "maintenance_schedule_item")
webnotes.conn.sql("""update `tabMaintenance Schedule Detail` set sales_person=incharge_name""")
webnotes.conn.sql("""update `tabMaintenance Schedule Item` set sales_person=incharge_name""")

View File

@ -45,7 +45,11 @@ def update_user_match():
for profile in webnotes.conn.sql_list("""select name from `tabProfile` for profile in webnotes.conn.sql_list("""select name from `tabProfile`
where enabled=1 and user_type='System User'"""): where enabled=1 and user_type='System User'"""):
perms = webnotes.permissions.get_user_perms(meta, "read", profile) user_roles = webnotes.get_roles(profile)
perms = meta.get({"doctype": "DocPerm", "permlevel": 0,
"role": ["in", [["All"] + user_roles]], "read": 1})
# user does not have required roles # user does not have required roles
if not perms: if not perms:
continue continue

View File

@ -270,4 +270,5 @@ patch_list = [
"execute:webnotes.reload_doc('selling', 'doctype', 'sales_order') # 2013-12-26", "execute:webnotes.reload_doc('selling', 'doctype', 'sales_order') # 2013-12-26",
"execute:webnotes.reload_doc('selling', 'doctype', 'quotation') # 2013-12-26", "execute:webnotes.reload_doc('selling', 'doctype', 'quotation') # 2013-12-26",
"execute:webnotes.reload_doc('stock', 'doctype', 'delivery_note') # 2013-12-26", "execute:webnotes.reload_doc('stock', 'doctype', 'delivery_note') # 2013-12-26",
"patches.1401.enable_all_price_list",
] ]

View File

@ -2,7 +2,7 @@
{ {
"creation": "2013-01-29 19:25:50", "creation": "2013-01-29 19:25:50",
"docstatus": 0, "docstatus": 0,
"modified": "2014-01-20 17:49:32", "modified": "2014-01-24 13:01:46",
"modified_by": "Administrator", "modified_by": "Administrator",
"owner": "Administrator" "owner": "Administrator"
}, },
@ -15,7 +15,9 @@
"icon": "icon-check", "icon": "icon-check",
"max_attachments": 5, "max_attachments": 5,
"module": "Projects", "module": "Projects",
"name": "__common__" "name": "__common__",
"search_fields": "subject",
"title_field": "subject"
}, },
{ {
"doctype": "DocField", "doctype": "DocField",

View File

@ -2,7 +2,7 @@
{ {
"creation": "2013-04-03 16:38:41", "creation": "2013-04-03 16:38:41",
"docstatus": 0, "docstatus": 0,
"modified": "2014-01-20 17:49:34", "modified": "2014-01-22 16:05:35",
"modified_by": "Administrator", "modified_by": "Administrator",
"owner": "Administrator" "owner": "Administrator"
}, },
@ -205,7 +205,7 @@
{ {
"create": 1, "create": 1,
"doctype": "DocPerm", "doctype": "DocPerm",
"match": "owner", "restricted": 1,
"role": "Projects User" "role": "Projects User"
}, },
{ {

View File

@ -18,7 +18,7 @@ cur_frm.cscript.load_defaults = function(doc, dt, dn) {
cur_frm.add_fetch('lead_name', 'company_name', 'customer_name'); cur_frm.add_fetch('lead_name', 'company_name', 'customer_name');
cur_frm.add_fetch('default_sales_partner','commission_rate','default_commission_rate'); cur_frm.add_fetch('default_sales_partner','commission_rate','default_commission_rate');
cur_frm.cscript.refresh = function(doc,dt,dn) { cur_frm.cscript.refresh = function(doc, dt, dn) {
cur_frm.cscript.setup_dashboard(doc); cur_frm.cscript.setup_dashboard(doc);
erpnext.hide_naming_series(); erpnext.hide_naming_series();
@ -107,20 +107,20 @@ cur_frm.cscript.make_contact = function() {
} }
cur_frm.fields_dict['customer_group'].get_query = function(doc,dt,dn) { cur_frm.fields_dict['customer_group'].get_query = function(doc, dt, dn) {
return{ return{
filters:{'is_group': 'No'} filters:{'is_group': 'No'}
} }
} }
cur_frm.fields_dict.lead_name.get_query = function(doc,cdt,cdn) { cur_frm.fields_dict.lead_name.get_query = function(doc, cdt, cdn) {
return{ return{
query: "erpnext.controllers.queries.lead_query" query: "erpnext.controllers.queries.lead_query"
} }
} }
cur_frm.fields_dict['default_price_list'].get_query = function(doc,cdt,cdn) { cur_frm.fields_dict['default_price_list'].get_query = function(doc, cdt, cdn) {
return{ return{
filters:{'selling': 1} filters:{'selling': 1}
} }

View File

@ -7,18 +7,18 @@
wn.provide("erpnext"); wn.provide("erpnext");
erpnext.LeadController = wn.ui.form.Controller.extend({ erpnext.LeadController = wn.ui.form.Controller.extend({
setup: function() { setup: function() {
this.frm.fields_dict.customer.get_query = function(doc,cdt,cdn) { this.frm.fields_dict.customer.get_query = function(doc, cdt, cdn) {
return { query: "erpnext.controllers.queries.customer_query" } } return { query: "erpnext.controllers.queries.customer_query" } }
}, },
onload: function() { onload: function() {
if(cur_frm.fields_dict.lead_owner.df.options.match(/^Profile/)) { if(cur_frm.fields_dict.lead_owner.df.options.match(/^Profile/)) {
cur_frm.fields_dict.lead_owner.get_query = function(doc,cdt,cdn) { cur_frm.fields_dict.lead_owner.get_query = function(doc, cdt, cdn) {
return { query:"webnotes.core.doctype.profile.profile.profile_query" } } return { query:"webnotes.core.doctype.profile.profile.profile_query" } }
} }
if(cur_frm.fields_dict.contact_by.df.options.match(/^Profile/)) { if(cur_frm.fields_dict.contact_by.df.options.match(/^Profile/)) {
cur_frm.fields_dict.contact_by.get_query = function(doc,cdt,cdn) { cur_frm.fields_dict.contact_by.get_query = function(doc, cdt, cdn) {
return { query:"webnotes.core.doctype.profile.profile.profile_query" } } return { query:"webnotes.core.doctype.profile.profile.profile_query" } }
} }

View File

@ -7,17 +7,17 @@ import webnotes
@webnotes.whitelist() @webnotes.whitelist()
def get_children(): def get_children():
ctype = webnotes.form_dict.get('ctype') ctype = webnotes.local.form_dict.get('ctype')
webnotes.form_dict['parent_field'] = 'parent_' + ctype.lower().replace(' ', '_') webnotes.local.form_dict['parent_field'] = 'parent_' + ctype.lower().replace(' ', '_')
if not webnotes.form_dict.get('parent'): if not webnotes.form_dict.get('parent'):
webnotes.form_dict['parent'] = '' webnotes.local.form_dict['parent'] = ''
return webnotes.conn.sql("""select name as value, return webnotes.conn.sql("""select name as value,
if(is_group='Yes', 1, 0) as expandable if(is_group='Yes', 1, 0) as expandable
from `tab%(ctype)s` from `tab%(ctype)s`
where docstatus < 2 where docstatus < 2
and ifnull(%(parent_field)s,'') = "%(parent)s" and ifnull(%(parent_field)s,'') = "%(parent)s"
order by name""" % webnotes.form_dict, as_dict=1) order by name""" % webnotes.local.form_dict, as_dict=1)
@webnotes.whitelist() @webnotes.whitelist()
def add_node(): def add_node():

View File

@ -150,8 +150,10 @@ def _get_basic_details(args, item_bean, warehouse_fieldname):
return out return out
def _get_price_list_rate(args, item_bean, meta): def _get_price_list_rate(args, item_bean, meta):
ref_rate = webnotes.conn.sql("""select ref_rate from `tabItem Price` ref_rate = webnotes.conn.sql("""select ip.ref_rate from
where price_list=%s and item_code=%s and selling=1""", `tabItem Price` ip, `tabPrice List` pl
where ip.price_list=pl.name and ip.price_list=%s and
ip.item_code=%s and ip.selling=1 and pl.enabled=1""",
(args.selling_price_list, args.item_code), as_dict=1) (args.selling_price_list, args.item_code), as_dict=1)
if not ref_rate: if not ref_rate:

View File

@ -1,29 +1,26 @@
// Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors // Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
// License: GNU General Public License v3. See license.txt // License: GNU General Public License v3. See license.txt
//--------- ONLOAD -------------
cur_frm.cscript.onload = function(doc, cdt, cdn) {
}
// Settings Module // Settings Module
cur_frm.cscript.refresh = function(doc, cdt, cdn) {
if (doc.based_on == 'Grand Total' || doc.based_on == 'Average Discount' || doc.based_on == 'Not Applicable')
hide_field('master_name');
else
unhide_field('master_name');
cur_frm.cscript.refresh = function(doc,cdt,cdn){ if (doc.based_on == 'Not Applicable')
hide_field('value');
else
unhide_field('value');
if (doc.transaction == 'Appraisal') {
if(doc.based_on == 'Grand Total' || doc.based_on == 'Average Discount' || doc.based_on == 'Not Applicable') hide_field('master_name');
else unhide_field('master_name');
if(doc.based_on == 'Not Applicable') hide_field('value');
else unhide_field('value');
if(doc.transaction == 'Appraisal'){
hide_field(['master_name','system_role', 'system_user']); hide_field(['master_name','system_role', 'system_user']);
unhide_field(['to_emp','to_designation']); unhide_field(['to_emp','to_designation']);
if(doc.transaction == 'Appraisal') hide_field('value');
else unhide_field('value'); if (doc.transaction == 'Appraisal')
hide_field('value');
else
unhide_field('value');
} }
else { else {
unhide_field(['master_name','system_role', 'system_user','value']); unhide_field(['master_name','system_role', 'system_user','value']);
@ -31,31 +28,32 @@ cur_frm.cscript.refresh = function(doc,cdt,cdn){
} }
} }
cur_frm.cscript.based_on = function(doc){ cur_frm.cscript.based_on = function(doc) {
if(doc.based_on == 'Grand Total' || doc.based_on == 'Average Discount' || doc.based_on == 'Not Applicable'){ if (doc.based_on == 'Grand Total' || doc.based_on == 'Average Discount' || doc.based_on == 'Not Applicable') {
doc.master_name = ''; doc.master_name = '';
refresh_field('master_name'); refresh_field('master_name');
hide_field('master_name'); hide_field('master_name');
} }
else{ else
unhide_field('master_name'); unhide_field('master_name');
}
if(doc.based_on == 'Not Applicable') { if (doc.based_on == 'Not Applicable') {
doc.value =0; doc.value =0;
refresh_field('value'); refresh_field('value');
hide_field('value'); hide_field('value');
} }
else unhide_field('value'); else
unhide_field('value');
} }
cur_frm.cscript.transaction = function(doc,cdt,cdn){ cur_frm.cscript.transaction = function(doc, cdt, cdn){
if (doc.transaction == 'Appraisal'){ if (doc.transaction == 'Appraisal') {
doc.based_on == 'Not Applicable';
doc.master_name = doc.system_role = doc.system_user = ''; doc.master_name = doc.system_role = doc.system_user = '';
refresh_many(['master_name','system_role', 'system_user']); refresh_many(['master_name','system_role', 'system_user', 'based_on']);
hide_field(['master_name','system_role', 'system_user']); hide_field(['master_name','system_role', 'system_user']);
unhide_field(['to_emp','to_designation']); unhide_field(['to_emp','to_designation']);
doc.value =0; doc.value = 0;
refresh_many('value'); refresh_many('value');
hide_field('value'); hide_field('value');
} }
@ -64,22 +62,22 @@ cur_frm.cscript.transaction = function(doc,cdt,cdn){
hide_field(['to_emp','to_designation']); hide_field(['to_emp','to_designation']);
} }
if(doc.transaction == 'Appraisal') doc.based_on == 'Not Applicable';
} }
cur_frm.fields_dict.system_user.get_query = function(doc, cdt, cdn) {
return { query:"webnotes.core.doctype.profile.profile.profile_query" }
}
cur_frm.fields_dict.system_user.get_query = function(doc,cdt,cdn) { cur_frm.fields_dict.approving_user.get_query = function(doc, cdt, cdn) {
return{ query:"webnotes.core.doctype.profile.profile.profile_query" } } return { query:"webnotes.core.doctype.profile.profile.profile_query" }
}
cur_frm.fields_dict.approving_user.get_query = function(doc,cdt,cdn) {
return{ query:"webnotes.core.doctype.profile.profile.profile_query" } }
cur_frm.fields_dict['approving_role'].get_query = cur_frm.fields_dict['system_role'].get_query; cur_frm.fields_dict['approving_role'].get_query = cur_frm.fields_dict['system_role'].get_query;
// System Role Trigger // System Role Trigger
// ----------------------- // -----------------------
cur_frm.fields_dict['system_role'].get_query = function(doc) { cur_frm.fields_dict['system_role'].get_query = function(doc) {
return{ return {
filters:[ filters:[
['Role', 'name', 'not in', 'Administrator, Guest, All'] ['Role', 'name', 'not in', 'Administrator, Guest, All']
] ]
@ -89,15 +87,15 @@ cur_frm.fields_dict['system_role'].get_query = function(doc) {
// Master Name Trigger // Master Name Trigger
// -------------------- // --------------------
cur_frm.fields_dict['master_name'].get_query = function(doc){ cur_frm.fields_dict['master_name'].get_query = function(doc) {
if(doc.based_on == 'Customerwise Discount') if (doc.based_on == 'Customerwise Discount')
return { return {
doctype: "Customer", doctype: "Customer",
filters:[ filters:[
['Customer', 'docstatus', '!=', 2] ['Customer', 'docstatus', '!=', 2]
] ]
} }
else if(doc.based_on == 'Itemwise Discount') else if (doc.based_on == 'Itemwise Discount')
return { return {
doctype: "Item", doctype: "Item",
query: "erpnext.controllers.queries.item_query" query: "erpnext.controllers.queries.item_query"
@ -110,5 +108,6 @@ cur_frm.fields_dict['master_name'].get_query = function(doc){
} }
} }
cur_frm.fields_dict.to_emp.get_query = function(doc,cdt,cdn) { cur_frm.fields_dict.to_emp.get_query = function(doc, cdt, cdn) {
return{ query: "erpnext.controllers.queries.employee_query" } } return { query: "erpnext.controllers.queries.employee_query" }
}

View File

@ -15,15 +15,10 @@ cur_frm.cscript.set_root_readonly = function(doc) {
} }
} }
cur_frm.cscript.onload = function(){
}
//get query select sales person //get query select sales person
cur_frm.fields_dict['parent_sales_person'].get_query = function(doc,cdt,cdn) { cur_frm.fields_dict['parent_sales_person'].get_query = function(doc, cdt, cdn) {
return{ return{
filters:[ filters: [
['Sales Person', 'is_group', '=', 'Yes'], ['Sales Person', 'is_group', '=', 'Yes'],
['Sales Person', 'name', '!=', doc.sales_person_name] ['Sales Person', 'name', '!=', doc.sales_person_name]
] ]
@ -31,10 +26,11 @@ cur_frm.fields_dict['parent_sales_person'].get_query = function(doc,cdt,cdn) {
} }
cur_frm.fields_dict['target_details'].grid.get_field("item_group").get_query = function(doc, cdt, cdn) { cur_frm.fields_dict['target_details'].grid.get_field("item_group").get_query = function(doc, cdt, cdn) {
return{ return {
filters:{ 'is_group': "No" } filters: { 'is_group': "No" }
} }
} }
cur_frm.fields_dict.employee.get_query = function(doc,cdt,cdn) { cur_frm.fields_dict.employee.get_query = function(doc, cdt, cdn) {
return{ query: "erpnext.controllers.queries.employee_query" } } return { query: "erpnext.controllers.queries.employee_query" }
}

View File

@ -3,10 +3,8 @@
from __future__ import unicode_literals from __future__ import unicode_literals
import webnotes import webnotes
from webnotes.model.bean import getlist from webnotes.model.bean import getlist
from webnotes.utils import flt from webnotes.utils import flt
from webnotes.utils.nestedset import DocTypeNestedSet from webnotes.utils.nestedset import DocTypeNestedSet
class DocType(DocTypeNestedSet): class DocType(DocTypeNestedSet):
@ -18,8 +16,7 @@ class DocType(DocTypeNestedSet):
def validate(self): def validate(self):
for d in getlist(self.doclist, 'target_details'): for d in getlist(self.doclist, 'target_details'):
if not flt(d.target_qty) and not flt(d.target_amount): if not flt(d.target_qty) and not flt(d.target_amount):
webnotes.msgprint("Either target qty or target amount is mandatory.") webnotes.throw(_("Either target qty or target amount is mandatory."))
raise Exception
def on_update(self): def on_update(self):
super(DocType, self).on_update() super(DocType, self).on_update()
@ -28,8 +25,7 @@ class DocType(DocTypeNestedSet):
def get_email_id(self): def get_email_id(self):
profile = webnotes.conn.get_value("Employee", self.doc.employee, "user_id") profile = webnotes.conn.get_value("Employee", self.doc.employee, "user_id")
if not profile: if not profile:
webnotes.msgprint("User ID (Profile) no set for Employee %s" % self.doc.employee, webnotes.throw("User ID (Profile) not set for Employee %s" % self.doc.employee)
raise_exception=True)
else: else:
return webnotes.conn.get_value("Profile", profile, "email") or profile return webnotes.conn.get_value("Profile", profile, "email") or profile

View File

@ -98,6 +98,7 @@ def create_price_lists(args):
{ {
"doctype": "Price List", "doctype": "Price List",
"price_list_name": "Standard " + pl_type, "price_list_name": "Standard " + pl_type,
"enabled": 1,
"buying": 1 if pl_type == "Buying" else 0, "buying": 1 if pl_type == "Buying" else 0,
"selling": 1 if pl_type == "Selling" else 0, "selling": 1 if pl_type == "Selling" else 0,
"currency": args["currency"] "currency": args["currency"]

View File

@ -3,7 +3,7 @@
from __future__ import unicode_literals from __future__ import unicode_literals
import webnotes import webnotes
from webnotes import _, msgprint from webnotes import _, msgprint, throw
import json import json
def get_company_currency(company): def get_company_currency(company):
@ -11,8 +11,8 @@ def get_company_currency(company):
if not currency: if not currency:
currency = webnotes.conn.get_default("currency") currency = webnotes.conn.get_default("currency")
if not currency: if not currency:
msgprint(_('Please specify Default Currency in Company Master \ throw(_('Please specify Default Currency in Company Master \
and Global Defaults'), raise_exception=True) and Global Defaults'))
return currency return currency
@ -32,5 +32,14 @@ def get_ancestors_of(doctype, name):
@webnotes.whitelist() @webnotes.whitelist()
def get_price_list_currency(price_list): def get_price_list_currency(price_list):
return {"price_list_currency": webnotes.conn.get_value("Price List", price_list, price_list_currency = webnotes.conn.get_value("Price List", {"name": price_list,
"currency")} "enabled": 1}, "currency")
if not price_list_currency:
throw("{message}: {price_list} {disabled}".format(**{
"message": _("Price List"),
"price_list": price_list,
"disabled": _("is disabled.")
}))
else:
return {"price_list_currency": price_list_currency}

View File

@ -12,17 +12,19 @@ class DocType:
self.doc, self.doclist = d, dl self.doc, self.doclist = d, dl
def validate(self): def validate(self):
self.validate_price_list()
self.check_duplicate_item() self.check_duplicate_item()
self.update_price_list_details() self.update_price_list_details()
self.update_item_details() self.update_item_details()
def update_price_list_details(self): def validate_price_list(self):
self.doc.buying, self.doc.selling, self.doc.currency = webnotes.conn.get_value("Price List", enabled = webnotes.conn.get_value("Price List", self.doc.price_list, "enabled")
self.doc.price_list, ["buying", "selling", "currency"]) if not enabled:
throw("{message}: {price_list} {disabled}".format(**{
def update_item_details(self): "message": _("Price List"),
self.doc.item_name, self.doc.item_description = webnotes.conn.get_value("Item", "price_list": self.doc.price_list,
self.doc.item_code, ["item_name", "description"]) "disabled": _("is disabled.")
}))
def check_duplicate_item(self): def check_duplicate_item(self):
if webnotes.conn.sql("""select name from `tabItem Price` if webnotes.conn.sql("""select name from `tabItem Price`
@ -35,3 +37,11 @@ class DocType:
"price_list": self.doc.price_list "price_list": self.doc.price_list
}), ItemPriceDuplicateItem) }), ItemPriceDuplicateItem)
def update_price_list_details(self):
self.doc.buying, self.doc.selling, self.doc.currency = webnotes.conn.get_value("Price List",
{"name": self.doc.price_list, "enabled": 1}, ["buying", "selling", "currency"])
def update_item_details(self):
self.doc.item_name, self.doc.item_description = webnotes.conn.get_value("Item",
self.doc.item_code, ["item_name", "description"])

View File

@ -37,14 +37,14 @@ class DocType(BuyingController):
for so_no in so_items.keys(): for so_no in so_items.keys():
for item in so_items[so_no].keys(): for item in so_items[so_no].keys():
already_indented = webnotes.conn.sql("""select sum(qty) from `tabMaterial Request Item` already_indented = webnotes.conn.sql("""select sum(ifnull(qty, 0))
from `tabMaterial Request Item`
where item_code = %s and sales_order_no = %s and where item_code = %s and sales_order_no = %s and
docstatus = 1 and parent != %s""", (item, so_no, self.doc.name)) docstatus = 1 and parent != %s""", (item, so_no, self.doc.name))
already_indented = already_indented and flt(already_indented[0][0]) or 0 already_indented = already_indented and flt(already_indented[0][0]) or 0
actual_so_qty = webnotes.conn.sql("""select sum(qty) from `tabSales Order Item` actual_so_qty = webnotes.conn.sql("""select sum(ifnull(qty, 0)) from `tabSales Order Item`
where parent = %s and item_code = %s and docstatus = 1 where parent = %s and item_code = %s and docstatus = 1""", (so_no, item))
group by parent""", (so_no, item))
actual_so_qty = actual_so_qty and flt(actual_so_qty[0][0]) or 0 actual_so_qty = actual_so_qty and flt(actual_so_qty[0][0]) or 0
if actual_so_qty and (flt(so_items[so_no][item]) + already_indented > actual_so_qty): if actual_so_qty and (flt(so_items[so_no][item]) + already_indented > actual_so_qty):

View File

@ -2,7 +2,7 @@
{ {
"creation": "2013-01-25 11:35:09", "creation": "2013-01-25 11:35:09",
"docstatus": 0, "docstatus": 0,
"modified": "2014-01-20 17:48:59", "modified": "2014-01-20 17:50:00",
"modified_by": "Administrator", "modified_by": "Administrator",
"owner": "Administrator" "owner": "Administrator"
}, },
@ -41,6 +41,18 @@
"doctype": "DocType", "doctype": "DocType",
"name": "Price List" "name": "Price List"
}, },
{
"default": "1",
"doctype": "DocField",
"fieldname": "enabled",
"fieldtype": "Check",
"label": "Enabled"
},
{
"doctype": "DocField",
"fieldname": "sb_1",
"fieldtype": "Section Break"
},
{ {
"doctype": "DocField", "doctype": "DocField",
"fieldname": "price_list_name", "fieldname": "price_list_name",

View File

@ -11,6 +11,7 @@ test_records = [
{ {
"doctype": "Price List", "doctype": "Price List",
"price_list_name": "_Test Price List", "price_list_name": "_Test Price List",
"enabled": 1,
"currency": "INR", "currency": "INR",
"selling": 1 "selling": 1
}, },
@ -24,6 +25,7 @@ test_records = [
{ {
"doctype": "Price List", "doctype": "Price List",
"price_list_name": "_Test Price List 2", "price_list_name": "_Test Price List 2",
"enabled": 1,
"currency": "INR", "currency": "INR",
"selling": 1 "selling": 1
}, },
@ -37,6 +39,7 @@ test_records = [
{ {
"doctype": "Price List", "doctype": "Price List",
"price_list_name": "_Test Price List India", "price_list_name": "_Test Price List India",
"enabled": 1,
"currency": "INR", "currency": "INR",
"selling": 1 "selling": 1
}, },
@ -50,6 +53,7 @@ test_records = [
{ {
"doctype": "Price List", "doctype": "Price List",
"price_list_name": "_Test Price List Rest of the World", "price_list_name": "_Test Price List Rest of the World",
"enabled": 1,
"currency": "USD", "currency": "USD",
"selling": 1 "selling": 1
}, },

View File

@ -4,7 +4,7 @@
from __future__ import unicode_literals from __future__ import unicode_literals
import webnotes import webnotes
from webnotes.utils import cint, validate_email_add from webnotes.utils import cint, validate_email_add
from webnotes import msgprint, _ from webnotes import throw, msgprint, _
class DocType: class DocType:
def __init__(self, doc, doclist=[]): def __init__(self, doc, doclist=[]):
@ -18,7 +18,7 @@ class DocType:
def validate(self): def validate(self):
if self.doc.email_id and not validate_email_add(self.doc.email_id): if self.doc.email_id and not validate_email_add(self.doc.email_id):
msgprint("Please enter valid Email Id", raise_exception=1) throw(_("Please enter valid Email Id"))
self.update_parent_account() self.update_parent_account()
@ -76,8 +76,8 @@ class DocType:
for d in bins: for d in bins:
if d['actual_qty'] or d['reserved_qty'] or d['ordered_qty'] or \ if d['actual_qty'] or d['reserved_qty'] or d['ordered_qty'] or \
d['indented_qty'] or d['projected_qty'] or d['planned_qty']: d['indented_qty'] or d['projected_qty'] or d['planned_qty']:
msgprint("""Warehouse: %s can not be deleted as qty exists for item: %s""" throw("""Warehouse: %s can not be deleted as qty exists for item: %s"""
% (self.doc.name, d['item_code']), raise_exception=1) % (self.doc.name, d['item_code']))
else: else:
webnotes.conn.sql("delete from `tabBin` where name = %s", d['name']) webnotes.conn.sql("delete from `tabBin` where name = %s", d['name'])
@ -88,8 +88,8 @@ class DocType:
if webnotes.conn.sql("""select name from `tabStock Ledger Entry` if webnotes.conn.sql("""select name from `tabStock Ledger Entry`
where warehouse = %s""", self.doc.name): where warehouse = %s""", self.doc.name):
msgprint("""Warehouse can not be deleted as stock ledger entry throw(_("""Warehouse can not be deleted as stock ledger entry
exists for this warehouse.""", raise_exception=1) exists for this warehouse."""))
def before_rename(self, olddn, newdn, merge=False): def before_rename(self, olddn, newdn, merge=False):
# Add company abbr if not provided # Add company abbr if not provided
@ -97,8 +97,8 @@ class DocType:
new_warehouse = get_name_with_abbr(newdn, self.doc.company) new_warehouse = get_name_with_abbr(newdn, self.doc.company)
if merge: if merge:
if not webnotes.conn.exists("Warehouse", newdn): if not webnotes.conn.exists("Warehouse", new_warehouse):
webnotes.throw(_("Warehouse ") + newdn +_(" does not exists")) webnotes.throw(_("Warehouse ") + new_warehouse +_(" does not exists"))
if self.doc.company != webnotes.conn.get_value("Warehouse", new_warehouse, "company"): if self.doc.company != webnotes.conn.get_value("Warehouse", new_warehouse, "company"):
webnotes.throw(_("Both Warehouse must belong to same Company")) webnotes.throw(_("Both Warehouse must belong to same Company"))

View File

@ -15,8 +15,8 @@ def execute(filters=None):
bom_rate = get_item_bom_rate() bom_rate = get_item_bom_rate()
val_rate_map = get_valuation_rate() val_rate_map = get_valuation_rate()
from erpnext.accounts.utils import get_currency_precision
precision = get_currency_precision() or 2 precision = get_currency_precision() or 2
data = [] data = []
for item in sorted(item_map): for item in sorted(item_map):
data.append([item, item_map[item]["item_name"], data.append([item, item_map[item]["item_name"],
@ -31,14 +31,6 @@ def execute(filters=None):
return columns, data return columns, data
def get_currency_precision():
company_currency = webnotes.conn.get_value("Company",
webnotes.conn.get_default("company"), "default_currency")
currency_format = webnotes.conn.get_value("Currency", company_currency, "number_format")
from webnotes.utils import get_number_format_info
return get_number_format_info(currency_format)[2]
def get_columns(filters): def get_columns(filters):
"""return columns based on filters""" """return columns based on filters"""
@ -65,9 +57,10 @@ def get_price_list():
rate = {} rate = {}
price_list = webnotes.conn.sql("""select item_code, buying, selling, price_list = webnotes.conn.sql("""select ip.item_code, ip.buying, ip.selling,
concat(price_list, " - ", currency, " ", ref_rate) as price concat(ip.price_list, " - ", ip.currency, " ", ip.ref_rate) as price
from `tabItem Price`""", as_dict=1) from `tabItem Price` ip, `tabPrice List` pl
where ip.price_list=pl.name and pl.enabled=1""", as_dict=1)
for j in price_list: for j in price_list:
if j.price: if j.price:

View File

@ -5,34 +5,36 @@ wn.provide("erpnext.support");
// TODO commonify this code // TODO commonify this code
erpnext.support.MaintenanceSchedule = wn.ui.form.Controller.extend({ erpnext.support.MaintenanceSchedule = wn.ui.form.Controller.extend({
refresh: function() { refresh: function() {
if (this.frm.doc.docstatus===0) { var me = this;
cur_frm.add_custom_button(wn._('From Sales Order'),
if (this.frm.doc.docstatus === 0) {
this.frm.add_custom_button(wn._('From Sales Order'),
function() { function() {
wn.model.map_current_doc({ wn.model.map_current_doc({
method: "erpnext.selling.doctype.sales_order.sales_order.make_maintenance_schedule", method: "erpnext.selling.doctype.sales_order.sales_order.make_maintenance_schedule",
source_doctype: "Sales Order", source_doctype: "Sales Order",
get_query_filters: { get_query_filters: {
docstatus: 1, docstatus: 1,
order_type: cur_frm.doc.order_type, order_type: me.frm.doc.order_type,
customer: cur_frm.doc.customer || undefined, customer: me.frm.doc.customer || undefined,
company: cur_frm.doc.company company: me.frm.doc.company
} }
})
}); });
} else if (this.frm.doc.docstatus===1) { });
cur_frm.add_custom_button(wn._("Make Maintenance Visit"), function() { } else if (this.frm.doc.docstatus === 1) {
this.frm.add_custom_button(wn._("Make Maintenance Visit"), function() {
wn.model.open_mapped_doc({ wn.model.open_mapped_doc({
method: "erpnext.support.doctype.maintenance_schedule.maintenance_schedule.make_maintenance_visit", method: "erpnext.support.doctype.maintenance_schedule.maintenance_schedule.make_maintenance_visit",
source_name: cur_frm.doc.name source_name: me.frm.doc.name
})
}) })
});
} }
}, },
customer: function() { customer: function() {
var me = this; var me = this;
if(this.frm.doc.customer) { if(this.frm.doc.customer) {
return this.frm.call({ return this.frm.call({
doc: this.frm.doc, doc: me.frm.doc,
method: "set_customer_defaults", method: "set_customer_defaults",
}); });
} }
@ -42,34 +44,40 @@ erpnext.support.MaintenanceSchedule = wn.ui.form.Controller.extend({
$.extend(cur_frm.cscript, new erpnext.support.MaintenanceSchedule({frm: cur_frm})); $.extend(cur_frm.cscript, new erpnext.support.MaintenanceSchedule({frm: cur_frm}));
cur_frm.cscript.onload = function(doc, dt, dn) { cur_frm.cscript.onload = function(doc, dt, dn) {
if(!doc.status) set_multiple(dt,dn,{status:'Draft'}); if (!doc.status)
set_multiple(dt, dn, { status:'Draft' });
if(doc.__islocal){ if (doc.__islocal) {
set_multiple(dt,dn,{transaction_date:get_today()}); set_multiple(dt, dn, { transaction_date:get_today() });
hide_field(['customer_address','contact_person','customer_name','address_display','contact_display','contact_mobile','contact_email','territory','customer_group']); hide_field(['customer_address', 'contact_person', 'customer_name', 'address_display',
'contact_display', 'contact_mobile', 'contact_email', 'territory', 'customer_group']);
} }
} }
cur_frm.cscript.customer_address = cur_frm.cscript.contact_person = function(doc,dt,dn) { cur_frm.cscript.customer_address = cur_frm.cscript.contact_person = function(doc, dt, dn) {
if(doc.customer) return get_server_fields('get_customer_address', JSON.stringify({customer: doc.customer, address: doc.customer_address, contact: doc.contact_person}),'', doc, dt, dn, 1); if (doc.customer) {
return get_server_fields('get_customer_address',
JSON.stringify({customer: doc.customer, address: doc.customer_address,
contact: doc.contact_person}), '', doc, dt, dn, 1);
}
} }
cur_frm.fields_dict['customer_address'].get_query = function(doc, cdt, cdn) { cur_frm.fields_dict['customer_address'].get_query = function(doc, cdt, cdn) {
return{ return {
filters:{ 'customer': doc.customer} filters:{ 'customer': doc.customer }
} }
} }
cur_frm.fields_dict['contact_person'].get_query = function(doc, cdt, cdn) { cur_frm.fields_dict['contact_person'].get_query = function(doc, cdt, cdn) {
return{ return {
filters:{ 'customer': doc.customer} filters:{ 'customer': doc.customer }
} }
} }
// //
cur_frm.fields_dict['item_maintenance_detail'].grid.get_field('item_code').get_query = function(doc, cdt, cdn) { cur_frm.fields_dict['item_maintenance_detail'].grid.get_field('item_code').get_query = function(doc, cdt, cdn) {
return{ return {
filters:{ 'is_service_item': "Yes"} filters:{ 'is_service_item': "Yes" }
} }
} }
@ -77,35 +85,37 @@ cur_frm.cscript.item_code = function(doc, cdt, cdn) {
var fname = cur_frm.cscript.fname; var fname = cur_frm.cscript.fname;
var d = locals[cdt][cdn]; var d = locals[cdt][cdn];
if (d.item_code) { if (d.item_code) {
return get_server_fields('get_item_details',d.item_code, 'item_maintenance_detail',doc,cdt,cdn,1); return get_server_fields('get_item_details', d.item_code, 'item_maintenance_detail',
doc, cdt, cdn, 1);
} }
} }
cur_frm.cscript.periodicity = function(doc, cdt, cdn){ cur_frm.cscript.periodicity = function(doc, cdt, cdn){
var d = locals[cdt][cdn]; var d = locals[cdt][cdn];
if(d.start_date && d.end_date){ if(d.start_date && d.end_date) {
arg = {} arg = {}
arg.start_date = d.start_date; arg.start_date = d.start_date;
arg.end_date = d.end_date; arg.end_date = d.end_date;
arg.periodicity = d.periodicity; arg.periodicity = d.periodicity;
return get_server_fields('get_no_of_visits',docstring(arg),'item_maintenance_detail',doc, cdt, cdn, 1); return get_server_fields('get_no_of_visits', docstring(arg),
} 'item_maintenance_detail', doc, cdt, cdn, 1);
else{ } else {
msgprint(wn._("Please enter Start Date and End Date")); msgprint(wn._("Please enter Start Date and End Date"));
} }
} }
cur_frm.cscript.generate_schedule = function(doc, cdt, cdn) { cur_frm.cscript.generate_schedule = function(doc, cdt, cdn) {
if (!doc.__islocal) { if (!doc.__islocal) {
return $c('runserverobj', args={'method':'generate_schedule', 'docs':wn.model.compress(make_doclist(cdt,cdn))}, return $c('runserverobj', args={'method':'generate_schedule',
function(r,rt){ 'docs':wn.model.compress(make_doclist(cdt,cdn))},
function(r, rt) {
refresh_field('maintenance_schedule_detail'); refresh_field('maintenance_schedule_detail');
} });
);
} else { } else {
alert(wn._("Please save the document before generating maintenance schedule")); msgprint(wn._("Please save the document before generating maintenance schedule"));
} }
} }
cur_frm.fields_dict.customer.get_query = function(doc,cdt,cdn) { cur_frm.fields_dict.customer.get_query = function(doc,cdt,cdn) {
return{ query: "erpnext.controllers.queries.customer_query" } } return { query: "erpnext.controllers.queries.customer_query" }
}

View File

@ -4,13 +4,10 @@
from __future__ import unicode_literals from __future__ import unicode_literals
import webnotes import webnotes
from webnotes.utils import add_days, cstr, getdate from webnotes.utils import add_days, cstr, getdate, cint
from webnotes.model.doc import addchild from webnotes.model.doc import addchild
from webnotes.model.bean import getlist from webnotes.model.bean import getlist
from webnotes import msgprint from webnotes import msgprint, throw, _
from erpnext.utilities.transaction_base import TransactionBase, delete_events from erpnext.utilities.transaction_base import TransactionBase, delete_events
class DocType(TransactionBase): class DocType(TransactionBase):
@ -19,7 +16,8 @@ class DocType(TransactionBase):
self.doclist = doclist self.doclist = doclist
def get_item_details(self, item_code): def get_item_details(self, item_code):
item = webnotes.conn.sql("select item_name, description from `tabItem` where name = '%s'" %(item_code), as_dict=1) item = webnotes.conn.sql("""select item_name, description from `tabItem`
where name=%s""", (item_code), as_dict=1)
ret = { ret = {
'item_name': item and item[0]['item_name'] or '', 'item_name': item and item[0]['item_name'] or '',
'description' : item and item[0]['description'] or '' 'description' : item and item[0]['description'] or ''
@ -28,12 +26,13 @@ class DocType(TransactionBase):
def generate_schedule(self): def generate_schedule(self):
self.doclist = self.doc.clear_table(self.doclist, 'maintenance_schedule_detail') self.doclist = self.doc.clear_table(self.doclist, 'maintenance_schedule_detail')
count = 0 webnotes.conn.sql("""delete from `tabMaintenance Schedule Detail`
webnotes.conn.sql("delete from `tabMaintenance Schedule Detail` where parent='%s'" %(self.doc.name)) where parent=%s""", (self.doc.name))
count = 1
for d in getlist(self.doclist, 'item_maintenance_detail'): for d in getlist(self.doclist, 'item_maintenance_detail'):
self.validate_maintenance_detail() self.validate_maintenance_detail()
s_list =[] s_list = []
s_list = self.create_schedule_list(d.start_date, d.end_date, d.no_of_visits) s_list = self.create_schedule_list(d.start_date, d.end_date, d.no_of_visits, d.sales_person)
for i in range(d.no_of_visits): for i in range(d.no_of_visits):
child = addchild(self.doc, 'maintenance_schedule_detail', child = addchild(self.doc, 'maintenance_schedule_detail',
'Maintenance Schedule Detail', self.doclist) 'Maintenance Schedule Detail', self.doclist)
@ -43,40 +42,39 @@ class DocType(TransactionBase):
if d.serial_no: if d.serial_no:
child.serial_no = d.serial_no child.serial_no = d.serial_no
child.idx = count child.idx = count
count = count+1 count = count + 1
child.incharge_name = d.incharge_name child.sales_person = d.sales_person
child.save(1) child.save(1)
self.on_update() self.on_update()
def on_submit(self): def on_submit(self):
if not getlist(self.doclist, 'maintenance_schedule_detail'): if not getlist(self.doclist, 'maintenance_schedule_detail'):
msgprint("Please click on 'Generate Schedule' to get schedule") throw("Please click on 'Generate Schedule' to get schedule")
raise Exception
self.check_serial_no_added() self.check_serial_no_added()
self.validate_serial_no_warranty() self.validate_serial_no_warranty()
self.validate_schedule() self.validate_schedule()
email_map ={} email_map = {}
for d in getlist(self.doclist, 'item_maintenance_detail'): for d in getlist(self.doclist, 'item_maintenance_detail'):
if d.serial_no: if d.serial_no:
self.update_amc_date(d.serial_no, d.end_date) self.update_amc_date(d.serial_no, d.end_date)
if d.incharge_name not in email_map: if d.sales_person not in email_map:
email_map[d.incharge_name] = webnotes.bean("Sales Person", sp = webnotes.bean("Sales Person", d.sales_person).make_controller()
d.incharge_name).run_method("get_email_id") email_map[d.sales_person] = sp.get_email_id()
scheduled_date =webnotes.conn.sql("select scheduled_date from `tabMaintenance Schedule Detail` \ scheduled_date = webnotes.conn.sql("""select scheduled_date from
where incharge_name='%s' and item_code='%s' and parent='%s' " %(d.incharge_name, \ `tabMaintenance Schedule Detail` where sales_person=%s and item_code=%s and
d.item_code, self.doc.name), as_dict=1) parent=%s""", (d.sales_person, d.item_code, self.doc.name), as_dict=1)
for key in scheduled_date: for key in scheduled_date:
if email_map[d.incharge_name]: if email_map[d.sales_person]:
description = "Reference: %s, Item Code: %s and Customer: %s" % \ description = "Reference: %s, Item Code: %s and Customer: %s" % \
(self.doc.name, d.item_code, self.doc.customer) (self.doc.name, d.item_code, self.doc.customer)
webnotes.bean({ webnotes.bean({
"doctype": "Event", "doctype": "Event",
"owner": email_map[d.incharge_name] or self.doc.owner, "owner": email_map[d.sales_person] or self.doc.owner,
"subject": description, "subject": description,
"description": description, "description": description,
"starts_on": key["scheduled_date"] + " 10:00:00", "starts_on": key["scheduled_date"] + " 10:00:00",
@ -89,92 +87,121 @@ class DocType(TransactionBase):
#get schedule dates #get schedule dates
#---------------------- #----------------------
def create_schedule_list(self, start_date, end_date, no_of_visit): def create_schedule_list(self, start_date, end_date, no_of_visit, sales_person):
schedule_list = [] schedule_list = []
start_date1 = start_date start_date_copy = start_date
date_diff = (getdate(end_date) - getdate(start_date)).days date_diff = (getdate(end_date) - getdate(start_date)).days
add_by = date_diff/no_of_visit add_by = date_diff / no_of_visit
#schedule_list.append(start_date1)
while(getdate(start_date1) < getdate(end_date)): for visit in range(cint(no_of_visit)):
start_date1 = add_days(start_date1, add_by) if (getdate(start_date_copy) < getdate(end_date)):
start_date_copy = add_days(start_date_copy, add_by)
if len(schedule_list) < no_of_visit: if len(schedule_list) < no_of_visit:
schedule_list.append(getdate(start_date1)) schedule_date = self.validate_schedule_date_for_holiday_list(getdate(start_date_copy),
sales_person)
if schedule_date > getdate(end_date):
schedule_date = getdate(end_date)
schedule_list.append(schedule_date)
return schedule_list return schedule_list
def validate_schedule_date_for_holiday_list(self, schedule_date, sales_person):
from erpnext.accounts.utils import get_fiscal_year
validated = False
fy_details = ""
try:
fy_details = get_fiscal_year(date=schedule_date, verbose=0)
except Exception:
pass
if fy_details and fy_details[0]:
# check holiday list in employee master
holiday_list = webnotes.conn.sql_list("""select h.holiday_date from `tabEmployee` emp,
`tabSales Person` sp, `tabHoliday` h, `tabHoliday List` hl
where sp.name=%s and emp.name=sp.employee
and hl.name=emp.holiday_list and
h.parent=hl.name and
hl.fiscal_year=%s""", (sales_person, fy_details[0]))
if not holiday_list:
# check global holiday list
holiday_list = webnotes.conn.sql("""select h.holiday_date from
`tabHoliday` h, `tabHoliday List` hl
where h.parent=hl.name and ifnull(hl.is_default, 0) = 1
and hl.fiscal_year=%s""", fy_details[0])
if not validated and holiday_list:
if schedule_date in holiday_list:
schedule_date = add_days(schedule_date, -1)
else:
validated = True
return schedule_date
#validate date range and periodicity selected #validate date range and periodicity selected
#------------------------------------------------- #-------------------------------------------------
def validate_period(self, arg): def validate_period(self, arg):
arg1 = eval(arg) args = eval(arg)
if getdate(arg1['start_date']) >= getdate(arg1['end_date']): if getdate(args['start_date']) >= getdate(args['end_date']):
msgprint("Start date should be less than end date ") throw(_("Start date should be less than end date."))
raise Exception
period = (getdate(arg1['end_date'])-getdate(arg1['start_date'])).days+1 period = (getdate(args['end_date']) - getdate(args['start_date'])).days + 1
if (arg1['periodicity']=='Yearly' or arg1['periodicity']=='Half Yearly' or arg1['periodicity']=='Quarterly') and period<365: if (args['periodicity'] == 'Yearly' or args['periodicity'] == 'Half Yearly' or
msgprint(cstr(arg1['periodicity'])+ " periodicity can be set for period of atleast 1 year or more only") args['periodicity'] == 'Quarterly') and period < 365:
raise Exception throw(cstr(args['periodicity']) + " periodicity can be set for period of atleast 1 year or more only")
elif arg1['periodicity']=='Monthly' and period<30: elif args['periodicity'] == 'Monthly' and period < 30:
msgprint("Monthly periodicity can be set for period of atleast 1 month or more") throw("Monthly periodicity can be set for period of atleast 1 month or more")
raise Exception elif args['periodicity'] == 'Weekly' and period < 7:
elif arg1['periodicity']=='Weekly' and period<7: throw("Weekly periodicity can be set for period of atleast 1 week or more")
msgprint("Weekly periodicity can be set for period of atleast 1 week or more")
raise Exception
def get_no_of_visits(self, arg): def get_no_of_visits(self, arg):
arg1 = eval(arg) args = eval(arg)
self.validate_period(arg) self.validate_period(arg)
period = (getdate(arg1['end_date'])-getdate(arg1['start_date'])).days+1 period = (getdate(args['end_date']) - getdate(args['start_date'])).days + 1
count = 0
count =0 if args['periodicity'] == 'Weekly':
if arg1['periodicity'] == 'Weekly':
count = period/7 count = period/7
elif arg1['periodicity'] == 'Monthly': elif args['periodicity'] == 'Monthly':
count = period/30 count = period/30
elif arg1['periodicity'] == 'Quarterly': elif args['periodicity'] == 'Quarterly':
count = period/91 count = period/91
elif arg1['periodicity'] == 'Half Yearly': elif args['periodicity'] == 'Half Yearly':
count = period/182 count = period/182
elif arg1['periodicity'] == 'Yearly': elif args['periodicity'] == 'Yearly':
count = period/365 count = period/365
ret = {'no_of_visits':count} ret = {'no_of_visits' : count}
return ret return ret
def validate_maintenance_detail(self): def validate_maintenance_detail(self):
if not getlist(self.doclist, 'item_maintenance_detail'): if not getlist(self.doclist, 'item_maintenance_detail'):
msgprint("Please enter Maintaince Details first") throw(_("Please enter Maintaince Details first"))
raise Exception
for d in getlist(self.doclist, 'item_maintenance_detail'): for d in getlist(self.doclist, 'item_maintenance_detail'):
if not d.item_code: if not d.item_code:
msgprint("Please select item code") throw(_("Please select item code"))
raise Exception
elif not d.start_date or not d.end_date: elif not d.start_date or not d.end_date:
msgprint("Please select Start Date and End Date for item "+d.item_code) throw(_("Please select Start Date and End Date for item") + " " + d.item_code)
raise Exception
elif not d.no_of_visits: elif not d.no_of_visits:
msgprint("Please mention no of visits required") throw(_("Please mention no of visits required"))
raise Exception elif not d.sales_person:
elif not d.incharge_name: throw(_("Please select Incharge Person's name"))
msgprint("Please select Incharge Person's name")
raise Exception
if getdate(d.start_date) >= getdate(d.end_date): if getdate(d.start_date) >= getdate(d.end_date):
msgprint("Start date should be less than end date for item "+d.item_code) throw(_("Start date should be less than end date for item") + " " + d.item_code)
raise Exception
#check if maintenance schedule already created against same sales order #check if maintenance schedule already created against same sales order
#----------------------------------------------------------------------------------- #-----------------------------------------------------------------------------------
def validate_sales_order(self): def validate_sales_order(self):
for d in getlist(self.doclist, 'item_maintenance_detail'): for d in getlist(self.doclist, 'item_maintenance_detail'):
if d.prevdoc_docname: if d.prevdoc_docname:
chk = webnotes.conn.sql("select t1.name from `tabMaintenance Schedule` t1, `tabMaintenance Schedule Item` t2 where t2.parent=t1.name and t2.prevdoc_docname=%s and t1.docstatus=1", d.prevdoc_docname) chk = webnotes.conn.sql("""select ms.name from `tabMaintenance Schedule` ms,
`tabMaintenance Schedule Item` msi where msi.parent=ms.name and
msi.prevdoc_docname=%s and ms.docstatus=1""", d.prevdoc_docname)
if chk: if chk:
msgprint("Maintenance Schedule against "+d.prevdoc_docname+" already exist") throw("Maintenance Schedule against " + d.prevdoc_docname + " already exist")
raise Exception
def validate_serial_no(self): def validate_serial_no(self):
@ -185,13 +212,13 @@ class DocType(TransactionBase):
cur_s_no = cur_serial_no.split(',') cur_s_no = cur_serial_no.split(',')
for x in cur_s_no: for x in cur_s_no:
chk = webnotes.conn.sql("select name, status from `tabSerial No` where docstatus!=2 and name=%s", (x)) chk = webnotes.conn.sql("""select name, status from `tabSerial No`
where docstatus!=2 and name=%s""", (x))
chk1 = chk and chk[0][0] or '' chk1 = chk and chk[0][0] or ''
status = chk and chk[0][1] or '' status = chk and chk[0][1] or ''
if not chk1: if not chk1:
msgprint("Serial no "+x+" does not exist in system.") throw("Serial no " + x + " does not exist in system.")
raise Exception
def validate(self): def validate(self):
self.validate_maintenance_detail() self.validate_maintenance_detail()
@ -208,13 +235,13 @@ class DocType(TransactionBase):
cur_s_no = cur_serial_no.split(',') cur_s_no = cur_serial_no.split(',')
for x in cur_s_no: for x in cur_s_no:
dt = webnotes.conn.sql("select delivery_date from `tabSerial No` where name = %s", x) dt = webnotes.conn.sql("""select delivery_date from `tabSerial No`
where name=%s""", x)
dt = dt and dt[0][0] or '' dt = dt and dt[0][0] or ''
if dt: if dt:
if dt > getdate(d.start_date): if dt > getdate(d.start_date):
msgprint("Maintenance start date can not be before delivery date "+dt.strftime('%Y-%m-%d')+" for serial no "+x) throw("Maintenance start date can not be before delivery date " + dt.strftime('%Y-%m-%d') + " for serial no " + x)
raise Exception
#update amc expiry date in serial no #update amc expiry date in serial no
#------------------------------------------ #------------------------------------------
@ -224,7 +251,8 @@ class DocType(TransactionBase):
cur_s_no = cur_serial_no.split(',') cur_s_no = cur_serial_no.split(',')
for x in cur_s_no: for x in cur_s_no:
webnotes.conn.sql("update `tabSerial No` set amc_expiry_date = '%s', maintenance_status = 'Under AMC' where name = '%s'"% (amc_end_date,x)) webnotes.conn.sql("""update `tabSerial No` set amc_expiry_date=%s,
maintenance_status='Under AMC' where name=%s""", (amc_end_date, x))
def on_update(self): def on_update(self):
webnotes.conn.set(self.doc, 'status', 'Draft') webnotes.conn.set(self.doc, 'status', 'Draft')
@ -233,16 +261,16 @@ class DocType(TransactionBase):
for d in getlist(self.doclist, 'item_maintenance_detail'): for d in getlist(self.doclist, 'item_maintenance_detail'):
if cstr(d.serial_no).strip(): if cstr(d.serial_no).strip():
dt = webnotes.conn.sql("""select warranty_expiry_date, amc_expiry_date dt = webnotes.conn.sql("""select warranty_expiry_date, amc_expiry_date
from `tabSerial No` where name = %s""", d.serial_no, as_dict=1) from `tabSerial No` where name=%s""", d.serial_no, as_dict=1)
if dt[0]['warranty_expiry_date'] and dt[0]['warranty_expiry_date'] >= d.start_date: if dt[0]['warranty_expiry_date'] and dt[0]['warranty_expiry_date'] >= d.start_date:
webnotes.msgprint("""Serial No: %s is already under warranty upto %s. throw("""Serial No: %s is already under warranty upto %s.
Please check AMC Start Date.""" % Please check AMC Start Date.""" %
(d.serial_no, dt[0]["warranty_expiry_date"]), raise_exception=1) (d.serial_no, dt[0]["warranty_expiry_date"]))
if dt[0]['amc_expiry_date'] and dt[0]['amc_expiry_date'] >= d.start_date: if dt[0]['amc_expiry_date'] and dt[0]['amc_expiry_date'] >= d.start_date:
webnotes.msgprint("""Serial No: %s is already under AMC upto %s. throw("""Serial No: %s is already under AMC upto %s.
Please check AMC Start Date.""" % Please check AMC Start Date.""" %
(d.serial_no, dt[0]["amc_expiry_date"]), raise_exception=1) (d.serial_no, dt[0]["amc_expiry_date"]))
def validate_schedule(self): def validate_schedule(self):
item_lst1 =[] item_lst1 =[]
@ -256,13 +284,11 @@ class DocType(TransactionBase):
item_lst2.append(m.item_code) item_lst2.append(m.item_code)
if len(item_lst1) != len(item_lst2): if len(item_lst1) != len(item_lst2):
msgprint("Maintenance Schedule is not generated for all the items. Please click on 'Generate Schedule'") throw("Maintenance Schedule is not generated for all the items. Please click on 'Generate Schedule'")
raise Exception
else: else:
for x in item_lst1: for x in item_lst1:
if x not in item_lst2: if x not in item_lst2:
msgprint("Maintenance Schedule is not generated for item "+x+". Please click on 'Generate Schedule'") throw("Maintenance Schedule is not generated for item "+x+". Please click on 'Generate Schedule'")
raise Exception
#check if serial no present in item maintenance table #check if serial no present in item maintenance table
#----------------------------------------------------------- #-----------------------------------------------------------
@ -275,10 +301,7 @@ class DocType(TransactionBase):
for m in getlist(self.doclist, 'maintenance_schedule_detail'): for m in getlist(self.doclist, 'maintenance_schedule_detail'):
if serial_present: if serial_present:
if m.item_code in serial_present and not m.serial_no: if m.item_code in serial_present and not m.serial_no:
msgprint("Please click on 'Generate Schedule' to fetch serial no added for item "+m.item_code) throw("Please click on 'Generate Schedule' to fetch serial no added for item "+m.item_code)
raise Exception
def on_cancel(self): def on_cancel(self):
for d in getlist(self.doclist, 'item_maintenance_detail'): for d in getlist(self.doclist, 'item_maintenance_detail'):
@ -313,7 +336,7 @@ def make_maintenance_visit(source_name, target_doclist=None):
"field_map": { "field_map": {
"parent": "prevdoc_docname", "parent": "prevdoc_docname",
"parenttype": "prevdoc_doctype", "parenttype": "prevdoc_doctype",
"incharge_name": "service_person" "sales_person": "service_person"
} }
} }
}, target_doclist) }, target_doclist)

View File

@ -2,7 +2,7 @@
{ {
"creation": "2013-02-22 01:28:05", "creation": "2013-02-22 01:28:05",
"docstatus": 0, "docstatus": 0,
"modified": "2013-12-20 19:23:20", "modified": "2013-12-31 12:13:38",
"modified_by": "Administrator", "modified_by": "Administrator",
"owner": "Administrator" "owner": "Administrator"
}, },
@ -52,6 +52,7 @@
"search_index": 0 "search_index": 0
}, },
{ {
"allow_on_submit": 0,
"doctype": "DocField", "doctype": "DocField",
"fieldname": "scheduled_date", "fieldname": "scheduled_date",
"fieldtype": "Date", "fieldtype": "Date",
@ -78,12 +79,13 @@
"report_hide": 1 "report_hide": 1
}, },
{ {
"allow_on_submit": 0,
"doctype": "DocField", "doctype": "DocField",
"fieldname": "incharge_name", "fieldname": "sales_person",
"fieldtype": "Link", "fieldtype": "Link",
"in_filter": 1, "in_filter": 1,
"in_list_view": 1, "in_list_view": 1,
"label": "Incharge Name", "label": "Sales Person",
"oldfieldname": "incharge_name", "oldfieldname": "incharge_name",
"oldfieldtype": "Link", "oldfieldtype": "Link",
"options": "Sales Person", "options": "Sales Person",

View File

@ -2,7 +2,7 @@
{ {
"creation": "2013-02-22 01:28:05", "creation": "2013-02-22 01:28:05",
"docstatus": 0, "docstatus": 0,
"modified": "2013-12-20 19:23:20", "modified": "2013-12-31 12:08:32",
"modified_by": "Administrator", "modified_by": "Administrator",
"owner": "Administrator" "owner": "Administrator"
}, },
@ -112,10 +112,10 @@
}, },
{ {
"doctype": "DocField", "doctype": "DocField",
"fieldname": "incharge_name", "fieldname": "sales_person",
"fieldtype": "Link", "fieldtype": "Link",
"in_filter": 1, "in_filter": 1,
"label": "Sales Person Incharge", "label": "Sales Person",
"oldfieldname": "incharge_name", "oldfieldname": "incharge_name",
"oldfieldtype": "Link", "oldfieldtype": "Link",
"options": "Sales Person", "options": "Sales Person",

View File

@ -2,7 +2,7 @@
{ {
"creation": "2013-01-10 16:34:31", "creation": "2013-01-10 16:34:31",
"docstatus": 0, "docstatus": 0,
"modified": "2013-12-20 19:24:14", "modified": "2014-01-24 13:00:11",
"modified_by": "Administrator", "modified_by": "Administrator",
"owner": "Administrator" "owner": "Administrator"
}, },
@ -13,7 +13,8 @@
"document_type": "Other", "document_type": "Other",
"icon": "icon-envelope", "icon": "icon-envelope",
"module": "Support", "module": "Support",
"name": "__common__" "name": "__common__",
"title_field": "subject"
}, },
{ {
"doctype": "DocField", "doctype": "DocField",
@ -26,6 +27,7 @@
{ {
"cancel": 0, "cancel": 0,
"create": 0, "create": 0,
"delete": 0,
"doctype": "DocPerm", "doctype": "DocPerm",
"email": 1, "email": 1,
"name": "__common__", "name": "__common__",

View File

@ -2,7 +2,7 @@
{ {
"creation": "2013-05-06 14:25:21", "creation": "2013-05-06 14:25:21",
"docstatus": 0, "docstatus": 0,
"modified": "2013-10-09 12:23:27", "modified": "2013-12-31 12:24:48",
"modified_by": "Administrator", "modified_by": "Administrator",
"owner": "Administrator" "owner": "Administrator"
}, },
@ -10,7 +10,7 @@
"doctype": "Report", "doctype": "Report",
"is_standard": "Yes", "is_standard": "Yes",
"name": "__common__", "name": "__common__",
"query": "SELECT\n ms_sch.scheduled_date as \"Schedule Date:Date:120\",\n\tms_sch.item_code as \"Item Code:Link/Item:120\",\n\tms_sch.item_name as \"Item Name::120\",\n\tms_sch.serial_no as \"Serial No::120\",\n\tms_sch.incharge_name as \"Incharge::120\",\n\tms.customer_name as \"Customer:Link/Customer:120\",\n\tms.address_display as \"Customer Address::120\",\n\tms_item.prevdoc_docname as \"Sales Order:Link/Sales Order:120\",\n\tms.company as \"Company:Link/Company:120\"\n\t\nFROM\n\t`tabMaintenance Schedule` ms, \n `tabMaintenance Schedule Detail` ms_sch, \n `tabMaintenance Schedule Item` ms_item\nWHERE\n\tms.name = ms_sch.parent and ms.name = ms_item.parent and ms.docstatus = 1\nORDER BY\n\tms_sch.scheduled_date asc, ms_sch.item_code asc", "query": "SELECT\n ms_sch.scheduled_date as \"Schedule Date:Date:120\",\n\tms_sch.item_code as \"Item Code:Link/Item:120\",\n\tms_sch.item_name as \"Item Name::120\",\n\tms_sch.serial_no as \"Serial No::120\",\n\tms_sch.sales_person as \"Sales Person::120\",\n\tms.customer_name as \"Customer:Link/Customer:120\",\n\tms.address_display as \"Customer Address::120\",\n\tms_item.prevdoc_docname as \"Sales Order:Link/Sales Order:120\",\n\tms.company as \"Company:Link/Company:120\"\n\t\nFROM\n\t`tabMaintenance Schedule` ms, \n `tabMaintenance Schedule Detail` ms_sch, \n `tabMaintenance Schedule Item` ms_item\nWHERE\n\tms.name = ms_sch.parent and ms.name = ms_item.parent and ms.docstatus = 1\nORDER BY\n\tms_sch.scheduled_date asc, ms_sch.item_code asc",
"ref_doctype": "Maintenance Schedule", "ref_doctype": "Maintenance Schedule",
"report_name": "Maintenance Schedules", "report_name": "Maintenance Schedules",
"report_type": "Query Report" "report_type": "Query Report"

View File

@ -2,7 +2,7 @@
{ {
"creation": "2013-05-24 13:41:00", "creation": "2013-05-24 13:41:00",
"docstatus": 0, "docstatus": 0,
"modified": "2014-01-20 17:48:58", "modified": "2014-01-22 16:05:35",
"modified_by": "Administrator", "modified_by": "Administrator",
"owner": "Administrator" "owner": "Administrator"
}, },
@ -25,7 +25,7 @@
"permlevel": 0 "permlevel": 0
}, },
{ {
"cancel": 1, "cancel": 0,
"create": 1, "create": 1,
"delete": 1, "delete": 1,
"doctype": "DocPerm", "doctype": "DocPerm",
@ -37,6 +37,7 @@
"permlevel": 0, "permlevel": 0,
"print": 1, "print": 1,
"read": 1, "read": 1,
"restricted": 1,
"role": "All", "role": "All",
"write": 1 "write": 1
}, },