Merge branch '4.0.0-wip' of github.com:webnotes/erpnext into 4.0-hotfix
This commit is contained in:
commit
ffa4769b51
@ -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;
|
||||
|
@ -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, {
|
||||
|
@ -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
|
||||
|
@ -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:
|
||||
|
@ -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]
|
||||
|
@ -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}
|
||||
}
|
||||
|
@ -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"
|
||||
|
@ -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:
|
||||
|
@ -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
|
||||
},
|
||||
|
@ -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});
|
||||
|
@ -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"
|
||||
},
|
||||
{
|
||||
|
@ -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
|
||||
|
@ -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"
|
||||
},
|
||||
{
|
||||
|
@ -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,
|
||||
|
@ -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
|
||||
|
9
erpnext/patches/1401/enable_all_price_list.py
Normal file
9
erpnext/patches/1401/enable_all_price_list.py
Normal 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""")
|
@ -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""")
|
@ -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
|
||||
|
@ -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",
|
||||
]
|
@ -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",
|
||||
|
@ -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"
|
||||
},
|
||||
{
|
||||
|
@ -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}
|
||||
}
|
||||
|
@ -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}));
|
||||
|
@ -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():
|
||||
|
@ -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:
|
||||
|
@ -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" }
|
||||
}
|
||||
|
@ -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" }
|
||||
}
|
@ -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
|
||||
|
@ -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"]
|
||||
|
@ -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}
|
@ -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"])
|
||||
|
@ -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."
|
||||
|
@ -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",
|
||||
|
@ -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
|
||||
},
|
||||
|
@ -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"))
|
||||
|
@ -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:
|
||||
|
@ -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" }
|
||||
}
|
||||
|
@ -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)
|
||||
|
@ -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",
|
||||
|
@ -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",
|
||||
|
@ -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__",
|
||||
|
@ -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"
|
||||
|
@ -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
|
||||
},
|
||||
|
Loading…
Reference in New Issue
Block a user