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.price_list = (party == "Customer" ?
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.net_total = "net_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) {
if (d.item_code == item_code) {
caught = true;
if (serial_no) {
d.serial_no += '\n' + serial_no;
me.frm.script_manager.trigger("serial_no", d.doctype, d.name);
}
else {
d.qty += 1;
me.frm.script_manager.trigger("qty", d.doctype, d.name);
}
if (serial_no)
wn.model.set_value(d.doctype, d.name, "serial_no", d.serial_no + '\n' + serial_no);
else
wn.model.set_value(d.doctype, d.name, "qty", d.qty + 1);
}
});
}
// if item not found then add new item
if (!caught) {
if (!caught)
this.add_new_item_to_grid(item_code, serial_no);
}
this.refresh();
this.refresh_search_box();
@ -337,15 +333,16 @@ erpnext.POS = Class.extend({
wn.model.clear_doc(d.doctype, d.name);
me.refresh_grid();
} else {
d.qty = qty;
me.frm.script_manager.trigger("qty", d.doctype, d.name);
wn.model.set_value(d.doctype, d.name, "qty", qty);
}
}
});
me.refresh();
this.refresh();
},
refresh: function() {
var me = this;
this.refresh_item_list();
this.party_field.set_input(this.frm.doc[this.party.toLowerCase()]);
this.wrapper.find('input.discount-amount').val(this.frm.doc.discount_amount);
this.barcode.set_input("");
@ -369,6 +366,14 @@ erpnext.POS = Class.extend({
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() {
var me = this;
var $items = this.wrapper.find("#cart tbody").empty();
@ -402,9 +407,8 @@ erpnext.POS = Class.extend({
)).appendTo($items);
});
this.wrapper.find(".increase-qty, .decrease-qty").on("click", function() {
var item_code = $(this).closest("tr").attr("id");
me.selected_item_qty_operation(item_code, $(this).attr("class"));
this.wrapper.find("input.qty").on("focus", function() {
$(this).select();
});
},
show_taxes: function() {
@ -441,10 +445,16 @@ erpnext.POS = Class.extend({
// append quantity to the respective item after change from input box
$(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());
});
// 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
$(this.wrapper).find("#cart tbody tr td").on("click", function() {
var row = $(this).closest("tr");
@ -462,6 +472,15 @@ erpnext.POS = Class.extend({
me.refresh_delete_btn();
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() {
var me = this;
// if form is submitted & cancelled then disable all input box & buttons
@ -533,26 +552,11 @@ erpnext.POS = Class.extend({
this.refresh_grid();
},
refresh_grid: function() {
this.frm.dirty();
this.frm.fields_dict[this.frm.cscript.fname].grid.refresh();
this.frm.script_manager.trigger("calculate_taxes_and_totals");
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() {
var me = this;
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)
acc = webnotes.conn.sql("select account_type from `tabAccount` where name = '%s' and docstatus != 2" % d.income_account)
if not acc:
msgprint("Account: "+d.income_account+" does not exist in the system")
raise Exception
msgprint("Account: "+d.income_account+" does not exist in the system", raise_exception=True)
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)
raise Exception
msgprint("Please select income head with account type 'Fixed Asset Account' as Item %s is an asset item" % d.item_code, raise_exception=True)
def validate_with_previous_doc(self):
super(DocType, self).validate_with_previous_doc(self.tname, {

View File

@ -37,12 +37,15 @@ class AccountsReceivableReport(object):
return columns
def get_data(self, customer_naming_by):
from erpnext.accounts.utils import get_currency_precision
currency_precision = get_currency_precision() or 2
data = []
future_vouchers = self.get_entries_after(self.filters.report_date)
for gle in self.get_entries_till(self.filters.report_date):
if self.is_receivable(gle, future_vouchers):
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)
invoiced_amount = gle.debit if (gle.debit > 0) else 0
payment_received = invoiced_amount - outstanding_amount

View File

@ -34,7 +34,7 @@ def validate_filters(filters, account_details):
def get_columns():
return ["Posting Date:Date:100", "Account:Link/Account:200", "Debit:Float:100",
"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):
gl_entries = get_gl_entries(filters)
@ -51,7 +51,7 @@ def get_gl_entries(filters):
gl_entries = webnotes.conn.sql("""select posting_date, account,
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`
where company=%(company)s {conditions}
{group_by_condition}
@ -138,7 +138,7 @@ def get_accountwise_gle(filters, gl_entries, gle_map):
for gle in gl_entries:
amount = flt(gle.debit) - flt(gle.credit)
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
opening += amount
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,
"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' %};
cur_frm.cscript.refresh = function(doc,dt,dn) {
cur_frm.cscript.refresh = function(doc, dt, dn) {
cur_frm.cscript.make_dashboard(doc);
erpnext.hide_naming_series();
@ -93,7 +93,7 @@ cur_frm.cscript.make_contact = function() {
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{
filters:{'buying': 1}
}

View File

@ -2,7 +2,7 @@
{
"creation": "2013-05-13 16:10:02",
"docstatus": 0,
"modified": "2013-05-13 16:21:07",
"modified": "2014-01-24 18:19:11",
"modified_by": "Administrator",
"owner": "Administrator"
},
@ -11,7 +11,7 @@
"doctype": "Report",
"is_standard": "Yes",
"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",
"report_name": "Requested Items To Be Ordered",
"report_type": "Query Report"

View File

@ -89,8 +89,10 @@ def _get_price_list_rate(args, item_bean, meta):
# try fetching from price list
if args.buying_price_list and args.price_list_currency:
price_list_rate = webnotes.conn.sql("""select ref_rate from `tabItem Price`
where price_list=%s and item_code=%s and buying=1""",
price_list_rate = webnotes.conn.sql("""select ip.ref_rate from
`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)
if price_list_rate:

View File

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

View File

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

View File

@ -2,7 +2,7 @@
{
"creation": "2013-01-10 16:34:14",
"docstatus": 0,
"modified": "2014-01-20 17:48:44",
"modified": "2014-01-22 16:05:34",
"modified_by": "Administrator",
"owner": "harshada@webnotestech.com"
},
@ -223,7 +223,7 @@
{
"delete": 0,
"doctype": "DocPerm",
"match": "owner",
"restricted": 1,
"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.doc import addchild, make_autoname
from webnotes.model.bean import copy_doclist
from webnotes import msgprint
from webnotes import msgprint, throw, _
import datetime
class DocType:
@ -19,7 +17,7 @@ class DocType:
self.doclist = doclist
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):
self.update_default_holiday_list()
@ -38,11 +36,9 @@ class DocType:
def validate_values(self):
if not self.doc.fiscal_year:
msgprint("Please select Fiscal Year")
raise Exception
throw(_("Please select Fiscal Year"))
if not self.doc.weekly_off:
msgprint("Please select weekly off day")
raise Exception
throw(_("Please select weekly off day"))
def get_fy_start_end_dates(self):
return webnotes.conn.sql("""select year_start_date, year_end_date

View File

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

View File

@ -243,10 +243,10 @@ class DocType:
"item_code": [qty_required, description, stock_uom, min_order_qty]
}
"""
bom_wise_item_details = {}
item_list = []
for bom, so_wise_qty in bom_dict.items():
bom_wise_item_details = {}
if self.doc.use_multi_level_bom:
# get all raw materials with sub assembly childs
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.move_warehouse_user_to_restrictions
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('selling', 'doctype', 'sales_order') # 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`
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
if not perms:
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', 'quotation') # 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",
"docstatus": 0,
"modified": "2014-01-20 17:49:32",
"modified": "2014-01-24 13:01:46",
"modified_by": "Administrator",
"owner": "Administrator"
},
@ -15,7 +15,9 @@
"icon": "icon-check",
"max_attachments": 5,
"module": "Projects",
"name": "__common__"
"name": "__common__",
"search_fields": "subject",
"title_field": "subject"
},
{
"doctype": "DocField",

View File

@ -2,7 +2,7 @@
{
"creation": "2013-04-03 16:38:41",
"docstatus": 0,
"modified": "2014-01-20 17:49:34",
"modified": "2014-01-22 16:05:35",
"modified_by": "Administrator",
"owner": "Administrator"
},
@ -205,7 +205,7 @@
{
"create": 1,
"doctype": "DocPerm",
"match": "owner",
"restricted": 1,
"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('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);
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{
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{
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{
filters:{'selling': 1}
}

View File

@ -7,18 +7,18 @@
wn.provide("erpnext");
erpnext.LeadController = wn.ui.form.Controller.extend({
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" } }
},
onload: function() {
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" } }
}
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" } }
}
@ -90,4 +90,4 @@ erpnext.LeadController = wn.ui.form.Controller.extend({
}
});
$.extend(cur_frm.cscript, new erpnext.LeadController({frm: cur_frm}));
$.extend(cur_frm.cscript, new erpnext.LeadController({frm: cur_frm}));

View File

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

View File

@ -150,8 +150,10 @@ def _get_basic_details(args, item_bean, warehouse_fieldname):
return out
def _get_price_list_rate(args, item_bean, meta):
ref_rate = webnotes.conn.sql("""select ref_rate from `tabItem Price`
where price_list=%s and item_code=%s and selling=1""",
ref_rate = webnotes.conn.sql("""select ip.ref_rate from
`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)
if not ref_rate:

View File

@ -1,114 +1,113 @@
// Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
// License: GNU General Public License v3. See license.txt
//--------- ONLOAD -------------
cur_frm.cscript.onload = function(doc, cdt, cdn) {
}
// 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.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']);
unhide_field(['to_emp','to_designation']);
if(doc.transaction == 'Appraisal') hide_field('value');
else unhide_field('value');
}
else {
unhide_field(['master_name','system_role', 'system_user','value']);
hide_field(['to_emp','to_designation']);
}
if (doc.transaction == 'Appraisal') {
hide_field(['master_name','system_role', 'system_user']);
unhide_field(['to_emp','to_designation']);
if (doc.transaction == 'Appraisal')
hide_field('value');
else
unhide_field('value');
}
else {
unhide_field(['master_name','system_role', 'system_user','value']);
hide_field(['to_emp','to_designation']);
}
}
cur_frm.cscript.based_on = function(doc){
if(doc.based_on == 'Grand Total' || doc.based_on == 'Average Discount' || doc.based_on == 'Not Applicable'){
doc.master_name = '';
refresh_field('master_name');
hide_field('master_name');
}
else{
unhide_field('master_name');
}
if(doc.based_on == 'Not Applicable') {
doc.value =0;
refresh_field('value');
hide_field('value');
}
else unhide_field('value');
cur_frm.cscript.based_on = function(doc) {
if (doc.based_on == 'Grand Total' || doc.based_on == 'Average Discount' || doc.based_on == 'Not Applicable') {
doc.master_name = '';
refresh_field('master_name');
hide_field('master_name');
}
else
unhide_field('master_name');
if (doc.based_on == 'Not Applicable') {
doc.value =0;
refresh_field('value');
hide_field('value');
}
else
unhide_field('value');
}
cur_frm.cscript.transaction = function(doc,cdt,cdn){
if (doc.transaction == 'Appraisal'){
doc.master_name = doc.system_role = doc.system_user = '';
refresh_many(['master_name','system_role', 'system_user']);
hide_field(['master_name','system_role', 'system_user']);
unhide_field(['to_emp','to_designation']);
doc.value =0;
refresh_many('value');
hide_field('value');
}
else {
unhide_field(['master_name','system_role', 'system_user','value']);
hide_field(['to_emp','to_designation']);
}
if(doc.transaction == 'Appraisal') doc.based_on == 'Not Applicable';
cur_frm.cscript.transaction = function(doc, cdt, cdn){
if (doc.transaction == 'Appraisal') {
doc.based_on == 'Not Applicable';
doc.master_name = doc.system_role = doc.system_user = '';
refresh_many(['master_name','system_role', 'system_user', 'based_on']);
hide_field(['master_name','system_role', 'system_user']);
unhide_field(['to_emp','to_designation']);
doc.value = 0;
refresh_many('value');
hide_field('value');
}
else {
unhide_field(['master_name','system_role', 'system_user','value']);
hide_field(['to_emp','to_designation']);
}
}
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) {
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_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;
// System Role Trigger
// -----------------------
cur_frm.fields_dict['system_role'].get_query = function(doc) {
return{
filters:[
['Role', 'name', 'not in', 'Administrator, Guest, All']
]
}
return {
filters:[
['Role', 'name', 'not in', 'Administrator, Guest, All']
]
}
}
// Master Name Trigger
// --------------------
cur_frm.fields_dict['master_name'].get_query = function(doc){
if(doc.based_on == 'Customerwise Discount')
return {
doctype: "Customer",
filters:[
['Customer', 'docstatus', '!=', 2]
]
}
else if(doc.based_on == 'Itemwise Discount')
return {
doctype: "Item",
query: "erpnext.controllers.queries.item_query"
}
else
return {
filters: [
['Item', 'name', '=', 'cheating done to avoid null']
]
}
cur_frm.fields_dict['master_name'].get_query = function(doc) {
if (doc.based_on == 'Customerwise Discount')
return {
doctype: "Customer",
filters:[
['Customer', 'docstatus', '!=', 2]
]
}
else if (doc.based_on == 'Itemwise Discount')
return {
doctype: "Item",
query: "erpnext.controllers.queries.item_query"
}
else
return {
filters: [
['Item', 'name', '=', 'cheating done to avoid null']
]
}
}
cur_frm.fields_dict.to_emp.get_query = function(doc,cdt,cdn) {
return{ query: "erpnext.controllers.queries.employee_query" } }
cur_frm.fields_dict.to_emp.get_query = function(doc, cdt, cdn) {
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
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{
filters:[
filters: [
['Sales Person', 'is_group', '=', 'Yes'],
['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) {
return{
filters:{ 'is_group': "No" }
return {
filters: { 'is_group': "No" }
}
}
cur_frm.fields_dict.employee.get_query = function(doc,cdt,cdn) {
return{ query: "erpnext.controllers.queries.employee_query" } }
cur_frm.fields_dict.employee.get_query = function(doc, cdt, cdn) {
return { query: "erpnext.controllers.queries.employee_query" }
}

View File

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

View File

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

View File

@ -3,7 +3,7 @@
from __future__ import unicode_literals
import webnotes
from webnotes import _, msgprint
from webnotes import _, msgprint, throw
import json
def get_company_currency(company):
@ -11,8 +11,8 @@ def get_company_currency(company):
if not currency:
currency = webnotes.conn.get_default("currency")
if not currency:
msgprint(_('Please specify Default Currency in Company Master \
and Global Defaults'), raise_exception=True)
throw(_('Please specify Default Currency in Company Master \
and Global Defaults'))
return currency
@ -32,5 +32,14 @@ def get_ancestors_of(doctype, name):
@webnotes.whitelist()
def get_price_list_currency(price_list):
return {"price_list_currency": webnotes.conn.get_value("Price List", price_list,
"currency")}
price_list_currency = webnotes.conn.get_value("Price List", {"name": price_list,
"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
def validate(self):
self.validate_price_list()
self.check_duplicate_item()
self.update_price_list_details()
self.update_item_details()
def update_price_list_details(self):
self.doc.buying, self.doc.selling, self.doc.currency = webnotes.conn.get_value("Price List",
self.doc.price_list, ["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"])
def validate_price_list(self):
enabled = webnotes.conn.get_value("Price List", self.doc.price_list, "enabled")
if not enabled:
throw("{message}: {price_list} {disabled}".format(**{
"message": _("Price List"),
"price_list": self.doc.price_list,
"disabled": _("is disabled.")
}))
def check_duplicate_item(self):
if webnotes.conn.sql("""select name from `tabItem Price`
@ -34,4 +36,12 @@ class DocType:
"already": _("already available in Price List"),
"price_list": self.doc.price_list
}), 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,16 +37,16 @@ class DocType(BuyingController):
for so_no in so_items.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
docstatus = 1 and parent != %s""", (item, so_no, self.doc.name))
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`
where parent = %s and item_code = %s and docstatus = 1
group by parent""", (so_no, 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""", (so_no, item))
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):
webnotes.throw("You can raise indent of maximum qty: %s for item: %s against sales order: %s\
\n Anyway, you can add more qty in new row for the same item."

View File

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

View File

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

View File

@ -4,7 +4,7 @@
from __future__ import unicode_literals
import webnotes
from webnotes.utils import cint, validate_email_add
from webnotes import msgprint, _
from webnotes import throw, msgprint, _
class DocType:
def __init__(self, doc, doclist=[]):
@ -18,7 +18,7 @@ class DocType:
def validate(self):
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()
@ -76,8 +76,8 @@ class DocType:
for d in bins:
if d['actual_qty'] or d['reserved_qty'] or d['ordered_qty'] or \
d['indented_qty'] or d['projected_qty'] or d['planned_qty']:
msgprint("""Warehouse: %s can not be deleted as qty exists for item: %s"""
% (self.doc.name, d['item_code']), raise_exception=1)
throw("""Warehouse: %s can not be deleted as qty exists for item: %s"""
% (self.doc.name, d['item_code']))
else:
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`
where warehouse = %s""", self.doc.name):
msgprint("""Warehouse can not be deleted as stock ledger entry
exists for this warehouse.""", raise_exception=1)
throw(_("""Warehouse can not be deleted as stock ledger entry
exists for this warehouse."""))
def before_rename(self, olddn, newdn, merge=False):
# Add company abbr if not provided
@ -97,8 +97,8 @@ class DocType:
new_warehouse = get_name_with_abbr(newdn, self.doc.company)
if merge:
if not webnotes.conn.exists("Warehouse", newdn):
webnotes.throw(_("Warehouse ") + newdn +_(" does not exists"))
if not webnotes.conn.exists("Warehouse", new_warehouse):
webnotes.throw(_("Warehouse ") + new_warehouse +_(" does not exists"))
if self.doc.company != webnotes.conn.get_value("Warehouse", new_warehouse, "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()
val_rate_map = get_valuation_rate()
from erpnext.accounts.utils import get_currency_precision
precision = get_currency_precision() or 2
data = []
for item in sorted(item_map):
data.append([item, item_map[item]["item_name"],
@ -30,14 +30,6 @@ def execute(filters=None):
])
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):
"""return columns based on filters"""
@ -65,9 +57,10 @@ def get_price_list():
rate = {}
price_list = webnotes.conn.sql("""select item_code, buying, selling,
concat(price_list, " - ", currency, " ", ref_rate) as price
from `tabItem Price`""", as_dict=1)
price_list = webnotes.conn.sql("""select ip.item_code, ip.buying, ip.selling,
concat(ip.price_list, " - ", ip.currency, " ", ip.ref_rate) as price
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:
if j.price:

View File

@ -5,107 +5,117 @@ wn.provide("erpnext.support");
// TODO commonify this code
erpnext.support.MaintenanceSchedule = wn.ui.form.Controller.extend({
refresh: function() {
if (this.frm.doc.docstatus===0) {
cur_frm.add_custom_button(wn._('From Sales Order'),
var me = this;
if (this.frm.doc.docstatus === 0) {
this.frm.add_custom_button(wn._('From Sales Order'),
function() {
wn.model.map_current_doc({
method: "erpnext.selling.doctype.sales_order.sales_order.make_maintenance_schedule",
source_doctype: "Sales Order",
get_query_filters: {
docstatus: 1,
order_type: cur_frm.doc.order_type,
customer: cur_frm.doc.customer || undefined,
company: cur_frm.doc.company
order_type: me.frm.doc.order_type,
customer: me.frm.doc.customer || undefined,
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({
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() {
var me = this;
if(this.frm.doc.customer) {
return this.frm.call({
doc: this.frm.doc,
doc: me.frm.doc,
method: "set_customer_defaults",
});
}
},
}
},
});
$.extend(cur_frm.cscript, new erpnext.support.MaintenanceSchedule({frm: cur_frm}));
cur_frm.cscript.onload = function(doc, dt, dn) {
if(!doc.status) set_multiple(dt,dn,{status:'Draft'});
if(doc.__islocal){
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']);
}
if (!doc.status)
set_multiple(dt, dn, { status:'Draft' });
if (doc.__islocal) {
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']);
}
}
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);
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);
}
}
cur_frm.fields_dict['customer_address'].get_query = function(doc, cdt, cdn) {
return{
filters:{ 'customer': doc.customer}
}
return {
filters:{ 'customer': doc.customer }
}
}
cur_frm.fields_dict['contact_person'].get_query = function(doc, cdt, cdn) {
return{
filters:{ 'customer': doc.customer}
}
return {
filters:{ 'customer': doc.customer }
}
}
//
cur_frm.fields_dict['item_maintenance_detail'].grid.get_field('item_code').get_query = function(doc, cdt, cdn) {
return{
filters:{ 'is_service_item': "Yes"}
}
return {
filters:{ 'is_service_item': "Yes" }
}
}
cur_frm.cscript.item_code = function(doc, cdt, cdn) {
var fname = cur_frm.cscript.fname;
var d = locals[cdt][cdn];
if (d.item_code) {
return get_server_fields('get_item_details',d.item_code, 'item_maintenance_detail',doc,cdt,cdn,1);
}
var fname = cur_frm.cscript.fname;
var d = locals[cdt][cdn];
if (d.item_code) {
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){
var d = locals[cdt][cdn];
if(d.start_date && d.end_date){
arg = {}
arg.start_date = d.start_date;
arg.end_date = d.end_date;
arg.periodicity = d.periodicity;
return get_server_fields('get_no_of_visits',docstring(arg),'item_maintenance_detail',doc, cdt, cdn, 1);
}
else{
msgprint(wn._("Please enter Start Date and End Date"));
}
var d = locals[cdt][cdn];
if(d.start_date && d.end_date) {
arg = {}
arg.start_date = d.start_date;
arg.end_date = d.end_date;
arg.periodicity = d.periodicity;
return get_server_fields('get_no_of_visits', docstring(arg),
'item_maintenance_detail', doc, cdt, cdn, 1);
} else {
msgprint(wn._("Please enter Start Date and End Date"));
}
}
cur_frm.cscript.generate_schedule = function(doc, cdt, cdn) {
if (!doc.__islocal) {
return $c('runserverobj', args={'method':'generate_schedule', 'docs':wn.model.compress(make_doclist(cdt,cdn))},
function(r,rt){
refresh_field('maintenance_schedule_detail');
}
);
} else {
alert(wn._("Please save the document before generating maintenance schedule"));
}
if (!doc.__islocal) {
return $c('runserverobj', args={'method':'generate_schedule',
'docs':wn.model.compress(make_doclist(cdt,cdn))},
function(r, rt) {
refresh_field('maintenance_schedule_detail');
});
} else {
msgprint(wn._("Please save the document before generating maintenance schedule"));
}
}
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
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.bean import getlist
from webnotes import msgprint
from webnotes import msgprint, throw, _
from erpnext.utilities.transaction_base import TransactionBase, delete_events
class DocType(TransactionBase):
@ -19,7 +16,8 @@ class DocType(TransactionBase):
self.doclist = doclist
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 = {
'item_name': item and item[0]['item_name'] or '',
'description' : item and item[0]['description'] or ''
@ -28,13 +26,14 @@ class DocType(TransactionBase):
def generate_schedule(self):
self.doclist = self.doc.clear_table(self.doclist, 'maintenance_schedule_detail')
count = 0
webnotes.conn.sql("delete from `tabMaintenance Schedule Detail` where parent='%s'" %(self.doc.name))
webnotes.conn.sql("""delete from `tabMaintenance Schedule Detail`
where parent=%s""", (self.doc.name))
count = 1
for d in getlist(self.doclist, 'item_maintenance_detail'):
self.validate_maintenance_detail()
s_list =[]
s_list = self.create_schedule_list(d.start_date, d.end_date, d.no_of_visits)
for i in range(d.no_of_visits):
s_list = []
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):
child = addchild(self.doc, 'maintenance_schedule_detail',
'Maintenance Schedule Detail', self.doclist)
child.item_code = d.item_code
@ -43,40 +42,39 @@ class DocType(TransactionBase):
if d.serial_no:
child.serial_no = d.serial_no
child.idx = count
count = count+1
child.incharge_name = d.incharge_name
count = count + 1
child.sales_person = d.sales_person
child.save(1)
self.on_update()
def on_submit(self):
if not getlist(self.doclist, 'maintenance_schedule_detail'):
msgprint("Please click on 'Generate Schedule' to get schedule")
raise Exception
throw("Please click on 'Generate Schedule' to get schedule")
self.check_serial_no_added()
self.validate_serial_no_warranty()
self.validate_schedule()
email_map ={}
email_map = {}
for d in getlist(self.doclist, 'item_maintenance_detail'):
if d.serial_no:
self.update_amc_date(d.serial_no, d.end_date)
if d.incharge_name not in email_map:
email_map[d.incharge_name] = webnotes.bean("Sales Person",
d.incharge_name).run_method("get_email_id")
if d.sales_person not in email_map:
sp = webnotes.bean("Sales Person", d.sales_person).make_controller()
email_map[d.sales_person] = sp.get_email_id()
scheduled_date =webnotes.conn.sql("select scheduled_date from `tabMaintenance Schedule Detail` \
where incharge_name='%s' and item_code='%s' and parent='%s' " %(d.incharge_name, \
d.item_code, self.doc.name), as_dict=1)
scheduled_date = webnotes.conn.sql("""select scheduled_date from
`tabMaintenance Schedule Detail` where sales_person=%s and item_code=%s and
parent=%s""", (d.sales_person, d.item_code, self.doc.name), as_dict=1)
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" % \
(self.doc.name, d.item_code, self.doc.customer)
webnotes.bean({
"doctype": "Event",
"owner": email_map[d.incharge_name] or self.doc.owner,
"owner": email_map[d.sales_person] or self.doc.owner,
"subject": description,
"description": description,
"starts_on": key["scheduled_date"] + " 10:00:00",
@ -89,92 +87,121 @@ class DocType(TransactionBase):
#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 = []
start_date1 = start_date
start_date_copy = start_date
date_diff = (getdate(end_date) - getdate(start_date)).days
add_by = date_diff/no_of_visit
#schedule_list.append(start_date1)
while(getdate(start_date1) < getdate(end_date)):
start_date1 = add_days(start_date1, add_by)
if len(schedule_list) < no_of_visit:
schedule_list.append(getdate(start_date1))
add_by = date_diff / no_of_visit
for visit in range(cint(no_of_visit)):
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:
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
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
#-------------------------------------------------
def validate_period(self, arg):
arg1 = eval(arg)
if getdate(arg1['start_date']) >= getdate(arg1['end_date']):
msgprint("Start date should be less than end date ")
raise Exception
period = (getdate(arg1['end_date'])-getdate(arg1['start_date'])).days+1
if (arg1['periodicity']=='Yearly' or arg1['periodicity']=='Half Yearly' or arg1['periodicity']=='Quarterly') and period<365:
msgprint(cstr(arg1['periodicity'])+ " periodicity can be set for period of atleast 1 year or more only")
raise Exception
elif arg1['periodicity']=='Monthly' and period<30:
msgprint("Monthly periodicity can be set for period of atleast 1 month or more")
raise Exception
elif arg1['periodicity']=='Weekly' and period<7:
msgprint("Weekly periodicity can be set for period of atleast 1 week or more")
raise Exception
args = eval(arg)
if getdate(args['start_date']) >= getdate(args['end_date']):
throw(_("Start date should be less than end date."))
period = (getdate(args['end_date']) - getdate(args['start_date'])).days + 1
if (args['periodicity'] == 'Yearly' or args['periodicity'] == 'Half Yearly' or
args['periodicity'] == 'Quarterly') and period < 365:
throw(cstr(args['periodicity']) + " periodicity can be set for period of atleast 1 year or more only")
elif args['periodicity'] == 'Monthly' and period < 30:
throw("Monthly periodicity can be set for period of atleast 1 month or more")
elif args['periodicity'] == 'Weekly' and period < 7:
throw("Weekly periodicity can be set for period of atleast 1 week or more")
def get_no_of_visits(self, arg):
arg1 = eval(arg)
args = eval(arg)
self.validate_period(arg)
period = (getdate(arg1['end_date'])-getdate(arg1['start_date'])).days+1
count =0
if arg1['periodicity'] == 'Weekly':
period = (getdate(args['end_date']) - getdate(args['start_date'])).days + 1
count = 0
if args['periodicity'] == 'Weekly':
count = period/7
elif arg1['periodicity'] == 'Monthly':
elif args['periodicity'] == 'Monthly':
count = period/30
elif arg1['periodicity'] == 'Quarterly':
elif args['periodicity'] == 'Quarterly':
count = period/91
elif arg1['periodicity'] == 'Half Yearly':
elif args['periodicity'] == 'Half Yearly':
count = period/182
elif arg1['periodicity'] == 'Yearly':
elif args['periodicity'] == 'Yearly':
count = period/365
ret = {'no_of_visits':count}
ret = {'no_of_visits' : count}
return ret
def validate_maintenance_detail(self):
if not getlist(self.doclist, 'item_maintenance_detail'):
msgprint("Please enter Maintaince Details first")
raise Exception
throw(_("Please enter Maintaince Details first"))
for d in getlist(self.doclist, 'item_maintenance_detail'):
if not d.item_code:
msgprint("Please select item code")
raise Exception
throw(_("Please select item code"))
elif not d.start_date or not d.end_date:
msgprint("Please select Start Date and End Date for item "+d.item_code)
raise Exception
throw(_("Please select Start Date and End Date for item") + " " + d.item_code)
elif not d.no_of_visits:
msgprint("Please mention no of visits required")
raise Exception
elif not d.incharge_name:
msgprint("Please select Incharge Person's name")
raise Exception
throw(_("Please mention no of visits required"))
elif not d.sales_person:
throw(_("Please select Incharge Person's name"))
if getdate(d.start_date) >= getdate(d.end_date):
msgprint("Start date should be less than end date for item "+d.item_code)
raise Exception
throw(_("Start date should be less than end date for item") + " " + d.item_code)
#check if maintenance schedule already created against same sales order
#-----------------------------------------------------------------------------------
def validate_sales_order(self):
for d in getlist(self.doclist, 'item_maintenance_detail'):
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:
msgprint("Maintenance Schedule against "+d.prevdoc_docname+" already exist")
raise Exception
throw("Maintenance Schedule against " + d.prevdoc_docname + " already exist")
def validate_serial_no(self):
@ -185,13 +212,13 @@ class DocType(TransactionBase):
cur_s_no = cur_serial_no.split(',')
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 ''
status = chk and chk[0][1] or ''
if not chk1:
msgprint("Serial no "+x+" does not exist in system.")
raise Exception
throw("Serial no " + x + " does not exist in system.")
def validate(self):
self.validate_maintenance_detail()
@ -208,13 +235,13 @@ class DocType(TransactionBase):
cur_s_no = cur_serial_no.split(',')
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 ''
if dt:
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)
raise Exception
throw("Maintenance start date can not be before delivery date " + dt.strftime('%Y-%m-%d') + " for serial no " + x)
#update amc expiry date in serial no
#------------------------------------------
@ -224,7 +251,8 @@ class DocType(TransactionBase):
cur_s_no = cur_serial_no.split(',')
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):
webnotes.conn.set(self.doc, 'status', 'Draft')
@ -233,16 +261,16 @@ class DocType(TransactionBase):
for d in getlist(self.doclist, 'item_maintenance_detail'):
if cstr(d.serial_no).strip():
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:
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.""" %
(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:
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.""" %
(d.serial_no, dt[0]["amc_expiry_date"]), raise_exception=1)
(d.serial_no, dt[0]["amc_expiry_date"]))
def validate_schedule(self):
item_lst1 =[]
@ -256,13 +284,11 @@ class DocType(TransactionBase):
item_lst2.append(m.item_code)
if len(item_lst1) != len(item_lst2):
msgprint("Maintenance Schedule is not generated for all the items. Please click on 'Generate Schedule'")
raise Exception
throw("Maintenance Schedule is not generated for all the items. Please click on 'Generate Schedule'")
else:
for x in item_lst1:
if x not in item_lst2:
msgprint("Maintenance Schedule is not generated for item "+x+". Please click on 'Generate Schedule'")
raise Exception
throw("Maintenance Schedule is not generated for item "+x+". Please click on 'Generate Schedule'")
#check if serial no present in item maintenance table
#-----------------------------------------------------------
@ -275,18 +301,15 @@ class DocType(TransactionBase):
for m in getlist(self.doclist, 'maintenance_schedule_detail'):
if serial_present:
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)
raise Exception
throw("Please click on 'Generate Schedule' to fetch serial no added for item "+m.item_code)
def on_cancel(self):
for d in getlist(self.doclist, 'item_maintenance_detail'):
if d.serial_no:
self.update_amc_date(d.serial_no, '')
webnotes.conn.set(self.doc, 'status', 'Cancelled')
delete_events(self.doc.doctype, self.doc.name)
def on_trash(self):
delete_events(self.doc.doctype, self.doc.name)
@ -313,7 +336,7 @@ def make_maintenance_visit(source_name, target_doclist=None):
"field_map": {
"parent": "prevdoc_docname",
"parenttype": "prevdoc_doctype",
"incharge_name": "service_person"
"sales_person": "service_person"
}
}
}, target_doclist)

View File

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

View File

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

View File

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

View File

@ -2,7 +2,7 @@
{
"creation": "2013-05-06 14:25:21",
"docstatus": 0,
"modified": "2013-10-09 12:23:27",
"modified": "2013-12-31 12:24:48",
"modified_by": "Administrator",
"owner": "Administrator"
},
@ -10,7 +10,7 @@
"doctype": "Report",
"is_standard": "Yes",
"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",
"report_name": "Maintenance Schedules",
"report_type": "Query Report"

View File

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